From 27cd00cf3f642b1cd9c2bcc3508b52900553bd27 Mon Sep 17 00:00:00 2001 From: Scott Bender Date: Fri, 27 Mar 2026 16:22:09 -0400 Subject: [PATCH] feature: add ability to respond with error from put handlers --- package.json | 2 ++ signalk-put-error.html | 28 ++++++++++++++++++++++++++++ signalk-put-error.js | 20 ++++++++++++++++++++ signalk-put-handler.html | 8 +++++++- signalk-put-handler.js | 9 +++++++-- signalk-put-success.html | 28 ++++++++++++++++++++++++++++ signalk-put-success.js | 20 ++++++++++++++++++++ signalk-send-put.js | 4 ++-- 8 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 signalk-put-error.html create mode 100644 signalk-put-error.js create mode 100644 signalk-put-success.html create mode 100644 signalk-put-success.js diff --git a/package.json b/package.json index b69bcfe..e21c463 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "signalk-geofence-switch": "signalk-geofence-switch.js", "signalk-delay": "signalk-delay.js", "signalk-put-handler": "signalk-put-handler.js", + "signalk-put-error": "signalk-put-error.js", + "signalk-put-success": "signalk-put-success.js", "signalk-input-handler-next": "signalk-input-handler-next.js", "signalk-input-handler": "signalk-input-handler.js" } diff --git a/signalk-put-error.html b/signalk-put-error.html new file mode 100644 index 0000000..795c9a6 --- /dev/null +++ b/signalk-put-error.html @@ -0,0 +1,28 @@ + + + + + diff --git a/signalk-put-error.js b/signalk-put-error.js new file mode 100644 index 0000000..3b25d31 --- /dev/null +++ b/signalk-put-error.js @@ -0,0 +1,20 @@ + +module.exports = function(RED) { + function SignalK(config) { + RED.nodes.createNode(this,config); + var node = this; + + var app = node.context().global.get('app') + + node.on('input', msg => { + let cb = msg.putCallBack + if ( cb ) { + cb({ state: 'COMPLETED', statusCode: msg.payload?.statusCode || 500, message: msg.payload?.message || 'Error'}) + } else { + node.error('No callback provided for put response') + } + }) + } + RED.nodes.registerType("signalk-put-error", SignalK); +} + diff --git a/signalk-put-handler.html b/signalk-put-handler.html index 3904e9e..59c9e0d 100644 --- a/signalk-put-handler.html +++ b/signalk-put-handler.html @@ -4,7 +4,8 @@ color: '#ffcc01', defaults: { name: {value:""}, - path: {value:""} + path: {value:""}, + pending: {value: false}, }, inputs:0, outputs:1, @@ -25,8 +26,13 @@ +
+ + +
diff --git a/signalk-put-handler.js b/signalk-put-handler.js index d495c3c..8aef09d 100644 --- a/signalk-put-handler.js +++ b/signalk-put-handler.js @@ -7,8 +7,13 @@ module.exports = function(RED) { var app = node.context().global.get('app') function handlePut(context, path, value, cb) { - node.send({topic: path, payload: value}) - return { state: 'SUCCESS' } + if ( config.pending ) { + node.send({topic: path, payload: value, putCallBack: cb}) + return { state: 'PENDING' } + } else { + node.send({topic: path, payload: value}) + return { state: 'SUCCESS' } + } } let deReg = app.registerActionHandler('vessels.self', config.path, diff --git a/signalk-put-success.html b/signalk-put-success.html new file mode 100644 index 0000000..e00269b --- /dev/null +++ b/signalk-put-success.html @@ -0,0 +1,28 @@ + + + + + diff --git a/signalk-put-success.js b/signalk-put-success.js new file mode 100644 index 0000000..77cb3b5 --- /dev/null +++ b/signalk-put-success.js @@ -0,0 +1,20 @@ + +module.exports = function(RED) { + function SignalK(config) { + RED.nodes.createNode(this,config); + var node = this; + + var app = node.context().global.get('app') + + node.on('input', msg => { + let cb = msg.putCallBack + if ( cb ) { + cb({ state: 'COMPLETED', statusCode: msg.payload?.statusCode || 200, message: msg.payload?.message || 'OK'}) + } else { + node.error('No callback provided for put response') + } + }) + } + RED.nodes.registerType("signalk-put-success", SignalK); +} + diff --git a/signalk-send-put.js b/signalk-send-put.js index 483dd48..837b246 100644 --- a/signalk-send-put.js +++ b/signalk-send-put.js @@ -20,13 +20,13 @@ module.exports = function(RED) { if ( reply.state === 'COMPLETED' ) { if ( reply.statusCode === 200 ) { node.status({fill:'green',shape:"dot",text:`value: ${msg.payload}`}) - node.send([{ payload: reply}, null]) + node.send([{ payload: reply, putCallBack: msg.putCallBack}, null]) } else if ( reply.state === 'PENDING' ) { node.status({fill:'yellow',shape:"dot",text:'pending...'}) } else { node.status({fill:'red',shape:"dot",text:`error`}) node.error(`put error ${reply.statusCode} ${reply.message || ''}`) - node.send([null, { payload: reply}]) + node.send([null, { payload: reply, putCallBack: msg.putCallBack}]) } } }, config.source && config.source.length > 0 ? config.source : undefined)