Files
bascula-autonoma-totem/uibuilder/.config/sioUse.js-template
T

43 lines
2.1 KiB
Plaintext

/**
* Template Socket.IO `use` middleware for uibuilder. Fn will be called for EVERY inbound msg from a client to Node-RED/uibuilder.
* UPDATED: 2022-04-01
*
* NOTES & WARNINGS:
* 1) This function is called when a client sends a "packet" of data to the server.
* 2) Failing to either return or call `next()` will mean that your clients will never be able to get responses.
* 3) You can amend the incoming msg in this middleware.
* 4) An error in this function will probably cause Node-RED to fail to start at all.
* 5) You have to restart Node-RED if you change this file.
* 6) If you call `next( new Error('blah') )` The error is sent back to the client and further proessing of the incoming msg stops.
* 7) To use for authentication/authorisation with Express and sio connection middleware, create a common node.js module.
*
* Allows you to process incoming data from clients.
*
* see: https://socket.io/docs/v4/server-api/#socketusefn
* see also: uibRoot/.config/sioMiddleware.js & sioMsgOut.js
* and https://cheatsheetseries.owasp.org/cheatsheets/HTML5_Security_Cheat_Sheet.html#websocket-implementation-hints
*
* @param {[string,Array<Object>]} data The channel name (strictly the event name) and args send by a client (Socket.IO calls it a "packet"). data[0] is the channel/event name, data[args][0] is the actual msg
* @param {function} next The callback to hand off to the next middleware
*/
function sioUseMw([ channel, ...args ], next) {
const msg = args[0]
console.log('[uibuilder:Socket.IO:sioUse.js] msg from client: ', 'Channel Name:', channel, ' Msg:', msg)
// Simplistic error example - looking for specific property on the inbound msg
if ( msg.i_am_an_error ) {
// The error is sent back to the client and further processing of the msg stops
next(new Error('Oops! Some kind of error happened'))
return
}
// You can amend the incoming msg
msg._test = 'added by sioUse.js middleware'
next()
} // Do not forget to end with a call to `next()` or clients will not be able to connect
module.exports = sioUseMw