@signalk/streams
Version:
Utilities for handling streams of Signal K data
60 lines (59 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const stream_1 = require("stream");
class KeysFilter extends stream_1.Transform {
debug;
exclude;
constructor(options) {
super({ objectMode: true });
const createDebug = options.createDebug ?? require('debug');
this.debug = createDebug('signalk:streams:keys-filter');
this.exclude = options.excludeMatchingPaths;
}
_transform(chunk, encoding, done) {
let delta = null;
let isString = false;
if (typeof chunk === 'object' &&
chunk !== null &&
!Buffer.isBuffer(chunk)) {
delta = chunk;
}
else if (typeof chunk === 'string') {
try {
delta = JSON.parse(chunk);
isString = true;
}
catch (e) {
const message = e instanceof Error ? e.message : String(e);
this.debug(`Error parsing chunk: ${message}`);
}
}
if (delta && Array.isArray(delta.updates)) {
const updates = [];
for (const update of delta.updates) {
if (Array.isArray(update.values)) {
const values = update.values.filter((value) => !this.exclude.includes(value.path));
if (values.length > 0) {
const upd = { values };
if (update.$source) {
upd.$source = update.$source;
}
if (update.source) {
upd.source = update.source;
}
if (update.timestamp) {
upd.timestamp = update.timestamp;
}
updates.push(upd);
}
}
}
if (updates.length > 0) {
delta.updates = updates;
this.push(isString ? JSON.stringify(delta) : delta);
}
}
done();
}
}
exports.default = KeysFilter;