UNPKG

@aptpod/iscp-ts

Version:

iSCP 2.0 client library for TypeScript

78 lines 4.78 kB
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _SegmentedMessageDecoder_segmentsMap, _SegmentedMessageDecoder_expiry, _SegmentedMessageDecoder_timeNow, _SegmentedMessageDecoder_onMessage; import { concat } from '../../utils/uint8array'; export class SegmentedMessageDecoder { constructor(config) { _SegmentedMessageDecoder_segmentsMap.set(this, void 0); _SegmentedMessageDecoder_expiry.set(this, void 0); _SegmentedMessageDecoder_timeNow.set(this, void 0); _SegmentedMessageDecoder_onMessage.set(this, void 0); __classPrivateFieldSet(this, _SegmentedMessageDecoder_segmentsMap, new Map(), "f"); __classPrivateFieldSet(this, _SegmentedMessageDecoder_expiry, config.expiry, "f"); __classPrivateFieldSet(this, _SegmentedMessageDecoder_timeNow, config.timeNow, "f"); __classPrivateFieldSet(this, _SegmentedMessageDecoder_onMessage, config.onMessage, "f"); } clear() { const segmentEntries = [...__classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").entries()]; segmentEntries.forEach(([sequenceNumber, segments]) => { segments.segmentMap.clear(); __classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").delete(sequenceNumber); }); } addMessage(message) { const segment = fromMessage(message); let segments = __classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").get(segment.sequenceNumber); if (!segments) { segments = { segmentMap: new Map(), expiredAt: 0, }; } segments.segmentMap.set(segment.index, segment); segments.expiredAt = __classPrivateFieldGet(this, _SegmentedMessageDecoder_timeNow, "f").call(this) + __classPrivateFieldGet(this, _SegmentedMessageDecoder_expiry, "f"); __classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").set(segment.sequenceNumber, segments); if (segments.segmentMap.size - 1 !== segment.maxIndex) { return; } const segmentedMessages = [...segments.segmentMap.values()].sort((a, b) => a.index - b.index).map((s) => s.message); const combinedMessage = concat(...segmentedMessages); segments.segmentMap.clear(); __classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").delete(segment.sequenceNumber); __classPrivateFieldGet(this, _SegmentedMessageDecoder_onMessage, "f").call(this, combinedMessage); } removeExpired() { const segmentEntries = [...__classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").entries()]; segmentEntries.forEach(([sequenceNumber, segments]) => { const expired = segments.expiredAt < __classPrivateFieldGet(this, _SegmentedMessageDecoder_timeNow, "f").call(this); if (expired) { segments.segmentMap.clear(); __classPrivateFieldGet(this, _SegmentedMessageDecoder_segmentsMap, "f").delete(sequenceNumber); } }); } } _SegmentedMessageDecoder_segmentsMap = new WeakMap(), _SegmentedMessageDecoder_expiry = new WeakMap(), _SegmentedMessageDecoder_timeNow = new WeakMap(), _SegmentedMessageDecoder_onMessage = new WeakMap(); const fromMessage = (message) => { const view = new DataView(message.buffer, message.byteOffset, message.byteLength); const sequenceNumber = view.getUint32(0, false); const maxIndex = view.getUint16(4, false); const index = view.getUint16(6, false); const segmentedMessage = message.slice(8); return { sequenceNumber, maxIndex, index, message: segmentedMessage, }; }; //# sourceMappingURL=index.js.map