node-red-contrib-ax25 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/.eslintignore +5 -0
  2. package/.prettierignore +7 -0
  3. package/ARCHITECTURE.md +174 -0
  4. package/CONTEXT.md +90 -0
  5. package/MESSAGES.md +314 -0
  6. package/README.md +317 -0
  7. package/examples/beacons.json +130 -0
  8. package/examples/beacons.png +0 -0
  9. package/examples/bye_subflow.json +107 -0
  10. package/examples/bye_subflow.png +0 -0
  11. package/examples/delete_all_my_messages.json +491 -0
  12. package/examples/delete_all_my_messages.png +0 -0
  13. package/examples/get_message_list_subflow.json +129 -0
  14. package/examples/get_message_list_subflow.png +0 -0
  15. package/examples/send_message_subflow.json +367 -0
  16. package/examples/send_message_subflow.png +0 -0
  17. package/examples/send_test_message.json +643 -0
  18. package/examples/send_test_message.png +0 -0
  19. package/jsconfig.json +37 -0
  20. package/lib/agwpe-client-transport.js +99 -0
  21. package/lib/agwpe-frame-builder.js +176 -0
  22. package/lib/agwpe-frame-pretty.js +107 -0
  23. package/lib/ax25-codec.js +382 -0
  24. package/lib/frame-router.js +95 -0
  25. package/lib/frame-segmentation.js +53 -0
  26. package/lib/message-utils.js +59 -0
  27. package/lib/runtime-store.js +94 -0
  28. package/lib/session-registry.js +142 -0
  29. package/local/buffer_compare.json +135 -0
  30. package/local/debug-d-frame.js +84 -0
  31. package/local/raw-out-test.json +128 -0
  32. package/nodes/agwpe-client.html +70 -0
  33. package/nodes/agwpe-client.js +771 -0
  34. package/nodes/agwpe-client.js.bak +871 -0
  35. package/nodes/connect.html +128 -0
  36. package/nodes/connect.js +450 -0
  37. package/nodes/decode.html +83 -0
  38. package/nodes/decode.js +56 -0
  39. package/nodes/disconnect.html +55 -0
  40. package/nodes/disconnect.js +47 -0
  41. package/nodes/encode.html +117 -0
  42. package/nodes/encode.js +164 -0
  43. package/nodes/monitor-in.html +48 -0
  44. package/nodes/monitor-in.js +42 -0
  45. package/nodes/raw-in.html +50 -0
  46. package/nodes/raw-in.js +72 -0
  47. package/nodes/raw-out.html +76 -0
  48. package/nodes/raw-out.js +144 -0
  49. package/nodes/send.html +91 -0
  50. package/nodes/send.js +373 -0
  51. package/nodes/ui-in.html +64 -0
  52. package/nodes/ui-in.js +68 -0
  53. package/nodes/ui-out.html +80 -0
  54. package/nodes/ui-out.js +133 -0
  55. package/package.json +47 -0
