@flowfuse/nr-file-nodes 0.0.5-479584e-202310241453.0 → 0.0.5
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.
- package/CHANGELOG.md +5 -0
- package/file.js +108 -107
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/file.js
CHANGED
|
@@ -63,7 +63,7 @@ module.exports = function (RED) {
|
|
|
63
63
|
node.closeCallback = null
|
|
64
64
|
|
|
65
65
|
function processMsg (msg, nodeSend, done) {
|
|
66
|
-
|
|
66
|
+
const filename = node.filename || ''
|
|
67
67
|
// Pre V3 compatibility - if filenameType is empty, do in place upgrade
|
|
68
68
|
if (typeof node.filenameType === 'undefined' || node.filenameType === '') {
|
|
69
69
|
// existing node AND filenameType is not set - inplace (compatible) upgrade
|
|
@@ -80,9 +80,12 @@ module.exports = function (RED) {
|
|
|
80
80
|
node.error(err, msg)
|
|
81
81
|
return done()
|
|
82
82
|
} else {
|
|
83
|
-
|
|
83
|
+
completeProcessMsg(msg, nodeSend, value, done)
|
|
84
84
|
}
|
|
85
85
|
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function completeProcessMsg (msg, nodeSend, filename, done) {
|
|
86
89
|
filename = filename || ''
|
|
87
90
|
msg.filename = filename
|
|
88
91
|
let fullFilename = filename
|
|
@@ -262,61 +265,73 @@ module.exports = function (RED) {
|
|
|
262
265
|
node.filenameType = 'str'
|
|
263
266
|
}
|
|
264
267
|
}
|
|
265
|
-
let propertyError = false
|
|
266
268
|
RED.util.evaluateNodeProperty(node.filename, node.filenameType, node, msg, (err, value) => {
|
|
267
269
|
if (err) {
|
|
268
270
|
node.error(err, msg)
|
|
269
|
-
|
|
270
|
-
// return done()
|
|
271
|
+
return nodeDone()
|
|
271
272
|
} else {
|
|
272
273
|
filename = (value || '').replace(/\t|\r|\n/g, '')
|
|
274
|
+
completeProcessMsg(msg, nodeSend, filename, nodeDone)
|
|
273
275
|
}
|
|
274
276
|
})
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
filename = filename || ''
|
|
279
|
-
let fullFilename = filename
|
|
277
|
+
function completeProcessMsg (msg, nodeSend, filename, nodeDone) {
|
|
278
|
+
filename = filename || ''
|
|
279
|
+
let fullFilename = filename
|
|
280
280
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
}
|
|
291
|
-
if (filename === '') {
|
|
292
|
-
node.warn(RED._('file.errors.nofilename'))
|
|
293
|
-
nodeDone()
|
|
294
|
-
} else {
|
|
295
|
-
msg.filename = filename
|
|
296
|
-
let lines = Buffer.from([])
|
|
297
|
-
let spare = ''
|
|
298
|
-
let count = 0
|
|
299
|
-
let type = 'buffer'
|
|
300
|
-
let ch = ''
|
|
301
|
-
if (node.format === 'lines') {
|
|
302
|
-
ch = '\n'
|
|
303
|
-
type = 'string'
|
|
281
|
+
if (filename && RED.settings.fileWorkingDirectory && !path.isAbsolute(filename)) {
|
|
282
|
+
// fullFilename = path.resolve(path.join(RED.settings.fileWorkingDirectory, filename))
|
|
283
|
+
fullFilename = path.join(RED.settings.fileWorkingDirectory, filename)
|
|
284
|
+
}
|
|
285
|
+
if (!node.filename) {
|
|
286
|
+
node.status({ fill: 'grey', shape: 'dot', text: filename })
|
|
287
|
+
}
|
|
288
|
+
if (path.isAbsolute(fullFilename)) {
|
|
289
|
+
fullFilename = fullFilename.slice(1)
|
|
304
290
|
}
|
|
305
|
-
|
|
291
|
+
if (filename === '') {
|
|
292
|
+
node.warn(RED._('file.errors.nofilename'))
|
|
293
|
+
nodeDone()
|
|
294
|
+
} else {
|
|
295
|
+
msg.filename = filename
|
|
296
|
+
let lines = Buffer.from([])
|
|
297
|
+
let spare = ''
|
|
298
|
+
let count = 0
|
|
299
|
+
let type = 'buffer'
|
|
300
|
+
let ch = ''
|
|
301
|
+
if (node.format === 'lines') {
|
|
302
|
+
ch = '\n'
|
|
303
|
+
type = 'string'
|
|
304
|
+
}
|
|
305
|
+
let getout = false
|
|
306
306
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
307
|
+
const rs = fs.createReadStream(fullFilename)
|
|
308
|
+
.on('readable', function () {
|
|
309
|
+
let chunk
|
|
310
|
+
let m
|
|
311
|
+
const hwm = rs._readableState.highWaterMark
|
|
312
|
+
while ((chunk = rs.read()) !== null) {
|
|
313
|
+
if (node.chunk === true) {
|
|
314
|
+
getout = true
|
|
315
|
+
if (node.format === 'lines') {
|
|
316
|
+
spare += decode(chunk, node.encoding)
|
|
317
|
+
const bits = spare.split('\n')
|
|
318
|
+
let i = 0
|
|
319
|
+
for (i = 0; i < bits.length - 1; i++) {
|
|
320
|
+
m = {}
|
|
321
|
+
if (node.allProps === true) {
|
|
322
|
+
m = RED.util.cloneMessage(msg)
|
|
323
|
+
} else {
|
|
324
|
+
m.topic = msg.topic
|
|
325
|
+
m.filename = msg.filename
|
|
326
|
+
}
|
|
327
|
+
m.payload = bits[i]
|
|
328
|
+
m.parts = { index: count, ch, type, id: msg._msgid }
|
|
329
|
+
count += 1
|
|
330
|
+
nodeSend(m)
|
|
331
|
+
}
|
|
332
|
+
spare = bits[i]
|
|
333
|
+
}
|
|
334
|
+
if (node.format === 'stream') {
|
|
320
335
|
m = {}
|
|
321
336
|
if (node.allProps === true) {
|
|
322
337
|
m = RED.util.cloneMessage(msg)
|
|
@@ -324,74 +339,60 @@ module.exports = function (RED) {
|
|
|
324
339
|
m.topic = msg.topic
|
|
325
340
|
m.filename = msg.filename
|
|
326
341
|
}
|
|
327
|
-
m.payload =
|
|
342
|
+
m.payload = chunk
|
|
328
343
|
m.parts = { index: count, ch, type, id: msg._msgid }
|
|
329
344
|
count += 1
|
|
345
|
+
if (chunk.length < hwm) { // last chunk is smaller that high water mark = eof
|
|
346
|
+
getout = false
|
|
347
|
+
m.parts.count = count
|
|
348
|
+
}
|
|
330
349
|
nodeSend(m)
|
|
331
350
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
if (node.format === 'stream') {
|
|
335
|
-
m = {}
|
|
336
|
-
if (node.allProps === true) {
|
|
337
|
-
m = RED.util.cloneMessage(msg)
|
|
338
|
-
} else {
|
|
339
|
-
m.topic = msg.topic
|
|
340
|
-
m.filename = msg.filename
|
|
341
|
-
}
|
|
342
|
-
m.payload = chunk
|
|
343
|
-
m.parts = { index: count, ch, type, id: msg._msgid }
|
|
344
|
-
count += 1
|
|
345
|
-
if (chunk.length < hwm) { // last chunk is smaller that high water mark = eof
|
|
346
|
-
getout = false
|
|
347
|
-
m.parts.count = count
|
|
348
|
-
}
|
|
349
|
-
nodeSend(m)
|
|
351
|
+
} else {
|
|
352
|
+
lines = Buffer.concat([lines, chunk])
|
|
350
353
|
}
|
|
351
|
-
} else {
|
|
352
|
-
lines = Buffer.concat([lines, chunk])
|
|
353
354
|
}
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
nodeSend(sendMessage)
|
|
363
|
-
}
|
|
364
|
-
nodeDone()
|
|
365
|
-
})
|
|
366
|
-
.on('end', function () {
|
|
367
|
-
if (node.chunk === false) {
|
|
368
|
-
if (node.format === 'utf8') {
|
|
369
|
-
msg.payload = decode(lines, node.encoding)
|
|
370
|
-
} else { msg.payload = lines }
|
|
371
|
-
nodeSend(msg)
|
|
372
|
-
} else if (node.format === 'lines') {
|
|
373
|
-
let m = {}
|
|
374
|
-
if (node.allProps) {
|
|
375
|
-
m = RED.util.cloneMessage(msg)
|
|
376
|
-
} else {
|
|
377
|
-
m.topic = msg.topic
|
|
378
|
-
m.filename = msg.filename
|
|
355
|
+
})
|
|
356
|
+
.on('error', function (err) {
|
|
357
|
+
node.error(err, msg)
|
|
358
|
+
if (node.sendError) {
|
|
359
|
+
const sendMessage = RED.util.cloneMessage(msg)
|
|
360
|
+
delete sendMessage.payload
|
|
361
|
+
sendMessage.error = err
|
|
362
|
+
nodeSend(sendMessage)
|
|
379
363
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
364
|
+
nodeDone()
|
|
365
|
+
})
|
|
366
|
+
.on('end', function () {
|
|
367
|
+
if (node.chunk === false) {
|
|
368
|
+
if (node.format === 'utf8') {
|
|
369
|
+
msg.payload = decode(lines, node.encoding)
|
|
370
|
+
} else { msg.payload = lines }
|
|
371
|
+
nodeSend(msg)
|
|
372
|
+
} else if (node.format === 'lines') {
|
|
373
|
+
let m = {}
|
|
374
|
+
if (node.allProps) {
|
|
375
|
+
m = RED.util.cloneMessage(msg)
|
|
376
|
+
} else {
|
|
377
|
+
m.topic = msg.topic
|
|
378
|
+
m.filename = msg.filename
|
|
379
|
+
}
|
|
380
|
+
m.payload = spare
|
|
381
|
+
m.parts = {
|
|
382
|
+
index: count,
|
|
383
|
+
count: count + 1,
|
|
384
|
+
ch,
|
|
385
|
+
type,
|
|
386
|
+
id: msg._msgid
|
|
387
|
+
}
|
|
388
|
+
nodeSend(m)
|
|
389
|
+
} else if (getout) { // last chunk same size as high water mark - have to send empty extra packet.
|
|
390
|
+
const m = { parts: { index: count, count, ch, type, id: msg._msgid } }
|
|
391
|
+
nodeSend(m)
|
|
387
392
|
}
|
|
388
|
-
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
nodeSend(m)
|
|
392
|
-
}
|
|
393
|
-
nodeDone()
|
|
394
|
-
})
|
|
393
|
+
nodeDone()
|
|
394
|
+
})
|
|
395
|
+
}
|
|
395
396
|
}
|
|
396
397
|
})
|
|
397
398
|
this.on('close', function () {
|