diff --git a/.eslintrc b/.eslintrc index 351a023..3915d22 100644 --- a/.eslintrc +++ b/.eslintrc @@ -12,6 +12,7 @@ "import" ], "rules": { + "no-console": 0, "prettier/prettier": "error", "import/no-extraneous-dependencies": [ "error", { diff --git a/index.js b/index.js index 7192a2e..789e89f 100644 --- a/index.js +++ b/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; diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..32bbdbd --- /dev/null +++ b/src/index.html @@ -0,0 +1,10 @@ + + + + MQTT Demo with Mosca + + +

MQTT Demo with Mosca

+ + + diff --git a/src/mqtt.mjs b/src/mqtt.mjs new file mode 100644 index 0000000..dc4934d --- /dev/null +++ b/src/mqtt.mjs @@ -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; +} diff --git a/src/server.mjs b/src/server.mjs index 9d32c30..cdc50af 100644 --- a/src/server.mjs +++ b/src/server.mjs @@ -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'); + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end(content); + }); + break; + } - const message = { - topic: '/hello/world', - payload: 'abdce', // or a Buffer - qos: 0, // 0, 1, or 2 - retain: true, // retain message for future subscribers - }; + 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; + } - server.publish(message, () => { - console.log('message published!'); + res.writeHead(200, { 'Content-Type': 'text/javascript' }); + res.end(content); + }); + break; + } + + 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); }); -}; - -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); -}); - -export default server;