feat: add a simple webserver
load up client-side mqtt code, and static html website
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
"import"
|
||||
],
|
||||
"rules": {
|
||||
"no-console": 0,
|
||||
"prettier/prettier": "error",
|
||||
"import/no-extraneous-dependencies": [
|
||||
"error", {
|
||||
|
||||
4
index.js
4
index.js
@@ -1,5 +1,3 @@
|
||||
/* eslint no-global-assign: 0 */
|
||||
require = require('@std/esm')(module);
|
||||
const mod = require('./src/server.mjs').default;
|
||||
|
||||
module.exports = mod.default;
|
||||
require('./src/server.mjs').default;
|
||||
|
||||
10
src/index.html
Normal file
10
src/index.html
Normal file
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>MQTT Demo with Mosca</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>MQTT Demo with Mosca</h1>
|
||||
<script src="/client.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
45
src/mqtt.mjs
Normal file
45
src/mqtt.mjs
Normal file
@@ -0,0 +1,45 @@
|
||||
import mosca from 'mosca';
|
||||
|
||||
// source: https://github.com/mcollina/mosca/wiki/Mosca-basic-usage
|
||||
|
||||
export default function createMQTTServer(port = 1883) {
|
||||
const moscaSettings = {
|
||||
port,
|
||||
persistence: {
|
||||
factory: mosca.persistence.LevelUp,
|
||||
path: 'db',
|
||||
},
|
||||
};
|
||||
|
||||
const server = new mosca.Server(moscaSettings);
|
||||
|
||||
const setup = () => {
|
||||
console.log('Mosca server is up and running on port:', moscaSettings.port);
|
||||
|
||||
const message = {
|
||||
topic: '/hello/world',
|
||||
payload: 'abdce', // or a Buffer
|
||||
qos: 0, // 0, 1, or 2
|
||||
retain: true, // retain message for future subscribers
|
||||
};
|
||||
|
||||
console.log('--- server publishing to mqtt ---');
|
||||
server.publish(message, () => {
|
||||
console.log('message published!');
|
||||
});
|
||||
};
|
||||
|
||||
server.on('ready', setup);
|
||||
|
||||
// fired when a message is published
|
||||
server.on('published', packet => {
|
||||
console.log(
|
||||
'published event',
|
||||
packet.retain ? '(persisted)' : '',
|
||||
packet.topic,
|
||||
packet.payload
|
||||
);
|
||||
});
|
||||
|
||||
return server;
|
||||
}
|
||||
@@ -1,37 +1,55 @@
|
||||
import mosca from 'mosca';
|
||||
import http from 'http';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import createMQTT from './mqtt.mjs';
|
||||
|
||||
// source: https://github.com/mcollina/mosca/wiki/Mosca-basic-usage
|
||||
const serverPort = process.env.PORT || 8080;
|
||||
const mqttPort = 1883;
|
||||
|
||||
const moscaSettings = {
|
||||
port: 1883,
|
||||
persistence: {
|
||||
factory: mosca.persistence.LevelUp,
|
||||
path: 'db',
|
||||
},
|
||||
const sendError = (err, res) => {
|
||||
console.error(err);
|
||||
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
||||
res.end('oh no!');
|
||||
};
|
||||
|
||||
const server = new mosca.Server(moscaSettings);
|
||||
http
|
||||
.createServer((req, res) => {
|
||||
switch (req.url) {
|
||||
case '/': {
|
||||
fs.readFile(path.resolve(__dirname, 'index.html'), (err, content) => {
|
||||
if (err) {
|
||||
sendError(err, res);
|
||||
return;
|
||||
}
|
||||
|
||||
const setup = () => {
|
||||
console.log('Mosca server is up and running');
|
||||
|
||||
const message = {
|
||||
topic: '/hello/world',
|
||||
payload: 'abdce', // or a Buffer
|
||||
qos: 0, // 0, 1, or 2
|
||||
retain: true, // retain message for future subscribers
|
||||
};
|
||||
|
||||
server.publish(message, () => {
|
||||
console.log('message published!');
|
||||
res.writeHead(200, { 'Content-Type': 'text/html' });
|
||||
res.end(content);
|
||||
});
|
||||
};
|
||||
break;
|
||||
}
|
||||
|
||||
server.on('ready', setup);
|
||||
case '/client.js': {
|
||||
const clientPath = path.join(path.dirname(require.resolve('mosca')), 'public', 'mqtt.js');
|
||||
fs.readFile(clientPath, (err, content) => {
|
||||
if (err) {
|
||||
sendError(err, res);
|
||||
return;
|
||||
}
|
||||
|
||||
// fired when a message is published
|
||||
server.on('published', packet => {
|
||||
console.log('published event', packet.retain ? '(persisted)' : '', packet.topic, packet.payload);
|
||||
});
|
||||
res.writeHead(200, { 'Content-Type': 'text/javascript' });
|
||||
res.end(content);
|
||||
});
|
||||
break;
|
||||
}
|
||||
|
||||
export default server;
|
||||
default: {
|
||||
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
||||
res.end('not found');
|
||||
}
|
||||
}
|
||||
})
|
||||
.listen(serverPort)
|
||||
.on('listening', () => {
|
||||
console.log('Webserver listening on port:', serverPort);
|
||||
createMQTT(mqttPort);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user