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)