Str dict global (#3064)

* testing global string dictionary

* ui: v bump

* tracker: save last prefix

* tracker: substract years from dateid

* tracker: fix digit shaving
This commit is contained in:
Delirium 2025-02-25 15:19:31 +01:00 committed by GitHub
parent 264f35cc9e
commit ac232ef599
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 248 additions and 21 deletions

View file

@ -10,5 +10,5 @@ func IsMobileType(id int) bool {
} }
func IsDOMType(id int) bool { func IsDOMType(id int) bool {
return 0 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 37 == id || 38 == id || 49 == id || 50 == id || 51 == id || 43 == id || 52 == id || 54 == id || 55 == id || 57 == id || 58 == id || 59 == id || 60 == id || 61 == id || 67 == id || 68 == id || 69 == id || 70 == id || 71 == id || 72 == id || 73 == id || 74 == id || 75 == id || 76 == id || 77 == id || 113 == id || 114 == id || 117 == id || 118 == id || 119 == id || 122 == id || 93 == id || 96 == id || 100 == id || 101 == id || 102 == id || 103 == id || 104 == id || 105 == id || 106 == id || 111 == id return 0 == id || 4 == id || 5 == id || 6 == id || 7 == id || 8 == id || 9 == id || 10 == id || 11 == id || 12 == id || 13 == id || 14 == id || 15 == id || 16 == id || 18 == id || 19 == id || 20 == id || 34 == id || 35 == id || 37 == id || 38 == id || 49 == id || 50 == id || 51 == id || 43 == id || 52 == id || 54 == id || 55 == id || 57 == id || 58 == id || 59 == id || 60 == id || 61 == id || 67 == id || 68 == id || 69 == id || 70 == id || 71 == id || 72 == id || 73 == id || 74 == id || 75 == id || 76 == id || 77 == id || 113 == id || 114 == id || 117 == id || 118 == id || 119 == id || 122 == id || 93 == id || 96 == id || 100 == id || 101 == id || 102 == id || 103 == id || 104 == id || 105 == id || 106 == id || 111 == id
} }

View file

