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"
|
"import"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"no-console": 0,
|
||||||
"prettier/prettier": "error",
|
"prettier/prettier": "error",
|
||||||
"import/no-extraneous-dependencies": [
|
"import/no-extraneous-dependencies": [
|
||||||
"error", {
|
"error", {
|
||||||
|
|||||||
4
index.js
4
index.js
@@ -1,5 +1,3 @@
|
|||||||
/* eslint no-global-assign: 0 */
|
/* eslint no-global-assign: 0 */
|
||||||
require = require('@std/esm')(module);
|
require = require('@std/esm')(module);
|
||||||
const mod = require('./src/server.mjs').default;
|
require('./src/server.mjs').default;
|
||||||
|
|
||||||
module.exports = mod.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 = {
|
const sendError = (err, res) => {
|
||||||
port: 1883,
|
console.error(err);
|
||||||
persistence: {
|
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
||||||
factory: mosca.persistence.LevelUp,
|
res.end('oh no!');
|
||||||
path: 'db',
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
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 = () => {
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
||||||
console.log('Mosca server is up and running');
|
res.end(content);
|
||||||
|
|
||||||
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!');
|
|
||||||
});
|
});
|
||||||
};
|
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
|
res.writeHead(200, { 'Content-Type': 'text/javascript' });
|
||||||
server.on('published', packet => {
|
res.end(content);
|
||||||
console.log('published event', packet.retain ? '(persisted)' : '', packet.topic, packet.payload);
|
|
||||||
});
|
});
|
||||||
|
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