import type { Message } from './message.gen'; import type { RawMessage } from './raw.gen'; import { MType } from './raw.gen'; interface RawMessageReaderI { readMessage(): RawMessage | null; } export default class MStreamReader { constructor( private readonly r: RawMessageReaderI, private startTs: number = 0, ) {} private t: number = 0; private idx: number = 0; currentTab = 'back-compatability'; readNext(): (Message & { _index: number; tabId: string }) | null { const msg = this.r.readMessage(); if (msg === null) { return null; } if (msg.tp === MType.Timestamp) { this.startTs = this.startTs || msg.timestamp; const newT = msg.timestamp - this.startTs; if (newT > this.t) { this.t = newT; } return this.readNext(); } if (msg.tp === MType.TabData) { this.currentTab = msg.tabId; return this.readNext(); } return Object.assign(msg, { time: this.t, _index: this.idx++, tabId: this.currentTab, }); } }