@ -35,6 +35,8 @@ const (
MsgPageEventDeprecated = 31 MsgPageEventDeprecated = 31
MsgInputEvent = 32 MsgInputEvent = 32
MsgPageEvent = 33 MsgPageEvent = 33
MsgStringDictGlobal = 34
MsgSetNodeAttributeDictGlobal = 35
MsgCSSInsertRule = 37 MsgCSSInsertRule = 37
MsgCSSDeleteRule = 38 MsgCSSDeleteRule = 38
MsgFetch = 39 MsgFetch = 39
@ -1015,6 +1017,54 @@ func (msg *PageEvent) TypeID() int {
return 33 return 33
} }
type StringDictGlobal struct {
message
Key uint64
Value string
}
func (msg *StringDictGlobal) Encode() []byte {
buf := make([]byte, 21+len(msg.Value))
buf[0] = 34
p := 1
p = WriteUint(msg.Key, buf, p)
p = WriteString(msg.Value, buf, p)
return buf[:p]
}
func (msg *StringDictGlobal) Decode() Message {
return msg
}
func (msg *StringDictGlobal) TypeID() int {
return 34
}
type SetNodeAttributeDictGlobal struct {
message
ID uint64
Name uint64
Value uint64
}
func (msg *SetNodeAttributeDictGlobal) Encode() []byte {
buf := make([]byte, 31)
buf[0] = 35
p := 1
p = WriteUint(msg.ID, buf, p)
p = WriteUint(msg.Name, buf, p)
p = WriteUint(msg.Value, buf, p)
return buf[:p]
}
func (msg *SetNodeAttributeDictGlobal) Decode() Message {
return msg
}
func (msg *SetNodeAttributeDictGlobal) TypeID() int {
return 35
}
type CSSInsertRule struct { type CSSInsertRule struct {
message message
ID uint64 ID uint64

View file

@ -606,6 +606,33 @@ func DecodePageEvent(reader BytesReader) (Message, error) {
return msg, err return msg, err
} }
func DecodeStringDictGlobal(reader BytesReader) (Message, error) {
var err error = nil
msg := &StringDictGlobal{}
if msg.Key, err = reader.ReadUint(); err != nil {
return nil, err
}
if msg.Value, err = reader.ReadString(); err != nil {
return nil, err
}
return msg, err
}
func DecodeSetNodeAttributeDictGlobal(reader BytesReader) (Message, error) {
var err error = nil
msg := &SetNodeAttributeDictGlobal{}
if msg.ID, err = reader.ReadUint(); err != nil {
return nil, err
}
if msg.Name, err = reader.ReadUint(); err != nil {
return nil, err
}
if msg.Value, err = reader.ReadUint(); err != nil {
return nil, err
}
return msg, err
}
func DecodeCSSInsertRule(reader BytesReader) (Message, error) { func DecodeCSSInsertRule(reader BytesReader) (Message, error) {
var err error = nil var err error = nil
msg := &CSSInsertRule{} msg := &CSSInsertRule{}
@ -2123,6 +2150,10 @@ func ReadMessage(t uint64, reader BytesReader) (Message, error) {
return DecodeInputEvent(reader) return DecodeInputEvent(reader)
case 33: case 33:
return DecodePageEvent(reader) return DecodePageEvent(reader)
case 34:
return DecodeStringDictGlobal(reader)
case 35:
return DecodeSetNodeAttributeDictGlobal(reader)
case 37: case 37:
return DecodeCSSInsertRule(reader) return DecodeCSSInsertRule(reader)
case 38: case 38:

View file

@ -300,6 +300,7 @@ export default class DOMManager extends ListWalker<Message> {
case MType.SetNodeAttribute: case MType.SetNodeAttribute:
this.setNodeAttribute(msg); this.setNodeAttribute(msg);
return; return;
case MType.SetNodeAttributeDictGlobal:
case MType.SetNodeAttributeDict: case MType.SetNodeAttributeDict:
const name = this.globalDict.get(msg.name); const name = this.globalDict.get(msg.name);
const value = this.globalDict.get(msg.value); const value = this.globalDict.get(msg.value);

View file

@ -29,7 +29,7 @@ export default class PagesManager extends ListWalker<DOMManager> {
*/ */
falseOrder = false; falseOrder = false;
appendMessage(m: Message): void { appendMessage(m: Message): void {
if (m.tp === MType.StringDict) { if ([MType.StringDict, MType.StringDictGlobal].includes(m.tp)) {
this.globalDictionary.set(m.key, m.value); this.globalDictionary.set(m.key, m.value);
return; return;
} }
@ -61,6 +61,7 @@ export default class PagesManager extends ListWalker<DOMManager> {
}, },
}) })
); );
console.log(this.globalDictionary)
this.falseOrder = false; this.falseOrder = false;
} }
if (this.last === null) { if (this.last === null) {

View file

@ -233,6 +233,28 @@ export default class RawMessageReader extends PrimitiveReader {
}; };
} }
case 34: {
const key = this.readUint(); if (key === null) { return resetPointer() }
const value = this.readString(); if (value === null) { return resetPointer() }
return {
tp: MType.StringDictGlobal,
key,
value,
};
}
case 35: {
const id = this.readUint(); if (id === null) { return resetPointer() }
const name = this.readUint(); if (name === null) { return resetPointer() }
const value = this.readUint(); if (value === null) { return resetPointer() }
return {
tp: MType.SetNodeAttributeDictGlobal,
id,
name,
value,
};
}
case 37: { case 37: {
const id = this.readUint(); if (id === null) { return resetPointer() } const id = this.readUint(); if (id === null) { return resetPointer() }
const rule = this.readString(); if (rule === null) { return resetPointer() } const rule = this.readString(); if (rule === null) { return resetPointer() }

View file

@ -4,7 +4,7 @@
import { MType } from './raw.gen' import { MType } from './raw.gen'
const IOS_TYPES = [90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,106,107,110,111] const IOS_TYPES = [90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,106,107,110,111]
const DOM_TYPES = [0,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20,37,38,49,50,51,43,52,54,55,57,58,59,60,61,67,68,69,70,71,72,73,74,75,76,77,113,114,117,118,119,122] const DOM_TYPES = [0,4,5,6,7,8,9,10,11,12,13,14,15,16,18,19,20,34,35,37,38,49,50,51,43,52,54,55,57,58,59,60,61,67,68,69,70,71,72,73,74,75,76,77,113,114,117,118,119,122]
export function isDOMType(t: MType) { export function isDOMType(t: MType) {
return DOM_TYPES.includes(t) return DOM_TYPES.includes(t)
} }

View file

@ -23,6 +23,8 @@ import type {
RawMouseMove, RawMouseMove,
RawNetworkRequestDeprecated, RawNetworkRequestDeprecated,
RawConsoleLog, RawConsoleLog,
RawStringDictGlobal,
RawSetNodeAttributeDictGlobal,
RawCssInsertRule, RawCssInsertRule,
RawCssDeleteRule, RawCssDeleteRule,
RawFetch, RawFetch,
@ -123,6 +125,10 @@ export type NetworkRequestDeprecated = RawNetworkRequestDeprecated & Timed
export type ConsoleLog = RawConsoleLog & Timed export type ConsoleLog = RawConsoleLog & Timed
export type StringDictGlobal = RawStringDictGlobal & Timed
export type SetNodeAttributeDictGlobal = RawSetNodeAttributeDictGlobal & Timed
export type CssInsertRule = RawCssInsertRule & Timed export type CssInsertRule = RawCssInsertRule & Timed
export type CssDeleteRule = RawCssDeleteRule & Timed export type CssDeleteRule = RawCssDeleteRule & Timed

View file

@ -21,6 +21,8 @@ export const enum MType {
MouseMove = 20, MouseMove = 20,
NetworkRequestDeprecated = 21, NetworkRequestDeprecated = 21,
ConsoleLog = 22, ConsoleLog = 22,
StringDictGlobal = 34,
SetNodeAttributeDictGlobal = 35,
CssInsertRule = 37, CssInsertRule = 37,
CssDeleteRule = 38, CssDeleteRule = 38,
Fetch = 39, Fetch = 39,
@ -207,6 +209,19 @@ export interface RawConsoleLog {
value: string, value: string,
} }
export interface RawStringDictGlobal {
tp: MType.StringDictGlobal,
key: number,
value: string,
}
export interface RawSetNodeAttributeDictGlobal {
tp: MType.SetNodeAttributeDictGlobal,
id: number,
name: number,
value: number,
}
export interface RawCssInsertRule { export interface RawCssInsertRule {
tp: MType.CssInsertRule, tp: MType.CssInsertRule,
id: number, id: number,
@ -647,4 +662,4 @@ export interface RawMobileIssueEvent {
} }
export type RawMessage = RawTimestamp | RawSetPageLocationDeprecated | RawSetViewportSize | RawSetViewportScroll | RawCreateDocument | RawCreateElementNode | RawCreateTextNode | RawMoveNode | RawRemoveNode | RawSetNodeAttribute | RawRemoveNodeAttribute | RawSetNodeData | RawSetCssData | RawSetNodeScroll | RawSetInputValue | RawSetInputChecked | RawMouseMove | RawNetworkRequestDeprecated | RawConsoleLog | RawCssInsertRule | RawCssDeleteRule | RawFetch | RawProfiler | RawOTable | RawReduxDeprecated | RawVuex | RawMobX | RawNgRx | RawGraphQlDeprecated | RawPerformanceTrack | RawStringDictDeprecated | RawSetNodeAttributeDictDeprecated | RawStringDict | RawSetNodeAttributeDict | RawResourceTimingDeprecated | RawConnectionInformation | RawSetPageVisibility | RawLoadFontFace | RawSetNodeFocus | RawLongTask | RawSetNodeAttributeURLBased | RawSetCssDataURLBased | RawCssInsertRuleURLBased | RawMouseClick | RawMouseClickDeprecated | RawCreateIFrameDocument | RawAdoptedSsReplaceURLBased | RawAdoptedSsReplace | RawAdoptedSsInsertRuleURLBased | RawAdoptedSsInsertRule | RawAdoptedSsDeleteRule | RawAdoptedSsAddOwner | RawAdoptedSsRemoveOwner | RawZustand | RawNetworkRequest | RawWsChannel | RawSelectionChange | RawMouseThrashing | RawResourceTiming | RawTabChange | RawTabData | RawCanvasNode | RawTagTrigger | RawRedux | RawSetPageLocation | RawGraphQl | RawMobileEvent | RawMobileScreenChanges | RawMobileClickEvent | RawMobileInputEvent | RawMobilePerformanceEvent | RawMobileLog | RawMobileInternalError | RawMobileNetworkCall | RawMobileSwipeEvent | RawMobileIssueEvent; export type RawMessage = RawTimestamp | RawSetPageLocationDeprecated | RawSetViewportSize | RawSetViewportScroll | RawCreateDocument | RawCreateElementNode | RawCreateTextNode | RawMoveNode | RawRemoveNode | RawSetNodeAttribute | RawRemoveNodeAttribute | RawSetNodeData | RawSetCssData | RawSetNodeScroll | RawSetInputValue | RawSetInputChecked | RawMouseMove | RawNetworkRequestDeprecated | RawConsoleLog | RawStringDictGlobal | RawSetNodeAttributeDictGlobal | RawCssInsertRule | RawCssDeleteRule | RawFetch | RawProfiler | RawOTable | RawReduxDeprecated | RawVuex | RawMobX | RawNgRx | RawGraphQlDeprecated | RawPerformanceTrack | RawStringDictDeprecated | RawSetNodeAttributeDictDeprecated | RawStringDict | RawSetNodeAttributeDict | RawResourceTimingDeprecated | RawConnectionInformation | RawSetPageVisibility | RawLoadFontFace | RawSetNodeFocus | RawLongTask | RawSetNodeAttributeURLBased | RawSetCssDataURLBased | RawCssInsertRuleURLBased | RawMouseClick | RawMouseClickDeprecated | RawCreateIFrameDocument | RawAdoptedSsReplaceURLBased | RawAdoptedSsReplace | RawAdoptedSsInsertRuleURLBased | RawAdoptedSsInsertRule | RawAdoptedSsDeleteRule | RawAdoptedSsAddOwner | RawAdoptedSsRemoveOwner | RawZustand | RawNetworkRequest | RawWsChannel | RawSelectionChange | RawMouseThrashing | RawResourceTiming | RawTabChange | RawTabData | RawCanvasNode | RawTagTrigger | RawRedux | RawSetPageLocation | RawGraphQl | RawMobileEvent | RawMobileScreenChanges | RawMobileClickEvent | RawMobileInputEvent | RawMobilePerformanceEvent | RawMobileLog | RawMobileInternalError | RawMobileNetworkCall | RawMobileSwipeEvent | RawMobileIssueEvent;

View file

@ -22,6 +22,8 @@ export const TP_MAP = {
20: MType.MouseMove, 20: MType.MouseMove,
21: MType.NetworkRequestDeprecated, 21: MType.NetworkRequestDeprecated,
22: MType.ConsoleLog, 22: MType.ConsoleLog,
34: MType.StringDictGlobal,
35: MType.SetNodeAttributeDictGlobal,
37: MType.CssInsertRule, 37: MType.CssInsertRule,
38: MType.CssDeleteRule, 38: MType.CssDeleteRule,
39: MType.Fetch, 39: MType.Fetch,

View file

@ -173,6 +173,19 @@ type TrMetadata = [
value: string, value: string,
] ]
type TrStringDictGlobal = [
type: 34,
key: number,
value: string,
]
type TrSetNodeAttributeDictGlobal = [
type: 35,
id: number,
name: number,
value: number,
]
type TrCSSInsertRule = [ type TrCSSInsertRule = [
type: 37, type: 37,
id: number, id: number,
@ -570,7 +583,7 @@ type TrWebVitals = [
] ]
export type TrackerMessage = TrTimestamp | TrSetPageLocationDeprecated | TrSetViewportSize | TrSetViewportScroll | TrCreateDocument | TrCreateElementNode | TrCreateTextNode | TrMoveNode | TrRemoveNode | TrSetNodeAttribute | TrRemoveNodeAttribute | TrSetNodeData | TrSetNodeScroll | TrSetInputTarget | TrSetInputValue | TrSetInputChecked | TrMouseMove | TrNetworkRequestDeprecated | TrConsoleLog | TrPageLoadTiming | TrPageRenderTiming | TrCustomEvent | TrUserID | TrUserAnonymousID | TrMetadata | TrCSSInsertRule | TrCSSDeleteRule | TrFetch | TrProfiler | TrOTable | TrStateAction | TrReduxDeprecated | TrVuex | TrMobX | TrNgRx | TrGraphQLDeprecated | TrPerformanceTrack | TrStringDictDeprecated | TrSetNodeAttributeDictDeprecated | TrStringDict | TrSetNodeAttributeDict | TrResourceTimingDeprecated | TrConnectionInformation | TrSetPageVisibility | TrLoadFontFace | TrSetNodeFocus | TrLongTask | TrSetNodeAttributeURLBased | TrSetCSSDataURLBased | TrTechnicalInfo | TrCustomIssue | TrCSSInsertRuleURLBased | TrMouseClick | TrMouseClickDeprecated | TrCreateIFrameDocument | TrAdoptedSSReplaceURLBased | TrAdoptedSSInsertRuleURLBased | TrAdoptedSSDeleteRule | TrAdoptedSSAddOwner | TrAdoptedSSRemoveOwner | TrJSException | TrZustand | TrBatchMetadata | TrPartitionedMessage | TrNetworkRequest | TrWSChannel | TrInputChange | TrSelectionChange | TrMouseThrashing | TrUnbindNodes | TrResourceTiming | TrTabChange | TrTabData | TrCanvasNode | TrTagTrigger | TrRedux | TrSetPageLocation | TrGraphQL | TrWebVitals export type TrackerMessage = TrTimestamp | TrSetPageLocationDeprecated | TrSetViewportSize | TrSetViewportScroll | TrCreateDocument | TrCreateElementNode | TrCreateTextNode | TrMoveNode | TrRemoveNode | TrSetNodeAttribute | TrRemoveNodeAttribute | TrSetNodeData | TrSetNodeScroll | TrSetInputTarget | TrSetInputValue | TrSetInputChecked | TrMouseMove | TrNetworkRequestDeprecated | TrConsoleLog | TrPageLoadTiming | TrPageRenderTiming | TrCustomEvent | TrUserID | TrUserAnonymousID | TrMetadata | TrStringDictGlobal | TrSetNodeAttributeDictGlobal | TrCSSInsertRule | TrCSSDeleteRule | TrFetch | TrProfiler | TrOTable | TrStateAction | TrReduxDeprecated | TrVuex | TrMobX | TrNgRx | TrGraphQLDeprecated | TrPerformanceTrack | TrStringDictDeprecated | TrSetNodeAttributeDictDeprecated | TrStringDict | TrSetNodeAttributeDict | TrResourceTimingDeprecated | TrConnectionInformation | TrSetPageVisibility | TrLoadFontFace | TrSetNodeFocus | TrLongTask | TrSetNodeAttributeURLBased | TrSetCSSDataURLBased | TrTechnicalInfo | TrCustomIssue | TrCSSInsertRuleURLBased | TrMouseClick | TrMouseClickDeprecated | TrCreateIFrameDocument | TrAdoptedSSReplaceURLBased | TrAdoptedSSInsertRuleURLBased | TrAdoptedSSDeleteRule | TrAdoptedSSAddOwner | TrAdoptedSSRemoveOwner | TrJSException | TrZustand | TrBatchMetadata | TrPartitionedMessage | TrNetworkRequest | TrWSChannel | TrInputChange | TrSelectionChange | TrMouseThrashing | TrUnbindNodes | TrResourceTiming | TrTabChange | TrTabData | TrCanvasNode | TrTagTrigger | TrRedux | TrSetPageLocation | TrGraphQL | TrWebVitals
export default function translate(tMsg: TrackerMessage): RawMessage | null { export default function translate(tMsg: TrackerMessage): RawMessage | null {
switch(tMsg[0]) { switch(tMsg[0]) {
@ -731,6 +744,23 @@ export default function translate(tMsg: TrackerMessage): RawMessage | null {
} }
} }
case 34: {
return {
tp: MType.StringDictGlobal,
key: tMsg[1],
value: tMsg[2],
}
}
case 35: {
return {
tp: MType.SetNodeAttributeDictGlobal,
id: tMsg[1],
name: tMsg[2],
value: tMsg[3],
}
}
case 37: { case 37: {
return { return {
tp: MType.CssInsertRule, tp: MType.CssInsertRule,

View file

@ -210,6 +210,16 @@ message 33, 'PageEvent', :tracker => false, :replayer => false do
string 'WebVitals' string 'WebVitals'
end end
message 34, "StringDictGlobal" do
uint "Key"
string "Value"
end
message 35, 'SetNodeAttributeDictGlobal' do
uint 'ID'
uint 'Name'
uint 'Value'
end
# DEPRECATED since 4.0.2 in favor of AdoptedSSInsertRule + AdoptedSSAddOwner # DEPRECATED since 4.0.2 in favor of AdoptedSSInsertRule + AdoptedSSAddOwner
message 37, 'CSSInsertRule' do message 37, 'CSSInsertRule' do
uint 'ID' uint 'ID'

View file

@ -1,7 +1,7 @@
{ {
"name": "@openreplay/tracker", "name": "@openreplay/tracker",
"description": "The OpenReplay tracker main package", "description": "The OpenReplay tracker main package",
"version": "15.0.5-beta.1", "version": "16.0.0-beta.4",
"keywords": [ "keywords": [
"logging", "logging",
"replay" "replay"

View file

@ -27,6 +27,8 @@ export declare const enum Type {
UserID = 28, UserID = 28,
UserAnonymousID = 29, UserAnonymousID = 29,
Metadata = 30, Metadata = 30,
StringDictGlobal = 34,
SetNodeAttributeDictGlobal = 35,
CSSInsertRule = 37, CSSInsertRule = 37,
CSSDeleteRule = 38, CSSDeleteRule = 38,
Fetch = 39, Fetch = 39,
@ -252,6 +254,19 @@ export type Metadata = [
/*value:*/ string, /*value:*/ string,
] ]
export type StringDictGlobal = [
/*type:*/ Type.StringDictGlobal,
/*key:*/ number,
/*value:*/ string,
]
export type SetNodeAttributeDictGlobal = [
/*type:*/ Type.SetNodeAttributeDictGlobal,
/*id:*/ number,
/*name:*/ number,
/*value:*/ number,
]
export type CSSInsertRule = [ export type CSSInsertRule = [
/*type:*/ Type.CSSInsertRule, /*type:*/ Type.CSSInsertRule,
/*id:*/ number, /*id:*/ number,
@ -649,5 +664,5 @@ export type WebVitals = [
] ]
type Message = Timestamp | SetPageLocationDeprecated | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | NetworkRequestDeprecated | ConsoleLog | PageLoadTiming | PageRenderTiming | CustomEvent | UserID | UserAnonymousID | Metadata | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | ReduxDeprecated | Vuex | MobX | NgRx | GraphQLDeprecated | PerformanceTrack | StringDictDeprecated | SetNodeAttributeDictDeprecated | StringDict | SetNodeAttributeDict | ResourceTimingDeprecated | ConnectionInformation | SetPageVisibility | LoadFontFace | SetNodeFocus | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | MouseClickDeprecated | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | JSException | Zustand | BatchMetadata | PartitionedMessage | NetworkRequest | WSChannel | InputChange | SelectionChange | MouseThrashing | UnbindNodes | ResourceTiming | TabChange | TabData | CanvasNode | TagTrigger | Redux | SetPageLocation | GraphQL | WebVitals type Message = Timestamp | SetPageLocationDeprecated | SetViewportSize | SetViewportScroll | CreateDocument | CreateElementNode | CreateTextNode | MoveNode | RemoveNode | SetNodeAttribute | RemoveNodeAttribute | SetNodeData | SetNodeScroll | SetInputTarget | SetInputValue | SetInputChecked | MouseMove | NetworkRequestDeprecated | ConsoleLog | PageLoadTiming | PageRenderTiming | CustomEvent | UserID | UserAnonymousID | Metadata | StringDictGlobal | SetNodeAttributeDictGlobal | CSSInsertRule | CSSDeleteRule | Fetch | Profiler | OTable | StateAction | ReduxDeprecated | Vuex | MobX | NgRx | GraphQLDeprecated | PerformanceTrack | StringDictDeprecated | SetNodeAttributeDictDeprecated | StringDict | SetNodeAttributeDict | ResourceTimingDeprecated | ConnectionInformation | SetPageVisibility | LoadFontFace | SetNodeFocus | LongTask | SetNodeAttributeURLBased | SetCSSDataURLBased | TechnicalInfo | CustomIssue | CSSInsertRuleURLBased | MouseClick | MouseClickDeprecated | CreateIFrameDocument | AdoptedSSReplaceURLBased | AdoptedSSInsertRuleURLBased | AdoptedSSDeleteRule | AdoptedSSAddOwner | AdoptedSSRemoveOwner | JSException | Zustand | BatchMetadata | PartitionedMessage | NetworkRequest | WSChannel | InputChange | SelectionChange | MouseThrashing | UnbindNodes | ResourceTiming | TabChange | TabData | CanvasNode | TagTrigger | Redux | SetPageLocation | GraphQL | WebVitals
export default Message export default Message

View file

@ -316,6 +316,30 @@ export function Metadata(
] ]
} }
export function StringDictGlobal(
key: number,
value: string,
): Messages.StringDictGlobal {
return [
Messages.Type.StringDictGlobal,
key,
value,
]
}
export function SetNodeAttributeDictGlobal(
id: number,
name: number,
value: number,
): Messages.SetNodeAttributeDictGlobal {
return [
Messages.Type.SetNodeAttributeDictGlobal,
id,
name,
value,
]
}
export function CSSInsertRule( export function CSSInsertRule(
id: number, id: number,
rule: string, rule: string,

View file

@ -1,21 +1,33 @@
import { SetNodeAttributeDict, SetNodeAttribute, Type } from '../../common/messages.gen.js' import {
SetNodeAttributeDictGlobal,
SetNodeAttribute,
Type,
} from '../../common/messages.gen.js'
import App from '../app/index.js' import App from '../app/index.js'
export class StringDictionary { export class StringDictionary {
private idx = 1 private lastTs = 0
private lastSuffix = 1
/** backwards dictionary of /** backwards dictionary of
* [repeated str:key] * [repeated str:key]
* */ * */
private backDict: Record<string, string> = {} private backDict: Record<string, number> = {}
constructor(private readonly getPageNo: () => number | undefined) {} getKey = (str: string): [number, boolean] => {
getKey = (str: string): [string, boolean] => {
let isNew = false let isNew = false
if (!this.backDict[str]) { if (!this.backDict[str]) {
isNew = true isNew = true
this.backDict[str] = `${this.getPageNo() ?? 0}_${this.idx}` const digits = Math.floor(Math.log10(Date.now())) + 1
this.idx += 1 const shavedTs = Date.now() % (10 ** (digits - 2))
let id: number = shavedTs
if (id === this.lastTs) {
id = id * 10000 + this.lastSuffix
this.lastSuffix += 1
} else {
this.lastSuffix = 1
}
this.backDict[str] = id
this.lastTs = shavedTs
} }
return [this.backDict[str], isNew] return [this.backDict[str], isNew]
} }
@ -28,7 +40,7 @@ export default class AttributeSender {
constructor(options: { app: App; isDictDisabled: boolean }) { constructor(options: { app: App; isDictDisabled: boolean }) {
this.app = options.app this.app = options.app
this.isDictDisabled = options.isDictDisabled this.isDictDisabled = options.isDictDisabled
this.dict = new StringDictionary(this.app.session.getPageNumber) this.dict = new StringDictionary()
} }
public sendSetAttribute = (id: number, name: string, value: string) => { public sendSetAttribute = (id: number, name: string, value: string) => {
@ -36,8 +48,8 @@ export default class AttributeSender {
const msg: SetNodeAttribute = [Type.SetNodeAttribute, id, name, value] const msg: SetNodeAttribute = [Type.SetNodeAttribute, id, name, value]
return this.app.send(msg) return this.app.send(msg)
} else { } else {
const message: SetNodeAttributeDict = [ const message: SetNodeAttributeDictGlobal = [
Type.SetNodeAttributeDict, Type.SetNodeAttributeDictGlobal,
id, id,
this.applyDict(name), this.applyDict(name),
this.applyDict(value), this.applyDict(value),
@ -46,15 +58,15 @@ export default class AttributeSender {
} }
} }
private applyDict(str: string): string { private applyDict(str: string): number {
const [key, isNew] = this.dict.getKey(str) const [key, isNew] = this.dict.getKey(str)
if (isNew) { if (isNew) {
this.app.send([Type.StringDict, key, str]) this.app.send([Type.StringDictGlobal, key, str])
} }
return key return key
} }
clear() { clear() {
this.dict = new StringDictionary(this.app.session.getPageNumber) this.dict = new StringDictionary()
} }
} }

View file

@ -110,6 +110,14 @@ export default class MessageEncoder extends PrimitiveEncoder {
return this.string(msg[1]) && this.string(msg[2]) return this.string(msg[1]) && this.string(msg[2])
break break
case Messages.Type.StringDictGlobal:
return this.uint(msg[1]) && this.string(msg[2])
break
case Messages.Type.SetNodeAttributeDictGlobal:
return this.uint(msg[1]) && this.uint(msg[2]) && this.uint(msg[3])
break
case Messages.Type.CSSInsertRule: case Messages.Type.CSSInsertRule:
return this.uint(msg[1]) && this.string(msg[2]) && this.uint(msg[3]) return this.uint(msg[1]) && this.string(msg[2]) && this.uint(msg[3])
break break