@signalk/streams 5.1.4 → 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.
- package/dist/actisense-serial.d.ts +3 -0
- package/dist/actisense-serial.d.ts.map +1 -0
- package/dist/actisense-serial.js +4 -0
- package/dist/autodetect.d.ts +54 -0
- package/dist/autodetect.d.ts.map +1 -0
- package/dist/autodetect.js +186 -0
- package/dist/canboatjs.d.ts +25 -0
- package/dist/canboatjs.d.ts.map +1 -0
- package/dist/canboatjs.js +57 -0
- package/dist/canbus.d.ts +3 -0
- package/dist/canbus.d.ts.map +1 -0
- package/dist/canbus.js +4 -0
- package/dist/execute.d.ts +34 -0
- package/dist/execute.d.ts.map +1 -0
- package/dist/execute.js +101 -0
- package/dist/filestream.d.ts +24 -0
- package/dist/filestream.d.ts.map +1 -0
- package/dist/filestream.js +58 -0
- package/dist/folderstream.d.ts +12 -0
- package/dist/folderstream.d.ts.map +1 -0
- package/dist/folderstream.js +36 -0
- package/dist/from_json.d.ts +6 -0
- package/dist/from_json.d.ts.map +1 -0
- package/dist/from_json.js +22 -0
- package/dist/gpiod-seatalk.d.ts +19 -0
- package/dist/gpiod-seatalk.d.ts.map +1 -0
- package/{gpiod-seatalk.js → dist/gpiod-seatalk.js} +18 -16
- package/dist/gpsd.d.ts +23 -0
- package/dist/gpsd.d.ts.map +1 -0
- package/dist/gpsd.js +55 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/keys-filter.d.ts +27 -0
- package/dist/keys-filter.d.ts.map +1 -0
- package/dist/keys-filter.js +59 -0
- package/dist/liner.d.ts +14 -0
- package/dist/liner.d.ts.map +1 -0
- package/dist/liner.js +35 -0
- package/dist/log.d.ts +15 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +17 -0
- package/dist/logging.d.ts +14 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +125 -0
- package/dist/mdns-ws.d.ts +37 -0
- package/dist/mdns-ws.d.ts.map +1 -0
- package/dist/mdns-ws.js +144 -0
- package/dist/multiplexedlog.d.ts +3 -0
- package/dist/multiplexedlog.d.ts.map +1 -0
- package/dist/multiplexedlog.js +7 -0
- package/dist/n2k-signalk.d.ts +39 -0
- package/dist/n2k-signalk.d.ts.map +1 -0
- package/dist/n2k-signalk.js +180 -0
- package/dist/n2kAnalyzer.d.ts +19 -0
- package/dist/n2kAnalyzer.d.ts.map +1 -0
- package/dist/n2kAnalyzer.js +61 -0
- package/dist/nmea0183-signalk.d.ts +33 -0
- package/dist/nmea0183-signalk.d.ts.map +1 -0
- package/dist/nmea0183-signalk.js +105 -0
- package/dist/nullprovider.d.ts +5 -0
- package/dist/nullprovider.d.ts.map +1 -0
- package/dist/nullprovider.js +9 -0
- package/dist/pigpio-seatalk.d.ts +19 -0
- package/dist/pigpio-seatalk.d.ts.map +1 -0
- package/{pigpio-seatalk.js → dist/pigpio-seatalk.js} +21 -18
- package/dist/replacer.d.ts +13 -0
- package/dist/replacer.d.ts.map +1 -0
- package/dist/replacer.js +20 -0
- package/dist/s3.d.ts +13 -0
- package/dist/s3.d.ts.map +1 -0
- package/dist/s3.js +82 -0
- package/dist/serialport.d.ts +35 -0
- package/dist/serialport.d.ts.map +1 -0
- package/dist/serialport.js +125 -0
- package/dist/simple.d.ts +78 -0
- package/dist/simple.d.ts.map +1 -0
- package/dist/simple.js +446 -0
- package/dist/splitting-liner.d.ts +12 -0
- package/dist/splitting-liner.d.ts.map +1 -0
- package/dist/splitting-liner.js +19 -0
- package/dist/tcp.d.ts +32 -0
- package/dist/tcp.d.ts.map +1 -0
- package/dist/tcp.js +113 -0
- package/dist/tcpserver.d.ts +14 -0
- package/dist/tcpserver.d.ts.map +1 -0
- package/dist/tcpserver.js +18 -0
- package/dist/test-helpers.d.ts +52 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +73 -0
- package/dist/throttle.d.ts +3 -0
- package/dist/throttle.d.ts.map +1 -0
- package/dist/throttle.js +4 -0
- package/dist/timestamp-throttle.d.ts +17 -0
- package/dist/timestamp-throttle.d.ts.map +1 -0
- package/dist/timestamp-throttle.js +41 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/udp.d.ts +26 -0
- package/dist/udp.d.ts.map +1 -0
- package/dist/udp.js +53 -0
- package/package.json +46 -4
- package/actisense-serial.js +0 -1
- package/autodetect.js +0 -201
- package/canboatjs.js +0 -71
- package/canbus.js +0 -17
- package/execute.js +0 -137
- package/filestream.js +0 -90
- package/folderstream.js +0 -36
- package/from_json.js +0 -51
- package/gpsd.js +0 -94
- package/keys-filter.js +0 -81
- package/liner.js +0 -68
- package/log.js +0 -51
- package/logging.js +0 -149
- package/mdns-ws.js +0 -167
- package/multiplexedlog.js +0 -3
- package/n2k-signalk.js +0 -197
- package/n2kAnalyzer.js +0 -82
- package/nmea0183-signalk.js +0 -119
- package/nullprovider.js +0 -31
- package/replacer.js +0 -57
- package/s3.js +0 -87
- package/serialport.js +0 -209
- package/simple.js +0 -448
- package/splitting-liner.js +0 -46
- package/tcp.js +0 -138
- package/tcpserver.js +0 -40
- package/throttle.js +0 -31
- package/timestamp-throttle.js +0 -63
- package/udp.js +0 -95
|
@@ -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,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;
|
package/dist/canbus.d.ts
ADDED
|
@@ -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,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"}
|
package/dist/execute.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|