UNPKG

@signalk/streams

Version:

Utilities for handling streams of Signal K data

60 lines (59 loc) 2.12 kB
"use strict"; 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;