@signalk/streams 1.19.0 → 2.0.3
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/.prettierrc.json +4 -0
- package/README.md +6 -6
- package/autodetect.js +5 -5
- package/canboatjs.js +9 -6
- package/execute.js +9 -6
- package/filestream.js +2 -2
- package/folderstream.js +20 -23
- package/from_json.js +2 -2
- package/gpsd.js +15 -11
- package/keys-filter.js +8 -7
- package/liner.js +2 -2
- package/log.js +3 -3
- package/logging.js +33 -27
- package/mdns-ws.js +61 -35
- package/n2k-signalk.js +88 -61
- package/n2kAnalyzer.js +5 -6
- package/nmea0183-signalk.js +12 -11
- package/nullprovider.js +2 -2
- package/package.json +6 -3
- package/pigpio-seatalk.js +4 -5
- package/replacer.js +2 -4
- package/s3.js +18 -14
- package/serialport.js +15 -12
- package/signalk-streams-3.0.1.tgz +0 -0
- package/simple.js +87 -65
- package/splitting-liner.js +2 -2
- package/tcp.js +35 -33
- package/tcpserver.js +2 -2
- package/timestamp-throttle.js +3 -3
- package/udp.js +4 -4
package/.prettierrc.json
ADDED
package/README.md
CHANGED
|
@@ -6,9 +6,9 @@ The code is not compiled and is not more effective, but allows using the streams
|
|
|
6
6
|
|
|
7
7
|
## Development
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
- Install dev packages with `npm i`.
|
|
10
|
+
- Edit files with `/src`.
|
|
11
|
+
- `npm link`
|
|
12
|
+
- `cd ../../`
|
|
13
|
+
- `npm link @signalk/streams`
|
|
14
|
+
- Restart signalk `npm start`
|
package/autodetect.js
CHANGED
|
@@ -45,12 +45,12 @@ A => actisense-serial format N2K data
|
|
|
45
45
|
1471172400153;A;2016-07-16T12:00:00.000Z,2,130306,105,255,8,00,d1,03,c9,23,fa,ff,ff
|
|
46
46
|
*/
|
|
47
47
|
|
|
48
|
-
function DeMultiplexer
|
|
48
|
+
function DeMultiplexer(options) {
|
|
49
49
|
Writable.call(this)
|
|
50
50
|
|
|
51
51
|
this.toTimestamped = new ToTimestamped(this, options)
|
|
52
52
|
this.timestampThrottle = new TimestampThrottle({
|
|
53
|
-
getMilliseconds: msg => msg.timestamp
|
|
53
|
+
getMilliseconds: (msg) => msg.timestamp,
|
|
54
54
|
})
|
|
55
55
|
this.splitter = new Splitter(this, options)
|
|
56
56
|
this.options = options
|
|
@@ -66,7 +66,7 @@ DeMultiplexer.prototype.write = function (chunk, encoding, callback) {
|
|
|
66
66
|
return this.toTimestamped.write(chunk, encoding, callback)
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
function Splitter
|
|
69
|
+
function Splitter(deMultiplexer, options) {
|
|
70
70
|
Transform.call(this, { objectMode: true })
|
|
71
71
|
this.demuxEmitData = function (msg) {
|
|
72
72
|
deMultiplexer.emit('data', msg)
|
|
@@ -91,7 +91,7 @@ Splitter.prototype._transform = function (msg, encoding, _done) {
|
|
|
91
91
|
let done = _done
|
|
92
92
|
try {
|
|
93
93
|
switch (msg.discriminator) {
|
|
94
|
-
|
|
94
|
+
case 'A': {
|
|
95
95
|
msg.fromFile = true
|
|
96
96
|
const result = this.fromActisenseSerial.write(msg, encoding)
|
|
97
97
|
if (!result) {
|
|
@@ -130,7 +130,7 @@ Splitter.prototype.pipe = function (target) {
|
|
|
130
130
|
return Transform.prototype.pipe.call(this, target)
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
function ToTimestamped
|
|
133
|
+
function ToTimestamped(deMultiplexer, options) {
|
|
134
134
|
Transform.call(this, { objectMode: true })
|
|
135
135
|
this.deMultiplexer = deMultiplexer
|
|
136
136
|
this.options = options
|
package/canboatjs.js
CHANGED
|
@@ -16,21 +16,24 @@
|
|
|
16
16
|
|
|
17
17
|
const Transform = require('stream').Transform
|
|
18
18
|
const FromPgn = require('@canboat/canboatjs').FromPgn
|
|
19
|
-
const debug = require('debug')('signalk:streams:canboatjs')
|
|
20
19
|
const _ = require('lodash')
|
|
21
20
|
|
|
22
|
-
function CanboatJs
|
|
21
|
+
function CanboatJs(options) {
|
|
23
22
|
Transform.call(this, {
|
|
24
|
-
objectMode: true
|
|
23
|
+
objectMode: true,
|
|
25
24
|
})
|
|
26
25
|
|
|
27
26
|
this.fromPgn = new FromPgn(options)
|
|
27
|
+
const createDebug = options.createDebug || require('debug')
|
|
28
|
+
const debug = createDebug('signalk:streams:nmea0183-signalk')
|
|
28
29
|
|
|
29
30
|
this.fromPgn.on('warning', (pgn, warning) => {
|
|
30
31
|
debug(`[warning] ${pgn.pgn} ${warning}`)
|
|
31
32
|
})
|
|
32
33
|
|
|
33
|
-
this.fromPgn.on('error', (pgn, err) => {
|
|
34
|
+
this.fromPgn.on('error', (pgn, err) => {
|
|
35
|
+
console.log(err)
|
|
36
|
+
})
|
|
34
37
|
|
|
35
38
|
this.app = options.app
|
|
36
39
|
}
|
|
@@ -40,14 +43,14 @@ require('util').inherits(CanboatJs, Transform)
|
|
|
40
43
|
CanboatJs.prototype._transform = function (chunk, encoding, done) {
|
|
41
44
|
if (_.isObject(chunk) && chunk.fromFile) {
|
|
42
45
|
const pgnData = this.fromPgn.parse(chunk.data)
|
|
43
|
-
if (
|
|
46
|
+
if (pgnData) {
|
|
44
47
|
pgnData.timestamp = new Date(Number(chunk.timestamp)).toISOString()
|
|
45
48
|
this.push(pgnData)
|
|
46
49
|
this.app.emit('N2KAnalyzerOut', pgnData)
|
|
47
50
|
}
|
|
48
51
|
} else {
|
|
49
52
|
const pgnData = this.fromPgn.parse(chunk)
|
|
50
|
-
if (
|
|
53
|
+
if (pgnData) {
|
|
51
54
|
this.push(pgnData)
|
|
52
55
|
this.app.emit('N2KAnalyzerOut', pgnData)
|
|
53
56
|
}
|
package/execute.js
CHANGED
|
@@ -39,10 +39,11 @@
|
|
|
39
39
|
const Transform = require('stream').Transform
|
|
40
40
|
const { pgnToActisenseSerialFormat } = require('@canboat/canboatjs')
|
|
41
41
|
|
|
42
|
-
function Execute
|
|
42
|
+
function Execute(options) {
|
|
43
43
|
Transform.call(this, {})
|
|
44
44
|
this.options = options
|
|
45
|
-
|
|
45
|
+
const createDebug = options.createDebug || require('debug')
|
|
46
|
+
this.debug = options.debug || createDebug('signalk:streams:execute')
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
require('util').inherits(Execute, Transform)
|
|
@@ -52,7 +53,7 @@ Execute.prototype._transform = function (chunk, encoding, done) {
|
|
|
52
53
|
this.analyzerProcess.stdin.write(chunk.toString())
|
|
53
54
|
done()
|
|
54
55
|
}
|
|
55
|
-
function start
|
|
56
|
+
function start(command, that) {
|
|
56
57
|
that.debug(`starting |${command}|`)
|
|
57
58
|
if (process.platform === 'win32') {
|
|
58
59
|
that.childProcess = require('child_process').spawn('cmd', ['/c', command])
|
|
@@ -75,7 +76,7 @@ function start (command, that) {
|
|
|
75
76
|
that.push(data)
|
|
76
77
|
})
|
|
77
78
|
|
|
78
|
-
that.childProcess.on('close', code => {
|
|
79
|
+
that.childProcess.on('close', (code) => {
|
|
79
80
|
const msg = `|${command}| exited with ${code}`
|
|
80
81
|
// that.options.app.setProviderError(that.options.providerId, msg)
|
|
81
82
|
console.error(msg)
|
|
@@ -106,7 +107,9 @@ Execute.prototype.pipe = function (pipeTo) {
|
|
|
106
107
|
start(this.options.command, this)
|
|
107
108
|
|
|
108
109
|
const stdOutEvent = this.options.toChildProcess || 'toChildProcess'
|
|
109
|
-
this.debug(
|
|
110
|
+
this.debug(
|
|
111
|
+
'Using event ' + stdOutEvent + " for output to child process's stdin"
|
|
112
|
+
)
|
|
110
113
|
const that = this
|
|
111
114
|
that.options.app.on(stdOutEvent, function (d) {
|
|
112
115
|
try {
|
|
@@ -117,7 +120,7 @@ Execute.prototype.pipe = function (pipeTo) {
|
|
|
117
120
|
})
|
|
118
121
|
|
|
119
122
|
if (stdOutEvent === 'nmea2000out') {
|
|
120
|
-
that.options.app.on('nmea2000JsonOut', pgn => {
|
|
123
|
+
that.options.app.on('nmea2000JsonOut', (pgn) => {
|
|
121
124
|
that.childProcess.stdin.write(pgnToActisenseSerialFormat(pgn) + '\r\n')
|
|
122
125
|
})
|
|
123
126
|
that.options.app.emit('nmea2000OutAvailable')
|
package/filestream.js
CHANGED
|
@@ -37,7 +37,7 @@ const path = require('path')
|
|
|
37
37
|
const PassThrough = require('stream').PassThrough
|
|
38
38
|
const fs = require('fs')
|
|
39
39
|
|
|
40
|
-
function EndIgnoringPassThrough
|
|
40
|
+
function EndIgnoringPassThrough() {
|
|
41
41
|
PassThrough.call(this)
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -72,7 +72,7 @@ FileStream.prototype.startStream = function () {
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
this.filestream = require('fs').createReadStream(filename)
|
|
75
|
-
this.filestream.on('error', err => {
|
|
75
|
+
this.filestream.on('error', (err) => {
|
|
76
76
|
console.error(err.message)
|
|
77
77
|
this.keepRunning = false
|
|
78
78
|
})
|
package/folderstream.js
CHANGED
|
@@ -1,39 +1,36 @@
|
|
|
1
|
-
const Transform = require(
|
|
2
|
-
const fs = require(
|
|
1
|
+
const Transform = require('stream').Transform
|
|
2
|
+
const fs = require('fs')
|
|
3
3
|
|
|
4
4
|
function FolderStreamProvider(folder) {
|
|
5
5
|
Transform.call(this, {
|
|
6
6
|
objectMode: false,
|
|
7
|
-
})
|
|
8
|
-
this.folder = folder
|
|
9
|
-
this.fileIndex = 0
|
|
7
|
+
})
|
|
8
|
+
this.folder = folder
|
|
9
|
+
this.fileIndex = 0
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
require(
|
|
12
|
+
require('util').inherits(FolderStreamProvider, Transform)
|
|
13
13
|
|
|
14
|
-
FolderStreamProvider.prototype.pipe = function(pipeTo) {
|
|
15
|
-
const files = fs.readdirSync(this.folder)
|
|
16
|
-
pipeNextFile.bind(this)()
|
|
14
|
+
FolderStreamProvider.prototype.pipe = function (pipeTo) {
|
|
15
|
+
const files = fs.readdirSync(this.folder)
|
|
16
|
+
pipeNextFile.bind(this)()
|
|
17
17
|
|
|
18
18
|
function pipeNextFile() {
|
|
19
19
|
const fileStream = fs.createReadStream(
|
|
20
|
-
this.folder +
|
|
21
|
-
)
|
|
22
|
-
fileStream.pipe(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
);
|
|
26
|
-
fileStream.on("end", () => {
|
|
27
|
-
this.fileIndex++;
|
|
20
|
+
this.folder + '/' + files[this.fileIndex]
|
|
21
|
+
)
|
|
22
|
+
fileStream.pipe(pipeTo, { end: false })
|
|
23
|
+
fileStream.on('end', () => {
|
|
24
|
+
this.fileIndex++
|
|
28
25
|
if (this.fileIndex === files.length) {
|
|
29
|
-
pipeTo.end()
|
|
26
|
+
pipeTo.end()
|
|
30
27
|
} else {
|
|
31
|
-
pipeNextFile.bind(this)()
|
|
28
|
+
pipeNextFile.bind(this)()
|
|
32
29
|
}
|
|
33
|
-
})
|
|
30
|
+
})
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
return pipeTo
|
|
37
|
-
}
|
|
33
|
+
return pipeTo
|
|
34
|
+
}
|
|
38
35
|
|
|
39
|
-
module.exports = FolderStreamProvider
|
|
36
|
+
module.exports = FolderStreamProvider
|
package/from_json.js
CHANGED
package/gpsd.js
CHANGED
|
@@ -32,35 +32,39 @@
|
|
|
32
32
|
|
|
33
33
|
const Transform = require('stream').Transform
|
|
34
34
|
const gpsd = require('node-gpsd')
|
|
35
|
-
const debug = require('debug')('signalk:streams:gpsd')
|
|
36
35
|
|
|
37
|
-
function Gpsd
|
|
36
|
+
function Gpsd(options) {
|
|
38
37
|
Transform.call(this, {
|
|
39
|
-
objectMode: true
|
|
38
|
+
objectMode: true,
|
|
40
39
|
})
|
|
41
|
-
|
|
40
|
+
|
|
42
41
|
const port = options.port || 2947
|
|
43
42
|
const hostname = options.hostname || options.host || 'localhost'
|
|
44
43
|
|
|
45
44
|
function setProviderStatus(msg) {
|
|
46
45
|
options.app.setProviderStatus(options.providerId, msg)
|
|
47
46
|
}
|
|
48
|
-
|
|
47
|
+
|
|
48
|
+
const createDebug = options.createDebug || require('debug')
|
|
49
|
+
|
|
49
50
|
this.listener = new gpsd.Listener({
|
|
50
51
|
port,
|
|
51
52
|
hostname,
|
|
52
53
|
logger: {
|
|
53
|
-
info:
|
|
54
|
+
info: createDebug('signalk:streams:gpsd'),
|
|
54
55
|
warn: console.warn,
|
|
55
56
|
error: (msg) => {
|
|
56
|
-
options.app.setProviderError(
|
|
57
|
-
|
|
57
|
+
options.app.setProviderError(
|
|
58
|
+
options.providerId,
|
|
59
|
+
`${hostname}:${port}: ` + msg
|
|
60
|
+
)
|
|
61
|
+
},
|
|
58
62
|
},
|
|
59
|
-
parse: false
|
|
63
|
+
parse: false,
|
|
60
64
|
})
|
|
61
65
|
|
|
62
66
|
setProviderStatus(`Connecting to ${hostname}:${port}`)
|
|
63
|
-
|
|
67
|
+
|
|
64
68
|
this.listener.connect(function () {
|
|
65
69
|
setProviderStatus(`Connected to ${hostname}:${port}`)
|
|
66
70
|
})
|
|
@@ -72,7 +76,7 @@ function Gpsd (options) {
|
|
|
72
76
|
|
|
73
77
|
this.listener.watch({
|
|
74
78
|
class: 'WATCH',
|
|
75
|
-
nmea: true
|
|
79
|
+
nmea: true,
|
|
76
80
|
})
|
|
77
81
|
}
|
|
78
82
|
|
package/keys-filter.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const Transform = require('stream').Transform
|
|
4
|
-
const debug = require('debug')('signalk:streams:keys-filter')
|
|
5
4
|
|
|
6
|
-
function ToSignalK
|
|
5
|
+
function ToSignalK(options) {
|
|
7
6
|
Transform.call(this, {
|
|
8
|
-
objectMode: true
|
|
7
|
+
objectMode: true,
|
|
9
8
|
})
|
|
10
9
|
|
|
10
|
+
const createDebug = options.createDebug || require('debug')
|
|
11
|
+
this.debug = createDebug('signalk:streams:keys-filter')
|
|
11
12
|
this.exclude = options.excludeMatchingPaths
|
|
12
13
|
}
|
|
13
14
|
|
|
@@ -25,17 +26,17 @@ ToSignalK.prototype._transform = function (chunk, encoding, done) {
|
|
|
25
26
|
delta = JSON.parse(chunk)
|
|
26
27
|
string = true
|
|
27
28
|
} catch (e) {
|
|
28
|
-
debug(`Error parsing chunk: ${e.message}`)
|
|
29
|
+
this.debug(`Error parsing chunk: ${e.message}`)
|
|
29
30
|
}
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
if (Array.isArray(delta.updates)) {
|
|
33
34
|
const updates = []
|
|
34
|
-
delta.updates.forEach(update => {
|
|
35
|
+
delta.updates.forEach((update) => {
|
|
35
36
|
if (Array.isArray(update.values)) {
|
|
36
37
|
const values = []
|
|
37
38
|
|
|
38
|
-
update.values.forEach(value => {
|
|
39
|
+
update.values.forEach((value) => {
|
|
39
40
|
if (this.exclude.includes(value.path) !== true) {
|
|
40
41
|
values.push(value)
|
|
41
42
|
}
|
|
@@ -43,7 +44,7 @@ ToSignalK.prototype._transform = function (chunk, encoding, done) {
|
|
|
43
44
|
|
|
44
45
|
if (values.length > 0) {
|
|
45
46
|
const upd = {
|
|
46
|
-
values
|
|
47
|
+
values,
|
|
47
48
|
}
|
|
48
49
|
|
|
49
50
|
if (update.hasOwnProperty('$source')) {
|
package/liner.js
CHANGED
|
@@ -28,9 +28,9 @@ const Transform = require('stream').Transform
|
|
|
28
28
|
|
|
29
29
|
require('util').inherits(Liner, Transform)
|
|
30
30
|
|
|
31
|
-
function Liner
|
|
31
|
+
function Liner(options) {
|
|
32
32
|
Transform.call(this, {
|
|
33
|
-
objectMode: true
|
|
33
|
+
objectMode: true,
|
|
34
34
|
})
|
|
35
35
|
this.doPush = this.push.bind(this)
|
|
36
36
|
this.lineSeparator = options.lineSeparator || '\n'
|
package/log.js
CHANGED
|
@@ -32,9 +32,9 @@
|
|
|
32
32
|
const Transform = require('stream').Transform
|
|
33
33
|
const getLogger = require('./logging').getLogger
|
|
34
34
|
|
|
35
|
-
function Log
|
|
35
|
+
function Log(options) {
|
|
36
36
|
Transform.call(this, {
|
|
37
|
-
objectMode: true
|
|
37
|
+
objectMode: true,
|
|
38
38
|
})
|
|
39
39
|
|
|
40
40
|
this.logger = getLogger(options.app, options.discriminator, options.logdir)
|
|
@@ -48,7 +48,7 @@ Log.prototype._transform = function (msg, encoding, done) {
|
|
|
48
48
|
done()
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
function pad
|
|
51
|
+
function pad(num) {
|
|
52
52
|
return (num > 9 ? '' : '0') + num
|
|
53
53
|
}
|
|
54
54
|
|
package/logging.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
const { FileTimestampStream } = require('file-timestamp-stream')
|
|
18
18
|
const path = require('path')
|
|
19
|
-
|
|
19
|
+
let debug = require('debug')('signalk:streams:logging')
|
|
20
20
|
const fs = require('fs')
|
|
21
21
|
|
|
22
22
|
const filenamePattern = /skserver\-raw\_\d\d\d\d\-\d\d\-\d\dT\d\d\.log/
|
|
@@ -25,57 +25,58 @@ const loggers = {}
|
|
|
25
25
|
module.exports = {
|
|
26
26
|
getLogger,
|
|
27
27
|
getFullLogDir,
|
|
28
|
-
listLogFiles
|
|
28
|
+
listLogFiles,
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
class FileTimestampStreamWithDelete extends FileTimestampStream {
|
|
32
|
-
constructor(app, fullLogDir, filesToKeep, options){
|
|
32
|
+
constructor(app, fullLogDir, filesToKeep, options) {
|
|
33
33
|
super(options)
|
|
34
34
|
this.app = app
|
|
35
35
|
this.filesToKeep = filesToKeep
|
|
36
36
|
this.fullLogDir = fullLogDir
|
|
37
37
|
this.prevFilename = undefined
|
|
38
|
+
debug = (options.createDebug || require('debug'))('signalk:streams:logging')
|
|
38
39
|
}
|
|
39
40
|
|
|
40
41
|
// This method of base class is called when new file name is contemplated
|
|
41
42
|
// So let's override it to check how many files are there and delete the oldest ones
|
|
42
43
|
newFilename() {
|
|
43
|
-
if (this.prevFilename !== this.currentFilename){
|
|
44
|
+
if (this.prevFilename !== this.currentFilename) {
|
|
45
|
+
// Only do that after new file created
|
|
44
46
|
this.prevFilename = this.currentFilename
|
|
45
47
|
this.deleteOldFiles()
|
|
46
48
|
}
|
|
47
49
|
return super.newFilename()
|
|
48
50
|
}
|
|
49
51
|
|
|
50
|
-
deleteOldFiles(){
|
|
52
|
+
deleteOldFiles() {
|
|
51
53
|
debug(`Checking for old log files`)
|
|
52
54
|
listLogFiles(this.app, (err, files) => {
|
|
53
55
|
if (err) {
|
|
54
|
-
console.error(err)
|
|
55
|
-
}else{
|
|
56
|
+
console.error(err)
|
|
57
|
+
} else {
|
|
56
58
|
if (files.length > this.filesToKeep) {
|
|
57
|
-
const sortedFiles = files.sort()
|
|
58
|
-
const numToDelete =
|
|
59
|
+
const sortedFiles = files.sort()
|
|
60
|
+
const numToDelete = files.length - this.filesToKeep
|
|
59
61
|
debug(`Will delete ${numToDelete} files`)
|
|
60
|
-
for(let i = 0; i < numToDelete; i++){
|
|
62
|
+
for (let i = 0; i < numToDelete; i++) {
|
|
61
63
|
const fileName = path.join(this.fullLogDir, sortedFiles[i])
|
|
62
64
|
debug(`Deleting ${fileName}`)
|
|
63
65
|
fs.unlink(fileName, (err) => {
|
|
64
|
-
if (err){
|
|
66
|
+
if (err) {
|
|
65
67
|
console.error(err)
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
+
} else {
|
|
68
69
|
debug(`${fileName} was deleted`)
|
|
69
70
|
}
|
|
70
|
-
})
|
|
71
|
+
})
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
})
|
|
75
|
+
})
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
|
|
78
|
-
function getLogger
|
|
79
|
+
function getLogger(app, discriminator = '', logdir) {
|
|
79
80
|
const fullLogdir = getFullLogDir(app, logdir)
|
|
80
81
|
|
|
81
82
|
if (!loggers[fullLogdir]) {
|
|
@@ -84,26 +85,28 @@ function getLogger (app, discriminator = '', logdir) {
|
|
|
84
85
|
debug(`logging to ${fileName}`)
|
|
85
86
|
|
|
86
87
|
let fileTimestampStream
|
|
87
|
-
if (app.config.settings.keepMostRecentLogsOnly){
|
|
88
|
+
if (app.config.settings.keepMostRecentLogsOnly) {
|
|
89
|
+
// Delete old logs
|
|
88
90
|
fileTimestampStream = new FileTimestampStreamWithDelete(
|
|
89
|
-
app,
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}else{ // Don't delete any logs
|
|
93
|
-
fileTimestampStream = new FileTimestampStream(
|
|
91
|
+
app,
|
|
92
|
+
fullLogdir,
|
|
93
|
+
app.config.settings.logCountToKeep,
|
|
94
94
|
{ path: fileName }
|
|
95
95
|
)
|
|
96
|
+
} else {
|
|
97
|
+
// Don't delete any logs
|
|
98
|
+
fileTimestampStream = new FileTimestampStream({ path: fileName })
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
loggers[fullLogdir] = fileTimestampStream
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
const logger = loggers[fullLogdir]
|
|
102
|
-
logger.on('error', err => {
|
|
105
|
+
logger.on('error', (err) => {
|
|
103
106
|
console.error(`Error opening data logging file: ${err.message}`)
|
|
104
107
|
})
|
|
105
108
|
|
|
106
|
-
return msg => {
|
|
109
|
+
return (msg) => {
|
|
107
110
|
try {
|
|
108
111
|
logger.write(
|
|
109
112
|
Date.now() +
|
|
@@ -119,7 +122,7 @@ function getLogger (app, discriminator = '', logdir) {
|
|
|
119
122
|
}
|
|
120
123
|
}
|
|
121
124
|
|
|
122
|
-
function getFullLogDir
|
|
125
|
+
function getFullLogDir(app, logdir) {
|
|
123
126
|
if (!logdir) {
|
|
124
127
|
logdir = app.config.settings.loggingDirectory || app.config.configPath
|
|
125
128
|
}
|
|
@@ -128,10 +131,13 @@ function getFullLogDir (app, logdir) {
|
|
|
128
131
|
: path.join(app.config.configPath, logdir)
|
|
129
132
|
}
|
|
130
133
|
|
|
131
|
-
function listLogFiles
|
|
134
|
+
function listLogFiles(app, cb) {
|
|
132
135
|
fs.readdir(getFullLogDir(app), (err, files) => {
|
|
133
136
|
if (!err) {
|
|
134
|
-
cb(
|
|
137
|
+
cb(
|
|
138
|
+
undefined,
|
|
139
|
+
files.filter((filename) => filename.match(filenamePattern))
|
|
140
|
+
)
|
|
135
141
|
} else {
|
|
136
142
|
cb(err)
|
|
137
143
|
}
|