Skip to content

Commit c14d520

Browse files
Re-subscribe on event/observed property error
1 parent 5afcbdc commit c14d520

2 files changed

Lines changed: 101 additions & 110 deletions

File tree

node-red-node-wot/src/wot-event.js

Lines changed: 49 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module.exports = function (RED) {
66
let node = this
77
let consumedThing
88
let subscription
9-
let repeatId
109

1110
this.status({})
1211

@@ -20,81 +19,73 @@ module.exports = function (RED) {
2019

2120
const thingNode = RED.nodes.getNode(config.thing)
2221
thingNode.addUpdateTDListener(async (_consumedThing) => {
23-
if (repeatId) {
24-
clearInterval(repeatId)
25-
repeatId = undefined
26-
}
2722
if (subscription) {
2823
// Stop if already subscribed
2924
await subscription.stop()
3025
}
3126
subscription = undefined
3227
consumedThing = _consumedThing
3328
// Repeat until event subscription succeeds.
34-
await new Promise((resolve) => {
35-
repeatId = setInterval(() => {
36-
consumedThing
37-
.subscribeEvent(
38-
config.event,
39-
async (resp) => {
40-
if (resp) {
41-
let payload
42-
try {
43-
payload = await resp.value()
44-
} catch (err) {
45-
node.error(`[error] failed to get event. err: ${err.toString()}`)
46-
console.error(`[error] failed to get event. err: `, err)
29+
while (true) {
30+
try {
31+
await new Promise((resolve, reject) => {
32+
consumedThing
33+
.subscribeEvent(
34+
config.event,
35+
async (resp) => {
36+
if (resp) {
37+
let payload
38+
try {
39+
payload = await resp.value()
40+
} catch (err) {
41+
node.error(`[error] failed to get event. err: ${err.toString()}`)
42+
console.error(`[error] failed to get event. err: `, err)
43+
}
44+
node.send({ payload, topic: config.topic })
4745
}
48-
node.send({ payload, topic: config.topic })
46+
node.status({
47+
fill: "green",
48+
shape: "dot",
49+
text: "Subscribed",
50+
})
51+
},
52+
(err) => {
53+
console.error("[error] subscribe events.", err)
54+
node.error(`[error] subscribe events. err: ${err.toString()}`)
55+
node.status({
56+
fill: "red",
57+
shape: "ring",
58+
text: "Subscription error",
59+
})
60+
reject(err)
4961
}
62+
)
63+
.then((sub) => {
64+
subscription = sub
5065
node.status({
5166
fill: "green",
5267
shape: "dot",
5368
text: "Subscribed",
5469
})
55-
},
56-
(err) => {
57-
console.error("[error] subscribe events.", err)
58-
node.error(`[error] subscribe events. err: ${err.toString()}`)
59-
node.status({
60-
fill: "red",
61-
shape: "ring",
62-
text: "Subscription error",
63-
})
64-
},
65-
() => {
66-
console.error("[warn] Subscription ended.")
67-
node.warn("[warn] Subscription ended.")
68-
node.status({})
69-
subscription = undefined
70-
}
71-
)
72-
.then((sub) => {
73-
subscription = sub
74-
clearInterval(repeatId)
75-
repeatId = undefined
76-
resolve()
77-
})
78-
.catch((err) => {
79-
console.warn("[warn] event subscribe error. try again. error: " + err)
80-
})
81-
}, 1000)
82-
})
83-
84-
if (subscription) {
85-
node.status({
86-
fill: "green",
87-
shape: "dot",
88-
text: "Subscribed",
89-
})
70+
})
71+
.catch(reject)
72+
});
73+
} catch (err) {
74+
console.warn("[warn] event subscribe error. try again. error: " + err)
75+
node.status({
76+
fill: "red",
77+
shape: "ring",
78+
text: "Subscription error",
79+
})
80+
}
81+
if (subscription) {
82+
await subscription.stop()
83+
}
84+
await new Promise((resolve) => setTimeout(resolve, 1000))
9085
}
9186
})
9287

9388
this.on("close", async function (removed, done) {
94-
if (repeatId) {
95-
clearInterval(repeatId)
96-
repeatId = undefined
97-
}
9889
if (subscription) {
9990
// Stop if already subscribed
10091
await subscription.stop()

node-red-node-wot/src/wot-property.js

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module.exports = function (RED) {
66
let node = this
77
let consumedThing
88
let subscription
9-
let repeatId
109

1110
this.status({})
1211

@@ -24,10 +23,6 @@ module.exports = function (RED) {
2423

2524
const thingNode = RED.nodes.getNode(config.thing)
2625
thingNode.addUpdateTDListener(async (_consumedThing) => {
27-
if (repeatId) {
28-
clearInterval(repeatId)
29-
repeatId = undefined
30-
}
3126
if (subscription) {
3227
// Stop if already subscribed
3328
await subscription.stop()
@@ -38,53 +33,62 @@ module.exports = function (RED) {
3833
return
3934
}
4035
// Repeat until observeProperty succeeds.
41-
await new Promise((resolve) => {
42-
repeatId = setInterval(() => {
43-
consumedThing
44-
.observeProperty(
45-
config.property,
46-
async (resp) => {
47-
let payload
48-
try {
49-
payload = await resp.value()
50-
} catch (err) {
51-
node.error(`[error] failed to get property change. err: ${err.toString()}`)
52-
console.error(`[error] failed to get property change. err:`, err)
36+
while (true) {
37+
try {
38+
await new Promise((resolve, reject) => {
39+
consumedThing
40+
.observeProperty(
41+
config.property,
42+
async (resp) => {
43+
if (resp) {
44+
let payload
45+
try {
46+
payload = await resp.value()
47+
} catch (err) {
48+
node.error(`[error] failed to get property change. err: ${err.toString()}`)
49+
console.error(`[error] failed to get property change. err:`, err)
50+
}
51+
node.send({ payload, topic: config.topic })
52+
}
53+
node.status({
54+
fill: "green",
55+
shape: "dot",
56+
text: "Subscribed",
57+
})
58+
},
59+
(err) => {
60+
node.error(`[error] property observe error. error: ${err.toString()}`)
61+
console.error(`[error] property observe error. error: `, err)
62+
node.status({
63+
fill: "red",
64+
shape: "ring",
65+
text: "Observe error",
66+
})
67+
reject(err)
5368
}
54-
node.send({ payload, topic: config.topic })
55-
},
56-
(err) => {
57-
node.error(`[error] property observe error. error: ${err.toString()}`)
58-
console.error(`[error] property observe error. error: `, err)
69+
)
70+
.then((sub) => {
71+
subscription = sub
5972
node.status({
60-
fill: "red",
61-
shape: "ring",
62-
text: "Observe error",
73+
fill: "green",
74+
shape: "dot",
75+
text: "connected",
6376
})
64-
}
65-
)
66-
.then((sub) => {
67-
subscription = sub
68-
clearInterval(repeatId)
69-
repeatId = undefined
70-
resolve()
71-
})
72-
.catch((err) => {
73-
console.warn("[warn] property observe error. try again. error: " + err)
74-
node.status({
75-
fill: "red",
76-
shape: "ring",
77-
text: "Observe error",
7877
})
79-
})
80-
}, 1000)
81-
})
82-
if (subscription) {
83-
node.status({
84-
fill: "green",
85-
shape: "dot",
86-
text: "connected",
87-
})
78+
.catch(reject)
79+
});
80+
} catch (err) {
81+
console.warn("[warn] property observe error. try again. error: " + err)
82+
node.status({
83+
fill: "red",
84+
shape: "ring",
85+
text: "Observe error",
86+
})
87+
}
88+
if (subscription) {
89+
await subscription.stop()
90+
}
91+
await new Promise((resolve) => setTimeout(resolve, 1000))
8892
}
8993
})
9094

@@ -126,10 +130,6 @@ module.exports = function (RED) {
126130
})
127131

128132
node.on("close", async function (removed, done) {
129-
if (repeatId) {
130-
clearInterval(repeatId)
131-
repeatId = undefined
132-
}
133133
if (subscription) {
134134
// Stop if already subscribed
135135
await subscription.stop()

0 commit comments

Comments
 (0)