@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,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const stream_1 = require("stream");
|
|
4
|
+
class FromJson extends stream_1.Transform {
|
|
5
|
+
constructor() {
|
|
6
|
+
super({ objectMode: true });
|
|
7
|
+
}
|
|
8
|
+
_transform(chunk, encoding, done) {
|
|
9
|
+
let parsed = null;
|
|
10
|
+
try {
|
|
11
|
+
parsed = JSON.parse(chunk.toString());
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
console.error('Could not parse JSON:' + chunk.toString());
|
|
15
|
+
}
|
|
16
|
+
if (parsed) {
|
|
17
|
+
this.push(parsed);
|
|
18
|
+
}
|
|
19
|
+
done();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.default = FromJson;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Execute from './execute';
|
|
2
|
+
import type { CreateDebug } from './types';
|
|
3
|
+
interface GpiodSeatalkOptions {
|
|
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 GpiodSeatalk extends Execute {
|
|
16
|
+
constructor(options: GpiodSeatalkOptions);
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=gpiod-seatalk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpiod-seatalk.d.ts","sourceRoot":"","sources":["../src/gpiod-seatalk.ts"],"names":[],"mappings":"AAsBA,OAAO,OAAO,MAAM,WAAW,CAAA;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA0V1C,UAAU,mBAAmB;IAC3B,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,YAAa,SAAQ,OAAO;gBACnC,OAAO,EAAE,mBAAmB;CAQzC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*
|
|
2
3
|
* Copyright 2024 Adrian Studer
|
|
3
4
|
*
|
|
@@ -13,16 +14,17 @@
|
|
|
13
14
|
* See the License for the specific language governing permissions and
|
|
14
15
|
* limitations under the License.
|
|
15
16
|
*/
|
|
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 });
|
|
17
21
|
/*
|
|
18
22
|
* This stream receives Seatalk1 data over GPIO on a Raspberry Pi
|
|
19
23
|
* Supports Python libraries gpiod 1.x and 2.x
|
|
20
24
|
* Supports Raspberry Pi OS Bookworm and Bullseye on Raspberry Pi 3, 4 and 5
|
|
21
25
|
*/
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
const cmd = `
|
|
26
|
+
const execute_1 = __importDefault(require("./execute"));
|
|
27
|
+
const pythonScript = `
|
|
26
28
|
import gpiod, sys, datetime, glob
|
|
27
29
|
|
|
28
30
|
ST_PIN = 4
|
|
@@ -364,15 +366,15 @@ if __name__ == "__main__":
|
|
|
364
366
|
pass
|
|
365
367
|
st.close()
|
|
366
368
|
print("exit")
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
369
|
+
`;
|
|
370
|
+
class GpiodSeatalk extends execute_1.default {
|
|
371
|
+
constructor(options) {
|
|
372
|
+
const createDebug = options.createDebug ?? require('debug');
|
|
373
|
+
super({
|
|
374
|
+
...options,
|
|
375
|
+
debug: createDebug('signalk:streams:gpiod-seatalk'),
|
|
376
|
+
command: `python -u -c '${pythonScript}' ${options.gpio} ${options.gpioInvert} `
|
|
377
|
+
});
|
|
378
|
+
}
|
|
374
379
|
}
|
|
375
|
-
|
|
376
|
-
require('util').inherits(GpiodSeatalk, Execute)
|
|
377
|
-
|
|
378
|
-
module.exports = GpiodSeatalk
|
|
380
|
+
exports.default = GpiodSeatalk;
|
package/dist/gpsd.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Transform, TransformCallback } from 'stream';
|
|
2
|
+
import type { CreateDebug } from './types';
|
|
3
|
+
interface GpsdOptions {
|
|
4
|
+
port?: number;
|
|
5
|
+
hostname?: string;
|
|
6
|
+
host?: string;
|
|
7
|
+
noDataReceivedTimeout?: number;
|
|
8
|
+
app: {
|
|
9
|
+
setProviderStatus(id: string, msg: string): void;
|
|
10
|
+
setProviderError(id: string, msg: string): void;
|
|
11
|
+
};
|
|
12
|
+
providerId: string;
|
|
13
|
+
createDebug?: CreateDebug;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export default class Gpsd extends Transform {
|
|
17
|
+
private readonly listener;
|
|
18
|
+
constructor(options: GpsdOptions);
|
|
19
|
+
end(): this;
|
|
20
|
+
_transform(chunk: Buffer, encoding: BufferEncoding, done: TransformCallback): void;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=gpsd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpsd.d.ts","sourceRoot":"","sources":["../src/gpsd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,GAAG,EAAE;QACH,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,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,SAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;gBAEzB,OAAO,EAAE,WAAW;IAiDhC,GAAG,IAAI,IAAI;IAKX,UAAU,CACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CAGR"}
|
package/dist/gpsd.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
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 stream_1 = require("stream");
|
|
7
|
+
const node_gpsd_client_1 = __importDefault(require("node-gpsd-client"));
|
|
8
|
+
class Gpsd extends stream_1.Transform {
|
|
9
|
+
listener;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
super({ objectMode: true });
|
|
12
|
+
const port = options.port ?? 2947;
|
|
13
|
+
const hostname = options.hostname ?? options.host ?? 'localhost';
|
|
14
|
+
const noDataReceivedTimeout = options.noDataReceivedTimeout ?? 0;
|
|
15
|
+
const setProviderStatus = (msg) => {
|
|
16
|
+
options.app.setProviderStatus(options.providerId, msg);
|
|
17
|
+
};
|
|
18
|
+
const createDebug = options.createDebug ?? require('debug');
|
|
19
|
+
this.listener = new node_gpsd_client_1.default({
|
|
20
|
+
port,
|
|
21
|
+
hostname,
|
|
22
|
+
logger: {
|
|
23
|
+
info: createDebug('signalk:streams:gpsd'),
|
|
24
|
+
warn: console.warn,
|
|
25
|
+
error: (msg) => {
|
|
26
|
+
options.app.setProviderError(options.providerId, `${hostname}:${port}: ` + msg);
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
parse: false,
|
|
30
|
+
reconnectThreshold: noDataReceivedTimeout,
|
|
31
|
+
reconnectInterval: noDataReceivedTimeout / 2
|
|
32
|
+
});
|
|
33
|
+
setProviderStatus(`Connecting to ${hostname}:${port}`);
|
|
34
|
+
this.listener.on('connected', () => {
|
|
35
|
+
setProviderStatus(`Connected to ${hostname}:${port}`);
|
|
36
|
+
this.listener.watch({
|
|
37
|
+
class: 'WATCH',
|
|
38
|
+
nmea: true,
|
|
39
|
+
json: false
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
this.listener.on('raw', (data) => {
|
|
43
|
+
this.push(data);
|
|
44
|
+
});
|
|
45
|
+
this.listener.connect();
|
|
46
|
+
}
|
|
47
|
+
end() {
|
|
48
|
+
this.listener.disconnect();
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
_transform(chunk, encoding, done) {
|
|
52
|
+
done();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.default = Gpsd;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAClE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
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
|
+
exports.listLogFiles = exports.getFullLogDir = exports.getLogger = exports.Execute = exports.Simple = void 0;
|
|
7
|
+
var simple_1 = require("./simple");
|
|
8
|
+
Object.defineProperty(exports, "Simple", { enumerable: true, get: function () { return __importDefault(simple_1).default; } });
|
|
9
|
+
var execute_1 = require("./execute");
|
|
10
|
+
Object.defineProperty(exports, "Execute", { enumerable: true, get: function () { return __importDefault(execute_1).default; } });
|
|
11
|
+
var logging_1 = require("./logging");
|
|
12
|
+
Object.defineProperty(exports, "getLogger", { enumerable: true, get: function () { return logging_1.getLogger; } });
|
|
13
|
+
Object.defineProperty(exports, "getFullLogDir", { enumerable: true, get: function () { return logging_1.getFullLogDir; } });
|
|
14
|
+
Object.defineProperty(exports, "listLogFiles", { enumerable: true, get: function () { return logging_1.listLogFiles; } });
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Transform, TransformCallback } from 'stream';
|
|
2
|
+
import type { CreateDebug } from './types';
|
|
3
|
+
interface KeysFilterOptions {
|
|
4
|
+
excludeMatchingPaths: string[];
|
|
5
|
+
createDebug?: CreateDebug;
|
|
6
|
+
}
|
|
7
|
+
interface DeltaUpdate {
|
|
8
|
+
values?: Array<{
|
|
9
|
+
path: string;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}>;
|
|
12
|
+
$source?: string;
|
|
13
|
+
source?: unknown;
|
|
14
|
+
timestamp?: string;
|
|
15
|
+
}
|
|
16
|
+
interface Delta {
|
|
17
|
+
updates?: DeltaUpdate[];
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
export default class KeysFilter extends Transform {
|
|
21
|
+
private readonly debug;
|
|
22
|
+
private readonly exclude;
|
|
23
|
+
constructor(options: KeysFilterOptions);
|
|
24
|
+
_transform(chunk: Buffer | string | Delta, encoding: BufferEncoding, done: TransformCallback): void;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=keys-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys-filter.d.ts","sourceRoot":"","sources":["../src/keys-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,SAAS,CAAA;AAEvD,UAAU,iBAAiB;IACzB,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;CAC1B;AAED,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAA;IACxD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,UAAU,KAAK;IACb,OAAO,CAAC,EAAE,WAAW,EAAE,CAAA;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,OAAO,EAAE,iBAAiB;IAOtC,UAAU,CACR,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAC9B,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CAsDR"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const stream_1 = require("stream");
|
|
4
|
+
class KeysFilter extends stream_1.Transform {
|
|
5
|
+
debug;
|
|
6
|
+
exclude;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super({ objectMode: true });
|
|
9
|
+
const createDebug = options.createDebug ?? require('debug');
|
|
10
|
+
this.debug = createDebug('signalk:streams:keys-filter');
|
|
11
|
+
this.exclude = options.excludeMatchingPaths;
|
|
12
|
+
}
|
|
13
|
+
_transform(chunk, encoding, done) {
|
|
14
|
+
let delta = null;
|
|
15
|
+
let isString = false;
|
|
16
|
+
if (typeof chunk === 'object' &&
|
|
17
|
+
chunk !== null &&
|
|
18
|
+
!Buffer.isBuffer(chunk)) {
|
|
19
|
+
delta = chunk;
|
|
20
|
+
}
|
|
21
|
+
else if (typeof chunk === 'string') {
|
|
22
|
+
try {
|
|
23
|
+
delta = JSON.parse(chunk);
|
|
24
|
+
isString = true;
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
28
|
+
this.debug(`Error parsing chunk: ${message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (delta && Array.isArray(delta.updates)) {
|
|
32
|
+
const updates = [];
|
|
33
|
+
for (const update of delta.updates) {
|
|
34
|
+
if (Array.isArray(update.values)) {
|
|
35
|
+
const values = update.values.filter((value) => !this.exclude.includes(value.path));
|
|
36
|
+
if (values.length > 0) {
|
|
37
|
+
const upd = { values };
|
|
38
|
+
if (update.$source) {
|
|
39
|
+
upd.$source = update.$source;
|
|
40
|
+
}
|
|
41
|
+
if (update.source) {
|
|
42
|
+
upd.source = update.source;
|
|
43
|
+
}
|
|
44
|
+
if (update.timestamp) {
|
|
45
|
+
upd.timestamp = update.timestamp;
|
|
46
|
+
}
|
|
47
|
+
updates.push(upd);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (updates.length > 0) {
|
|
52
|
+
delta.updates = updates;
|
|
53
|
+
this.push(isString ? JSON.stringify(delta) : delta);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
done();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.default = KeysFilter;
|
package/dist/liner.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Transform, TransformCallback } from 'stream';
|
|
2
|
+
interface LinerOptions {
|
|
3
|
+
lineSeparator?: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
export default class Liner extends Transform {
|
|
7
|
+
private readonly lineSeparator;
|
|
8
|
+
private lastLineData;
|
|
9
|
+
constructor(options?: LinerOptions);
|
|
10
|
+
_transform(chunk: Buffer, encoding: BufferEncoding, done: TransformCallback): void;
|
|
11
|
+
_flush(done: TransformCallback): void;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=liner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liner.d.ts","sourceRoot":"","sources":["../src/liner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,UAAU,YAAY;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,SAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,YAAY,CAAsB;gBAE9B,OAAO,GAAE,YAAiB;IAKtC,UAAU,CACR,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;IAuBP,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;CAOtC"}
|
package/dist/liner.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const stream_1 = require("stream");
|
|
4
|
+
class Liner extends stream_1.Transform {
|
|
5
|
+
lineSeparator;
|
|
6
|
+
lastLineData = null;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
super({ objectMode: true });
|
|
9
|
+
this.lineSeparator = options.lineSeparator ?? '\n';
|
|
10
|
+
}
|
|
11
|
+
_transform(chunk, encoding, done) {
|
|
12
|
+
let data = chunk.toString();
|
|
13
|
+
if (this.lastLineData) {
|
|
14
|
+
data = this.lastLineData + data;
|
|
15
|
+
}
|
|
16
|
+
const lines = data.split(this.lineSeparator);
|
|
17
|
+
this.lastLineData = lines.splice(lines.length - 1, 1)[0] ?? null;
|
|
18
|
+
if (this.lastLineData && this.lastLineData.length > 2048) {
|
|
19
|
+
console.error('Are you sure you are using the correct line terminator? Not going to handle lines longer than 2048 chars.');
|
|
20
|
+
this.lastLineData = '';
|
|
21
|
+
}
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
this.push(line);
|
|
24
|
+
}
|
|
25
|
+
done();
|
|
26
|
+
}
|
|
27
|
+
_flush(done) {
|
|
28
|
+
if (this.lastLineData) {
|
|
29
|
+
this.push(this.lastLineData);
|
|
30
|
+
}
|
|
31
|
+
this.lastLineData = null;
|
|
32
|
+
done();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.default = Liner;
|
package/dist/log.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Transform, TransformCallback } from 'stream';
|
|
2
|
+
import type { LoggingApp } from './logging';
|
|
3
|
+
interface LogOptions {
|
|
4
|
+
app: LoggingApp;
|
|
5
|
+
discriminator?: string;
|
|
6
|
+
logdir?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export default class Log extends Transform {
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(options: LogOptions);
|
|
12
|
+
_transform(msg: unknown, encoding: BufferEncoding, done: TransformCallback): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3C,UAAU,UAAU;IAClB,GAAG,EAAE,UAAU,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,SAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;gBAEnC,OAAO,EAAE,UAAU;IAK/B,UAAU,CACR,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CAKR"}
|
package/dist/log.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const stream_1 = require("stream");
|
|
4
|
+
const logging_1 = require("./logging");
|
|
5
|
+
class Log extends stream_1.Transform {
|
|
6
|
+
logger;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super({ objectMode: true });
|
|
9
|
+
this.logger = (0, logging_1.getLogger)(options.app, options.discriminator, options.logdir);
|
|
10
|
+
}
|
|
11
|
+
_transform(msg, encoding, done) {
|
|
12
|
+
this.push(msg);
|
|
13
|
+
this.logger(msg);
|
|
14
|
+
done();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.default = Log;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface LoggingApp {
|
|
2
|
+
config: {
|
|
3
|
+
configPath: string;
|
|
4
|
+
settings: {
|
|
5
|
+
loggingDirectory?: string;
|
|
6
|
+
keepMostRecentLogsOnly?: boolean;
|
|
7
|
+
logCountToKeep?: number;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function getLogger(app: LoggingApp, discriminator?: string, logdir?: string): (msg: unknown) => void;
|
|
12
|
+
export declare function getFullLogDir(app: LoggingApp, logdir?: string): string;
|
|
13
|
+
export declare function listLogFiles(app: LoggingApp, cb: (err: NodeJS.ErrnoException | undefined, files?: string[]) => void): void;
|
|
14
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE;QACN,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE;YACR,gBAAgB,CAAC,EAAE,MAAM,CAAA;YACzB,sBAAsB,CAAC,EAAE,OAAO,CAAA;YAChC,cAAc,CAAC,EAAE,MAAM,CAAA;SACxB,CAAA;KACF,CAAA;CACF;AAsED,wBAAgB,SAAS,CACvB,GAAG,EAAE,UAAU,EACf,aAAa,SAAK,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CA8CxB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAItE;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,UAAU,EACf,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,GACrE,IAAI,CAWN"}
|
package/dist/logging.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2017 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.getLogger = getLogger;
|
|
22
|
+
exports.getFullLogDir = getFullLogDir;
|
|
23
|
+
exports.listLogFiles = listLogFiles;
|
|
24
|
+
const file_timestamp_stream_1 = __importDefault(require("file-timestamp-stream"));
|
|
25
|
+
const path_1 = __importDefault(require("path"));
|
|
26
|
+
const fs_1 = __importDefault(require("fs"));
|
|
27
|
+
let debug = require('debug')('signalk:streams:logging');
|
|
28
|
+
const filenamePattern = /skserver-raw_\d\d\d\d-\d\d-\d\dT\d\d\.log/;
|
|
29
|
+
const loggers = {};
|
|
30
|
+
class FileTimestampStreamWithDelete extends file_timestamp_stream_1.default {
|
|
31
|
+
app;
|
|
32
|
+
filesToKeep;
|
|
33
|
+
fullLogDir;
|
|
34
|
+
prevFilename;
|
|
35
|
+
constructor(app, fullLogDir, filesToKeep, options) {
|
|
36
|
+
super(options);
|
|
37
|
+
this.app = app;
|
|
38
|
+
this.filesToKeep = filesToKeep;
|
|
39
|
+
this.fullLogDir = fullLogDir;
|
|
40
|
+
this.prevFilename = undefined;
|
|
41
|
+
debug = (options.createDebug ?? require('debug'))('signalk:streams:logging');
|
|
42
|
+
}
|
|
43
|
+
newFilename() {
|
|
44
|
+
if (this.prevFilename !== this.currentFilename) {
|
|
45
|
+
this.prevFilename = this.currentFilename;
|
|
46
|
+
this.deleteOldFiles();
|
|
47
|
+
}
|
|
48
|
+
return super.newFilename();
|
|
49
|
+
}
|
|
50
|
+
deleteOldFiles() {
|
|
51
|
+
debug('Checking for old log files');
|
|
52
|
+
listLogFiles(this.app, (err, files) => {
|
|
53
|
+
if (err) {
|
|
54
|
+
console.error(err);
|
|
55
|
+
}
|
|
56
|
+
else if (files &&
|
|
57
|
+
this.filesToKeep !== undefined &&
|
|
58
|
+
files.length > this.filesToKeep) {
|
|
59
|
+
const sortedFiles = files.sort();
|
|
60
|
+
const numToDelete = files.length - this.filesToKeep;
|
|
61
|
+
debug(`Will delete ${numToDelete} files`);
|
|
62
|
+
for (let i = 0; i < numToDelete; i++) {
|
|
63
|
+
const fileName = path_1.default.join(this.fullLogDir, sortedFiles[i]);
|
|
64
|
+
debug(`Deleting ${fileName}`);
|
|
65
|
+
fs_1.default.unlink(fileName, (unlinkErr) => {
|
|
66
|
+
if (unlinkErr) {
|
|
67
|
+
console.error(unlinkErr);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
debug(`${fileName} was deleted`);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function getLogger(app, discriminator = '', logdir) {
|
|
79
|
+
const fullLogdir = getFullLogDir(app, logdir);
|
|
80
|
+
if (!loggers[fullLogdir]) {
|
|
81
|
+
const fileName = path_1.default.join(fullLogdir, 'skserver-raw_%Y-%m-%dT%H.log');
|
|
82
|
+
debug(`logging to ${fileName}`);
|
|
83
|
+
let fileTimestampStream;
|
|
84
|
+
if (app.config.settings.keepMostRecentLogsOnly === undefined ||
|
|
85
|
+
app.config.settings.keepMostRecentLogsOnly) {
|
|
86
|
+
fileTimestampStream = new FileTimestampStreamWithDelete(app, fullLogdir, app.config.settings.logCountToKeep, { path: fileName });
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
fileTimestampStream = new file_timestamp_stream_1.default({ path: fileName });
|
|
90
|
+
}
|
|
91
|
+
loggers[fullLogdir] = fileTimestampStream;
|
|
92
|
+
}
|
|
93
|
+
const logger = loggers[fullLogdir];
|
|
94
|
+
logger.on('error', (err) => {
|
|
95
|
+
console.error(`Error opening data logging file: ${err.message}`);
|
|
96
|
+
});
|
|
97
|
+
return (msg) => {
|
|
98
|
+
try {
|
|
99
|
+
const logMsg = msg;
|
|
100
|
+
logger.write(Date.now() +
|
|
101
|
+
';' +
|
|
102
|
+
discriminator +
|
|
103
|
+
';' +
|
|
104
|
+
(logMsg.updates ? JSON.stringify(msg) : String(msg)) +
|
|
105
|
+
'\n');
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
console.error(e);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function getFullLogDir(app, logdir) {
|
|
113
|
+
const dir = logdir || app.config.settings.loggingDirectory || app.config.configPath;
|
|
114
|
+
return path_1.default.isAbsolute(dir) ? dir : path_1.default.join(app.config.configPath, dir);
|
|
115
|
+
}
|
|
116
|
+
function listLogFiles(app, cb) {
|
|
117
|
+
fs_1.default.readdir(getFullLogDir(app), (err, files) => {
|
|
118
|
+
if (!err) {
|
|
119
|
+
cb(undefined, files.filter((filename) => filenamePattern.test(filename)));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
cb(err);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Transform, TransformCallback } from 'stream';
|
|
2
|
+
import { CreateDebug } from './types';
|
|
3
|
+
interface MdnsWsOptions {
|
|
4
|
+
app: {
|
|
5
|
+
config: {
|
|
6
|
+
getExternalHostname(): string;
|
|
7
|
+
getExternalPort(): number;
|
|
8
|
+
};
|
|
9
|
+
setProviderStatus(id: string, msg: string): void;
|
|
10
|
+
setProviderError(id: string, msg: string): void;
|
|
11
|
+
};
|
|
12
|
+
providerId: string;
|
|
13
|
+
createDebug?: CreateDebug;
|
|
14
|
+
host?: string;
|
|
15
|
+
port?: number;
|
|
16
|
+
type?: string;
|
|
17
|
+
subscription?: string;
|
|
18
|
+
selfHandling?: string;
|
|
19
|
+
remoteSelf?: string;
|
|
20
|
+
ignoreServers?: string[];
|
|
21
|
+
selfsignedcert?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export default class MdnsWs extends Transform {
|
|
24
|
+
private readonly options;
|
|
25
|
+
private readonly selfHost;
|
|
26
|
+
private readonly selfPort;
|
|
27
|
+
private readonly remoteServers;
|
|
28
|
+
private readonly debug;
|
|
29
|
+
private readonly dataDebug;
|
|
30
|
+
private handleContext;
|
|
31
|
+
private signalkClient?;
|
|
32
|
+
constructor(options: MdnsWsOptions);
|
|
33
|
+
private connectClient;
|
|
34
|
+
_transform(chunk: unknown, encoding: BufferEncoding, done: TransformCallback): void;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=mdns-ws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdns-ws.d.ts","sourceRoot":"","sources":["../src/mdns-ws.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,EAAE,WAAW,EAAe,MAAM,SAAS,CAAA;AAElD,UAAU,aAAa;IACrB,GAAG,EAAE;QACH,MAAM,EAAE;YACN,mBAAmB,IAAI,MAAM,CAAA;YAC7B,eAAe,IAAI,MAAM,CAAA;SAC1B,CAAA;QACD,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,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAOD,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,SAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,aAAa,CAAC,CAAQ;gBAElB,OAAO,EAAE,aAAa;IAuDlC,OAAO,CAAC,aAAa;IA8ErB,UAAU,CACR,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,iBAAiB,GACtB,IAAI;CAGR"}
|