2022-01-26 23:09:26 +01:00
|
|
|
/* MagicMirror²
|
2019-12-31 19:31:13 +00:00
|
|
|
* Node Helper Superclass
|
|
|
|
*
|
2020-04-28 23:05:28 +02:00
|
|
|
* By Michael Teeuw https://michaelteeuw.nl
|
2019-12-31 19:31:13 +00:00
|
|
|
* MIT Licensed.
|
|
|
|
*/
|
2020-05-02 10:39:09 +02:00
|
|
|
const Class = require("./class.js");
|
2021-02-18 19:14:53 +01:00
|
|
|
const Log = require("logger");
|
2020-05-02 10:39:09 +02:00
|
|
|
const express = require("express");
|
2019-12-31 19:31:13 +00:00
|
|
|
|
2021-01-05 18:44:36 +01:00
|
|
|
const NodeHelper = Class.extend({
|
|
|
|
init() {
|
2020-05-11 07:25:42 +02:00
|
|
|
Log.log("Initializing new module helper ...");
|
2019-12-31 19:31:13 +00:00
|
|
|
},
|
|
|
|
|
2023-02-26 18:36:47 +01:00
|
|
|
loaded() {
|
2021-01-05 18:44:36 +01:00
|
|
|
Log.log(`Module helper loaded: ${this.name}`);
|
2019-12-31 19:31:13 +00:00
|
|
|
},
|
|
|
|
|
2021-01-05 18:44:36 +01:00
|
|
|
start() {
|
|
|
|
Log.log(`Starting module helper: ${this.name}`);
|
2019-12-31 19:31:13 +00:00
|
|
|
},
|
|
|
|
|
2021-10-18 14:36:31 +02:00
|
|
|
/**
|
2022-01-26 23:47:51 +01:00
|
|
|
* Called when the MagicMirror² server receives a `SIGINT`
|
2019-12-31 19:31:13 +00:00
|
|
|
* Close any open connections, stop any sub-processes and
|
|
|
|
* gracefully exit the module.
|
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
stop() {
|
|
|
|
Log.log(`Stopping module helper: ${this.name}`);
|
2019-12-31 19:31:13 +00:00
|
|
|
},
|
|
|
|
|
2021-10-18 14:36:31 +02:00
|
|
|
/**
|
2019-12-31 19:31:13 +00:00
|
|
|
* This method is called when a socket notification arrives.
|
|
|
|
*
|
2021-10-18 14:36:31 +02:00
|
|
|
* @param {string} notification The identifier of the notification.
|
|
|
|
* @param {*} payload The payload of the notification.
|
2019-12-31 19:31:13 +00:00
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
socketNotificationReceived(notification, payload) {
|
|
|
|
Log.log(`${this.name} received a socket notification: ${notification} - Payload: ${payload}`);
|
2019-12-31 19:31:13 +00:00
|
|
|
},
|
|
|
|
|
2021-10-18 14:36:31 +02:00
|
|
|
/**
|
2019-12-31 19:31:13 +00:00
|
|
|
* Set the module name.
|
|
|
|
*
|
2021-10-18 14:36:31 +02:00
|
|
|
* @param {string} name Module name.
|
2019-12-31 19:31:13 +00:00
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
setName(name) {
|
2019-12-31 19:31:13 +00:00
|
|
|
this.name = name;
|
|
|
|
},
|
|
|
|
|
2021-10-18 14:36:31 +02:00
|
|
|
/**
|
2019-12-31 19:31:13 +00:00
|
|
|
* Set the module path.
|
|
|
|
*
|
2021-10-18 14:36:31 +02:00
|
|
|
* @param {string} path Module path.
|
2019-12-31 19:31:13 +00:00
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
setPath(path) {
|
2019-12-31 19:31:13 +00:00
|
|
|
this.path = path;
|
|
|
|
},
|
|
|
|
|
|
|
|
/* sendSocketNotification(notification, payload)
|
|
|
|
* Send a socket notification to the node helper.
|
|
|
|
*
|
|
|
|
* argument notification string - The identifier of the notification.
|
|
|
|
* argument payload mixed - The payload of the notification.
|
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
sendSocketNotification(notification, payload) {
|
2019-12-31 19:31:13 +00:00
|
|
|
this.io.of(this.name).emit(notification, payload);
|
|
|
|
},
|
|
|
|
|
|
|
|
/* setExpressApp(app)
|
|
|
|
* Sets the express app object for this module.
|
|
|
|
* This allows you to host files from the created webserver.
|
|
|
|
*
|
|
|
|
* argument app Express app - The Express app object.
|
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
setExpressApp(app) {
|
2019-12-31 19:31:13 +00:00
|
|
|
this.expressApp = app;
|
|
|
|
|
2021-01-05 18:44:36 +01:00
|
|
|
app.use(`/${this.name}`, express.static(`${this.path}/public`));
|
2019-12-31 19:31:13 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/* setSocketIO(io)
|
|
|
|
* Sets the socket io object for this module.
|
|
|
|
* Binds message receiver.
|
|
|
|
*
|
|
|
|
* argument io Socket.io - The Socket io object.
|
|
|
|
*/
|
2021-01-05 18:44:36 +01:00
|
|
|
setSocketIO(io) {
|
|
|
|
this.io = io;
|
2019-12-31 19:31:13 +00:00
|
|
|
|
2021-01-05 18:44:36 +01:00
|
|
|
Log.log(`Connecting socket for: ${this.name}`);
|
|
|
|
|
|
|
|
io.of(this.name).on("connection", (socket) => {
|
2019-12-31 19:31:13 +00:00
|
|
|
// add a catch all event.
|
2021-01-05 18:44:36 +01:00
|
|
|
const onevent = socket.onevent;
|
2020-05-11 22:22:32 +02:00
|
|
|
socket.onevent = function (packet) {
|
2021-01-05 18:44:36 +01:00
|
|
|
const args = packet.data || [];
|
2020-03-15 15:49:34 +01:00
|
|
|
onevent.call(this, packet); // original call
|
2019-12-31 19:31:13 +00:00
|
|
|
packet.data = ["*"].concat(args);
|
2020-03-15 15:49:34 +01:00
|
|
|
onevent.call(this, packet); // additional call to catch-all
|
2019-12-31 19:31:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// register catch all.
|
2021-01-05 18:44:36 +01:00
|
|
|
socket.on("*", (notification, payload) => {
|
2019-12-31 19:31:13 +00:00
|
|
|
if (notification !== "*") {
|
2021-01-05 18:44:36 +01:00
|
|
|
this.socketNotificationReceived(notification, payload);
|
2019-12-31 19:31:13 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2021-04-24 09:14:08 +02:00
|
|
|
NodeHelper.checkFetchStatus = function (response) {
|
|
|
|
// response.status >= 200 && response.status < 300
|
|
|
|
if (response.ok) {
|
|
|
|
return response;
|
|
|
|
} else {
|
|
|
|
throw Error(response.statusText);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-05-15 14:49:04 +02:00
|
|
|
/**
|
|
|
|
* Look at the specified error and return an appropriate error type, that
|
|
|
|
* can be translated to a detailed error message
|
|
|
|
*
|
|
|
|
* @param {Error} error the error from fetching something
|
|
|
|
* @returns {string} the string of the detailed error message in the translations
|
|
|
|
*/
|
2021-05-02 10:24:22 +02:00
|
|
|
NodeHelper.checkFetchError = function (error) {
|
|
|
|
let error_type = "MODULE_ERROR_UNSPECIFIED";
|
|
|
|
if (error.code === "EAI_AGAIN") {
|
|
|
|
error_type = "MODULE_ERROR_NO_CONNECTION";
|
2021-05-02 14:43:12 +02:00
|
|
|
} else if (error.message === "Unauthorized") {
|
|
|
|
error_type = "MODULE_ERROR_UNAUTHORIZED";
|
2021-05-02 10:24:22 +02:00
|
|
|
}
|
|
|
|
return error_type;
|
|
|
|
};
|
|
|
|
|
2020-05-11 22:22:32 +02:00
|
|
|
NodeHelper.create = function (moduleDefinition) {
|
2019-12-31 19:31:13 +00:00
|
|
|
return NodeHelper.extend(moduleDefinition);
|
|
|
|
};
|
|
|
|
|
2021-01-05 18:44:36 +01:00
|
|
|
module.exports = NodeHelper;
|