@signalk/streams 5.1.3 → 6.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 (132) hide show
  1. package/dist/actisense-serial.d.ts +3 -0
  2. package/dist/actisense-serial.d.ts.map +1 -0
  3. package/dist/actisense-serial.js +4 -0
  4. package/dist/autodetect.d.ts +54 -0
  5. package/dist/autodetect.d.ts.map +1 -0
  6. package/dist/autodetect.js +186 -0
  7. package/dist/canboatjs.d.ts +25 -0
  8. package/dist/canboatjs.d.ts.map +1 -0
  9. package/dist/canboatjs.js +57 -0
  10. package/dist/canbus.d.ts +3 -0
  11. package/dist/canbus.d.ts.map +1 -0
  12. package/dist/canbus.js +4 -0
  13. package/dist/execute.d.ts +34 -0
  14. package/dist/execute.d.ts.map +1 -0
  15. package/dist/execute.js +101 -0
  16. package/dist/filestream.d.ts +24 -0
  17. package/dist/filestream.d.ts.map +1 -0
  18. package/dist/filestream.js +58 -0
  19. package/dist/folderstream.d.ts +12 -0
  20. package/dist/folderstream.d.ts.map +1 -0
  21. package/dist/folderstream.js +36 -0
  22. package/dist/from_json.d.ts +6 -0
  23. package/dist/from_json.d.ts.map +1 -0
  24. package/dist/from_json.js +22 -0
  25. package/dist/gpiod-seatalk.d.ts +19 -0
  26. package/dist/gpiod-seatalk.d.ts.map +1 -0
  27. package/{gpiod-seatalk.js → dist/gpiod-seatalk.js} +18 -16
  28. package/dist/gpsd.d.ts +23 -0
  29. package/dist/gpsd.d.ts.map +1 -0
  30. package/dist/gpsd.js +55 -0
  31. package/dist/index.d.ts +5 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +14 -0
  34. package/dist/keys-filter.d.ts +27 -0
  35. package/dist/keys-filter.d.ts.map +1 -0
  36. package/dist/keys-filter.js +59 -0
  37. package/dist/liner.d.ts +14 -0
  38. package/dist/liner.d.ts.map +1 -0
  39. package/dist/liner.js +35 -0
  40. package/dist/log.d.ts +15 -0
  41. package/dist/log.d.ts.map +1 -0
  42. package/dist/log.js +17 -0
  43. package/dist/logging.d.ts +14 -0
  44. package/dist/logging.d.ts.map +1 -0
  45. package/dist/logging.js +125 -0
  46. package/dist/mdns-ws.d.ts +37 -0
  47. package/dist/mdns-ws.d.ts.map +1 -0
  48. package/dist/mdns-ws.js +144 -0
  49. package/dist/multiplexedlog.d.ts +3 -0
  50. package/dist/multiplexedlog.d.ts.map +1 -0
  51. package/dist/multiplexedlog.js +7 -0
  52. package/dist/n2k-signalk.d.ts +39 -0
  53. package/dist/n2k-signalk.d.ts.map +1 -0
  54. package/dist/n2k-signalk.js +180 -0
  55. package/dist/n2kAnalyzer.d.ts +19 -0
  56. package/dist/n2kAnalyzer.d.ts.map +1 -0
  57. package/dist/n2kAnalyzer.js +61 -0
  58. package/dist/nmea0183-signalk.d.ts +33 -0
  59. package/dist/nmea0183-signalk.d.ts.map +1 -0
  60. package/dist/nmea0183-signalk.js +105 -0
  61. package/dist/nullprovider.d.ts +5 -0
  62. package/dist/nullprovider.d.ts.map +1 -0
  63. package/dist/nullprovider.js +9 -0
  64. package/dist/pigpio-seatalk.d.ts +19 -0
  65. package/dist/pigpio-seatalk.d.ts.map +1 -0
  66. package/{pigpio-seatalk.js → dist/pigpio-seatalk.js} +21 -18
  67. package/dist/replacer.d.ts +13 -0
  68. package/dist/replacer.d.ts.map +1 -0
  69. package/dist/replacer.js +20 -0
  70. package/dist/s3.d.ts +13 -0
  71. package/dist/s3.d.ts.map +1 -0
  72. package/dist/s3.js +82 -0
  73. package/dist/serialport.d.ts +35 -0
  74. package/dist/serialport.d.ts.map +1 -0
  75. package/dist/serialport.js +125 -0
  76. package/dist/simple.d.ts +78 -0
  77. package/dist/simple.d.ts.map +1 -0
  78. package/dist/simple.js +446 -0
  79. package/dist/splitting-liner.d.ts +12 -0
  80. package/dist/splitting-liner.d.ts.map +1 -0
  81. package/dist/splitting-liner.js +19 -0
  82. package/dist/tcp.d.ts +32 -0
  83. package/dist/tcp.d.ts.map +1 -0
  84. package/dist/tcp.js +113 -0
  85. package/dist/tcpserver.d.ts +14 -0
  86. package/dist/tcpserver.d.ts.map +1 -0
  87. package/dist/tcpserver.js +18 -0
  88. package/dist/test-helpers.d.ts +52 -0
  89. package/dist/test-helpers.d.ts.map +1 -0
  90. package/dist/test-helpers.js +73 -0
  91. package/dist/throttle.d.ts +3 -0
  92. package/dist/throttle.d.ts.map +1 -0
  93. package/dist/throttle.js +4 -0
  94. package/dist/timestamp-throttle.d.ts +17 -0
  95. package/dist/timestamp-throttle.d.ts.map +1 -0
  96. package/dist/timestamp-throttle.js +41 -0
  97. package/dist/types.d.ts +8 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +2 -0
  100. package/dist/udp.d.ts +26 -0
  101. package/dist/udp.d.ts.map +1 -0
  102. package/dist/udp.js +53 -0
  103. package/package.json +46 -4
  104. package/actisense-serial.js +0 -1
  105. package/autodetect.js +0 -198
  106. package/canboatjs.js +0 -71
  107. package/canbus.js +0 -17
  108. package/execute.js +0 -137
  109. package/filestream.js +0 -90
  110. package/folderstream.js +0 -36
  111. package/from_json.js +0 -51
  112. package/gpsd.js +0 -94
  113. package/keys-filter.js +0 -81
  114. package/liner.js +0 -68
  115. package/log.js +0 -51
  116. package/logging.js +0 -149
  117. package/mdns-ws.js +0 -167
  118. package/multiplexedlog.js +0 -3
  119. package/n2k-signalk.js +0 -195
  120. package/n2kAnalyzer.js +0 -82
  121. package/nmea0183-signalk.js +0 -119
  122. package/nullprovider.js +0 -31
  123. package/replacer.js +0 -57
  124. package/s3.js +0 -87
  125. package/serialport.js +0 -209
  126. package/simple.js +0 -446
  127. package/splitting-liner.js +0 -46
  128. package/tcp.js +0 -138
  129. package/tcpserver.js +0 -40
  130. package/throttle.js +0 -31
  131. package/timestamp-throttle.js +0 -63
  132. package/udp.js +0 -95
