feat: add a simple webserver

load up client-side mqtt code, and static html website
This commit is contained in:
2018-01-11 19:31:28 -07:00
parent 753db12b3e
commit b2d98eb670
5 changed files with 104 additions and 32 deletions

View File

@@ -12,6 +12,7 @@
"import"
],
"rules": {
"no-console": 0,
"prettier/prettier": "error",
"import/no-extraneous-dependencies": [
"error", {

View File

@@ -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
View 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
View 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;
}

View File

@@ -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);
});