@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.
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 -201
  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 -197
  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 -448
  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,144 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const stream_1 = require("stream");
19
+ const client_1 = require("@signalk/client");
20
+ class MdnsWs extends stream_1.Transform {
21
+ options;
22
+ selfHost;
23
+ selfPort;
24
+ remoteServers = {};
25
+ debug;
26
+ dataDebug;
27
+ handleContext;
28
+ signalkClient;
29
+ constructor(options) {
30
+ super({ objectMode: true });
31
+ this.options = options;
32
+ this.selfHost = options.app.config.getExternalHostname() + '.';
33
+ this.selfPort = options.app.config.getExternalPort();
34
+ this.remoteServers[this.selfHost + ':' + this.selfPort] = {};
35
+ const deltaStreamBehaviour = options.subscription ? 'none' : 'all';
36
+ const createDebug = options.createDebug ?? require('debug');
37
+ this.debug = createDebug('signalk:streams:mdns-ws');
38
+ this.dataDebug = createDebug('signalk:streams:mdns-ws-data');
39
+ this.debug(`deltaStreamBehaviour:${deltaStreamBehaviour}`);
40
+ this.handleContext = () => { };
41
+ if (options.selfHandling === 'manualSelf') {
42
+ if (options.remoteSelf) {
43
+ this.debug(`Using manual remote self ${options.remoteSelf}`);
44
+ this.handleContext = (delta) => {
45
+ if (delta.context === options.remoteSelf) {
46
+ delete delta.context;
47
+ }
48
+ };
49
+ }
50
+ else {
51
+ console.error('Manual self handling speficied but no remoteSelf configured');
52
+ }
53
+ }
54
+ if (options.ignoreServers) {
55
+ options.ignoreServers.forEach((s) => {
56
+ this.remoteServers[s] = {};
57
+ });
58
+ }
59
+ if (options.host && options.port) {
60
+ this.signalkClient = new client_1.Client({
61
+ hostname: options.host,
62
+ port: options.port,
63
+ useTLS: options.type === 'wss',
64
+ reconnect: true,
65
+ notifications: false,
66
+ autoConnect: false,
67
+ deltaStreamBehaviour,
68
+ rejectUnauthorized: !(options.selfsignedcert === true),
69
+ wsKeepaliveInterval: 10
70
+ });
71
+ this.connectClient(this.signalkClient);
72
+ }
73
+ else {
74
+ this.options.app.setProviderError(this.options.providerId, 'This connection is deprecated and must be deleted');
75
+ }
76
+ }
77
+ connectClient(client) {
78
+ client
79
+ .connect()
80
+ .then(() => {
81
+ this.options.app.setProviderStatus(this.options.providerId, `ws connection connected to ${client.options.hostname}:${client.options.port}`);
82
+ console.log(`ws connection connected to ${client.options.hostname}:${client.options.port}`);
83
+ if (this.options.selfHandling === 'useRemoteSelf') {
84
+ client
85
+ .API()
86
+ .then((api) => api.get('/self'))
87
+ .then((selfFromServer) => {
88
+ this.debug(`Mapping context ${selfFromServer} to self (empty context)`);
89
+ this.handleContext = (delta) => {
90
+ if (delta.context === selfFromServer) {
91
+ delete delta.context;
92
+ }
93
+ };
94
+ })
95
+ .catch((err) => {
96
+ console.error('Error retrieving self from remote server');
97
+ console.error(err);
98
+ });
99
+ }
100
+ this.remoteServers[client.options.hostname + ':' + client.options.port] = client;
101
+ if (this.options.subscription) {
102
+ let parsed;
103
+ try {
104
+ parsed = JSON.parse(this.options.subscription);
105
+ }
106
+ catch (ex) {
107
+ const error = ex;
108
+ this.options.app.setProviderError(this.options.providerId, `unable to parse subscription json: ${this.options.subscription}: ${error.message}`);
109
+ console.error(`unable to parse subscription json: ${this.options.subscription}: ${error.message}`);
110
+ return;
111
+ }
112
+ if (!Array.isArray(parsed)) {
113
+ parsed = [parsed];
114
+ }
115
+ ;
116
+ parsed.forEach((sub, idx) => {
117
+ this.debug('sending subscription %j', sub);
118
+ client.subscribe(sub, String(idx));
119
+ });
120
+ }
121
+ })
122
+ .catch((err) => {
123
+ this.options.app.setProviderError(this.options.providerId, err.message);
124
+ console.error(err.message);
125
+ });
126
+ client.on('delta', (data) => {
127
+ if (data && data.updates) {
128
+ this.handleContext(data);
129
+ if (this.dataDebug.enabled) {
130
+ this.dataDebug(JSON.stringify(data));
131
+ }
132
+ data.updates.forEach((update) => {
133
+ update['$source'] =
134
+ `${this.options.providerId}.${client.options.hostname}:${client.options.port}`;
135
+ });
136
+ }
137
+ this.push(data);
138
+ });
139
+ }
140
+ _transform(chunk, encoding, done) {
141
+ done();
142
+ }
143
+ }
144
+ exports.default = MdnsWs;
@@ -0,0 +1,3 @@
1
+ import autodetect from './autodetect';
2
+ export default autodetect;
3
+ //# sourceMappingURL=multiplexedlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiplexedlog.d.ts","sourceRoot":"","sources":["../src/multiplexedlog.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAA;AAErC,eAAe,UAAU,CAAA"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const autodetect_1 = __importDefault(require("./autodetect"));
7
+ exports.default = autodetect_1.default;
@@ -0,0 +1,39 @@
1
+ import { Transform, TransformCallback } from 'stream';
2
+ import type { DeltaCache } from './types';
3
+ interface N2kFilter {
4
+ source?: string;
5
+ pgn?: string;
6
+ }
7
+ interface N2kToSignalKOptions {
8
+ app: {
9
+ selfContext: string;
10
+ isNmea2000OutAvailable: boolean;
11
+ deltaCache: DeltaCache;
12
+ on(event: string, cb: (...args: any[]) => void): void;
13
+ emit(event: string, ...args: unknown[]): void;
14
+ handleMessage(id: string, delta: object): void;
15
+ };
16
+ providerId: string;
17
+ filters?: N2kFilter[];
18
+ filtersEnabled?: boolean;
19
+ useCanName?: boolean;
20
+ [key: string]: unknown;
21
+ }
22
+ interface N2kMessage {
23
+ src: string | number;
24
+ pgn: string | number;
25
+ timestamp: string;
26
+ }
27
+ export default class N2kToSignalK extends Transform {
28
+ private readonly sourceMeta;
29
+ private readonly notifications;
30
+ private readonly options;
31
+ private readonly app;
32
+ private readonly filters?;
33
+ private readonly n2kMapper;
34
+ constructor(options: N2kToSignalKOptions);
35
+ private isFiltered;
36
+ _transform(chunk: N2kMessage, encoding: BufferEncoding, done: TransformCallback): void;
37
+ }
38
+ export {};
39
+ //# sourceMappingURL=n2k-signalk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n2k-signalk.d.ts","sourceRoot":"","sources":["../src/n2k-signalk.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,UAAU,SAAS;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,UAAU,mBAAmB;IAC3B,GAAG,EAAE;QACH,WAAW,EAAE,MAAM,CAAA;QACnB,sBAAsB,EAAE,OAAO,CAAA;QAC/B,UAAU,EAAE,UAAU,CAAA;QAEtB,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,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAC/C,CAAA;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;IACrB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB;AAoCD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAGxB;IACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAa;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAExC,OAAO,EAAE,mBAAmB;IAwFxC,OAAO,CAAC,UAAU;IAiBlB,UAAU,CACR,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CA0FR"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2014-2015 Fabian Tollenaar <fabian@starting-point.nl>
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
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const stream_1 = require("stream");
19
+ const n2k_signalk_1 = require("@signalk/n2k-signalk");
20
+ class N2kToSignalK extends stream_1.Transform {
21
+ sourceMeta = {};
22
+ notifications = {};
23
+ options;
24
+ app;
25
+ filters;
26
+ n2kMapper;
27
+ constructor(options) {
28
+ super({ objectMode: true });
29
+ this.options = options;
30
+ this.app = options.app;
31
+ if (options.filters && options.filtersEnabled) {
32
+ this.filters = options.filters.filter((f) => (f.source && f.source.length) || (f.pgn && f.pgn.length));
33
+ }
34
+ this.n2kMapper = new n2k_signalk_1.N2kMapper({
35
+ ...options,
36
+ sendMetaData: true
37
+ });
38
+ const n2kOutEvent = 'nmea2000JsonOut';
39
+ this.n2kMapper.on('n2kOut', (pgn) => this.app.emit('nmea2000JsonOut', pgn));
40
+ this.n2kMapper.on('n2kSourceMetadata', (n2k, meta) => {
41
+ const src = Number(n2k.src);
42
+ const existing = this.sourceMeta[src] ?? {};
43
+ this.sourceMeta[src] = { ...existing, ...meta };
44
+ const delta = {
45
+ context: this.app.selfContext,
46
+ updates: [
47
+ {
48
+ source: {
49
+ ...this.sourceMeta[src],
50
+ label: this.options.providerId,
51
+ type: 'NMEA2000',
52
+ pgn: Number(n2k.pgn),
53
+ src: n2k.src.toString()
54
+ },
55
+ timestamp: n2k.timestamp.substring(0, 10) +
56
+ 'T' +
57
+ n2k.timestamp.substring(11, n2k.timestamp.length),
58
+ values: []
59
+ }
60
+ ]
61
+ };
62
+ this.app.deltaCache.setSourceDelta(`${this.options.providerId}.${n2k.src}`, delta);
63
+ });
64
+ this.n2kMapper.on('n2kSourceMetadataTimeout', (pgn, src) => {
65
+ if (Number(pgn) === 60928) {
66
+ console.warn(`n2k-signalk: unable to detect can name for src ${src}`);
67
+ const srcNum = Number(src);
68
+ const meta = this.sourceMeta[srcNum];
69
+ if (meta) {
70
+ meta.unknowCanName = true;
71
+ }
72
+ }
73
+ });
74
+ this.n2kMapper.on('n2kSourceChanged', (src, from, to) => {
75
+ console.warn(`n2k-signalk: address ${src} changed from ${from} ${to}`);
76
+ const srcNum = Number(src);
77
+ if (this.sourceMeta[srcNum]) {
78
+ delete this.sourceMeta[srcNum];
79
+ }
80
+ });
81
+ if (this.app.isNmea2000OutAvailable) {
82
+ this.n2kMapper.n2kOutIsAvailable(this.app, n2kOutEvent);
83
+ }
84
+ else {
85
+ this.app.on('nmea2000OutAvailable', () => this.n2kMapper.n2kOutIsAvailable(this.app, n2kOutEvent));
86
+ }
87
+ }
88
+ isFiltered(source) {
89
+ if (!this.filters) {
90
+ return undefined;
91
+ }
92
+ return this.filters.find((filter) => {
93
+ const sFilter = this.options.useCanName ? source.canName : source.src;
94
+ return ((!filter.source ||
95
+ filter.source.length === 0 ||
96
+ filter.source === sFilter) &&
97
+ (!filter.pgn ||
98
+ filter.pgn.length === 0 ||
99
+ String(filter.pgn) === String(source.pgn)));
100
+ });
101
+ }
102
+ _transform(chunk, encoding, done) {
103
+ try {
104
+ const delta = this.n2kMapper.toDelta(chunk);
105
+ const src = Number(chunk.src);
106
+ if (!this.sourceMeta[src]) {
107
+ this.sourceMeta[src] = {};
108
+ }
109
+ const firstUpdate = delta?.updates[0];
110
+ if (delta &&
111
+ firstUpdate &&
112
+ firstUpdate.values.length > 0 &&
113
+ !this.isFiltered(firstUpdate.source)) {
114
+ if (!this.options.useCanName) {
115
+ delete firstUpdate.source.canName;
116
+ }
117
+ const canName = firstUpdate.source.canName;
118
+ if (this.options.useCanName &&
119
+ !canName &&
120
+ !this.sourceMeta[src]?.unknowCanName) {
121
+ done();
122
+ return;
123
+ }
124
+ delta.updates.forEach((update) => {
125
+ update.values.forEach((kv) => {
126
+ if (kv.path && kv.path.startsWith('notifications.')) {
127
+ const pathNotifs = this.notifications[kv.path];
128
+ if (kv.value.state === 'normal' &&
129
+ pathNotifs &&
130
+ pathNotifs[src]) {
131
+ clearInterval(pathNotifs[src].interval);
132
+ delete pathNotifs[src];
133
+ }
134
+ else if (kv.value.state !== 'normal') {
135
+ if (!this.notifications[kv.path]) {
136
+ this.notifications[kv.path] = {};
137
+ }
138
+ const currentPathNotifs = this.notifications[kv.path];
139
+ if (!currentPathNotifs[src]) {
140
+ const interval = setInterval(() => {
141
+ const entry = currentPathNotifs[src];
142
+ if (entry && Date.now() - entry.lastTime > 10000) {
143
+ const copy = JSON.parse(JSON.stringify(kv));
144
+ copy.value.state = 'normal';
145
+ const normalDelta = {
146
+ context: delta.context,
147
+ updates: [
148
+ {
149
+ source: update.source,
150
+ values: [copy]
151
+ }
152
+ ]
153
+ };
154
+ delete currentPathNotifs[src];
155
+ clearInterval(interval);
156
+ this.app.handleMessage(this.options.providerId, normalDelta);
157
+ }
158
+ }, 5000);
159
+ currentPathNotifs[src] = {
160
+ lastTime: Date.now(),
161
+ interval
162
+ };
163
+ }
164
+ else {
165
+ currentPathNotifs[src].lastTime = Date.now();
166
+ }
167
+ }
168
+ }
169
+ });
170
+ });
171
+ this.push(delta);
172
+ }
173
+ }
174
+ catch (ex) {
175
+ console.error(ex);
176
+ }
177
+ done();
178
+ }
179
+ }
180
+ exports.default = N2kToSignalK;
@@ -0,0 +1,19 @@
1
+ import { Transform, TransformCallback } from 'stream';
2
+ interface N2kAnalyzerOptions {
3
+ app: {
4
+ emit(event: string, ...args: unknown[]): void;
5
+ };
6
+ analyzerOutEvent?: string;
7
+ [key: string]: unknown;
8
+ }
9
+ export default class N2kAnalyzer extends Transform {
10
+ private readonly analyzerOutEvent;
11
+ private readonly analyzerProcess;
12
+ private pipeTo;
13
+ constructor(options: N2kAnalyzerOptions);
14
+ _transform(chunk: Buffer, encoding: BufferEncoding, done: TransformCallback): void;
15
+ pipe<T extends NodeJS.WritableStream>(pipeTo: T): T;
16
+ end(): this;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=n2kAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"n2kAnalyzer.d.ts","sourceRoot":"","sources":["../src/n2kAnalyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAY,MAAM,QAAQ,CAAA;AAC/D,UAAU,kBAAkB;IAC1B,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,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAOD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,MAAM,CAAwB;gBAE1B,OAAO,EAAE,kBAAkB;IA0CvC,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;IAKnD,GAAG,IAAI,IAAI;CAQZ"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const child_process_1 = require("child_process");
4
+ const readline_1 = require("readline");
5
+ const stream_1 = require("stream");
6
+ class N2kAnalyzer extends stream_1.Transform {
7
+ analyzerOutEvent;
8
+ analyzerProcess;
9
+ pipeTo = null;
10
+ constructor(options) {
11
+ super({ objectMode: true });
12
+ this.analyzerOutEvent = options.analyzerOutEvent ?? 'N2KAnalyzerOut';
13
+ if (process.platform === 'win32') {
14
+ this.analyzerProcess = (0, child_process_1.spawn)('cmd', ['/c', 'analyzer -json -si -camel']);
15
+ }
16
+ else {
17
+ this.analyzerProcess = (0, child_process_1.spawn)('sh', ['-c', 'analyzer -json -si -camel']);
18
+ }
19
+ this.analyzerProcess.stderr?.on('data', (data) => {
20
+ console.error(data.toString());
21
+ });
22
+ this.analyzerProcess.on('close', (code) => {
23
+ console.error('Analyzer process exited with code ' + code);
24
+ });
25
+ const linereader = (0, readline_1.createInterface)(this.analyzerProcess.stdout, this.analyzerProcess.stdin);
26
+ linereader.on('line', (data) => {
27
+ try {
28
+ const parsed = JSON.parse(data);
29
+ if (parsed.version) {
30
+ console.log('Connected to analyzer v' + parsed.version);
31
+ return;
32
+ }
33
+ this.push(parsed);
34
+ options.app.emit(this.analyzerOutEvent, parsed);
35
+ }
36
+ catch (ex) {
37
+ console.error(data);
38
+ if (ex instanceof Error) {
39
+ console.error(ex.stack);
40
+ }
41
+ }
42
+ });
43
+ }
44
+ _transform(chunk, encoding, done) {
45
+ this.analyzerProcess.stdin?.write(chunk.toString() + '\n');
46
+ done();
47
+ }
48
+ pipe(pipeTo) {
49
+ this.pipeTo = pipeTo;
50
+ return super.pipe(pipeTo);
51
+ }
52
+ end() {
53
+ console.log('end, killing child analyzer process');
54
+ this.analyzerProcess.kill();
55
+ if (this.pipeTo) {
56
+ this.pipeTo.end();
57
+ }
58
+ return this;
59
+ }
60
+ }
61
+ exports.default = N2kAnalyzer;
@@ -0,0 +1,33 @@
1
+ import { Transform, TransformCallback } from 'stream';
2
+ import type { CreateDebug } from './types';
3
+ interface Nmea0183ToSignalKOptions {
4
+ app: {
5
+ emit(event: string, ...args: unknown[]): void;
6
+ signalk: {
7
+ emit(event: string, ...args: unknown[]): void;
8
+ };
9
+ };
10
+ providerId: string;
11
+ createDebug?: CreateDebug;
12
+ suppress0183event?: boolean;
13
+ appendChecksum?: boolean;
14
+ sentenceEvent?: string | string[];
15
+ [key: string]: unknown;
16
+ }
17
+ interface TimestampedChunk {
18
+ line: string;
19
+ timestamp: number | string;
20
+ }
21
+ export default class Nmea0183ToSignalK extends Transform {
22
+ private readonly debug;
23
+ private readonly parser;
24
+ private readonly n2kParser;
25
+ private readonly n2kState;
26
+ private readonly app;
27
+ private readonly sentenceEvents;
28
+ private readonly appendChecksumFlag;
29
+ constructor(options: Nmea0183ToSignalKOptions);
30
+ _transform(chunk: string | Buffer | TimestampedChunk, encoding: BufferEncoding, done: TransformCallback): void;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=nmea0183-signalk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nmea0183-signalk.d.ts","sourceRoot":"","sources":["../src/nmea0183-signalk.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAKrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,UAAU,wBAAwB;IAChC,GAAG,EAAE;QACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;QAC7C,OAAO,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;SAAE,CAAA;KAC3D,CAAA;IACD,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3B;AAWD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,SAAS;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,OAAO,EAAE,wBAAwB;IAuB7C,UAAU,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,EACzC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CAyDR"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2017 Signal K & Fabian Tollenaar <fabian@signalk.org>
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 nmea0183_signalk_1 = __importDefault(require("@signalk/nmea0183-signalk"));
23
+ const nmea0183_utilities_1 = require("@signalk/nmea0183-utilities");
24
+ const n2k_signalk_1 = require("@signalk/n2k-signalk");
25
+ const canboatjs_1 = require("@canboat/canboatjs");
26
+ class Nmea0183ToSignalK extends stream_1.Transform {
27
+ debug;
28
+ parser;
29
+ n2kParser;
30
+ n2kState = {};
31
+ app;
32
+ sentenceEvents;
33
+ appendChecksumFlag;
34
+ constructor(options) {
35
+ super({ objectMode: true });
36
+ this.debug = (options.createDebug ?? require('debug'))('signalk:streams:nmea0183-signalk');
37
+ this.parser = new nmea0183_signalk_1.default(options);
38
+ this.n2kParser = new canboatjs_1.FromPgn(options);
39
+ this.app = options.app;
40
+ this.appendChecksumFlag = options.appendChecksum ?? false;
41
+ this.sentenceEvents = options.suppress0183event ? [] : ['nmea0183'];
42
+ if (options.sentenceEvent) {
43
+ if (Array.isArray(options.sentenceEvent)) {
44
+ this.sentenceEvents = this.sentenceEvents.concat(options.sentenceEvent);
45
+ }
46
+ else {
47
+ this.sentenceEvents.push(options.sentenceEvent);
48
+ }
49
+ }
50
+ }
51
+ _transform(chunk, encoding, done) {
52
+ let sentence;
53
+ let timestamp = null;
54
+ if (chunk &&
55
+ typeof chunk === 'object' &&
56
+ !Buffer.isBuffer(chunk) &&
57
+ typeof chunk.line === 'string') {
58
+ const tsChunk = chunk;
59
+ timestamp = new Date(Number(tsChunk.timestamp));
60
+ sentence = tsChunk.line.trim();
61
+ }
62
+ else if (Buffer.isBuffer(chunk)) {
63
+ sentence = chunk.toString().trim();
64
+ }
65
+ else if (chunk && typeof chunk === 'string') {
66
+ sentence = chunk.trim();
67
+ }
68
+ try {
69
+ if (sentence !== undefined) {
70
+ if (this.appendChecksumFlag) {
71
+ sentence = (0, nmea0183_utilities_1.appendChecksum)(sentence);
72
+ }
73
+ this.sentenceEvents.forEach((eventName) => {
74
+ this.app.emit(eventName, sentence);
75
+ this.app.signalk.emit(eventName, sentence);
76
+ });
77
+ let delta = null;
78
+ if (this.n2kParser.isN2KOver0183(sentence)) {
79
+ const pgn = this.n2kParser.parseN2KOver0183(sentence, () => { });
80
+ if (pgn) {
81
+ delta = (0, n2k_signalk_1.toDelta)(pgn, this.n2kState, {
82
+ sendMetaData: true
83
+ });
84
+ }
85
+ }
86
+ else {
87
+ delta = this.parser.parse(sentence);
88
+ }
89
+ if (delta !== null) {
90
+ if (timestamp !== null) {
91
+ delta.updates.forEach((update) => {
92
+ update.timestamp = timestamp;
93
+ });
94
+ }
95
+ this.push(delta);
96
+ }
97
+ }
98
+ }
99
+ catch (e) {
100
+ this.debug(e);
101
+ }
102
+ done();
103
+ }
104
+ }
105
+ exports.default = Nmea0183ToSignalK;
@@ -0,0 +1,5 @@
1
+ import { Transform } from 'stream';
2
+ export default class NullProvider extends Transform {
3
+ constructor();
4
+ }
5
+ //# sourceMappingURL=nullprovider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullprovider.d.ts","sourceRoot":"","sources":["../src/nullprovider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;;CAIlD"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const stream_1 = require("stream");
4
+ class NullProvider extends stream_1.Transform {
5
+ constructor() {
6
+ super({ objectMode: true });
7
+ }
8
+ }
9
+ exports.default = NullProvider;
@@ -0,0 +1,19 @@
1
+ import Execute from './execute';
2
+ import type { CreateDebug } from './types';
3
+ interface PigpioSeatalkOptions {
4
+ app: {
5
+ on(event: string, cb: (...args: any[]) => void): void;
6
+ emit(event: string, ...args: unknown[]): void;
7
+ setProviderStatus(id: string, msg: string): void;
8
+ setProviderError(id: string, msg: string): void;
9
+ };
10
+ providerId: string;
11
+ createDebug?: CreateDebug;
12
+ gpio?: string;
13
+ gpioInvert?: string;
14
+ }
15
+ export default class PigpioSeatalk extends Execute {
16
+ constructor(options: PigpioSeatalkOptions);
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=pigpio-seatalk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pigpio-seatalk.d.ts","sourceRoot":"","sources":["../src/pigpio-seatalk.ts"],"names":[],"mappings":"AAuBA,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA6D1C,UAAU,oBAAoB;IAC5B,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,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;gBACpC,OAAO,EAAE,oBAAoB;CAQ1C"}