openreplay/frontend/app/player/MessageDistributor/messages/MStreamReader.ts
Delirium 4ebcff74e1
feat(ui): make ui able to load unprocessed session files (#652)
* feat(ui): make ui able to load unprocessed session files

* feat(ui): some lgos

* feat(ui): connect api, rewrite old code

* feat(ui): create testing ui functions

* feat(ui/player): add ability to jump back in time for assist

* feat(ui/player): rewrite for better readability

* fix(ui/player): small refactor for better readability

* fix(ui/player): fix private prop

* fix(ui/player): add tooltip

* feat(ui/player): create time calculating tooltip

* fix(player): fix message timestamp

* fix(ui/player): cleanup

* fix(ui/player): handle errors for unprocessed files as well

* fix(player): fix logged message

* fix(player): code review fixes

* fix(ui): fix circle color, fix button text

* fix(tracker): code review

* fix(player): small style fixes
2022-08-11 12:07:34 +02:00

71 lines
1.8 KiB
TypeScript

import type { Message } from './message'
import type {
RawMessage,
RawSetNodeAttributeURLBased,
RawSetNodeAttribute,
RawSetCssDataURLBased,
RawSetCssData,
RawCssInsertRuleURLBased,
RawCssInsertRule,
} from './raw'
import RawMessageReader from './RawMessageReader'
import { resolveURL, resolveCSS } from './urlResolve'
interface RawMessageReaderI {
readMessage(): RawMessage | null
}
const resolveMsg = {
"set_node_attribute_url_based": (msg: RawSetNodeAttributeURLBased): RawSetNodeAttribute =>
({
...msg,
value: msg.name === 'src' || msg.name === 'href'
? resolveURL(msg.baseURL, msg.value)
: (msg.name === 'style'
? resolveCSS(msg.baseURL, msg.value)
: msg.value
),
tp: "set_node_attribute",
}),
"set_css_data_url_based": (msg: RawSetCssDataURLBased): RawSetCssData =>
({
...msg,
data: resolveCSS(msg.baseURL, msg.data),
tp: "set_css_data",
}),
"css_insert_rule_url_based": (msg: RawCssInsertRuleURLBased): RawCssInsertRule =>
({
...msg,
rule: resolveCSS(msg.baseURL, msg.rule),
tp: "css_insert_rule",
})
}
export default class MStreamReader {
constructor(private readonly r: RawMessageReaderI = new RawMessageReader()){}
// append(buf: Uint8Array) {
// this.r.append(buf)
// }
private t0: number = 0
private t: number = 0
private idx: number = 0
readNext(): Message | null {
let msg = this.r.readMessage()
if (msg === null) { return null }
if (msg.tp === "timestamp" || msg.tp === "batch_meta") {
this.t0 = this.t0 || msg.timestamp
this.t = msg.timestamp - this.t0
return this.readNext()
}
// why typescript doesn't work here?
msg = (resolveMsg[msg.tp] || ((m:RawMessage)=>m))(msg)
return Object.assign(msg, {
time: this.t,
_index: this.idx++,
})
}
}