@@ -0,0 +1,491 @@
1
+ [
2
+ {
3
+ "id": "f1e3c30bea1bbe94",
4
+ "type": "subflow",
5
+ "name": "Bye",
6
+ "info": "",
7
+ "category": "",
8
+ "in": [
9
+ {
10
+ "x": 80,
11
+ "y": 120,
12
+ "wires": [
13
+ {
14
+ "id": "0813fedcec47e075"
15
+ }
16
+ ]
17
+ }
18
+ ],
19
+ "out": [],
20
+ "env": [],
21
+ "meta": {},
22
+ "color": "#DDAA99"
23
+ },
24
+ {
25
+ "id": "0813fedcec47e075",
26
+ "type": "function",
27
+ "z": "f1e3c30bea1bbe94",
28
+ "name": "B",
29
+ "func": "\"use strict\";\n\nif (!msg.sessionId) {\n const errorCode = 'NO_SESSION_ID';\n const errorText = \"sessionID not found\";\n\n node.error(`[${errorCode}] ${errorText}`);\n\n return [{\n status: 'error',\n errorCode,\n errorText,\n msg,\n }, null];\n}\n\nreturn [null, {\n sessionId: msg.sessionId,\n command: 'send',\n payload: 'B',\n timeout: 30000,\n}];\n",
30
+ "outputs": 2,
31
+ "timeout": 0,
32
+ "noerr": 0,
33
+ "initialize": "",
34
+ "finalize": "",
35
+ "libs": [],
36
+ "x": 210,
37
+ "y": 120,
38
+ "wires": [
39
+ [
40
+ "637170b1c7227488"
41
+ ],
42
+ [
43
+ "1e49e3218b1dd308"
44
+ ]
45
+ ]
46
+ },
47
+ {
48
+ "id": "1e49e3218b1dd308",
49
+ "type": "send",
50
+ "z": "f1e3c30bea1bbe94",
51
+ "name": "",
52
+ "timeout": "",
53
+ "waitFor": "",
54
+ "x": 390,
55
+ "y": 160,
56
+ "wires": [
57
+ [
58
+ "e3ab85e4461b92a5"
59
+ ],
60
+ [
61
+ "fed58202ceb48e13"
62
+ ]
63
+ ]
64
+ },
65
+ {
66
+ "id": "e3ab85e4461b92a5",
67
+ "type": "function",
68
+ "z": "f1e3c30bea1bbe94",
69
+ "name": "check error",
70
+ "func": "\"use strict\";\n\nif (msg.status === 'error') {\n node.error(`[${msg.errorCode}] ${msg.errorText}`, msg);\n return msg;\n}\nreturn null;",
71
+ "outputs": 1,
72
+ "timeout": 0,
73
+ "noerr": 0,
74
+ "initialize": "",
75
+ "finalize": "",
76
+ "libs": [],
77
+ "x": 610,
78
+ "y": 140,
79
+ "wires": [
80
+ [
81
+ "fed58202ceb48e13"
82
+ ]
83
+ ]
84
+ },
85
+ {
86
+ "id": "fed58202ceb48e13",
87
+ "type": "disconnect",
88
+ "z": "f1e3c30bea1bbe94",
89
+ "name": "",
90
+ "x": 810,
91
+ "y": 180,
92
+ "wires": [
93
+ []
94
+ ]
95
+ },
96
+ {
97
+ "id": "637170b1c7227488",
98
+ "type": "disconnect",
99
+ "z": "f1e3c30bea1bbe94",
100
+ "name": "",
101
+ "x": 410,
102
+ "y": 80,
103
+ "wires": [
104
+ []
105
+ ]
106
+ },
107
+ {
108
+ "id": "3c693657989a4c37",
109
+ "type": "subflow",
110
+ "name": "Get message list",
111
+ "info": "",
112
+ "category": "",
113
+ "in": [
114
+ {
115
+ "x": 91,
116
+ "y": 96,
117
+ "wires": [
118
+ {
119
+ "id": "9cf1412f3b5cb133"
120
+ }
121
+ ]
122
+ }
123
+ ],
124
+ "out": [
125
+ {
126
+ "x": 660,
127
+ "y": 140,
128
+ "wires": [
129
+ {
130
+ "id": "9cf1412f3b5cb133",
131
+ "port": 0
132
+ },
133
+ {
134
+ "id": "7a0bf977aceb9b9d",
135
+ "port": 0
136
+ },
137
+ {
138
+ "id": "9bc838d18c1486f0",
139
+ "port": 0
140
+ }
141
+ ]
142
+ },
143
+ {
144
+ "x": 660,
145
+ "y": 260,
146
+ "wires": [
147
+ {
148
+ "id": "7a0bf977aceb9b9d",
149
+ "port": 1
150
+ }
151
+ ]
152
+ }
153
+ ],
154
+ "env": [],
155
+ "meta": {},
156
+ "color": "#DDAA99"
157
+ },
158
+ {
159
+ "id": "43f63a776d0f7144",
160
+ "type": "send",
161
+ "z": "3c693657989a4c37",
162
+ "name": "",
163
+ "timeout": "30000",
164
+ "waitFor": "^ENTER COMMAND",
165
+ "x": 221,
166
+ "y": 176,
167
+ "wires": [
168
+ [
169
+ "9bc838d18c1486f0"
170
+ ],
171
+ [
172
+ "7a0bf977aceb9b9d"
173
+ ]
174
+ ]
175
+ },
176
+ {
177
+ "id": "9cf1412f3b5cb133",
178
+ "type": "function",
179
+ "z": "3c693657989a4c37",
180
+ "name": "L",
181
+ "func": "\"use strict\";\n\nif (!msg.sessionId) {\n const errorCode = 'NO_SESSION_ID';\n const errorText = \"sessionID not found\";\n\n node.error(`[${errorCode}] ${errorText}`);\n\n return [{\n status: 'error',\n errorCode,\n errorText,\n msg,\n }, null];\n}\n\nreturn [null, {\n sessionId: msg.sessionId,\n command: 'send',\n payload: 'L',\n timeout: 30000,\n}];\n",
182
+ "outputs": 2,
183
+ "timeout": 0,
184
+ "noerr": 0,
185
+ "initialize": "",
186
+ "finalize": "",
187
+ "libs": [],
188
+ "x": 221,
189
+ "y": 96,
190
+ "wires": [
191
+ [],
192
+ [
193
+ "43f63a776d0f7144"
194
+ ]
195
+ ]
196
+ },
197
+ {
198
+ "id": "7a0bf977aceb9b9d",
199
+ "type": "function",
200
+ "z": "3c693657989a4c37",
201
+ "name": "Create delete list",
202
+ "func": "\"use strict\";\n\nfunction kamParse(input) {\n const regex = /^(\\d+)\\s+(\\S+)\\s+(\\d+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)$/;\n\n const output = input.map( l => {\n const m = l.match(regex);\n\n if (m) {\n return {\n line: m[0],\n no: m[1],\n type: m[2],\n size: m[3],\n dest: m[4],\n src: m[5],\n date: m[6],\n time: m[7],\n subject: m[8],\n };\n }\n }).filter(Boolean);\n\n return output;\n}\n\nif (!msg.match || !msg.match.startsWith('ENTER COMMAND')) {\n const errorCode = 'MATCH_NOT_FOUND';\n const errorText = \"Expected ENTER COMMAND\";\n \n node.error(`[${errorCode}] ${errorText}`, msg);\n\n return [{\n sessionId: msg.sessionId,\n status: 'error',\n errorCode,\n errorText,\n }, null];\n}\n\nconst list = kamParse(msg.payload);\n\nreturn [null, {\n sessionId: msg.sessionId,\n status: 'ok',\n list,\n}];\n",
203
+ "outputs": 2,
204
+ "timeout": 0,
205
+ "noerr": 0,
206
+ "initialize": "",
207
+ "finalize": "",
208
+ "libs": [],
209
+ "x": 250,
210
+ "y": 260,
211
+ "wires": [
212
+ [],
213
+ []
214
+ ]
215
+ },
216
+ {
217
+ "id": "9bc838d18c1486f0",
218
+ "type": "function",
219
+ "z": "3c693657989a4c37",
220
+ "name": "check error",
221
+ "func": "\"use strict\";\n\nif (msg.status === 'error') {\n node.error(`[${msg.errorCode}] ${msg.errorText}`, msg);\n return msg;\n}\nreturn null;",
222
+ "outputs": 1,
223
+ "timeout": 0,
224
+ "noerr": 0,
225
+ "initialize": "",
226
+ "finalize": "",
227
+ "libs": [],
228
+ "x": 430,
229
+ "y": 160,
230
+ "wires": [
231
+ []
232
+ ]
233
+ },
234
+ {
235
+ "id": "cf056828a30c1bd7",
236
+ "type": "tab",
237
+ "label": "Delete my messages",
238
+ "disabled": false,
239
+ "info": "",
240
+ "env": []
241
+ },
242
+ {
243
+ "id": "bc16718a70430de0",
244
+ "type": "inject",
245
+ "z": "cf056828a30c1bd7",
246
+ "name": "Create test messages",
247
+ "props": [],
248
+ "repeat": "",
249
+ "crontab": "",
250
+ "once": false,
251
+ "onceDelay": 0.1,
252
+ "topic": "",
253
+ "x": 160,
254
+ "y": 60,
255
+ "wires": [
256
+ [
257
+ "da6080e062f7493b"
258
+ ]
259
+ ]
260
+ },
261
+ {
262
+ "id": "da6080e062f7493b",
263
+ "type": "connect",
264
+ "z": "cf056828a30c1bd7",
265
+ "client": "663651df790ce7b1",
266
+ "name": "",
267
+ "source": "N0CALL",
268
+ "destination": "N0CALL-1",
269
+ "via": "",
270
+ "mode": "line",
271
+ "timeout": "30000",
272
+ "waitFor": "^ENTER COMMAND",
273
+ "x": 400,
274
+ "y": 60,
275
+ "wires": [
276
+ [
277
+ "5c0277411e1b4539"
278
+ ],
279
+ [
280
+ "b67be17d7c84f184"
281
+ ]
282
+ ]
283
+ },
284
+ {
285
+ "id": "b67be17d7c84f184",
286
+ "type": "subflow:3c693657989a4c37",
287
+ "z": "cf056828a30c1bd7",
288
+ "name": "",
289
+ "x": 170,
290
+ "y": 180,
291
+ "wires": [
292
+ [
293
+ "2c681d4b6e8d6ae3"
294
+ ],
295
+ [
296
+ "6adb56b31fbf5602"
297
+ ]
298
+ ]
299
+ },
300
+ {
301
+ "id": "6adb56b31fbf5602",
302
+ "type": "function",
303
+ "z": "cf056828a30c1bd7",
304
+ "name": "Create delete list",
305
+ "func": "\"use strict\";\n\nconst list = msg.list;\n\nconst deleteList = list.filter( i => i.src === 'N0CALL' ).map( i => i.no );\n\nflow.set('deleteList', deleteList);\n\nreturn { \n\tsessionId: msg.sessionId,\n};",
306
+ "outputs": 1,
307
+ "timeout": 0,
308
+ "noerr": 0,
309
+ "initialize": "",
310
+ "finalize": "",
311
+ "libs": [],
312
+ "x": 350,
313
+ "y": 260,
314
+ "wires": [
315
+ [
316
+ "bd9ec6de880aa136"
317
+ ]
318
+ ]
319
+ },
320
+ {
321
+ "id": "bd9ec6de880aa136",
322
+ "type": "function",
323
+ "z": "cf056828a30c1bd7",
324
+ "name": "K <no>",
325
+ "func": "\"use strict\";\n\nconst deleteList = flow.get('deleteList');\n\nif (!deleteList || deleteList.length === 0) {\n flow.set(\"state\", \"done\");\n\n return [{ sessionId: msg.sessionId }, null];\n}\n\nconst msgNo = deleteList[0];\n\nreturn [null, {\n command: 'send',\n sessionId: msg.sessionId,\n payload: \"K \" + msgNo,\n waitFor: '^ENTER COMMAND',\n timeout: 30000,\n}];",
326
+ "outputs": 2,
327
+ "timeout": 0,
328
+ "noerr": 0,
329
+ "initialize": "",
330
+ "finalize": "",
331
+ "libs": [],
332
+ "x": 340,
333
+ "y": 360,
334
+ "wires": [
335
+ [
336
+ "be67b7e42aed5ca3"
337
+ ],
338
+ [
339
+ "2aab72bc68a05429"
340
+ ]
341
+ ]
342
+ },
343
+ {
344
+ "id": "2aab72bc68a05429",
345
+ "type": "send",
346
+ "z": "cf056828a30c1bd7",
347
+ "name": "",
348
+ "timeout": "",
349
+ "waitFor": "",
350
+ "x": 510,
351
+ "y": 380,
352
+ "wires": [
353
+ [
354
+ "07f0218b1bda20af"
355
+ ],
356
+ [
357
+ "4bd41eeb07ccad40"
358
+ ]
359
+ ]
360
+ },
361
+ {
362
+ "id": "4bd41eeb07ccad40",
363
+ "type": "function",
364
+ "z": "cf056828a30c1bd7",
365
+ "name": "done?",
366
+ "func": "\"use strict\";\n\nif (!msg.match || !msg.match.startsWith('ENTER COMMAND')) {\n node.error(\"Expected ENTER COMMAND\", msg);\n return [{ sessionId: msg.sessionId }, null];\n}\n\n// TODO: check delete message\n\nconst deleteList = flow.get('deleteList');\n\ndeleteList.shift();\nflow.set('msgList', deleteList);\n\nreturn [null, {\n sessionId: msg.sessionId,\n}];",
367
+ "outputs": 2,
368
+ "timeout": 0,
369
+ "noerr": 0,
370
+ "initialize": "",
371
+ "finalize": "",
372
+ "libs": [],
373
+ "x": 390,
374
+ "y": 520,
375
+ "wires": [
376
+ [
377
+ "391ebda3a1381299"
378
+ ],
379
+ [
380
+ "bd9ec6de880aa136"
381
+ ]
382
+ ]
383
+ },
384
+ {
385
+ "id": "771d2def0287a8f6",
386
+ "type": "disconnect",
387
+ "z": "cf056828a30c1bd7",
388
+ "name": "",
389
+ "x": 830,
390
+ "y": 60,
391
+ "wires": [
392
+ []
393
+ ]
394
+ },
395
+ {
396
+ "id": "5c0277411e1b4539",
397
+ "type": "function",
398
+ "z": "cf056828a30c1bd7",
399
+ "name": "check error",
400
+ "func": "\"use strict\";\n\nif (msg.status === 'error') {\n node.error(`[${msg.errorCode}] ${msg.errorText}`, msg);\n return msg;\n}\nreturn null;",
401
+ "outputs": 1,
402
+ "timeout": 0,
403
+ "noerr": 0,
404
+ "initialize": "",
405
+ "finalize": "",
406
+ "libs": [],
407
+ "x": 610,
408
+ "y": 60,
409
+ "wires": [
410
+ [
411
+ "771d2def0287a8f6"
412
+ ]
413
+ ]
414
+ },
415
+ {
416
+ "id": "07f0218b1bda20af",
417
+ "type": "function",
418
+ "z": "cf056828a30c1bd7",
419
+ "name": "check error",
420
+ "func": "\"use strict\";\n\nif (msg.status === 'error') {\n node.error(`[${msg.errorCode}] ${msg.errorText}`, msg);\n return msg;\n}\nreturn null;",
421
+ "outputs": 1,
422
+ "timeout": 0,
423
+ "noerr": 0,
424
+ "initialize": "",
425
+ "finalize": "",
426
+ "libs": [],
427
+ "x": 730,
428
+ "y": 380,
429
+ "wires": [
430
+ [
431
+ "f71795f83c061930"
432
+ ]
433
+ ]
434
+ },
435
+ {
436
+ "id": "2c681d4b6e8d6ae3",
437
+ "type": "disconnect",
438
+ "z": "cf056828a30c1bd7",
439
+ "name": "",
440
+ "x": 410,
441
+ "y": 160,
442
+ "wires": [
443
+ []
444
+ ]
445
+ },
446
+ {
447
+ "id": "f71795f83c061930",
448
+ "type": "disconnect",
449
+ "z": "cf056828a30c1bd7",
450
+ "name": "",
451
+ "x": 930,
452
+ "y": 380,
453
+ "wires": [
454
+ []
455
+ ]
456
+ },
457
+ {
458
+ "id": "be67b7e42aed5ca3",
459
+ "type": "subflow:f1e3c30bea1bbe94",
460
+ "z": "cf056828a30c1bd7",
461
+ "name": "",
462
+ "x": 510,
463
+ "y": 340,
464
+ "wires": []
465
+ },
466
+ {
467
+ "id": "391ebda3a1381299",
468
+ "type": "disconnect",
469
+ "z": "cf056828a30c1bd7",
470
+ "name": "",
471
+ "x": 610,
472
+ "y": 500,
473
+ "wires": [
474
+ []
475
+ ]
476
+ },
477
+ {
478
+ "id": "663651df790ce7b1",
479
+ "type": "agwpe-client",
480
+ "name": "win10 AGWPE",
481
+ "host": "192.168.68.11",
482
+ "port": 8000,
483
+ "callsigns": "N0CALL",
484
+ "username": "",
485
+ "password": "",
486
+ "monitor": false,
487
+ "raw": true,
488
+ "reconnect": true,
489
+ "reconnectDelay": 5000
490
+ }
491
+ ]
@@ -0,0 +1,129 @@
1
+ [
2
+ {
3
+ "id": "3c693657989a4c37",
4
+ "type": "subflow",
5
+ "name": "Get message list",
6
+ "info": "",
7
+ "category": "",
8
+ "in": [
9
+ {
10
+ "x": 91,
11
+ "y": 96,
12
+ "wires": [
13
+ {
14
+ "id": "9cf1412f3b5cb133"
15
+ }
16
+ ]
17
+ }
18
+ ],
19
+ "out": [
20
+ {
21
+ "x": 660,
22
+ "y": 140,
23
+ "wires": [
24
+ {
25
+ "id": "9cf1412f3b5cb133",
26
+ "port": 0
27
+ },
28
+ {
29
+ "id": "7a0bf977aceb9b9d",
30
+ "port": 0
31
+ },
32
+ {
33
+ "id": "9bc838d18c1486f0",
34
+ "port": 0
35
+ }
36
+ ]
37
+ },
38
+ {
39
+ "x": 660,
40
+ "y": 260,
41
+ "wires": [
42
+ {
43
+ "id": "7a0bf977aceb9b9d",
44
+ "port": 1
45
+ }
46
+ ]
47
+ }
48
+ ],
49
+ "env": [],
50
+ "meta": {},
51
+ "color": "#DDAA99"
52
+ },
53
+ {
54
+ "id": "43f63a776d0f7144",
55
+ "type": "send",
56
+ "z": "3c693657989a4c37",
57
+ "name": "",
58
+ "timeout": "30000",
59
+ "waitFor": "^ENTER COMMAND",
60
+ "x": 221,
61
+ "y": 176,
62
+ "wires": [
63
+ [
64
+ "9bc838d18c1486f0"
65
+ ],
66
+ [
67
+ "7a0bf977aceb9b9d"
68
+ ]
69
+ ]
70
+ },
71
+ {
72
+ "id": "9cf1412f3b5cb133",
73
+ "type": "function",
74
+ "z": "3c693657989a4c37",
75
+ "name": "L",
76
+ "func": "\"use strict\";\n\nif (!msg.sessionId) {\n const errorCode = 'NO_SESSION_ID';\n const errorText = \"sessionID not found\";\n\n node.error(`[${errorCode}] ${errorText}`);\n\n return [{\n status: 'error',\n errorCode,\n errorText,\n msg,\n }, null];\n}\n\nreturn [null, {\n sessionId: msg.sessionId,\n command: 'send',\n payload: 'L',\n timeout: 30000,\n}];\n",
77
+ "outputs": 2,
78
+ "timeout": 0,
79
+ "noerr": 0,
80
+ "initialize": "",
81
+ "finalize": "",
82
+ "libs": [],
83
+ "x": 221,
84
+ "y": 96,
85
+ "wires": [
86
+ [],
87
+ [
88
+ "43f63a776d0f7144"
89
+ ]
90
+ ]
91
+ },
92
+ {
93
+ "id": "7a0bf977aceb9b9d",
94
+ "type": "function",
95
+ "z": "3c693657989a4c37",
96
+ "name": "Create delete list",
97
+ "func": "\"use strict\";\n\nfunction kamParse(input) {\n const regex = /^(\\d+)\\s+(\\S+)\\s+(\\d+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.+)$/;\n\n const output = input.map( l => {\n const m = l.match(regex);\n\n if (m) {\n return {\n line: m[0],\n no: m[1],\n type: m[2],\n size: m[3],\n dest: m[4],\n src: m[5],\n date: m[6],\n time: m[7],\n subject: m[8],\n };\n }\n }).filter(Boolean);\n\n return output;\n}\n\nif (!msg.match || !msg.match.startsWith('ENTER COMMAND')) {\n const errorCode = 'MATCH_NOT_FOUND';\n const errorText = \"Expected ENTER COMMAND\";\n \n node.error(`[${errorCode}] ${errorText}`, msg);\n\n return [{\n sessionId: msg.sessionId,\n status: 'error',\n errorCode,\n errorText,\n }, null];\n}\n\nconst list = kamParse(msg.payload);\n\nreturn [null, {\n sessionId: msg.sessionId,\n status: 'ok',\n list,\n}];\n",
98
+ "outputs": 2,
99
+ "timeout": 0,
100
+ "noerr": 0,
101
+ "initialize": "",
102
+ "finalize": "",
103
+ "libs": [],
104
+ "x": 250,
105
+ "y": 260,
106
+ "wires": [
107
+ [],
108
+ []
109
+ ]
110
+ },
111
+ {
112
+ "id": "9bc838d18c1486f0",
113
+ "type": "function",
114
+ "z": "3c693657989a4c37",
115
+ "name": "check error",
116
+ "func": "\"use strict\";\n\nif (msg.status === 'error') {\n node.error(`[${msg.errorCode}] ${msg.errorText}`, msg);\n return msg;\n}\nreturn null;",
117
+ "outputs": 1,
118
+ "timeout": 0,
119
+ "noerr": 0,
120
+ "initialize": "",
121
+ "finalize": "",
122
+ "libs": [],
123
+ "x": 430,
124
+ "y": 160,
125
+ "wires": [
126
+ []
127
+ ]
128
+ }
129
+ ]