ray-logger-core 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/collectors/rrweb.d.ts +2 -2
- package/collectors/rrweb.d.ts.map +1 -1
- package/collectors/rrweb.js +22 -12
- package/collectors/rrweb.js.map +1 -1
- package/controller.d.ts +4 -2
- package/controller.d.ts.map +1 -1
- package/controller.js +35 -4
- package/controller.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.d.ts.map +1 -1
- package/index.js +211 -14
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/storage/idb.d.ts +4 -1
- package/storage/idb.d.ts.map +1 -1
- package/storage/idb.js +156 -1
- package/storage/idb.js.map +1 -1
- package/storage/idb.test.d.ts +2 -0
- package/storage/idb.test.d.ts.map +1 -0
- package/storage/idb.test.js +88 -0
- package/storage/idb.test.js.map +1 -0
- package/types.d.ts +29 -1
- package/types.d.ts.map +1 -1
- package/types.js +1 -0
- package/types.js.map +1 -1
package/collectors/rrweb.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { NewWebLoggerEvent } from '../types';
|
|
1
|
+
import type { NewWebLoggerEvent, RrwebRecordOptions } from '../types';
|
|
2
2
|
import type { CollectorDispose } from './types';
|
|
3
3
|
export interface RrwebCollectorOptions {
|
|
4
4
|
record(event: NewWebLoggerEvent): void;
|
|
5
|
-
|
|
5
|
+
rrwebOptions?: RrwebRecordOptions;
|
|
6
6
|
}
|
|
7
7
|
export declare function installRrwebCollector(options: RrwebCollectorOptions): CollectorDispose;
|
|
8
8
|
//# sourceMappingURL=rrweb.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rrweb.d.ts","sourceRoot":"","sources":["../../src/collectors/rrweb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rrweb.d.ts","sourceRoot":"","sources":["../../src/collectors/rrweb.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAc,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAQD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAwBtF"}
|
package/collectors/rrweb.js
CHANGED
|
@@ -5,7 +5,9 @@ export function installRrwebCollector(options) {
|
|
|
5
5
|
return noop;
|
|
6
6
|
}
|
|
7
7
|
try {
|
|
8
|
+
const rrwebOptions = mergeRrwebOptions(defaultRrwebOptions(), options.rrwebOptions);
|
|
8
9
|
const stop = rrwebRecord({
|
|
10
|
+
...rrwebOptions,
|
|
9
11
|
emit(event) {
|
|
10
12
|
options.record({
|
|
11
13
|
type: 'rrweb',
|
|
@@ -15,13 +17,6 @@ export function installRrwebCollector(options) {
|
|
|
15
17
|
},
|
|
16
18
|
});
|
|
17
19
|
},
|
|
18
|
-
recordCanvas: true,
|
|
19
|
-
sampling: {
|
|
20
|
-
canvas: 4,
|
|
21
|
-
media: 4,
|
|
22
|
-
},
|
|
23
|
-
collectFonts: true,
|
|
24
|
-
checkoutEveryNms: normalizeCheckoutEveryNms(options.checkoutEveryNms),
|
|
25
20
|
});
|
|
26
21
|
return stop ?? noop;
|
|
27
22
|
}
|
|
@@ -32,10 +27,25 @@ export function installRrwebCollector(options) {
|
|
|
32
27
|
function noop() {
|
|
33
28
|
// noop
|
|
34
29
|
}
|
|
35
|
-
function
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
30
|
+
function defaultRrwebOptions() {
|
|
31
|
+
return {
|
|
32
|
+
recordCanvas: true,
|
|
33
|
+
sampling: {
|
|
34
|
+
canvas: 2,
|
|
35
|
+
media: 2,
|
|
36
|
+
},
|
|
37
|
+
collectFonts: true,
|
|
38
|
+
checkoutEveryNms: DEFAULT_RRWEB_CHECKOUT_EVERY_NMS,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function mergeRrwebOptions(defaults, overrides) {
|
|
42
|
+
return {
|
|
43
|
+
...defaults,
|
|
44
|
+
...overrides,
|
|
45
|
+
sampling: {
|
|
46
|
+
...defaults.sampling,
|
|
47
|
+
...overrides?.sampling,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
40
50
|
}
|
|
41
51
|
//# sourceMappingURL=rrweb.js.map
|
package/collectors/rrweb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rrweb.js","sourceRoot":"","sources":["../../src/collectors/rrweb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rrweb.js","sourceRoot":"","sources":["../../src/collectors/rrweb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAe5D,MAAM,UAAU,qBAAqB,CAAC,OAA8B;IAClE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,iBAAiB,CAAC,mBAAmB,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;QACpF,MAAM,IAAI,GAAI,WAAsC,CAAC;YACnD,GAAG,YAAY;YACf,IAAI,CAAC,KAAK;gBACR,OAAO,CAAC,MAAM,CAAC;oBACb,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,OAAO,EAAE;wBACP,UAAU,EAAE,KAAK;qBAClB;iBACF,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,IAAI;IACX,OAAO;AACT,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;SACT;QACD,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,gCAAgC;KACnD,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,QAA4B,EAC5B,SAAyC;IAEzC,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,SAAS;QACZ,QAAQ,EAAE;YACR,GAAG,QAAQ,CAAC,QAAQ;YACpB,GAAG,SAAS,EAAE,QAAQ;SACvB;KACF,CAAC;AACJ,CAAC"}
|
package/controller.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cleanupIndexedDb } from './storage/idb';
|
|
2
|
+
import { type IndexedDbCleanupOptions, type IndexedDbCleanupResult, type NewWebLoggerEvent, type SessionExport, type WebLoggerConfig, type WebLoggerController, type WebLoggerEvent } from './types';
|
|
2
3
|
export interface InitWebLoggerOptions extends WebLoggerConfig {
|
|
3
4
|
sessionId?: string;
|
|
4
5
|
persistentSessionId?: string;
|
|
@@ -15,8 +16,9 @@ export declare class WebLoggerCoreController implements WebLoggerController {
|
|
|
15
16
|
flushToIdb(): Promise<void>;
|
|
16
17
|
exportFull(): Promise<SessionExport>;
|
|
17
18
|
exportSince(sinceMs: number): Promise<SessionExport>;
|
|
19
|
+
cleanupIndexedDb(options?: IndexedDbCleanupOptions): Promise<IndexedDbCleanupResult>;
|
|
18
20
|
destroy(): void;
|
|
19
21
|
}
|
|
20
22
|
export declare function initWebLogger(options?: InitWebLoggerOptions): WebLoggerController;
|
|
21
|
-
export { WebLoggerCoreController as InMemoryWebLoggerController };
|
|
23
|
+
export { cleanupIndexedDb, WebLoggerCoreController as InMemoryWebLoggerController };
|
|
22
24
|
//# sourceMappingURL=controller.d.ts.map
|
package/controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuB,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EAIL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,uBAAwB,YAAW,mBAAmB;;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,2BAA2B,CAAC,CAAC,GAAG,eAAe,CAAC;gBAYpF,OAAO,GAAE,oBAAyB;IAiD9C,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,cAAc;IAe1C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAQpC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAqBpD,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAe9F,OAAO,IAAI,IAAI;CA6FhB;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CAErF;AAED,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,IAAI,2BAA2B,EAAE,CAAC"}
|
package/controller.js
CHANGED
|
@@ -5,10 +5,10 @@ import { installFetchCollector } from './collectors/network/fetch';
|
|
|
5
5
|
import { installXhrCollector } from './collectors/network/xhr';
|
|
6
6
|
import { installRrwebCollector } from './collectors/rrweb';
|
|
7
7
|
import { installStorageCollector } from './collectors/storage';
|
|
8
|
-
import { IndexedDbEventStore } from './storage/idb';
|
|
8
|
+
import { IndexedDbEventStore, cleanupIndexedDb } from './storage/idb';
|
|
9
9
|
import { resolveSession } from './session';
|
|
10
10
|
import { Timeline, compareTimelineEvents, hasRrwebFullSnapshot } from './timeline';
|
|
11
|
-
import { DEFAULT_MEMORY_FLUSH_THRESHOLD_BYTES, SESSION_EXPORT_SCHEMA_VERSION, } from './types';
|
|
11
|
+
import { DEFAULT_INDEXED_DB_RETENTION_TTL_MS, DEFAULT_MEMORY_FLUSH_THRESHOLD_BYTES, SESSION_EXPORT_SCHEMA_VERSION, } from './types';
|
|
12
12
|
export class WebLoggerCoreController {
|
|
13
13
|
sessionId;
|
|
14
14
|
persistentSessionId;
|
|
@@ -47,6 +47,9 @@ export class WebLoggerCoreController {
|
|
|
47
47
|
namespaceKey: this.namespaceKey,
|
|
48
48
|
now: this.#now,
|
|
49
49
|
});
|
|
50
|
+
void this.#store.cleanup(this.#cleanupOptions()).catch(() => {
|
|
51
|
+
// Retention cleanup is best-effort and must not block SDK startup.
|
|
52
|
+
});
|
|
50
53
|
}
|
|
51
54
|
this.#readyPromise = this.#hydrateSeqFromIdb();
|
|
52
55
|
this.#collectorDisposers = [
|
|
@@ -61,7 +64,7 @@ export class WebLoggerCoreController {
|
|
|
61
64
|
installCookieCollector({ config: this.config, record: (event) => this.record(event) }),
|
|
62
65
|
installRrwebCollector({
|
|
63
66
|
record: (event) => this.record(event),
|
|
64
|
-
|
|
67
|
+
rrwebOptions: this.config.rrwebOptions,
|
|
65
68
|
}),
|
|
66
69
|
];
|
|
67
70
|
}
|
|
@@ -128,6 +131,19 @@ export class WebLoggerCoreController {
|
|
|
128
131
|
replayableStandalone: includesRrwebBaseline,
|
|
129
132
|
});
|
|
130
133
|
}
|
|
134
|
+
async cleanupIndexedDb(options = {}) {
|
|
135
|
+
const mergedOptions = {
|
|
136
|
+
...this.#cleanupOptions(),
|
|
137
|
+
...options,
|
|
138
|
+
excludeNamespaceKeys: [
|
|
139
|
+
this.namespaceKey,
|
|
140
|
+
...(this.#cleanupOptions().excludeNamespaceKeys ?? []),
|
|
141
|
+
...(options.excludeNamespaceKeys ?? []),
|
|
142
|
+
],
|
|
143
|
+
now: options.now ?? this.#now,
|
|
144
|
+
};
|
|
145
|
+
return this.#store ? this.#store.cleanup(mergedOptions) : cleanupIndexedDb(mergedOptions);
|
|
146
|
+
}
|
|
131
147
|
destroy() {
|
|
132
148
|
for (const dispose of this.#collectorDisposers.splice(0)) {
|
|
133
149
|
dispose();
|
|
@@ -188,11 +204,26 @@ export class WebLoggerCoreController {
|
|
|
188
204
|
].filter((event) => event !== undefined);
|
|
189
205
|
return anchors.sort(compareTimelineEvents).at(-1);
|
|
190
206
|
}
|
|
207
|
+
#cleanupOptions() {
|
|
208
|
+
return {
|
|
209
|
+
ttlMs: this.#validRetentionTtlMs(),
|
|
210
|
+
maxChunks: this.config.indexedDbMaxChunks,
|
|
211
|
+
maxEstimatedBytes: this.config.indexedDbMaxEstimatedBytes,
|
|
212
|
+
excludeNamespaceKeys: [this.namespaceKey],
|
|
213
|
+
now: this.#now,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
#validRetentionTtlMs() {
|
|
217
|
+
const ttlMs = this.config.indexedDbRetentionTtlMs;
|
|
218
|
+
return typeof ttlMs === 'number' && Number.isFinite(ttlMs) && ttlMs >= 0
|
|
219
|
+
? ttlMs
|
|
220
|
+
: DEFAULT_INDEXED_DB_RETENTION_TTL_MS;
|
|
221
|
+
}
|
|
191
222
|
}
|
|
192
223
|
export function initWebLogger(options = {}) {
|
|
193
224
|
return new WebLoggerCoreController(options);
|
|
194
225
|
}
|
|
195
|
-
export { WebLoggerCoreController as InMemoryWebLoggerController };
|
|
226
|
+
export { cleanupIndexedDb, WebLoggerCoreController as InMemoryWebLoggerController };
|
|
196
227
|
function createSessionId() {
|
|
197
228
|
if (globalThis.crypto?.randomUUID) {
|
|
198
229
|
return globalThis.crypto.randomUUID();
|
package/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export { InMemoryWebLoggerController, WebLoggerCoreController, initWebLogger } from './controller';
|
|
2
2
|
export type { InitWebLoggerOptions } from './controller';
|
|
3
|
-
export { EVENT_CHUNKS_STORE, IDB_VERSION, IndexedDbEventStore, SESSION_META_STORE, } from './storage/idb';
|
|
3
|
+
export { EVENT_CHUNKS_STORE, IDB_VERSION, IndexedDbEventStore, SESSION_META_STORE, cleanupIndexedDb, } from './storage/idb';
|
|
4
4
|
export type { EventChunkRecord, SessionMetaRecord } from './storage/idb';
|
|
5
5
|
export { resolveSession } from './session';
|
|
6
6
|
export type { ResolveSessionOptions, SessionState } from './session';
|
|
7
7
|
export { Timeline, compareTimelineEvents } from './timeline';
|
|
8
|
-
export { CONSOLE_CAPTURE_METHODS,
|
|
9
|
-
export type { BaseWebLoggerEvent, ConsoleCaptureMethod, ConsolePayload, ConsoleStackFrame, CookieSnapshotItem, CookieSnapshotSkippedItem, CookiePayload, ErrorPayload, JsonPrimitive, JsonValue, NetworkPayload, NetworkPayloadFailed, NetworkPayloadSuccess, NewWebLoggerEvent, RrwebEvent, RrwebPayload, SerializedValue, SessionExport, StorageSnapshotSkippedItem, StoragePayload, WebLoggerConfig, WebLoggerController, WebLoggerEvent, } from './types';
|
|
8
|
+
export { CONSOLE_CAPTURE_METHODS, DEFAULT_INDEXED_DB_NAME, DEFAULT_INDEXED_DB_RETENTION_TTL_MS, DEFAULT_MEMORY_FLUSH_THRESHOLD_BYTES, DEFAULT_RRWEB_CHECKOUT_EVERY_NMS, DEFAULT_SESSION_STORAGE_KEY, PACKAGE_NAME, SESSION_EXPORT_SCHEMA_VERSION, } from './types';
|
|
9
|
+
export type { BaseWebLoggerEvent, ConsoleCaptureMethod, ConsolePayload, ConsoleStackFrame, CookieSnapshotItem, CookieSnapshotSkippedItem, CookiePayload, ErrorPayload, IndexedDbCleanupOptions, IndexedDbCleanupResult, JsonPrimitive, JsonValue, NetworkPayload, NetworkPayloadFailed, NetworkPayloadSuccess, NewWebLoggerEvent, RrwebEvent, RrwebPayload, RrwebRecordOptions, SerializedValue, SessionExport, StorageSnapshotSkippedItem, StoragePayload, WebLoggerConfig, WebLoggerController, WebLoggerEvent, } from './types';
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACnG,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACnG,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,mCAAmC,EACnC,oCAAoC,EACpC,gCAAgC,EAChC,2BAA2B,EAC3B,YAAY,EACZ,6BAA6B,GAC9B,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,EACb,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,0BAA0B,EAC1B,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,cAAc,GACf,MAAM,SAAS,CAAC"}
|
package/index.js
CHANGED
|
@@ -4,6 +4,7 @@ const PACKAGE_NAME = '@ray-web-logger/core';
|
|
|
4
4
|
const SESSION_EXPORT_SCHEMA_VERSION = 1;
|
|
5
5
|
const DEFAULT_MEMORY_FLUSH_THRESHOLD_BYTES = 1_048_576;
|
|
6
6
|
const DEFAULT_RRWEB_CHECKOUT_EVERY_NMS = 30_000;
|
|
7
|
+
const DEFAULT_INDEXED_DB_RETENTION_TTL_MS = 24 * 60 * 60 * 1000;
|
|
7
8
|
const DEFAULT_INDEXED_DB_NAME = 'ray-web-logger-webLogger';
|
|
8
9
|
const DEFAULT_SESSION_STORAGE_KEY = '__web_logger_session__';
|
|
9
10
|
/** 与规格 DevTools 对齐的 `console.*` 方法名;采集时写入 `ConsolePayload.level`,宿主无实现则跳过 patch。 */
|
|
@@ -857,7 +858,9 @@ function installRrwebCollector(options) {
|
|
|
857
858
|
return noop$1;
|
|
858
859
|
}
|
|
859
860
|
try {
|
|
861
|
+
const rrwebOptions = mergeRrwebOptions(defaultRrwebOptions(), options.rrwebOptions);
|
|
860
862
|
const stop = record({
|
|
863
|
+
...rrwebOptions,
|
|
861
864
|
emit(event) {
|
|
862
865
|
options.record({
|
|
863
866
|
type: 'rrweb',
|
|
@@ -867,13 +870,6 @@ function installRrwebCollector(options) {
|
|
|
867
870
|
},
|
|
868
871
|
});
|
|
869
872
|
},
|
|
870
|
-
recordCanvas: true,
|
|
871
|
-
sampling: {
|
|
872
|
-
canvas: 2,
|
|
873
|
-
media: 2,
|
|
874
|
-
},
|
|
875
|
-
collectFonts: true,
|
|
876
|
-
checkoutEveryNms: normalizeCheckoutEveryNms(options.checkoutEveryNms),
|
|
877
873
|
});
|
|
878
874
|
return stop ?? noop$1;
|
|
879
875
|
}
|
|
@@ -884,11 +880,26 @@ function installRrwebCollector(options) {
|
|
|
884
880
|
function noop$1() {
|
|
885
881
|
// noop
|
|
886
882
|
}
|
|
887
|
-
function
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
883
|
+
function defaultRrwebOptions() {
|
|
884
|
+
return {
|
|
885
|
+
recordCanvas: true,
|
|
886
|
+
sampling: {
|
|
887
|
+
canvas: 2,
|
|
888
|
+
media: 2,
|
|
889
|
+
},
|
|
890
|
+
collectFonts: true,
|
|
891
|
+
checkoutEveryNms: DEFAULT_RRWEB_CHECKOUT_EVERY_NMS,
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
function mergeRrwebOptions(defaults, overrides) {
|
|
895
|
+
return {
|
|
896
|
+
...defaults,
|
|
897
|
+
...overrides,
|
|
898
|
+
sampling: {
|
|
899
|
+
...defaults.sampling,
|
|
900
|
+
...overrides?.sampling,
|
|
901
|
+
},
|
|
902
|
+
};
|
|
892
903
|
}
|
|
893
904
|
|
|
894
905
|
function installStorageCollector(options) {
|
|
@@ -1111,6 +1122,9 @@ class IndexedDbEventStore {
|
|
|
1111
1122
|
static isSupported() {
|
|
1112
1123
|
return typeof globalThis.indexedDB !== 'undefined';
|
|
1113
1124
|
}
|
|
1125
|
+
static async cleanup(options = {}) {
|
|
1126
|
+
return cleanupIndexedDb(options);
|
|
1127
|
+
}
|
|
1114
1128
|
async appendChunk(events) {
|
|
1115
1129
|
if (events.length === 0) {
|
|
1116
1130
|
return undefined;
|
|
@@ -1162,6 +1176,16 @@ class IndexedDbEventStore {
|
|
|
1162
1176
|
.openCursor(range, 'prev');
|
|
1163
1177
|
return findLatestRrwebFullSnapshotCursor(cursor, beforeMs);
|
|
1164
1178
|
}
|
|
1179
|
+
async cleanup(options = {}) {
|
|
1180
|
+
return cleanupIndexedDb({
|
|
1181
|
+
...options,
|
|
1182
|
+
excludeNamespaceKeys: [
|
|
1183
|
+
this.namespaceKey,
|
|
1184
|
+
...(options.excludeNamespaceKeys ?? []).filter((key) => key !== this.namespaceKey),
|
|
1185
|
+
],
|
|
1186
|
+
now: options.now ?? this.#now,
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1165
1189
|
async #nextChunkSeq(db) {
|
|
1166
1190
|
const tx = db.transaction(EVENT_CHUNKS_STORE, 'readonly');
|
|
1167
1191
|
const store = tx.objectStore(EVENT_CHUNKS_STORE);
|
|
@@ -1184,6 +1208,148 @@ class IndexedDbEventStore {
|
|
|
1184
1208
|
return this.#dbPromise;
|
|
1185
1209
|
}
|
|
1186
1210
|
}
|
|
1211
|
+
async function cleanupIndexedDb(options = {}) {
|
|
1212
|
+
if (!IndexedDbEventStore.isSupported()) {
|
|
1213
|
+
return emptyCleanupResult();
|
|
1214
|
+
}
|
|
1215
|
+
const db = await openDatabase(DEFAULT_INDEXED_DB_NAME);
|
|
1216
|
+
const usage = await collectNamespaceUsage(db);
|
|
1217
|
+
const chunksBefore = usage.reduce((total, item) => total + item.chunkCount, 0);
|
|
1218
|
+
const estimatedBytesBefore = usage.reduce((total, item) => total + item.estimatedBytes, 0);
|
|
1219
|
+
const excludeNamespaceKeys = new Set(options.excludeNamespaceKeys ?? []);
|
|
1220
|
+
const ttlMs = normalizeNonNegativeNumber(options.ttlMs, DEFAULT_INDEXED_DB_RETENTION_TTL_MS);
|
|
1221
|
+
const now = options.now?.() ?? Date.now();
|
|
1222
|
+
const expiresBefore = now - ttlMs;
|
|
1223
|
+
const deletedNamespaceKeys = [];
|
|
1224
|
+
const deleted = new Set();
|
|
1225
|
+
for (const item of usage) {
|
|
1226
|
+
if (!excludeNamespaceKeys.has(item.namespaceKey) && item.updatedAt < expiresBefore) {
|
|
1227
|
+
deleted.add(item.namespaceKey);
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
let remaining = usage.filter((item) => !deleted.has(item.namespaceKey));
|
|
1231
|
+
const maxChunks = normalizeOptionalNonNegativeNumber(options.maxChunks);
|
|
1232
|
+
const maxEstimatedBytes = normalizeOptionalNonNegativeNumber(options.maxEstimatedBytes);
|
|
1233
|
+
if (maxChunks !== undefined || maxEstimatedBytes !== undefined) {
|
|
1234
|
+
let chunks = remaining.reduce((total, item) => total + item.chunkCount, 0);
|
|
1235
|
+
let estimatedBytes = remaining.reduce((total, item) => total + item.estimatedBytes, 0);
|
|
1236
|
+
const candidates = remaining
|
|
1237
|
+
.filter((item) => !excludeNamespaceKeys.has(item.namespaceKey))
|
|
1238
|
+
.sort((left, right) => left.updatedAt - right.updatedAt || left.namespaceKey.localeCompare(right.namespaceKey));
|
|
1239
|
+
for (const item of candidates) {
|
|
1240
|
+
const overChunks = maxChunks !== undefined && chunks > maxChunks;
|
|
1241
|
+
const overBytes = maxEstimatedBytes !== undefined && estimatedBytes > maxEstimatedBytes;
|
|
1242
|
+
if (!overChunks && !overBytes) {
|
|
1243
|
+
break;
|
|
1244
|
+
}
|
|
1245
|
+
deleted.add(item.namespaceKey);
|
|
1246
|
+
chunks -= item.chunkCount;
|
|
1247
|
+
estimatedBytes -= item.estimatedBytes;
|
|
1248
|
+
}
|
|
1249
|
+
remaining = usage.filter((item) => !deleted.has(item.namespaceKey));
|
|
1250
|
+
}
|
|
1251
|
+
let deletedChunks = 0;
|
|
1252
|
+
for (const namespaceKey of deleted) {
|
|
1253
|
+
const item = usage.find((entry) => entry.namespaceKey === namespaceKey);
|
|
1254
|
+
deletedChunks += item?.chunkCount ?? 0;
|
|
1255
|
+
await deleteNamespace(db, namespaceKey);
|
|
1256
|
+
deletedNamespaceKeys.push(namespaceKey);
|
|
1257
|
+
}
|
|
1258
|
+
const chunksAfter = remaining.reduce((total, item) => total + item.chunkCount, 0);
|
|
1259
|
+
const estimatedBytesAfter = remaining.reduce((total, item) => total + item.estimatedBytes, 0);
|
|
1260
|
+
return {
|
|
1261
|
+
deletedNamespaceKeys,
|
|
1262
|
+
deletedChunks,
|
|
1263
|
+
estimatedBytesBefore,
|
|
1264
|
+
estimatedBytesAfter,
|
|
1265
|
+
chunksBefore,
|
|
1266
|
+
chunksAfter,
|
|
1267
|
+
};
|
|
1268
|
+
}
|
|
1269
|
+
function emptyCleanupResult() {
|
|
1270
|
+
return {
|
|
1271
|
+
deletedNamespaceKeys: [],
|
|
1272
|
+
deletedChunks: 0,
|
|
1273
|
+
estimatedBytesBefore: 0,
|
|
1274
|
+
estimatedBytesAfter: 0,
|
|
1275
|
+
chunksBefore: 0,
|
|
1276
|
+
chunksAfter: 0,
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1279
|
+
function normalizeNonNegativeNumber(value, fallback) {
|
|
1280
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
1281
|
+
}
|
|
1282
|
+
function normalizeOptionalNonNegativeNumber(value) {
|
|
1283
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
1284
|
+
}
|
|
1285
|
+
async function collectNamespaceUsage(db) {
|
|
1286
|
+
const meta = await collectSessionMeta(db);
|
|
1287
|
+
const chunks = await collectEventChunks(db);
|
|
1288
|
+
const byNamespace = new Map();
|
|
1289
|
+
for (const record of meta) {
|
|
1290
|
+
byNamespace.set(record.namespaceKey, {
|
|
1291
|
+
namespaceKey: record.namespaceKey,
|
|
1292
|
+
updatedAt: normalizeRecordUpdatedAt(record.updatedAt),
|
|
1293
|
+
chunkCount: 0,
|
|
1294
|
+
estimatedBytes: 0,
|
|
1295
|
+
});
|
|
1296
|
+
}
|
|
1297
|
+
for (const chunk of chunks) {
|
|
1298
|
+
const current = byNamespace.get(chunk.namespaceKey) ?? {
|
|
1299
|
+
namespaceKey: chunk.namespaceKey,
|
|
1300
|
+
updatedAt: 0,
|
|
1301
|
+
chunkCount: 0,
|
|
1302
|
+
estimatedBytes: 0,
|
|
1303
|
+
};
|
|
1304
|
+
current.chunkCount += 1;
|
|
1305
|
+
current.estimatedBytes += estimateChunkBytes(chunk);
|
|
1306
|
+
byNamespace.set(chunk.namespaceKey, current);
|
|
1307
|
+
}
|
|
1308
|
+
return [...byNamespace.values()];
|
|
1309
|
+
}
|
|
1310
|
+
function collectSessionMeta(db) {
|
|
1311
|
+
return collectCursorValues(db.transaction(SESSION_META_STORE, 'readonly').objectStore(SESSION_META_STORE).openCursor());
|
|
1312
|
+
}
|
|
1313
|
+
function collectEventChunks(db) {
|
|
1314
|
+
return collectCursorValues(db.transaction(EVENT_CHUNKS_STORE, 'readonly').objectStore(EVENT_CHUNKS_STORE).openCursor());
|
|
1315
|
+
}
|
|
1316
|
+
function collectCursorValues(request) {
|
|
1317
|
+
return new Promise((resolve, reject) => {
|
|
1318
|
+
const values = [];
|
|
1319
|
+
request.onerror = () => reject(request.error ?? new Error('IndexedDB cursor failed.'));
|
|
1320
|
+
request.onsuccess = () => {
|
|
1321
|
+
const cursor = request.result;
|
|
1322
|
+
if (!cursor) {
|
|
1323
|
+
resolve(values);
|
|
1324
|
+
return;
|
|
1325
|
+
}
|
|
1326
|
+
values.push(cursor.value);
|
|
1327
|
+
cursor.continue();
|
|
1328
|
+
};
|
|
1329
|
+
});
|
|
1330
|
+
}
|
|
1331
|
+
async function deleteNamespace(db, namespaceKey) {
|
|
1332
|
+
const tx = db.transaction([SESSION_META_STORE, EVENT_CHUNKS_STORE], 'readwrite');
|
|
1333
|
+
tx.objectStore(SESSION_META_STORE).delete(namespaceKey);
|
|
1334
|
+
const range = IDBKeyRange.bound([namespaceKey, 0], [namespaceKey, Number.MAX_SAFE_INTEGER]);
|
|
1335
|
+
const store = tx.objectStore(EVENT_CHUNKS_STORE);
|
|
1336
|
+
const request = store.openCursor(range);
|
|
1337
|
+
request.onsuccess = () => {
|
|
1338
|
+
const cursor = request.result;
|
|
1339
|
+
if (!cursor) {
|
|
1340
|
+
return;
|
|
1341
|
+
}
|
|
1342
|
+
cursor.delete();
|
|
1343
|
+
cursor.continue();
|
|
1344
|
+
};
|
|
1345
|
+
await transactionDone(tx);
|
|
1346
|
+
}
|
|
1347
|
+
function normalizeRecordUpdatedAt(updatedAt) {
|
|
1348
|
+
return Number.isFinite(updatedAt) ? updatedAt : 0;
|
|
1349
|
+
}
|
|
1350
|
+
function estimateChunkBytes(chunk) {
|
|
1351
|
+
return JSON.stringify(chunk.events).length * 2;
|
|
1352
|
+
}
|
|
1187
1353
|
function openDatabase(dbName) {
|
|
1188
1354
|
return new Promise((resolve, reject) => {
|
|
1189
1355
|
const request = globalThis.indexedDB.open(dbName, IDB_VERSION);
|
|
@@ -1387,6 +1553,9 @@ class WebLoggerCoreController {
|
|
|
1387
1553
|
namespaceKey: this.namespaceKey,
|
|
1388
1554
|
now: this.#now,
|
|
1389
1555
|
});
|
|
1556
|
+
void this.#store.cleanup(this.#cleanupOptions()).catch(() => {
|
|
1557
|
+
// Retention cleanup is best-effort and must not block SDK startup.
|
|
1558
|
+
});
|
|
1390
1559
|
}
|
|
1391
1560
|
this.#readyPromise = this.#hydrateSeqFromIdb();
|
|
1392
1561
|
this.#collectorDisposers = [
|
|
@@ -1401,7 +1570,7 @@ class WebLoggerCoreController {
|
|
|
1401
1570
|
installCookieCollector({ config: this.config, record: (event) => this.record(event) }),
|
|
1402
1571
|
installRrwebCollector({
|
|
1403
1572
|
record: (event) => this.record(event),
|
|
1404
|
-
|
|
1573
|
+
rrwebOptions: this.config.rrwebOptions,
|
|
1405
1574
|
}),
|
|
1406
1575
|
];
|
|
1407
1576
|
}
|
|
@@ -1468,6 +1637,19 @@ class WebLoggerCoreController {
|
|
|
1468
1637
|
replayableStandalone: includesRrwebBaseline,
|
|
1469
1638
|
});
|
|
1470
1639
|
}
|
|
1640
|
+
async cleanupIndexedDb(options = {}) {
|
|
1641
|
+
const mergedOptions = {
|
|
1642
|
+
...this.#cleanupOptions(),
|
|
1643
|
+
...options,
|
|
1644
|
+
excludeNamespaceKeys: [
|
|
1645
|
+
this.namespaceKey,
|
|
1646
|
+
...(this.#cleanupOptions().excludeNamespaceKeys ?? []),
|
|
1647
|
+
...(options.excludeNamespaceKeys ?? []),
|
|
1648
|
+
],
|
|
1649
|
+
now: options.now ?? this.#now,
|
|
1650
|
+
};
|
|
1651
|
+
return this.#store ? this.#store.cleanup(mergedOptions) : cleanupIndexedDb(mergedOptions);
|
|
1652
|
+
}
|
|
1471
1653
|
destroy() {
|
|
1472
1654
|
for (const dispose of this.#collectorDisposers.splice(0)) {
|
|
1473
1655
|
dispose();
|
|
@@ -1528,6 +1710,21 @@ class WebLoggerCoreController {
|
|
|
1528
1710
|
].filter((event) => event !== undefined);
|
|
1529
1711
|
return anchors.sort(compareTimelineEvents).at(-1);
|
|
1530
1712
|
}
|
|
1713
|
+
#cleanupOptions() {
|
|
1714
|
+
return {
|
|
1715
|
+
ttlMs: this.#validRetentionTtlMs(),
|
|
1716
|
+
maxChunks: this.config.indexedDbMaxChunks,
|
|
1717
|
+
maxEstimatedBytes: this.config.indexedDbMaxEstimatedBytes,
|
|
1718
|
+
excludeNamespaceKeys: [this.namespaceKey],
|
|
1719
|
+
now: this.#now,
|
|
1720
|
+
};
|
|
1721
|
+
}
|
|
1722
|
+
#validRetentionTtlMs() {
|
|
1723
|
+
const ttlMs = this.config.indexedDbRetentionTtlMs;
|
|
1724
|
+
return typeof ttlMs === 'number' && Number.isFinite(ttlMs) && ttlMs >= 0
|
|
1725
|
+
? ttlMs
|
|
1726
|
+
: DEFAULT_INDEXED_DB_RETENTION_TTL_MS;
|
|
1727
|
+
}
|
|
1531
1728
|
}
|
|
1532
1729
|
function initWebLogger(options = {}) {
|
|
1533
1730
|
return new WebLoggerCoreController(options);
|
|
@@ -1555,5 +1752,5 @@ function mergeEvents(persistedEvents, memoryEvents) {
|
|
|
1555
1752
|
return [...bySeq.values()].sort(compareTimelineEvents);
|
|
1556
1753
|
}
|
|
1557
1754
|
|
|
1558
|
-
export { CONSOLE_CAPTURE_METHODS, DEFAULT_INDEXED_DB_NAME, DEFAULT_MEMORY_FLUSH_THRESHOLD_BYTES, DEFAULT_RRWEB_CHECKOUT_EVERY_NMS, DEFAULT_SESSION_STORAGE_KEY, EVENT_CHUNKS_STORE, IDB_VERSION, WebLoggerCoreController as InMemoryWebLoggerController, IndexedDbEventStore, PACKAGE_NAME, SESSION_EXPORT_SCHEMA_VERSION, SESSION_META_STORE, Timeline, WebLoggerCoreController, compareTimelineEvents, initWebLogger, resolveSession };
|
|
1755
|
+
export { CONSOLE_CAPTURE_METHODS, DEFAULT_INDEXED_DB_NAME, DEFAULT_INDEXED_DB_RETENTION_TTL_MS, DEFAULT_MEMORY_FLUSH_THRESHOLD_BYTES, DEFAULT_RRWEB_CHECKOUT_EVERY_NMS, DEFAULT_SESSION_STORAGE_KEY, EVENT_CHUNKS_STORE, IDB_VERSION, WebLoggerCoreController as InMemoryWebLoggerController, IndexedDbEventStore, PACKAGE_NAME, SESSION_EXPORT_SCHEMA_VERSION, SESSION_META_STORE, Timeline, WebLoggerCoreController, cleanupIndexedDb, compareTimelineEvents, initWebLogger, resolveSession };
|
|
1559
1756
|
//# sourceMappingURL=index.js.map
|