@canboat/canboatjs 3.18.0 → 3.19.0-beta.2

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 (50) hide show
  1. package/README.md +4 -0
  2. package/build/Makefile +2 -2
  3. package/build/canSocket.target.mk +14 -14
  4. package/dist/actisense-serial.d.ts.map +1 -1
  5. package/dist/actisense-serial.js +46 -38
  6. package/dist/actisense-serial.js.map +1 -1
  7. package/dist/actisense-serial.test.js +106 -0
  8. package/dist/actisense-serial.test.js.map +1 -1
  9. package/dist/bin/maretron-ipgjs.d.ts +26 -0
  10. package/dist/bin/maretron-ipgjs.d.ts.map +1 -0
  11. package/dist/bin/maretron-ipgjs.js +159 -0
  12. package/dist/bin/maretron-ipgjs.js.map +1 -0
  13. package/dist/fromPgn.d.ts.map +1 -1
  14. package/dist/fromPgn.js +22 -1
  15. package/dist/fromPgn.js.map +1 -1
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/maretron-ipg.d.ts +135 -0
  21. package/dist/maretron-ipg.d.ts.map +1 -0
  22. package/dist/maretron-ipg.js +660 -0
  23. package/dist/maretron-ipg.js.map +1 -0
  24. package/dist/maretron-ipg.test.d.ts +2 -0
  25. package/dist/maretron-ipg.test.d.ts.map +1 -0
  26. package/dist/maretron-ipg.test.js +703 -0
  27. package/dist/maretron-ipg.test.js.map +1 -0
  28. package/dist/n2kDevice.d.ts.map +1 -1
  29. package/dist/n2kDevice.js +58 -5
  30. package/dist/n2kDevice.js.map +1 -1
  31. package/dist/n2kDevice.test.d.ts +2 -0
  32. package/dist/n2kDevice.test.d.ts.map +1 -0
  33. package/dist/n2kDevice.test.js +154 -0
  34. package/dist/n2kDevice.test.js.map +1 -0
  35. package/dist/n2kIpGateway.d.ts +40 -0
  36. package/dist/n2kIpGateway.d.ts.map +1 -0
  37. package/dist/n2kIpGateway.js +464 -0
  38. package/dist/n2kIpGateway.js.map +1 -0
  39. package/dist/n2kIpGateway.test.d.ts +2 -0
  40. package/dist/n2kIpGateway.test.d.ts.map +1 -0
  41. package/dist/n2kIpGateway.test.js +349 -0
  42. package/dist/n2kIpGateway.test.js.map +1 -0
  43. package/dist/stringMsg.d.ts +1 -1
  44. package/dist/stringMsg.d.ts.map +1 -1
  45. package/dist/stringMsg.js +16 -3
  46. package/dist/stringMsg.js.map +1 -1
  47. package/dist/ydgw02.js +9 -1
  48. package/dist/ydgw02.js.map +1 -1
  49. package/package.json +3 -2
  50. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,464 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2025 Scott Bender <scott@scottbender.net>
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
+ exports.N2kIpGateway = N2kIpGateway;
22
+ const stream_1 = require("stream");
23
+ const net_1 = __importDefault(require("net"));
24
+ const lodash_1 = __importDefault(require("lodash"));
25
+ const util_1 = __importDefault(require("util"));
26
+ const candevice_1 = require("./candevice");
27
+ const canId_1 = require("./canId");
28
+ const toPgn_1 = require("./toPgn");
29
+ const stringMsg_1 = require("./stringMsg");
30
+ const utilities_1 = require("./utilities");
31
+ const DEFAULT_PORT = 2599;
32
+ const DEFAULT_RECONNECT_MS = 5000;
33
+ const DEFAULT_FORMAT = 'candump3';
34
+ // Anything before 2000-01-01 UTC is treated as the device's uptime clock,
35
+ // not wall-clock time, and dropped so the downstream analyzer can fall
36
+ // back to `new Date()`. This is needed because devices like the SensESP
37
+ // candump gateway fall back to uptime when their RTC has not been synced
38
+ // (no NTP yet), and stamping deltas with 1970-01-01 + uptime ends up in
39
+ // historical timeseries databases as either way-future or way-past rows.
40
+ const MIN_VALID_TIMESTAMP_MS = Date.UTC(2000, 0, 1);
41
+ // Convert a candump3-style "(sec.usec)" or "(sec.usec) " timestamp into an
42
+ // ISO-8601 string. Returns undefined if the input doesn't look like a
43
+ // candump epoch timestamp, or if the value clearly comes from a device
44
+ // whose clock has not been set — the caller should drop the field in
45
+ // either case.
46
+ function candumpTimestampToIso(ts) {
47
+ const m = /^\(?(\d+)(?:\.(\d+))?\)?$/.exec(ts);
48
+ if (!m)
49
+ return undefined;
50
+ const sec = Number(m[1]);
51
+ if (!Number.isFinite(sec))
52
+ return undefined;
53
+ // Pad the fractional part to microseconds so we always interpret it as such.
54
+ const usec = m[2] ? Number(m[2].slice(0, 6).padEnd(6, '0')) : 0;
55
+ if (!Number.isFinite(usec))
56
+ return undefined;
57
+ const ms = sec * 1000 + Math.floor(usec / 1000);
58
+ if (ms < MIN_VALID_TIMESTAMP_MS)
59
+ return undefined;
60
+ const d = new Date(ms);
61
+ if (Number.isNaN(d.getTime()))
62
+ return undefined;
63
+ return d.toISOString();
64
+ }
65
+ function encodeCandump3Line(pgn, _canid, buffer) {
66
+ return (0, stringMsg_1.encodeCandump3)({
67
+ data: buffer,
68
+ pgn: pgn.pgn,
69
+ src: pgn.src,
70
+ dst: pgn.dst,
71
+ prio: pgn.prio
72
+ });
73
+ }
74
+ function encodeCandump2Line(pgn, _canid, buffer) {
75
+ return (0, stringMsg_1.encodeCandump2)({
76
+ data: buffer,
77
+ pgn: pgn.pgn,
78
+ src: pgn.src,
79
+ dst: pgn.dst,
80
+ prio: pgn.prio
81
+ });
82
+ }
83
+ function encodeCandump1Line(pgn, _canid, buffer) {
84
+ return (0, stringMsg_1.encodeCandump1)({
85
+ data: buffer,
86
+ pgn: pgn.pgn,
87
+ src: pgn.src,
88
+ dst: pgn.dst,
89
+ prio: pgn.prio
90
+ });
91
+ }
92
+ function encodeYDRAWLine(pgn, _canid, buffer) {
93
+ return (0, stringMsg_1.encodeYDRAW)({
94
+ data: buffer,
95
+ pgn: pgn.pgn,
96
+ src: pgn.src,
97
+ dst: pgn.dst,
98
+ prio: pgn.prio
99
+ });
100
+ }
101
+ function encodeActisenseLine(pgn, _canid, _buffer) {
102
+ // Actisense format carries the entire (possibly long) PGN payload — no
103
+ // fast-packet split needed. The caller passes the full unsplit buffer.
104
+ return (0, toPgn_1.pgnToN2KActisenseFormat)(pgn);
105
+ }
106
+ function encodeActisenseN2KAsciiLine(pgn, _canid, _buffer) {
107
+ return (0, toPgn_1.pgnToActisenseN2KAsciiFormat)(pgn);
108
+ }
109
+ function encodePCDINLine(pgn, _canid, buffer) {
110
+ return (0, stringMsg_1.encodePCDIN)({
111
+ pgn: pgn.pgn,
112
+ data: buffer,
113
+ src: pgn.src,
114
+ dst: pgn.dst,
115
+ prio: pgn.prio
116
+ });
117
+ }
118
+ const FORMATS = {
119
+ candump3: {
120
+ parse: stringMsg_1.parseCandump3,
121
+ encode: encodeCandump3Line,
122
+ splitFastPacket: true,
123
+ terminator: '\n'
124
+ },
125
+ candump2: {
126
+ parse: stringMsg_1.parseCandump2,
127
+ encode: encodeCandump2Line,
128
+ splitFastPacket: true,
129
+ terminator: '\n'
130
+ },
131
+ candump1: {
132
+ parse: stringMsg_1.parseCandump1,
133
+ encode: encodeCandump1Line,
134
+ splitFastPacket: true,
135
+ terminator: '\n'
136
+ },
137
+ ydraw: {
138
+ parse: stringMsg_1.parseYDRAW,
139
+ encode: encodeYDRAWLine,
140
+ splitFastPacket: true,
141
+ terminator: '\r\n'
142
+ },
143
+ actisense: {
144
+ parse: stringMsg_1.parseActisense,
145
+ encode: encodeActisenseLine,
146
+ splitFastPacket: false,
147
+ terminator: '\r\n'
148
+ },
149
+ 'actisense-n2k-ascii': {
150
+ parse: stringMsg_1.parseActisenseN2KASCII,
151
+ encode: encodeActisenseN2KAsciiLine,
152
+ splitFastPacket: false,
153
+ terminator: '\r\n'
154
+ },
155
+ pcdin: {
156
+ parse: stringMsg_1.parsePCDIN,
157
+ encode: encodePCDINLine,
158
+ splitFastPacket: false,
159
+ terminator: '\r\n'
160
+ }
161
+ };
162
+ function N2kIpGateway(options) {
163
+ if (this === undefined) {
164
+ return new N2kIpGateway(options);
165
+ }
166
+ stream_1.Transform.call(this, { objectMode: true });
167
+ if (!options || !options.host) {
168
+ throw new Error('N2kIpGateway: options.host is required');
169
+ }
170
+ this.options = options;
171
+ this.host = options.host;
172
+ this.port = options.port ?? DEFAULT_PORT;
173
+ this.reconnectIntervalMs = options.reconnectIntervalMs ?? DEFAULT_RECONNECT_MS;
174
+ const fmt = (options.format ?? DEFAULT_FORMAT);
175
+ if (!FORMATS[fmt]) {
176
+ throw new Error(`N2kIpGateway: unsupported format "${fmt}"`);
177
+ }
178
+ this.format = fmt;
179
+ this.formatSpec = FORMATS[fmt];
180
+ // Default is "be a CAN device" — matches the user's KISS expectation.
181
+ this.actAsCanDevice = options.actAsCanDevice ?? true;
182
+ this.debug = (0, utilities_1.createDebug)('canboatjs:n2k-ip-gateway', options);
183
+ this.debugData = (0, utilities_1.createDebug)('canboatjs:n2k-ip-gateway-data', options);
184
+ this.debugOut = (0, utilities_1.createDebug)('canboatjs:n2k-out', options);
185
+ this.plainText = false;
186
+ this.rxBuffer = '';
187
+ this.reconnecting = false;
188
+ this.stopping = false;
189
+ this.sentAvailable = false;
190
+ this.setProviderStatus =
191
+ options.app && options.app.setProviderStatus
192
+ ? (msg) => options.app.setProviderStatus(options.providerId, msg)
193
+ : () => { };
194
+ this.setProviderError =
195
+ options.app && options.app.setProviderError
196
+ ? (msg) => options.app.setProviderError(options.providerId, msg)
197
+ : () => { };
198
+ if (options.app) {
199
+ const outEvents = (options.outEvent || 'nmea2000out')
200
+ .split(',')
201
+ .map((event) => event.trim());
202
+ outEvents.forEach((event) => {
203
+ options.app.on(event, (msg) => {
204
+ this.sendPGN(msg, false);
205
+ });
206
+ });
207
+ const jsonOutEvents = (options.jsonOutEvent || 'nmea2000JsonOut')
208
+ .split(',')
209
+ .map((event) => event.trim());
210
+ jsonOutEvents.forEach((event) => {
211
+ options.app.on(event, (msg) => {
212
+ this.sendPGN(msg, false);
213
+ });
214
+ });
215
+ }
216
+ this.connect();
217
+ }
218
+ util_1.default.inherits(N2kIpGateway, stream_1.Transform);
219
+ N2kIpGateway.prototype.connect = function () {
220
+ if (this.reconnecting || this.stopping) {
221
+ return;
222
+ }
223
+ this.reconnecting = true;
224
+ this.debug(`connecting to ${this.host}:${this.port}`);
225
+ const socket = new net_1.default.Socket();
226
+ this.socket = socket;
227
+ const onError = (err) => {
228
+ this.debug(`socket error: ${err.message}`);
229
+ this.setProviderError(err.message);
230
+ };
231
+ const onClose = () => {
232
+ this.debug('socket closed');
233
+ if (this.candevice) {
234
+ try {
235
+ this.candevice.stop();
236
+ }
237
+ catch (_e) {
238
+ // best-effort cleanup
239
+ }
240
+ this.candevice = undefined;
241
+ }
242
+ this.socket = undefined;
243
+ this.reconnecting = false;
244
+ if (!this.stopping) {
245
+ this.setProviderError('disconnected, reconnecting...');
246
+ this.reconnectTimer = setTimeout(() => this.connect(), this.reconnectIntervalMs);
247
+ }
248
+ };
249
+ socket.on('error', onError);
250
+ socket.on('close', onClose);
251
+ socket.on('data', (chunk) => this._onData(chunk));
252
+ socket.connect(this.port, this.host, () => {
253
+ if (this.stopping || this.socket !== socket) {
254
+ // We were torn down (or replaced) before the connect callback fired —
255
+ // don't spin up a CanDevice whose timers would then leak.
256
+ return;
257
+ }
258
+ this.debug(`connected to ${this.host}:${this.port}`);
259
+ this.setProviderStatus(`Connected to ${this.host}:${this.port}`);
260
+ this.reconnecting = false;
261
+ if (this.actAsCanDevice && this.options.app && !this.candevice) {
262
+ this.candevice = new candevice_1.CanDevice(this, this.options);
263
+ this.candevice.start();
264
+ }
265
+ if (!this.sentAvailable && this.options.app) {
266
+ this.options.app.emit('nmea2000OutAvailable');
267
+ this.sentAvailable = true;
268
+ }
269
+ });
270
+ };
271
+ N2kIpGateway.prototype._onData = function (chunk) {
272
+ this.rxBuffer += chunk.toString('utf8');
273
+ let nl;
274
+ while ((nl = this.rxBuffer.indexOf('\n')) >= 0) {
275
+ let line = this.rxBuffer.slice(0, nl);
276
+ this.rxBuffer = this.rxBuffer.slice(nl + 1);
277
+ if (line.endsWith('\r')) {
278
+ line = line.slice(0, -1);
279
+ }
280
+ if (line.length === 0)
281
+ continue;
282
+ this._handleLine(line);
283
+ }
284
+ };
285
+ N2kIpGateway.prototype._handleLine = function (line) {
286
+ if (this.debugData.enabled) {
287
+ this.debugData(line);
288
+ }
289
+ let parsed;
290
+ try {
291
+ parsed = this.formatSpec.parse(line);
292
+ }
293
+ catch (e) {
294
+ this.debug(`parse error (${this.format}): ${e.message}`);
295
+ return;
296
+ }
297
+ if (!parsed || parsed.error || !parsed.data) {
298
+ return;
299
+ }
300
+ // parseXxx() returns a flat CanID-like object: { pgn, src, dst, prio, data }.
301
+ // Downstream consumers expect { pgn: <that object>, length, data }.
302
+ const data = parsed.data;
303
+ // Normalize the per-frame timestamp. parseCandump3() puts the raw
304
+ // "(<sec>.<usec>)" string in parsed.timestamp; downstream code that does
305
+ // `new Date(parsed.timestamp)` would get an Invalid Date and produce NaN
306
+ // when consumers (e.g. ILP writers) try to extract a numeric timestamp.
307
+ // Convert to an ISO string if we can, otherwise drop the field so the
308
+ // analyzer falls back to its own `new Date()`.
309
+ if (typeof parsed.timestamp === 'string') {
310
+ const iso = candumpTimestampToIso(parsed.timestamp);
311
+ if (iso) {
312
+ parsed.timestamp = iso;
313
+ }
314
+ else {
315
+ delete parsed.timestamp;
316
+ }
317
+ }
318
+ // Drop frames we sent ourselves so we don't re-process loopback / echoed
319
+ // outbound traffic as if it were bus input.
320
+ if (this.candevice &&
321
+ this.candevice.cansend &&
322
+ parsed.src === this.candevice.address) {
323
+ return;
324
+ }
325
+ const out = { pgn: parsed, length: data.length, data };
326
+ if (this.options.app &&
327
+ this.options.app.listenerCount &&
328
+ this.options.app.listenerCount('canboatjs:rawoutput') > 0) {
329
+ this.options.app.emit('canboatjs:rawoutput', out);
330
+ }
331
+ this.push(out);
332
+ };
333
+ N2kIpGateway.prototype.send = function (line) {
334
+ if (!this.socket) {
335
+ this.debug('drop send: socket not connected');
336
+ return;
337
+ }
338
+ this.debugOut('sending %s', line);
339
+ this.socket.write(line + this.formatSpec.terminator);
340
+ };
341
+ N2kIpGateway.prototype.sendPGN = function (msg, force) {
342
+ if (this.actAsCanDevice) {
343
+ if (!this.candevice) {
344
+ // Not connected yet — drop. The server will retry as needed.
345
+ return;
346
+ }
347
+ if (!this.candevice.cansend && force !== true) {
348
+ // Address claim not yet completed; only CanDevice's own probes are
349
+ // allowed through with force=true.
350
+ return;
351
+ }
352
+ }
353
+ if (this.options.app) {
354
+ this.options.app.emit('connectionwrite', {
355
+ providerId: this.options.providerId
356
+ });
357
+ }
358
+ let pgn;
359
+ if (lodash_1.default.isString(msg)) {
360
+ // Inbound message is in some text format. We accept it as-is when it
361
+ // already matches our wire format; otherwise reparse via Actisense (the
362
+ // canonical comma-delimited form used by signalk-server).
363
+ pgn = (0, stringMsg_1.parseActisense)(msg);
364
+ }
365
+ else {
366
+ pgn = msg;
367
+ if (lodash_1.default.isUndefined(pgn.prio))
368
+ pgn.prio = 3;
369
+ if (lodash_1.default.isUndefined(pgn.dst))
370
+ pgn.dst = 255;
371
+ if (this.actAsCanDevice && this.candevice && !pgn.forceSrc) {
372
+ pgn.src = this.candevice.address;
373
+ }
374
+ else if (lodash_1.default.isUndefined(pgn.src)) {
375
+ pgn.src = 0;
376
+ }
377
+ }
378
+ // Prefer an already-encoded buffer when the caller supplied one — this lets
379
+ // upstream code forward frames that have already been serialized (e.g.
380
+ // verbatim relays from another analyzer) without re-encoding fields.
381
+ let buffer;
382
+ if (lodash_1.default.isString(msg)) {
383
+ buffer = pgn.data;
384
+ }
385
+ else if (Buffer.isBuffer(pgn.data)) {
386
+ buffer = pgn.data;
387
+ }
388
+ else {
389
+ buffer = (0, toPgn_1.toPgn)(pgn);
390
+ }
391
+ if (!buffer) {
392
+ this.debug("can't convert %j", msg);
393
+ return;
394
+ }
395
+ const canid = (0, canId_1.encodeCanId)(pgn);
396
+ let payloads;
397
+ if (this.formatSpec.splitFastPacket &&
398
+ (buffer.length > 8 || pgn.pgn === 126720)) {
399
+ payloads = (0, utilities_1.getPlainPGNs)(buffer);
400
+ }
401
+ else {
402
+ payloads = [buffer];
403
+ }
404
+ payloads.forEach((payload) => {
405
+ const encoded = this.formatSpec.encode(pgn, canid, payload);
406
+ const lines = Array.isArray(encoded) ? encoded : [encoded];
407
+ lines.forEach((line) => this.send(line));
408
+ if (this.options.app &&
409
+ this.options.app.listenerCount &&
410
+ this.options.app.listenerCount('canboatjs:rawsend') > 0) {
411
+ this.options.app.emit('canboatjs:rawsend', {
412
+ knownSrc: true,
413
+ data: { pgn, length: payload.length, data: (0, utilities_1.byteStringArray)(payload) }
414
+ });
415
+ }
416
+ // Forward self-emitted device info back into the analyzer pipe so the
417
+ // server sees its own address claim / product info / config info, the
418
+ // same way CanbusStream does. CRITICALLY this must be done once per
419
+ // per-frame `payload` (≤ 8 bytes), not once with the full reassembled
420
+ // buffer — handing a > 8 byte chunk to FromPgn flips the analyzer
421
+ // into FORMAT_COALESCED for the rest of the session and corrupts
422
+ // every subsequent fast-packet reassembly (e.g. AIS PGN 129038/9
423
+ // bytes get read at the wrong offset, producing phantom vessels).
424
+ if (pgn.pgn === 60928 || pgn.pgn === 126996 || pgn.pgn === 126998) {
425
+ this.push({ pgn, length: payload.length, data: payload });
426
+ }
427
+ });
428
+ };
429
+ N2kIpGateway.prototype._transform = function (_chunk, _encoding, done) {
430
+ done();
431
+ };
432
+ N2kIpGateway.prototype.pipe = function (pipeTo) {
433
+ if (!pipeTo.fromPgn) {
434
+ this.plainText = true;
435
+ }
436
+ return N2kIpGateway.super_.prototype.pipe.call(this, pipeTo);
437
+ };
438
+ N2kIpGateway.prototype.end = function () {
439
+ this.stopping = true;
440
+ if (this.reconnectTimer) {
441
+ clearTimeout(this.reconnectTimer);
442
+ this.reconnectTimer = undefined;
443
+ }
444
+ if (this.candevice) {
445
+ try {
446
+ this.candevice.stop();
447
+ }
448
+ catch (_e) {
449
+ // best-effort
450
+ }
451
+ this.candevice = undefined;
452
+ }
453
+ if (this.socket) {
454
+ try {
455
+ this.socket.end();
456
+ this.socket.destroy();
457
+ }
458
+ catch (_e) {
459
+ // best-effort
460
+ }
461
+ this.socket = undefined;
462
+ }
463
+ };
464
+ //# sourceMappingURL=n2kIpGateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n2kIpGateway.js","sourceRoot":"","sources":["../lib/n2kIpGateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=n2kIpGateway.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n2kIpGateway.test.d.ts","sourceRoot":"","sources":["../lib/n2kIpGateway.test.ts"],"names":[],"mappings":""}