ray-logger-core 0.0.2 → 0.0.4
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.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 +190 -3
- package/index.js.map +1 -1
- package/package.json +3 -3
- 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 +21 -1
- package/types.d.ts.map +1 -1
- package/types.js +2 -1
- package/types.js.map +1 -1
- package/utils/console-stack.js +1 -1
- package/utils/console-stack.js.map +1 -1
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: 2,
|
|
21
|
-
media: 2,
|
|
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, RrwebRecordOptions, 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
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { record } from 'rrweb';
|
|
2
2
|
|
|
3
|
-
const PACKAGE_NAME = '
|
|
3
|
+
const PACKAGE_NAME = 'ray-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。 */
|
|
@@ -93,7 +94,7 @@ const INTERNAL_STACK_MARKERS = [
|
|
|
93
94
|
'collectors\\console.ts',
|
|
94
95
|
'collectors/console.js',
|
|
95
96
|
'collectors\\console.js',
|
|
96
|
-
'
|
|
97
|
+
'ray-logger-core',
|
|
97
98
|
'packages/core/src/collectors/console',
|
|
98
99
|
'packages\\core\\src\\collectors\\console',
|
|
99
100
|
];
|
|
@@ -1121,6 +1122,9 @@ class IndexedDbEventStore {
|
|
|
1121
1122
|
static isSupported() {
|
|
1122
1123
|
return typeof globalThis.indexedDB !== 'undefined';
|
|
1123
1124
|
}
|
|
1125
|
+
static async cleanup(options = {}) {
|
|
1126
|
+
return cleanupIndexedDb(options);
|
|
1127
|
+
}
|
|
1124
1128
|
async appendChunk(events) {
|
|
1125
1129
|
if (events.length === 0) {
|
|
1126
1130
|
return undefined;
|
|
@@ -1172,6 +1176,16 @@ class IndexedDbEventStore {
|
|
|
1172
1176
|
.openCursor(range, 'prev');
|
|
1173
1177
|
return findLatestRrwebFullSnapshotCursor(cursor, beforeMs);
|
|
1174
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
|
+
}
|
|
1175
1189
|
async #nextChunkSeq(db) {
|
|
1176
1190
|
const tx = db.transaction(EVENT_CHUNKS_STORE, 'readonly');
|
|
1177
1191
|
const store = tx.objectStore(EVENT_CHUNKS_STORE);
|
|
@@ -1194,6 +1208,148 @@ class IndexedDbEventStore {
|
|
|
1194
1208
|
return this.#dbPromise;
|
|
1195
1209
|
}
|
|
1196
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
|
+
}
|
|
1197
1353
|
function openDatabase(dbName) {
|
|
1198
1354
|
return new Promise((resolve, reject) => {
|
|
1199
1355
|
const request = globalThis.indexedDB.open(dbName, IDB_VERSION);
|
|
@@ -1397,6 +1553,9 @@ class WebLoggerCoreController {
|
|
|
1397
1553
|
namespaceKey: this.namespaceKey,
|
|
1398
1554
|
now: this.#now,
|
|
1399
1555
|
});
|
|
1556
|
+
void this.#store.cleanup(this.#cleanupOptions()).catch(() => {
|
|
1557
|
+
// Retention cleanup is best-effort and must not block SDK startup.
|
|
1558
|
+
});
|
|
1400
1559
|
}
|
|
1401
1560
|
this.#readyPromise = this.#hydrateSeqFromIdb();
|
|
1402
1561
|
this.#collectorDisposers = [
|
|
@@ -1478,6 +1637,19 @@ class WebLoggerCoreController {
|
|
|
1478
1637
|
replayableStandalone: includesRrwebBaseline,
|
|
1479
1638
|
});
|
|
1480
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
|
+
}
|
|
1481
1653
|
destroy() {
|
|
1482
1654
|
for (const dispose of this.#collectorDisposers.splice(0)) {
|
|
1483
1655
|
dispose();
|
|
@@ -1538,6 +1710,21 @@ class WebLoggerCoreController {
|
|
|
1538
1710
|
].filter((event) => event !== undefined);
|
|
1539
1711
|
return anchors.sort(compareTimelineEvents).at(-1);
|
|
1540
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
|
+
}
|
|
1541
1728
|
}
|
|
1542
1729
|
function initWebLogger(options = {}) {
|
|
1543
1730
|
return new WebLoggerCoreController(options);
|
|
@@ -1565,5 +1752,5 @@ function mergeEvents(persistedEvents, memoryEvents) {
|
|
|
1565
1752
|
return [...bySeq.values()].sort(compareTimelineEvents);
|
|
1566
1753
|
}
|
|
1567
1754
|
|
|
1568
|
-
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 };
|
|
1569
1756
|
//# sourceMappingURL=index.js.map
|