@@ -0,0 +1,3 @@
1
+ import { serial } from '@canboat/canboatjs';
2
+ export default serial;
3
+ //# sourceMappingURL=actisense-serial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actisense-serial.d.ts","sourceRoot":"","sources":["../src/actisense-serial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,eAAe,MAAM,CAAA"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const canboatjs_1 = require("@canboat/canboatjs");
4
+ exports.default = canboatjs_1.serial;
@@ -0,0 +1,54 @@
1
+ import { Writable, Transform, TransformCallback } from 'stream';
2
+ import TimestampThrottle from './timestamp-throttle';
3
+ import type { DeltaCache } from './types';
4
+ interface AutodetectOptions {
5
+ app: {
6
+ selfContext: string;
7
+ isNmea2000OutAvailable: boolean;
8
+ deltaCache: DeltaCache;
9
+ on(event: string, cb: (...args: any[]) => void): void;
10
+ emit(event: string, ...args: unknown[]): void;
11
+ handleMessage(id: string, delta: object): void;
12
+ signalk: {
13
+ emit(event: string, ...args: unknown[]): void;
14
+ };
15
+ };
16
+ providerId: string;
17
+ noThrottle?: boolean;
18
+ useCanboatjs?: boolean;
19
+ [key: string]: unknown;
20
+ }
21
+ interface TimestampedMessage {
22
+ timestamp: number | string;
23
+ discriminator: string;
24
+ data: string;
25
+ fromFile?: boolean;
26
+ }
27
+ declare class ToTimestamped extends Transform {
28
+ private readonly deMultiplexer;
29
+ private readonly options;
30
+ private multiplexedFormat;
31
+ constructor(deMultiplexer: DeMultiplexer, options: AutodetectOptions);
32
+ _transform(msg: string | Buffer, encoding: BufferEncoding, done: TransformCallback): void;
33
+ private handleMixed;
34
+ private handleMultiplexed;
35
+ }
36
+ declare class Splitter extends Transform {
37
+ private readonly demuxEmitData;
38
+ private readonly fromN2KJson;
39
+ private readonly fromActisenseSerial;
40
+ private readonly fromNMEA0183;
41
+ constructor(deMultiplexer: DeMultiplexer, options: AutodetectOptions);
42
+ _transform(msg: TimestampedMessage, encoding: BufferEncoding, done: TransformCallback): void;
43
+ pipe<T extends NodeJS.WritableStream>(target: T): T;
44
+ }
45
+ export default class DeMultiplexer extends Writable {
46
+ readonly toTimestamped: ToTimestamped;
47
+ readonly timestampThrottle: TimestampThrottle;
48
+ readonly splitter: Splitter;
49
+ constructor(options: AutodetectOptions);
50
+ pipe<T extends NodeJS.WritableStream>(target: T): T;
51
+ write(chunk: unknown, encodingOrCallback?: BufferEncoding | ((error?: Error | null) => void), callback?: (error?: Error | null) => void): boolean;
52
+ }
53
+ export {};
54
+ //# sourceMappingURL=autodetect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autodetect.d.ts","sourceRoot":"","sources":["../src/autodetect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2016 Teppo Kurki <teppo.kurki@iki.fi>
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ const stream_1 = require("stream");
22
+ const timestamp_throttle_1 = __importDefault(require("./timestamp-throttle"));
23
+ const n2k_signalk_1 = __importDefault(require("./n2k-signalk"));
24
+ const n2kAnalyzer_1 = __importDefault(require("./n2kAnalyzer"));
25
+ const canboatjs_1 = __importDefault(require("./canboatjs"));
26
+ const nmea0183_signalk_1 = __importDefault(require("./nmea0183-signalk"));
27
+ class ToTimestamped extends stream_1.Transform {
28
+ deMultiplexer;
29
+ options;
30
+ multiplexedFormat = false;
31
+ constructor(deMultiplexer, options) {
32
+ super({ objectMode: true });
33
+ this.deMultiplexer = deMultiplexer;
34
+ this.options = options;
35
+ }
36
+ _transform(msg, encoding, done) {
37
+ const str = msg.toString();
38
+ if (str.trim().length === 0) {
39
+ done();
40
+ return;
41
+ }
42
+ this.multiplexedFormat =
43
+ str.length > 16 && str.charAt(13) === ';' && str.split(';').length >= 3;
44
+ if (this.multiplexedFormat) {
45
+ if (this.options.noThrottle) {
46
+ this.deMultiplexer.toTimestamped.pipe(this.deMultiplexer.splitter);
47
+ }
48
+ else {
49
+ this.deMultiplexer.toTimestamped
50
+ .pipe(this.deMultiplexer.timestampThrottle)
51
+ .pipe(this.deMultiplexer.splitter);
52
+ }
53
+ this._transform = this.handleMultiplexed;
54
+ }
55
+ else {
56
+ this._transform = this.handleMixed;
57
+ }
58
+ this._transform(msg, encoding, done);
59
+ }
60
+ handleMixed(msg, encoding, done) {
61
+ const line = msg.toString();
62
+ const res = {
63
+ timestamp: new Date().getTime(),
64
+ data: line,
65
+ discriminator: 'I'
66
+ };
67
+ if (line.charAt(0) === '{') {
68
+ res.discriminator = 'I';
69
+ }
70
+ else if ((line.charAt(0) === '$' || line.charAt(0) === '!') &&
71
+ !line.startsWith('!PDGY')) {
72
+ res.discriminator = 'N';
73
+ }
74
+ else {
75
+ res.discriminator = 'A';
76
+ }
77
+ this.push(res);
78
+ done();
79
+ }
80
+ handleMultiplexed(msg, encoding, done) {
81
+ const line = msg.toString();
82
+ const parts = line.split(';');
83
+ this.push({
84
+ timestamp: parts[0],
85
+ discriminator: parts[1],
86
+ data: parts.slice(2).join(';')
87
+ });
88
+ done();
89
+ }
90
+ }
91
+ class Splitter extends stream_1.Transform {
92
+ demuxEmitData;
93
+ fromN2KJson;
94
+ fromActisenseSerial;
95
+ fromNMEA0183;
96
+ constructor(deMultiplexer, options) {
97
+ super({ objectMode: true });
98
+ this.demuxEmitData = (msg) => {
99
+ deMultiplexer.emit('data', msg);
100
+ };
101
+ this.fromN2KJson = new n2k_signalk_1.default(options);
102
+ this.fromN2KJson.on('data', this.demuxEmitData);
103
+ if (options.useCanboatjs === undefined || options.useCanboatjs) {
104
+ this.fromActisenseSerial = new canboatjs_1.default(options);
105
+ }
106
+ else {
107
+ this.fromActisenseSerial = new n2kAnalyzer_1.default(options);
108
+ }
109
+ this.fromActisenseSerial.pipe(this.fromN2KJson);
110
+ this.fromNMEA0183 = new nmea0183_signalk_1.default(options);
111
+ this.fromNMEA0183.on('data', this.demuxEmitData);
112
+ }
113
+ _transform(msg, encoding, done) {
114
+ let actualDone = done;
115
+ try {
116
+ switch (msg.discriminator) {
117
+ case 'A': {
118
+ msg.fromFile = true;
119
+ const result = this.fromActisenseSerial.write(msg, encoding);
120
+ if (!result) {
121
+ this.fromActisenseSerial.once('drain', done);
122
+ actualDone = () => { };
123
+ }
124
+ break;
125
+ }
126
+ case 'C':
127
+ case 'N':
128
+ case 'G':
129
+ case 'M':
130
+ this.fromNMEA0183.write({ line: msg.data, timestamp: msg.timestamp }, encoding);
131
+ break;
132
+ case 'I':
133
+ default:
134
+ try {
135
+ const parsed = JSON.parse(msg.data);
136
+ const timestamp = new Date(Number(msg.timestamp));
137
+ if (parsed.updates) {
138
+ parsed.updates.forEach((update) => {
139
+ update.timestamp = timestamp;
140
+ });
141
+ }
142
+ this.push(parsed);
143
+ this.demuxEmitData(parsed);
144
+ }
145
+ catch (e) {
146
+ console.error(e);
147
+ }
148
+ break;
149
+ }
150
+ }
151
+ finally {
152
+ actualDone();
153
+ }
154
+ }
155
+ pipe(target) {
156
+ this.fromN2KJson.pipe(target);
157
+ this.fromNMEA0183.pipe(target);
158
+ return stream_1.Transform.prototype.pipe.call(this, target);
159
+ }
160
+ }
161
+ class DeMultiplexer extends stream_1.Writable {
162
+ toTimestamped;
163
+ timestampThrottle;
164
+ splitter;
165
+ constructor(options) {
166
+ super();
167
+ this.toTimestamped = new ToTimestamped(this, options);
168
+ this.timestampThrottle = new timestamp_throttle_1.default({
169
+ getMilliseconds: (msg) => typeof msg.timestamp === 'string'
170
+ ? Number(msg.timestamp)
171
+ : msg.timestamp
172
+ });
173
+ this.splitter = new Splitter(this, options);
174
+ this.toTimestamped.on('drain', this.emit.bind(this, 'drain'));
175
+ }
176
+ pipe(target) {
177
+ return this.splitter.pipe(target);
178
+ }
179
+ write(chunk, encodingOrCallback, callback) {
180
+ if (typeof encodingOrCallback === 'function') {
181
+ return this.toTimestamped.write(chunk, encodingOrCallback);
182
+ }
183
+ return this.toTimestamped.write(chunk, encodingOrCallback ?? 'utf8', callback);
184
+ }
185
+ }
186
+ exports.default = DeMultiplexer;
@@ -0,0 +1,25 @@
1
+ import { Transform, TransformCallback } from 'stream';
2
+ import type { CreateDebug } from './types';
3
+ interface CanboatJsOptions {
4
+ app: {
5
+ emit(event: string, ...args: unknown[]): void;
6
+ };
7
+ analyzerOutEvent?: string;
8
+ useCamelCompat?: boolean;
9
+ createDebug?: CreateDebug;
10
+ [key: string]: unknown;
11
+ }
12
+ interface FileChunk {
13
+ fromFile: boolean;
14
+ data: string;
15
+ timestamp: string;
16
+ }
17
+ export default class CanboatJs extends Transform {
18
+ private readonly fromPgn;
19
+ private readonly app;
20
+ private readonly analyzerOutEvent;
21
+ constructor(options: CanboatJsOptions);
22
+ _transform(chunk: Buffer | FileChunk, encoding: BufferEncoding, done: TransformCallback): void;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=canboatjs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canboatjs.d.ts","sourceRoot":"","sources":["../src/canboatjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,UAAU,gBAAgB;IACxB,GAAG,EAAE;QACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;KAC9C,CAAA;IACD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,SAAS;IACjB,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,SAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAE7B,OAAO,EAAE,gBAAgB;IAyBrC,UAAU,CACR,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CA0BR"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const stream_1 = require("stream");
4
+ const canboatjs_1 = require("@canboat/canboatjs");
5
+ class CanboatJs extends stream_1.Transform {
6
+ fromPgn;
7
+ app;
8
+ analyzerOutEvent;
9
+ constructor(options) {
10
+ super({ objectMode: true });
11
+ const opts = {
12
+ ...options,
13
+ useCamelCompat: options.useCamelCompat ?? true
14
+ };
15
+ this.fromPgn = new canboatjs_1.FromPgn(opts);
16
+ const createDebug = options.createDebug ?? require('debug');
17
+ const debug = createDebug('signalk:streams:canboatjs');
18
+ this.fromPgn.on('warning', (pgn, warning) => {
19
+ debug(`[warning] ${pgn.pgn} ${warning}`);
20
+ options.app.emit('canboatjs:warning', warning);
21
+ });
22
+ this.fromPgn.on('error', (pgn, err) => {
23
+ console.error(pgn.input, err.message);
24
+ options.app.emit('canboatjs:error', err);
25
+ });
26
+ this.app = options.app;
27
+ this.analyzerOutEvent = options.analyzerOutEvent ?? 'N2KAnalyzerOut';
28
+ }
29
+ _transform(chunk, encoding, done) {
30
+ if (typeof chunk === 'object' &&
31
+ chunk !== null &&
32
+ 'fromFile' in chunk &&
33
+ chunk.fromFile) {
34
+ const pgnData = this.fromPgn.parse(chunk.data);
35
+ if (pgnData) {
36
+ pgnData.timestamp = new Date(Number(chunk.timestamp)).toISOString();
37
+ this.push(pgnData);
38
+ this.app.emit(this.analyzerOutEvent, pgnData);
39
+ }
40
+ else {
41
+ this.app.emit('canboatjs:unparsed:object', chunk);
42
+ }
43
+ }
44
+ else {
45
+ const pgnData = this.fromPgn.parse(chunk);
46
+ if (pgnData) {
47
+ this.push(pgnData);
48
+ this.app.emit(this.analyzerOutEvent, pgnData);
49
+ }
50
+ else {
51
+ this.app.emit('canboatjs:unparsed:data', chunk);
52
+ }
53
+ }
54
+ done();
55
+ }
56
+ }
57
+ exports.default = CanboatJs;
@@ -0,0 +1,3 @@
1
+ import { canbus } from '@canboat/canboatjs';
2
+ export default canbus;
3
+ //# sourceMappingURL=canbus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canbus.d.ts","sourceRoot":"","sources":["../src/canbus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,eAAe,MAAM,CAAA"}
package/dist/canbus.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const canboatjs_1 = require("@canboat/canboatjs");
4
+ exports.default = canboatjs_1.canbus;
@@ -0,0 +1,34 @@
1
+ import { ChildProcess } from 'child_process';
2
+ import { Transform, TransformCallback } from 'stream';
3
+ import type { CreateDebug, DebugLogger } from './types';
4
+ interface ExecuteOptions {
5
+ command: string;
6
+ app: {
7
+ on(event: string, cb: (...args: any[]) => void): void;
8
+ emit(event: string, ...args: unknown[]): void;
9
+ setProviderStatus(id: string, msg: string): void;
10
+ setProviderError(id: string, msg: string): void;
11
+ };
12
+ providerId: string;
13
+ toChildProcess?: string;
14
+ restartOnClose?: boolean;
15
+ restartThrottleTime?: number;
16
+ createDebug?: CreateDebug;
17
+ debug?: DebugLogger;
18
+ [key: string]: unknown;
19
+ }
20
+ export default class Execute extends Transform {
21
+ private readonly options;
22
+ private readonly debug;
23
+ childProcess: ChildProcess;
24
+ private pipeTo;
25
+ private lastStartupTime;
26
+ private stopped;
27
+ constructor(options: ExecuteOptions);
28
+ _transform(chunk: Buffer, encoding: BufferEncoding, done: TransformCallback): void;
29
+ pipe<T extends NodeJS.WritableStream>(pipeTo: T): T;
30
+ end(): this;
31
+ private startProcess;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../src/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAS,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAY,MAAM,QAAQ,CAAA;AAG/D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAEvD,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE;QAEH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAA;QACrD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QAC7C,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;QAChD,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAChD,CAAA;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,YAAY,EAAG,YAAY,CAAA;IAC3B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,EAAE,cAAc;IAOnC,UAAU,CACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;IAKP,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;IA6BnD,GAAG,IAAI,IAAI;IAUX,OAAO,CAAC,YAAY;CAgDrB"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const child_process_1 = require("child_process");
4
+ const stream_1 = require("stream");
5
+ const canboatjs_1 = require("@canboat/canboatjs");
6
+ class Execute extends stream_1.Transform {
7
+ options;
8
+ debug;
9
+ childProcess;
10
+ pipeTo = null;
11
+ lastStartupTime = 0;
12
+ stopped = false;
13
+ constructor(options) {
14
+ super({});
15
+ this.options = options;
16
+ const createDebug = options.createDebug ?? require('debug');
17
+ this.debug = options.debug ?? createDebug('signalk:streams:execute');
18
+ }
19
+ _transform(chunk, encoding, done) {
20
+ this.childProcess.stdin?.write(chunk.toString());
21
+ done();
22
+ }
23
+ pipe(pipeTo) {
24
+ this.pipeTo = pipeTo;
25
+ this.startProcess(this.options.command);
26
+ const stdOutEvent = this.options.toChildProcess ?? 'toChildProcess';
27
+ this.debug('Using event ' + stdOutEvent + " for output to child process's stdin");
28
+ this.options.app.on(stdOutEvent, (d) => {
29
+ try {
30
+ this.childProcess.stdin?.write(d + '\n');
31
+ }
32
+ catch (err) {
33
+ const message = err instanceof Error ? err.message : String(err);
34
+ console.log('execute:' + message);
35
+ }
36
+ });
37
+ if (stdOutEvent === 'nmea2000out') {
38
+ this.options.app.on('nmea2000JsonOut', (pgn) => {
39
+ this.childProcess.stdin?.write((0, canboatjs_1.pgnToActisenseSerialFormat)(pgn) + '\r\n');
40
+ });
41
+ this.options.app.emit('nmea2000OutAvailable');
42
+ }
43
+ super.pipe(pipeTo);
44
+ return pipeTo;
45
+ }
46
+ end() {
47
+ this.debug('end, killing child process');
48
+ this.stopped = true;
49
+ this.childProcess.kill();
50
+ if (this.pipeTo) {
51
+ this.pipeTo.end();
52
+ }
53
+ return this;
54
+ }
55
+ startProcess(command) {
56
+ this.debug(`starting |${command}|`);
57
+ if (process.platform === 'win32') {
58
+ this.childProcess = (0, child_process_1.spawn)('cmd', ['/c', command]);
59
+ }
60
+ else {
61
+ this.childProcess = (0, child_process_1.spawn)('sh', ['-c', command]);
62
+ }
63
+ this.lastStartupTime = Date.now();
64
+ this.options.app.setProviderStatus(this.options.providerId, 'Started');
65
+ this.childProcess.stderr?.on('data', (data) => {
66
+ const msg = data.toString();
67
+ this.options.app.setProviderError(this.options.providerId, msg);
68
+ console.error(msg);
69
+ });
70
+ this.childProcess.stdout?.on('data', (data) => {
71
+ if (this.debug.enabled) {
72
+ this.debug(data.toString());
73
+ }
74
+ this.push(data);
75
+ });
76
+ this.childProcess.on('close', (code) => {
77
+ const msg = `|${command}| exited with ${code}`;
78
+ console.error(msg);
79
+ if (this.stopped)
80
+ return;
81
+ if (this.options.restartOnClose === undefined ||
82
+ this.options.restartOnClose) {
83
+ const throttleTime = (this.options.restartThrottleTime ?? 60) * 1000;
84
+ const sinceLast = Date.now() - this.lastStartupTime;
85
+ if (sinceLast > throttleTime) {
86
+ this.startProcess(command);
87
+ }
88
+ else {
89
+ const nextStart = throttleTime - sinceLast;
90
+ const waitMsg = `Waiting ${nextStart / 1000} seconds to restart`;
91
+ this.options.app.setProviderStatus(this.options.providerId, waitMsg);
92
+ this.debug(waitMsg);
93
+ setTimeout(() => {
94
+ this.startProcess(command);
95
+ }, nextStart);
96
+ }
97
+ }
98
+ });
99
+ }
100
+ }
101
+ exports.default = Execute;
@@ -0,0 +1,24 @@
1
+ import { Writable } from 'stream';
2
+ interface FileStreamOptions {
3
+ filename: string;
4
+ app: {
5
+ config: {
6
+ configPath: string;
7
+ };
8
+ };
9
+ keepRunning?: boolean;
10
+ [key: string]: unknown;
11
+ }
12
+ export default class FileStream {
13
+ private readonly options;
14
+ private keepRunning;
15
+ private pipeTo;
16
+ private endIgnoringPassThrough;
17
+ private filestream;
18
+ constructor(options: FileStreamOptions);
19
+ pipe<T extends Writable>(pipeTo: T): T;
20
+ startStream(): void;
21
+ end(): void;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=filestream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filestream.d.ts","sourceRoot":"","sources":["../src/filestream.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAO9C,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE;QACH,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAA;SAAE,CAAA;KAC/B,CAAA;IACD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,sBAAsB,CAAsC;IACpE,OAAO,CAAC,UAAU,CAA0B;gBAEhC,OAAO,EAAE,iBAAiB;IAKtC,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;IAQtC,WAAW,IAAI,IAAI;IAsBnB,GAAG,IAAI,IAAI;CAQZ"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs_1 = require("fs");
4
+ const path_1 = require("path");
5
+ const stream_1 = require("stream");
6
+ class EndIgnoringPassThrough extends stream_1.PassThrough {
7
+ end() {
8
+ return this;
9
+ }
10
+ }
11
+ class FileStream {
12
+ options;
13
+ keepRunning;
14
+ pipeTo = null;
15
+ endIgnoringPassThrough = null;
16
+ filestream = null;
17
+ constructor(options) {
18
+ this.options = options;
19
+ this.keepRunning = options.keepRunning ?? true;
20
+ }
21
+ pipe(pipeTo) {
22
+ this.pipeTo = pipeTo;
23
+ this.endIgnoringPassThrough = new EndIgnoringPassThrough();
24
+ this.endIgnoringPassThrough.pipe(pipeTo);
25
+ this.startStream();
26
+ return pipeTo;
27
+ }
28
+ startStream() {
29
+ let filename;
30
+ if ((0, path_1.isAbsolute)(this.options.filename)) {
31
+ filename = this.options.filename;
32
+ }
33
+ else {
34
+ filename = (0, path_1.join)(this.options.app.config.configPath, this.options.filename);
35
+ if (!(0, fs_1.existsSync)(filename)) {
36
+ filename = (0, path_1.join)(__dirname, '..', this.options.filename);
37
+ }
38
+ }
39
+ this.filestream = (0, fs_1.createReadStream)(filename);
40
+ this.filestream.on('error', (err) => {
41
+ console.error(err.message);
42
+ this.keepRunning = false;
43
+ });
44
+ if (this.keepRunning) {
45
+ this.filestream.on('end', () => this.startStream());
46
+ }
47
+ this.filestream.pipe(this.endIgnoringPassThrough);
48
+ }
49
+ end() {
50
+ if (this.pipeTo) {
51
+ this.pipeTo.end();
52
+ }
53
+ if (this.filestream) {
54
+ this.filestream.close();
55
+ }
56
+ }
57
+ }
58
+ exports.default = FileStream;
@@ -0,0 +1,12 @@
1
+ import { Transform } from 'stream';
2
+ interface FolderStreamOptions {
3
+ folder: string;
4
+ }
5
+ export default class FolderStream extends Transform {
6
+ private readonly folder;
7
+ private fileIndex;
8
+ constructor(options: FolderStreamOptions);
9
+ pipe<T extends NodeJS.WritableStream>(pipeTo: T): T;
10
+ }
11
+ export {};
12
+ //# sourceMappingURL=folderstream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folderstream.d.ts","sourceRoot":"","sources":["../src/folderstream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,UAAU,mBAAmB;IAC3B,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,SAAS,CAAI;gBAET,OAAO,EAAE,mBAAmB;IAKxC,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC;CAwBpD"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fs_1 = require("fs");
4
+ const stream_1 = require("stream");
5
+ class FolderStream extends stream_1.Transform {
6
+ folder;
7
+ fileIndex = 0;
8
+ constructor(options) {
9
+ super({ objectMode: false });
10
+ this.folder = options.folder;
11
+ }
12
+ pipe(pipeTo) {
13
+ const files = (0, fs_1.readdirSync)(this.folder);
14
+ const pipeNextFile = () => {
15
+ const file = files[this.fileIndex];
16
+ if (!file) {
17
+ pipeTo.end();
18
+ return;
19
+ }
20
+ const fileStream = (0, fs_1.createReadStream)(this.folder + '/' + file);
21
+ fileStream.pipe(pipeTo, { end: false });
22
+ fileStream.on('end', () => {
23
+ this.fileIndex++;
24
+ if (this.fileIndex === files.length) {
25
+ pipeTo.end();
26
+ }
27
+ else {
28
+ pipeNextFile();
29
+ }
30
+ });
31
+ };
32
+ pipeNextFile();
33
+ return pipeTo;
34
+ }
35
+ }
36
+ exports.default = FolderStream;
@@ -0,0 +1,6 @@
1
+ import { Transform, TransformCallback } from 'stream';
2
+ export default class FromJson extends Transform {
3
+ constructor();
4
+ _transform(chunk: Buffer, encoding: BufferEncoding, done: TransformCallback): void;
5
+ }
6
+ //# sourceMappingURL=from_json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from_json.d.ts","sourceRoot":"","sources":["../src/from_json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;;IAK7C,UAAU,CACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CAYR"}