@aptpod/iscp-ts
Version:
iSCP 2.0 client library for TypeScript
78 lines • 4.78 kB
JavaScript
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