@loggerjs/browser 0.6.0 → 0.7.0
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/README.md +2 -2
- package/dist/chunks/http-capture-utils-DbhpUirh.cjs +83 -0
- package/dist/chunks/http-capture-utils-DbhpUirh.cjs.map +1 -0
- package/dist/chunks/http-capture-utils-_hG5wepA.js +48 -0
- package/dist/chunks/http-capture-utils-_hG5wepA.js.map +1 -0
- package/dist/context-propagation-integration.cjs +5 -4
- package/dist/context-propagation-integration.cjs.map +1 -1
- package/dist/context-propagation-integration.d.ts +2 -1
- package/dist/context-propagation-integration.d.ts.map +1 -1
- package/dist/context-propagation-integration.js +2 -1
- package/dist/context-propagation-integration.js.map +1 -1
- package/dist/fetch-integration.cjs +8 -52
- package/dist/fetch-integration.cjs.map +1 -1
- package/dist/fetch-integration.js +1 -45
- package/dist/fetch-integration.js.map +1 -1
- package/dist/http-transport.cjs +90 -16
- package/dist/http-transport.cjs.map +1 -1
- package/dist/http-transport.d.ts +17 -0
- package/dist/http-transport.d.ts.map +1 -1
- package/dist/http-transport.js +90 -16
- package/dist/http-transport.js.map +1 -1
- package/dist/index.cjs +58 -4167
- package/dist/index.d.ts +243 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -4135
- package/dist/indexeddb-offline-queue.cjs +8 -1
- package/dist/indexeddb-offline-queue.cjs.map +1 -1
- package/dist/indexeddb-offline-queue.d.ts.map +1 -1
- package/dist/indexeddb-offline-queue.js +8 -1
- package/dist/indexeddb-offline-queue.js.map +1 -1
- package/dist/indexeddb-transport.cjs +24 -4
- package/dist/indexeddb-transport.cjs.map +1 -1
- package/dist/indexeddb-transport.d.ts.map +1 -1
- package/dist/indexeddb-transport.js +24 -4
- package/dist/indexeddb-transport.js.map +1 -1
- package/dist/offline-first-transport.cjs +2 -1029
- package/dist/offline-first-transport.cjs.map +1 -1
- package/dist/offline-first-transport.js +2 -1029
- package/dist/offline-first-transport.js.map +1 -1
- package/dist/payload-transforms.cjs +3 -3
- package/dist/payload-transforms.cjs.map +1 -1
- package/dist/payload-transforms.d.ts.map +1 -1
- package/dist/payload-transforms.js +1 -1
- package/dist/payload-transforms.js.map +1 -1
- package/dist/websocket-integration.cjs +5 -32
- package/dist/websocket-integration.cjs.map +1 -1
- package/dist/websocket-integration.js +1 -28
- package/dist/websocket-integration.js.map +1 -1
- package/dist/websocket-transport.cjs +1 -1
- package/dist/websocket-transport.cjs.map +1 -1
- package/dist/websocket-transport.js +2 -2
- package/dist/websocket-transport.js.map +1 -1
- package/dist/xhr-integration.cjs +6 -33
- package/dist/xhr-integration.cjs.map +1 -1
- package/dist/xhr-integration.js +1 -28
- package/dist/xhr-integration.js.map +1 -1
- package/package.json +5 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb-transport.d.ts","sourceRoot":"","sources":["../src/indexeddb-transport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"indexeddb-transport.d.ts","sourceRoot":"","sources":["../src/indexeddb-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -445,7 +445,12 @@ function indexedDbTransport(options = {}) {
|
|
|
445
445
|
});
|
|
446
446
|
request.addEventListener("success", () => {
|
|
447
447
|
statsState.databaseOpenCount += 1;
|
|
448
|
-
|
|
448
|
+
const db = request.result;
|
|
449
|
+
db.onversionchange = () => {
|
|
450
|
+
db.close();
|
|
451
|
+
dbPromise = void 0;
|
|
452
|
+
};
|
|
453
|
+
resolve(db);
|
|
449
454
|
}, { once: true });
|
|
450
455
|
request.addEventListener("error", () => reject(request.error ?? /* @__PURE__ */ new Error("IndexedDB open failed")), { once: true });
|
|
451
456
|
});
|
|
@@ -738,6 +743,7 @@ function indexedDbTransport(options = {}) {
|
|
|
738
743
|
const startedAt = nowMs();
|
|
739
744
|
statsState.lastFlushBatchSize = events.length;
|
|
740
745
|
const entries = events.map(eventToEntry);
|
|
746
|
+
let stored = false;
|
|
741
747
|
try {
|
|
742
748
|
await withLogAndSessionStores("readwrite", async (store, sessionStore) => {
|
|
743
749
|
const rebuildSessionIds = /* @__PURE__ */ new Set();
|
|
@@ -750,6 +756,7 @@ function indexedDbTransport(options = {}) {
|
|
|
750
756
|
await rebuildSessionSummaries(store, sessionStore, rebuildSessionIds);
|
|
751
757
|
await mergeSessionSummaries(sessionStore, entries.filter((entry) => !entry.sessionId || !rebuildSessionIds.has(entry.sessionId)));
|
|
752
758
|
});
|
|
759
|
+
stored = true;
|
|
753
760
|
statsState.persisted += entries.length;
|
|
754
761
|
incrementLoggerMetaCounter("transport.indexeddb.persisted", entries.length);
|
|
755
762
|
markLocalStorageSpillPersisted(events);
|
|
@@ -757,6 +764,10 @@ function indexedDbTransport(options = {}) {
|
|
|
757
764
|
statsState.flushes += 1;
|
|
758
765
|
} catch (error) {
|
|
759
766
|
statsState.flushErrors += 1;
|
|
767
|
+
if (!stored) {
|
|
768
|
+
const reason = isQuotaExceededError(error) ? "quota" : "write-failed";
|
|
769
|
+
for (const event of events) dropEvent(event, reason);
|
|
770
|
+
}
|
|
760
771
|
throw error;
|
|
761
772
|
} finally {
|
|
762
773
|
statsState.lastFlushDurationMs = nowMs() - startedAt;
|
|
@@ -885,7 +896,11 @@ function indexedDbTransport(options = {}) {
|
|
|
885
896
|
timer = void 0;
|
|
886
897
|
};
|
|
887
898
|
const flushPending = async () => {
|
|
888
|
-
if (flushPromise)
|
|
899
|
+
if (flushPromise) {
|
|
900
|
+
if (buffer.length === 0) return flushPromise;
|
|
901
|
+
await flushPromise.catch(() => void 0);
|
|
902
|
+
return flushPending();
|
|
903
|
+
}
|
|
889
904
|
clearTimer();
|
|
890
905
|
const batch = buffer.splice(0, buffer.length);
|
|
891
906
|
pendingFlushBatch = batch;
|
|
@@ -897,7 +912,9 @@ function indexedDbTransport(options = {}) {
|
|
|
897
912
|
})().finally(() => {
|
|
898
913
|
if (pendingFlushBatch === batch) pendingFlushBatch = void 0;
|
|
899
914
|
flushPromise = void 0;
|
|
900
|
-
if (buffer.length
|
|
915
|
+
if (buffer.length === 0 || closed) return;
|
|
916
|
+
if (flushIntervalMs <= 0) flushPending().catch((error) => reportInternalError(error, "flush"));
|
|
917
|
+
else schedule();
|
|
901
918
|
});
|
|
902
919
|
return flushPromise;
|
|
903
920
|
};
|
|
@@ -935,8 +952,11 @@ function indexedDbTransport(options = {}) {
|
|
|
935
952
|
name: options.name ?? "indexeddb",
|
|
936
953
|
minLevel: options.minLevel,
|
|
937
954
|
log(event, context) {
|
|
938
|
-
if (closed) return;
|
|
939
955
|
if (options.minLevel !== void 0 && event.level < toLevelValue(options.minLevel)) return;
|
|
956
|
+
if (closed) {
|
|
957
|
+
dropEvent(event, "closed");
|
|
958
|
+
return;
|
|
959
|
+
}
|
|
940
960
|
lastContext = context;
|
|
941
961
|
if (maxBufferSize === 0 || buffer.length >= maxBufferSize) {
|
|
942
962
|
if (dropPolicy === "drop-newest") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexeddb-transport.js","names":[],"sources":["../src/indexeddb-transport.ts"],"sourcesContent":["import {\n incrementLoggerMetaCounter,\n safeJsonCodec,\n safeJsonStringify,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport type { BrowserHttpDropPolicy } from \"./http-transport\";\n\nexport interface IndexedDbLogEntry {\n id: string;\n sessionId?: string;\n seq: number;\n createdAt: number;\n level: number;\n levelName: string;\n logger: string;\n type?: string;\n byteLength: number;\n payload: string | Uint8Array;\n}\n\nexport interface IndexedDbTransportQueryOptions {\n from?: number;\n to?: number;\n sessionId?: string;\n minLevel?: LoggerLevel;\n logger?: string;\n type?: string;\n limit?: number;\n order?: \"asc\" | \"desc\";\n}\n\nexport type IndexedDbTransportDurability = \"default\" | \"strict\" | \"relaxed\";\n\nexport type IndexedDbStorageBucketDurability = \"strict\" | \"relaxed\";\n\nexport interface IndexedDbTransportSessionOptions {\n id?: string;\n getId?: (event: LogEvent) => string | undefined;\n contextKey?: string;\n}\n\nexport type IndexedDbTransportSession = string | false | IndexedDbTransportSessionOptions;\n\nexport interface IndexedDbLogSession {\n sessionId: string;\n firstSeen: number;\n lastSeen: number;\n count: number;\n byteLength: number;\n}\n\nexport interface IndexedDbTransportSessionQueryOptions {\n limit?: number;\n order?: \"asc\" | \"desc\";\n}\n\nexport interface IndexedDbLocalStorageSpillOptions {\n namespace?: string;\n maxEntries?: number;\n maxBytes?: number;\n maxOriginBytes?: number;\n minLevel?: LoggerLevel;\n drainOnCreate?: boolean;\n spillOnPageHide?: boolean;\n storage?: Storage;\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\nexport interface IndexedDbTransportStats {\n bufferDepth: number;\n maxBufferDepth: number;\n pendingFlush: boolean;\n enqueued: number;\n persisted: number;\n dropped: number;\n droppedByReason: Record<string, number>;\n persistedDropped: number;\n persistedDroppedByReason: Record<string, number>;\n flushes: number;\n flushErrors: number;\n lastFlushBatchSize: number;\n lastFlushDurationMs: number;\n prunes: number;\n pruneFallbacks: number;\n lastPruneDurationMs: number;\n queries: number;\n queryFallbacks: number;\n lastQueryDurationMs: number;\n databaseOpenCount: number;\n storageBucketFallbacks: number;\n transactionOptionFallbacks: number;\n errors: number;\n errorsByOperation: Record<string, number>;\n localStorageSpillWrites: number;\n localStorageSpillEntries: number;\n localStorageSpillDrains: number;\n localStorageSpillDrainedEntries: number;\n localStorageSpillDropped: number;\n localStorageSpillDroppedByReason: Record<string, number>;\n localStorageSpillErrors: number;\n localStorageSpillErrorsByOperation: Record<string, number>;\n}\n\nexport interface IndexedDbTransportOptions {\n name?: string;\n dbName?: string;\n storeName?: string;\n maxEntries?: number;\n maxBytes?: number;\n ttlMs?: number;\n batchSize?: number;\n flushIntervalMs?: number;\n maxBufferSize?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n flushOnPageHide?: boolean;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n durability?: IndexedDbTransportDurability;\n storageBucketName?: string;\n storageBucketPersisted?: boolean;\n storageBucketDurability?: IndexedDbStorageBucketDurability;\n session?: IndexedDbTransportSession;\n localStorageSpill?: false | IndexedDbLocalStorageSpillOptions;\n indexedDB?: IDBFactory;\n onDrop?: (event: LogEvent, reason: string) => void;\n onPersistedDrop?: (entry: IndexedDbLogEntry, reason: string) => void;\n}\n\nexport interface IndexedDbTransport extends Transport {\n count: () => Promise<number>;\n clear: () => Promise<void>;\n remove: (ids: string | readonly string[]) => Promise<void>;\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n sessions: (options?: IndexedDbTransportSessionQueryOptions) => Promise<IndexedDbLogSession[]>;\n stats: () => IndexedDbTransportStats;\n}\n\nconst DEFAULT_DB_NAME = \"loggerjs\";\nconst DEFAULT_STORE_NAME = \"logs\";\nconst DEFAULT_SESSION_CONTEXT_KEY = \"sessionId\";\nconst DEFAULT_SPILL_MAX_ENTRIES = 200;\nconst DEFAULT_SPILL_MAX_BYTES = 512 * 1024;\nconst DEFAULT_SPILL_MAX_ORIGIN_BYTES = 5 * 1024 * 1024;\nconst DB_VERSION = 4;\nconst ORDER_INDEX_NAME = \"createdAtSeq\";\nconst SESSION_INDEX_NAME = \"sessionId\";\nconst SESSION_ORDER_INDEX_NAME = \"sessionIdCreatedAtSeq\";\nconst SESSION_STORE_SUFFIX = \"__sessions\";\nconst SESSION_LAST_SEEN_INDEX_NAME = \"lastSeenSessionId\";\nconst SPILL_SCHEMA = \"loggerjs.indexeddb-spill.v1\";\n\ninterface NormalizedSessionOptions {\n id?: string;\n getId?: (event: LogEvent) => string | undefined;\n contextKey: string;\n}\n\ninterface NormalizedLocalStorageSpillOptions {\n key: string;\n maxEntries: number;\n maxBytes: number;\n maxOriginBytes: number;\n minLevelValue?: number;\n drainOnCreate: boolean;\n spillOnPageHide: boolean;\n storage: Storage;\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\ninterface LocalStorageSpillPayload {\n schema: typeof SPILL_SCHEMA;\n createdAt: number;\n entries: readonly LogEvent[];\n}\n\ninterface LocalStorageSpillClearCandidate {\n value: string;\n pendingIds: Set<string>;\n}\n\ninterface StorageBucketLike {\n indexedDB?: IDBFactory;\n}\n\ninterface StorageBucketManagerLike {\n open: (\n name: string,\n options?: {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n },\n ) => Promise<StorageBucketLike>;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nlet fallbackSessionSeq = 0;\n\nfunction defaultPageSessionId(): string {\n const randomUUID = globalThis.crypto?.randomUUID;\n if (randomUUID) return randomUUID.call(globalThis.crypto);\n return `${Date.now().toString(36)}-${(fallbackSessionSeq++).toString(36)}`;\n}\n\nfunction normalizeSessionId(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeSessionOptions(\n session: IndexedDbTransportSession | undefined,\n): NormalizedSessionOptions | undefined {\n if (session === false) return undefined;\n if (typeof session === \"string\") {\n return {\n contextKey: DEFAULT_SESSION_CONTEXT_KEY,\n id: normalizeSessionId(session) ?? defaultPageSessionId(),\n };\n }\n return {\n contextKey: session?.contextKey ?? DEFAULT_SESSION_CONTEXT_KEY,\n getId: session?.getId,\n id: normalizeSessionId(session?.id) ?? defaultPageSessionId(),\n };\n}\n\nfunction resolveLocalStorage(storage: Storage | undefined): Storage | undefined {\n if (storage) return storage;\n try {\n return globalThis.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeLocalStorageSpillOptions(\n spill: false | IndexedDbLocalStorageSpillOptions | undefined,\n dbName: string,\n storeName: string,\n): NormalizedLocalStorageSpillOptions | undefined {\n if (!spill) return undefined;\n const storage = resolveLocalStorage(spill.storage);\n if (!storage) return undefined;\n const namespace = spill.namespace ?? `${dbName}:${storeName}`;\n return {\n drainOnCreate: spill.drainOnCreate ?? true,\n key: `loggerjs:spill:v1:${namespace}`,\n maxBytes: normalizePositiveInteger(spill.maxBytes, DEFAULT_SPILL_MAX_BYTES),\n maxEntries: normalizePositiveInteger(spill.maxEntries, DEFAULT_SPILL_MAX_ENTRIES),\n maxOriginBytes: normalizePositiveInteger(spill.maxOriginBytes, DEFAULT_SPILL_MAX_ORIGIN_BYTES),\n minLevelValue: spill.minLevel === undefined ? undefined : toLevelValue(spill.minLevel),\n onDrop: spill.onDrop,\n spillOnPageHide: spill.spillOnPageHide ?? true,\n storage,\n };\n}\n\nfunction storageByteLength(key: string, value: string): number {\n return 2 * (key.length + value.length);\n}\n\nfunction estimateLocalStorageBytes(storage: Storage): number | undefined {\n try {\n let total = 0;\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (key === null) continue;\n total += storageByteLength(key, storage.getItem(key) ?? \"\");\n }\n return total;\n } catch {\n return undefined;\n }\n}\n\nfunction isQuotaExceededError(error: unknown): boolean {\n return (\n typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n (error.name === \"QuotaExceededError\" || error.name === \"NS_ERROR_DOM_QUOTA_REACHED\")\n );\n}\n\nfunction isSpillLogEvent(value: unknown): value is LogEvent {\n if (!value || typeof value !== \"object\") return false;\n const event = value as Partial<LogEvent>;\n return (\n typeof event.id === \"string\" &&\n typeof event.time === \"number\" &&\n typeof event.seq === \"number\" &&\n typeof event.level === \"number\" &&\n typeof event.levelName === \"string\" &&\n typeof event.logger === \"string\" &&\n typeof event.message === \"string\"\n );\n}\n\nfunction parseSpillPayload(raw: string): LogEvent[] | undefined {\n const parsed = JSON.parse(raw) as Partial<LocalStorageSpillPayload>;\n if (parsed.schema !== SPILL_SCHEMA || !Array.isArray(parsed.entries)) return undefined;\n return parsed.entries.filter(isSpillLogEvent);\n}\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction incrementRecord(record: Record<string, number>, key: string, amount = 1): void {\n record[key] = (record[key] ?? 0) + amount;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB request failed\")),\n { once: true },\n );\n });\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.addEventListener(\"complete\", () => resolve(), { once: true });\n transaction.addEventListener(\n \"abort\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction aborted\")),\n { once: true },\n );\n transaction.addEventListener(\n \"error\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction failed\")),\n { once: true },\n );\n });\n}\n\nfunction payloadByteLength(payload: string | Uint8Array): number {\n if (typeof payload !== \"string\") return payload.byteLength;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(payload).byteLength;\n return new Blob([payload]).size;\n}\n\nfunction compareEntries(a: IndexedDbLogEntry, b: IndexedDbLogEntry): number {\n if (a.createdAt !== b.createdAt) return a.createdAt - b.createdAt;\n if (a.seq !== b.seq) return a.seq - b.seq;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction orderEntries(\n entries: readonly IndexedDbLogEntry[],\n order: \"asc\" | \"desc\" = \"asc\",\n): IndexedDbLogEntry[] {\n // oxlint-disable-next-line no-array-sort -- Sort a copy to preserve ES2020 compatibility and caller immutability.\n const sorted = [...entries].sort(compareEntries);\n if (order === \"asc\") return sorted;\n const reversed: IndexedDbLogEntry[] = [];\n for (let index = sorted.length - 1; index >= 0; index -= 1) {\n reversed.push(sorted[index] as IndexedDbLogEntry);\n }\n return reversed;\n}\n\nfunction indexExists(store: IDBObjectStore, name: string): boolean {\n return store.indexNames.contains(name);\n}\n\nfunction ensureIndex(store: IDBObjectStore, name: string, keyPath: string | readonly string[]) {\n if (!indexExists(store, name)) store.createIndex(name, keyPath);\n}\n\nfunction sessionStoreNameFor(storeName: string): string {\n return `${storeName}${SESSION_STORE_SUFFIX}`;\n}\n\nfunction getStoreIndex(store: IDBObjectStore, name: string): IDBIndex | undefined {\n const maybeStore = store as IDBObjectStore & {\n index?: (indexName: string) => IDBIndex;\n };\n if (typeof maybeStore.index !== \"function\" || !indexExists(store, name)) return undefined;\n return maybeStore.index(name);\n}\n\nfunction getStorageBucketManager(): StorageBucketManagerLike | undefined {\n return (globalThis.navigator as unknown as { storageBuckets?: StorageBucketManagerLike })\n ?.storageBuckets;\n}\n\nfunction storageBucketOpenOptions(options: IndexedDbTransportOptions):\n | {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n }\n | undefined {\n if (\n options.storageBucketDurability === undefined &&\n options.storageBucketPersisted === undefined\n ) {\n return undefined;\n }\n return {\n durability: options.storageBucketDurability,\n persisted: options.storageBucketPersisted,\n };\n}\n\nfunction decodeEntry(\n entry: IndexedDbLogEntry,\n codec: Codec<string | Uint8Array>,\n): LogEvent | undefined {\n if (!codec.decode) throw new Error(\"indexedDbTransport query requires a codec with decode\");\n const decoded = codec.decode(entry.payload);\n return Array.isArray(decoded) ? decoded[0] : decoded;\n}\n\nfunction shouldKeepEntry(entry: IndexedDbLogEntry, options: IndexedDbTransportQueryOptions) {\n if (options.from !== undefined && entry.createdAt < options.from) return false;\n if (options.to !== undefined && entry.createdAt > options.to) return false;\n if (options.sessionId !== undefined && entry.sessionId !== options.sessionId) return false;\n if (options.minLevel !== undefined && entry.level < toLevelValue(options.minLevel)) return false;\n if (options.logger !== undefined && entry.logger !== options.logger) return false;\n if (options.type !== undefined && entry.type !== options.type) return false;\n return true;\n}\n\nfunction addSessionSummary(\n sessions: Map<string, IndexedDbLogSession>,\n entry: IndexedDbLogEntry,\n): void {\n if (!entry.sessionId) return;\n const current = sessions.get(entry.sessionId);\n if (current) {\n current.firstSeen = Math.min(current.firstSeen, entry.createdAt);\n current.lastSeen = Math.max(current.lastSeen, entry.createdAt);\n current.count += 1;\n current.byteLength += entry.byteLength;\n return;\n }\n sessions.set(entry.sessionId, {\n byteLength: entry.byteLength,\n count: 1,\n firstSeen: entry.createdAt,\n lastSeen: entry.createdAt,\n sessionId: entry.sessionId,\n });\n}\n\nfunction mergeSessionSummary(\n current: IndexedDbLogSession | undefined,\n incoming: IndexedDbLogSession,\n): IndexedDbLogSession {\n if (!current) return incoming;\n return {\n byteLength: current.byteLength + incoming.byteLength,\n count: current.count + incoming.count,\n firstSeen: Math.min(current.firstSeen, incoming.firstSeen),\n lastSeen: Math.max(current.lastSeen, incoming.lastSeen),\n sessionId: incoming.sessionId,\n };\n}\n\nfunction orderSessions(\n sessions: readonly IndexedDbLogSession[],\n order: \"asc\" | \"desc\" = \"desc\",\n): IndexedDbLogSession[] {\n // oxlint-disable-next-line no-array-sort -- Sort a copy for deterministic session lists.\n const sorted = [...sessions].sort((left, right) => {\n if (left.lastSeen !== right.lastSeen) return left.lastSeen - right.lastSeen;\n return left.sessionId < right.sessionId ? -1 : left.sessionId > right.sessionId ? 1 : 0;\n });\n if (order === \"asc\") return sorted;\n const reversed: IndexedDbLogSession[] = [];\n for (let index = sorted.length - 1; index >= 0; index -= 1) {\n reversed.push(sorted[index] as IndexedDbLogSession);\n }\n return reversed;\n}\n\nfunction orderRangeForQuery(options: IndexedDbTransportQueryOptions): IDBKeyRange | undefined {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n if (options.sessionId !== undefined) {\n const lower = [\n options.sessionId,\n options.from ?? Number.MIN_SAFE_INTEGER,\n Number.MIN_SAFE_INTEGER,\n \"\",\n ];\n const upper = [\n options.sessionId,\n options.to ?? Number.MAX_SAFE_INTEGER,\n Number.MAX_SAFE_INTEGER,\n \"\\uffff\",\n ];\n return IDBKeyRange.bound(lower, upper);\n }\n const lower =\n options.from === undefined ? undefined : [options.from, Number.MIN_SAFE_INTEGER, \"\"];\n const upper =\n options.to === undefined ? undefined : [options.to, Number.MAX_SAFE_INTEGER, \"\\uffff\"];\n if (lower && upper) return IDBKeyRange.bound(lower, upper);\n if (lower) return IDBKeyRange.lowerBound(lower);\n if (upper) return IDBKeyRange.upperBound(upper);\n return undefined;\n}\n\nfunction orderRangeForSessionId(sessionId: string): IDBKeyRange | undefined {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n return IDBKeyRange.bound(\n [sessionId, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, \"\"],\n [sessionId, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, \"\\uffff\"],\n );\n}\n\nfunction migrateSessionSummaries(logStore: IDBObjectStore, sessionStore: IDBObjectStore): void {\n const summaries = new Map<string, IndexedDbLogSession>();\n const request = logStore.openCursor();\n request.addEventListener(\"success\", () => {\n const cursor = request.result;\n if (!cursor) {\n for (const summary of summaries.values()) sessionStore.put(summary);\n return;\n }\n addSessionSummary(summaries, cursor.value as IndexedDbLogEntry);\n cursor.continue();\n });\n}\n\nfunction iterateCursor(\n request: IDBRequest<IDBCursorWithValue | null>,\n visit: (cursor: IDBCursorWithValue) => boolean | void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\n \"success\",\n () => {\n const cursor = request.result;\n if (!cursor) {\n resolve();\n return;\n }\n try {\n const shouldContinue = visit(cursor);\n if (shouldContinue === false) {\n resolve();\n return;\n }\n cursor.continue();\n } catch (error) {\n reject(error);\n }\n },\n false,\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB cursor failed\")),\n { once: true },\n );\n });\n}\n\nexport function indexedDbTransport(options: IndexedDbTransportOptions = {}): IndexedDbTransport {\n const dbName = options.dbName ?? DEFAULT_DB_NAME;\n const storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const sessionStoreName = sessionStoreNameFor(storeName);\n const codec: Codec<string | Uint8Array> = options.codec ?? safeJsonCodec();\n const batchSize = normalizePositiveInteger(options.batchSize, 100);\n const flushIntervalMs = normalizePositiveInteger(options.flushIntervalMs, 1000);\n const maxBufferSize = normalizePositiveInteger(options.maxBufferSize, 1000);\n const maxEntries = normalizePositiveInteger(options.maxEntries, 50_000);\n const maxBytes = normalizePositiveInteger(options.maxBytes, 50 * 1024 * 1024);\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const flushOnPageHide = options.flushOnPageHide ?? true;\n const durability = options.durability ?? \"default\";\n const rootIndexedDB = options.indexedDB ?? globalThis.indexedDB;\n const sessionOptions = normalizeSessionOptions(options.session);\n const spillOptions = normalizeLocalStorageSpillOptions(\n options.localStorageSpill,\n dbName,\n storeName,\n );\n const transactionOptions =\n durability === \"default\"\n ? undefined\n : ({\n durability,\n } satisfies IDBTransactionOptions);\n\n const buffer: LogEvent[] = [];\n let dbPromise: Promise<IDBDatabase> | undefined;\n let indexedDBFactoryPromise: Promise<IDBFactory | undefined> | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushPromise: Promise<void> | undefined;\n let clearPromise: Promise<void> | undefined;\n let pendingFlushBatch: LogEvent[] | undefined;\n let spillDrainPromise: Promise<void> | undefined;\n let localStorageSpillClearCandidate: LocalStorageSpillClearCandidate | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n const statsState: IndexedDbTransportStats = {\n bufferDepth: 0,\n maxBufferDepth: 0,\n pendingFlush: false,\n enqueued: 0,\n persisted: 0,\n dropped: 0,\n droppedByReason: {},\n persistedDropped: 0,\n persistedDroppedByReason: {},\n flushes: 0,\n flushErrors: 0,\n lastFlushBatchSize: 0,\n lastFlushDurationMs: 0,\n prunes: 0,\n pruneFallbacks: 0,\n lastPruneDurationMs: 0,\n queries: 0,\n queryFallbacks: 0,\n lastQueryDurationMs: 0,\n databaseOpenCount: 0,\n storageBucketFallbacks: 0,\n transactionOptionFallbacks: 0,\n errors: 0,\n errorsByOperation: {},\n localStorageSpillWrites: 0,\n localStorageSpillEntries: 0,\n localStorageSpillDrains: 0,\n localStorageSpillDrainedEntries: 0,\n localStorageSpillDropped: 0,\n localStorageSpillDroppedByReason: {},\n localStorageSpillErrors: 0,\n localStorageSpillErrorsByOperation: {},\n };\n\n const snapshotStats = (): IndexedDbTransportStats => ({\n ...statsState,\n bufferDepth: buffer.length,\n droppedByReason: { ...statsState.droppedByReason },\n errorsByOperation: { ...statsState.errorsByOperation },\n localStorageSpillDroppedByReason: { ...statsState.localStorageSpillDroppedByReason },\n localStorageSpillErrorsByOperation: { ...statsState.localStorageSpillErrorsByOperation },\n pendingFlush: flushPromise !== undefined,\n persistedDroppedByReason: { ...statsState.persistedDroppedByReason },\n });\n\n const reportInternalError = (error: unknown, operation: string) => {\n statsState.errors += 1;\n incrementRecord(statsState.errorsByOperation, operation);\n lastContext?.reportInternalError(error, {\n operation,\n phase: \"transport\",\n transport: options.name ?? \"indexeddb\",\n });\n };\n\n const dropEvent = (event: LogEvent, reason: string) => {\n statsState.dropped += 1;\n incrementRecord(statsState.droppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.dropped.${reason}`);\n options.onDrop?.(event, reason);\n };\n\n const dropPersistedEntry = (entry: IndexedDbLogEntry, reason: string) => {\n statsState.persistedDropped += 1;\n incrementRecord(statsState.persistedDroppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.persisted.dropped.${reason}`);\n options.onPersistedDrop?.(entry, reason);\n };\n\n const reportSpillError = (error: unknown, operation: string) => {\n statsState.localStorageSpillErrors += 1;\n incrementRecord(statsState.localStorageSpillErrorsByOperation, operation);\n reportInternalError(error, `localstorage-spill-${operation}`);\n };\n\n const dropSpillEvent = (event: LogEvent, reason: string) => {\n statsState.localStorageSpillDropped += 1;\n incrementRecord(statsState.localStorageSpillDroppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.localstorage_spill.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.localstorage_spill.dropped.${reason}`);\n spillOptions?.onDrop?.(event, reason);\n };\n\n const resolveIndexedDBFactory = async () => {\n if (options.indexedDB || !options.storageBucketName) return rootIndexedDB;\n indexedDBFactoryPromise ??= (async () => {\n const manager = getStorageBucketManager();\n if (!manager) {\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n }\n try {\n const bucket = await manager.open(\n options.storageBucketName as string,\n storageBucketOpenOptions(options),\n );\n if (bucket.indexedDB) return bucket.indexedDB;\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n } catch (error) {\n statsState.storageBucketFallbacks += 1;\n reportInternalError(error, \"storage-bucket-open\");\n return rootIndexedDB;\n }\n })();\n return indexedDBFactoryPromise;\n };\n\n const openDb = () => {\n dbPromise ??= resolveIndexedDBFactory().then((idb) => {\n if (!idb) throw new Error(\"IndexedDB is not available for indexedDbTransport\");\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = idb.open(dbName, DB_VERSION);\n request.addEventListener(\"upgradeneeded\", (event) => {\n const db = request.result;\n const store = db.objectStoreNames.contains(storeName)\n ? request.transaction?.objectStore(storeName)\n : db.createObjectStore(storeName, { keyPath: \"id\" });\n if (!store) return;\n ensureIndex(store, \"createdAt\", \"createdAt\");\n ensureIndex(store, \"level\", \"level\");\n ensureIndex(store, \"logger\", \"logger\");\n ensureIndex(store, \"type\", \"type\");\n ensureIndex(store, ORDER_INDEX_NAME, [\"createdAt\", \"seq\", \"id\"]);\n ensureIndex(store, SESSION_INDEX_NAME, \"sessionId\");\n ensureIndex(store, SESSION_ORDER_INDEX_NAME, [\"sessionId\", \"createdAt\", \"seq\", \"id\"]);\n const sessionStore = db.objectStoreNames.contains(sessionStoreName)\n ? request.transaction?.objectStore(sessionStoreName)\n : db.createObjectStore(sessionStoreName, { keyPath: \"sessionId\" });\n if (!sessionStore) return;\n ensureIndex(sessionStore, SESSION_LAST_SEEN_INDEX_NAME, [\"lastSeen\", \"sessionId\"]);\n if (event.oldVersion < 4) migrateSessionSummaries(store, sessionStore);\n });\n request.addEventListener(\n \"success\",\n () => {\n statsState.databaseOpenCount += 1;\n resolve(request.result);\n },\n { once: true },\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB open failed\")),\n { once: true },\n );\n });\n });\n return dbPromise;\n };\n\n const createTransaction = (\n db: IDBDatabase,\n mode: IDBTransactionMode,\n stores: string | string[] = storeName,\n ) => {\n if (mode !== \"readwrite\" || !transactionOptions) return db.transaction(stores, mode);\n try {\n return db.transaction(stores, mode, transactionOptions);\n } catch {\n statsState.transactionOptionFallbacks += 1;\n return db.transaction(stores, mode);\n }\n };\n\n const withStore = async <T>(\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore, transaction: IDBTransaction) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(storeName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const withLogAndSessionStores = async <T>(\n mode: IDBTransactionMode,\n run: (\n store: IDBObjectStore,\n sessionStore: IDBObjectStore,\n transaction: IDBTransaction,\n ) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode, [storeName, sessionStoreName]);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(storeName), tx.objectStore(sessionStoreName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const withSessionStore = async <T>(\n mode: IDBTransactionMode,\n run: (sessionStore: IDBObjectStore, transaction: IDBTransaction) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode, sessionStoreName);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(sessionStoreName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const mergeSessionSummaries = async (\n sessionStore: IDBObjectStore,\n entries: readonly IndexedDbLogEntry[],\n ) => {\n const summaries = new Map<string, IndexedDbLogSession>();\n for (const entry of entries) addSessionSummary(summaries, entry);\n for (const summary of summaries.values()) {\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n const current = await requestToPromise(\n sessionStore.get(summary.sessionId) as IDBRequest<IndexedDbLogSession | undefined>,\n );\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(sessionStore.put(mergeSessionSummary(current, summary)));\n }\n };\n\n const rebuildSessionSummaries = async (\n store: IDBObjectStore,\n sessionStore: IDBObjectStore,\n sessionIds: ReadonlySet<string>,\n ) => {\n if (sessionIds.size === 0) return;\n const index = getStoreIndex(store, SESSION_ORDER_INDEX_NAME);\n for (const sessionId of sessionIds) {\n const summaries = new Map<string, IndexedDbLogSession>();\n const range = orderRangeForSessionId(sessionId);\n const request = index && range ? index.openCursor(range) : store.openCursor();\n // oxlint-disable-next-line no-await-in-loop -- Rebuilds one session at a time inside the active transaction.\n await iterateCursor(request, (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (entry.sessionId === sessionId) addSessionSummary(summaries, entry);\n });\n const summary = summaries.get(sessionId);\n if (summary) {\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(sessionStore.put(summary));\n } else {\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(sessionStore.delete(sessionId));\n }\n }\n };\n\n const getEntries = async () =>\n orderEntries(\n await withStore(\"readonly\", (store) =>\n requestToPromise(store.getAll() as IDBRequest<IndexedDbLogEntry[]>),\n ),\n );\n\n const countEntries = async (): Promise<number | undefined> =>\n withStore(\"readonly\", (store) => {\n const maybeStore = store as IDBObjectStore & {\n count?: () => IDBRequest<number>;\n };\n if (typeof maybeStore.count !== \"function\") return undefined;\n return requestToPromise(maybeStore.count.call(store));\n });\n\n const deleteEntries = async (entries: readonly IndexedDbLogEntry[], reason: string) => {\n if (entries.length === 0) return;\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const affectedSessionIds = new Set<string>();\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Deletes are sequenced for fake IDB compatibility.\n await requestToPromise(store.delete(entry.id));\n if (entry.sessionId) affectedSessionIds.add(entry.sessionId);\n dropPersistedEntry(entry, reason);\n }\n await rebuildSessionSummaries(store, sessionStore, affectedSessionIds);\n });\n };\n\n const deleteByCursor = async (\n reason: string,\n openCursor: (store: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null> | undefined,\n shouldDelete: (entry: IndexedDbLogEntry, deleted: number) => boolean,\n ): Promise<number | undefined> =>\n withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const request = openCursor(store);\n if (!request) return undefined;\n let deleted = 0;\n const affectedSessionIds = new Set<string>();\n await iterateCursor(request, (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldDelete(entry, deleted)) return false;\n cursor.delete();\n deleted += 1;\n if (entry.sessionId) affectedSessionIds.add(entry.sessionId);\n dropPersistedEntry(entry, reason);\n return true;\n });\n await rebuildSessionSummaries(store, sessionStore, affectedSessionIds);\n return deleted;\n });\n\n const deleteExpiredByCursor = async (cutoff: number): Promise<number | undefined> => {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n const range = IDBKeyRange.upperBound(cutoff, true);\n return deleteByCursor(\n \"ttl\",\n (store) => getStoreIndex(store, \"createdAt\")?.openCursor(range),\n () => true,\n );\n };\n\n const deleteOldestByCursor = async (\n reason: string,\n count: number,\n ): Promise<number | undefined> => {\n if (count <= 0) return 0;\n return deleteByCursor(\n reason,\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (_entry, deleted) => deleted < count,\n );\n };\n\n const deleteOldestBytesByCursor = async (bytesToFree: number): Promise<number | undefined> => {\n if (bytesToFree <= 0) return 0;\n let freed = 0;\n return deleteByCursor(\n \"max-bytes\",\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (entry) => {\n if (freed >= bytesToFree) return false;\n freed += entry.byteLength;\n return true;\n },\n );\n };\n\n const sumBytesByCursor = async (): Promise<number | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(store, ORDER_INDEX_NAME);\n if (!index) return undefined;\n let total = 0;\n await iterateCursor(index.openCursor(), (cursor) => {\n total += (cursor.value as IndexedDbLogEntry).byteLength;\n });\n return total;\n });\n\n const queryEntriesByCursor = async (\n queryOptions: IndexedDbTransportQueryOptions,\n ): Promise<IndexedDbLogEntry[] | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(\n store,\n queryOptions.sessionId === undefined ? ORDER_INDEX_NAME : SESSION_ORDER_INDEX_NAME,\n );\n if (!index) return undefined;\n const entries: IndexedDbLogEntry[] = [];\n const limit = queryOptions.limit;\n if (limit !== undefined && limit <= 0) return entries;\n await iterateCursor(\n index.openCursor(\n orderRangeForQuery(queryOptions),\n queryOptions.order === \"desc\" ? \"prev\" : \"next\",\n ),\n (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldKeepEntry(entry, queryOptions)) return true;\n entries.push(entry);\n return limit === undefined || entries.length < limit;\n },\n );\n return entries;\n });\n\n const listSessions = async (\n sessionQueryOptions: IndexedDbTransportSessionQueryOptions = {},\n ): Promise<IndexedDbLogSession[]> => {\n const limit = sessionQueryOptions.limit;\n if (limit !== undefined && limit <= 0) return [];\n return withSessionStore(\"readonly\", async (sessionStore) => {\n const sessions: IndexedDbLogSession[] = [];\n const index = getStoreIndex(sessionStore, SESSION_LAST_SEEN_INDEX_NAME);\n if (!index) {\n const items = await requestToPromise(\n sessionStore.getAll() as IDBRequest<IndexedDbLogSession[]>,\n );\n return orderSessions(items, sessionQueryOptions.order).slice(0, limit);\n }\n await iterateCursor(\n index.openCursor(undefined, sessionQueryOptions.order === \"asc\" ? \"next\" : \"prev\"),\n (cursor) => {\n sessions.push(cursor.value as IndexedDbLogSession);\n return limit === undefined || sessions.length < limit;\n },\n );\n return sessions;\n });\n };\n\n const pruneWithEntries = async () => {\n const now = Date.now();\n let entries = await getEntries();\n const expired =\n options.ttlMs === undefined\n ? []\n : entries.filter((entry) => now - entry.createdAt > (options.ttlMs as number));\n if (expired.length > 0) {\n await deleteEntries(expired, \"ttl\");\n const expiredIds = new Set(expired.map((entry) => entry.id));\n entries = entries.filter((entry) => !expiredIds.has(entry.id));\n }\n\n if (maxEntries >= 0 && entries.length > maxEntries) {\n const dropped = entries.slice(0, entries.length - maxEntries);\n await deleteEntries(dropped, \"max-entries\");\n entries = entries.slice(entries.length - maxEntries);\n }\n\n if (maxBytes >= 0) {\n let total = entries.reduce((sum, entry) => sum + entry.byteLength, 0);\n const dropped: IndexedDbLogEntry[] = [];\n for (const entry of entries) {\n if (total <= maxBytes) break;\n total -= entry.byteLength;\n dropped.push(entry);\n }\n await deleteEntries(dropped, \"max-bytes\");\n }\n };\n\n const pruneWithCursors = async (): Promise<boolean> => {\n if (options.ttlMs !== undefined) {\n const deleted = await deleteExpiredByCursor(Date.now() - options.ttlMs);\n if (deleted === undefined) return false;\n }\n\n if (maxEntries >= 0) {\n const persistedCount = await countEntries();\n if (persistedCount === undefined) return false;\n if (persistedCount > maxEntries) {\n const deleted = await deleteOldestByCursor(\"max-entries\", persistedCount - maxEntries);\n if (deleted === undefined) return false;\n }\n }\n\n if (maxBytes >= 0) {\n const totalBytes = await sumBytesByCursor();\n if (totalBytes === undefined) return false;\n if (totalBytes > maxBytes) {\n const deleted = await deleteOldestBytesByCursor(totalBytes - maxBytes);\n if (deleted === undefined) return false;\n }\n }\n\n return true;\n };\n\n const prune = async () => {\n const startedAt = nowMs();\n try {\n if (await pruneWithCursors()) return;\n statsState.pruneFallbacks += 1;\n await pruneWithEntries();\n } finally {\n statsState.prunes += 1;\n statsState.lastPruneDurationMs = nowMs() - startedAt;\n }\n };\n\n const sessionIdForEvent = (event: LogEvent): string | undefined => {\n if (!sessionOptions) return undefined;\n return (\n normalizeSessionId(sessionOptions.getId?.(event)) ??\n normalizeSessionId(event.context?.[sessionOptions.contextKey]) ??\n sessionOptions.id\n );\n };\n\n const eventWithSessionContext = (event: LogEvent, sessionId: string | undefined): LogEvent => {\n if (!sessionId || !sessionOptions?.contextKey) return event;\n if (event.context?.[sessionOptions.contextKey] === sessionId) return event;\n return {\n ...event,\n context: {\n ...event.context,\n [sessionOptions.contextKey]: sessionId,\n },\n };\n };\n\n const eventWithResolvedSession = (\n event: LogEvent,\n ): {\n event: LogEvent;\n sessionId?: string;\n } => {\n const sessionId = sessionIdForEvent(event);\n return {\n event: eventWithSessionContext(event, sessionId),\n sessionId,\n };\n };\n\n const eventToEntry = (event: LogEvent): IndexedDbLogEntry => {\n const resolved = eventWithResolvedSession(event);\n const payload = codec.encode(resolved.event);\n return {\n id: event.id,\n sessionId: resolved.sessionId,\n seq: event.seq,\n createdAt: event.time,\n level: event.level,\n levelName: event.levelName,\n logger: event.logger,\n type: event.type,\n byteLength: payloadByteLength(payload),\n payload,\n };\n };\n\n const clearLocalStorageSpill = (expectedValue?: string): boolean => {\n if (!spillOptions) return false;\n try {\n if (\n expectedValue !== undefined &&\n spillOptions.storage.getItem(spillOptions.key) !== expectedValue\n ) {\n return false;\n }\n spillOptions.storage.removeItem(spillOptions.key);\n if (expectedValue === undefined || localStorageSpillClearCandidate?.value === expectedValue) {\n localStorageSpillClearCandidate = undefined;\n }\n return true;\n } catch (error) {\n reportSpillError(error, \"clear\");\n return false;\n }\n };\n\n const rememberLocalStorageSpill = (value: string, events: readonly LogEvent[]) => {\n localStorageSpillClearCandidate = {\n pendingIds: new Set(events.map((event) => event.id)),\n value,\n };\n };\n\n const markLocalStorageSpillPersisted = (events: readonly LogEvent[]) => {\n const candidate = localStorageSpillClearCandidate;\n if (!candidate || events.length === 0) return;\n for (const event of events) candidate.pendingIds.delete(event.id);\n if (candidate.pendingIds.size === 0) clearLocalStorageSpill(candidate.value);\n };\n\n const writeBatch = async (events: readonly LogEvent[]) => {\n if (events.length === 0) return;\n const startedAt = nowMs();\n statsState.lastFlushBatchSize = events.length;\n const entries = events.map(eventToEntry);\n try {\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const rebuildSessionIds = new Set<string>();\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Reads must precede the matching put for overwrite accounting.\n const existing = await requestToPromise(\n store.get(entry.id) as IDBRequest<IndexedDbLogEntry | undefined>,\n );\n if (existing?.sessionId) rebuildSessionIds.add(existing.sessionId);\n if (existing && entry.sessionId) rebuildSessionIds.add(entry.sessionId);\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(store.put(entry));\n }\n await rebuildSessionSummaries(store, sessionStore, rebuildSessionIds);\n await mergeSessionSummaries(\n sessionStore,\n entries.filter((entry) => !entry.sessionId || !rebuildSessionIds.has(entry.sessionId)),\n );\n });\n statsState.persisted += entries.length;\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted\", entries.length);\n markLocalStorageSpillPersisted(events);\n await prune();\n statsState.flushes += 1;\n } catch (error) {\n statsState.flushErrors += 1;\n throw error;\n } finally {\n statsState.lastFlushDurationMs = nowMs() - startedAt;\n }\n };\n\n const stringifySpillPayload = (events: readonly LogEvent[]): string =>\n safeJsonStringify(\n {\n createdAt: Date.now(),\n entries: events,\n schema: SPILL_SCHEMA,\n } satisfies LocalStorageSpillPayload,\n { maxArrayLength: spillOptions?.maxEntries ?? DEFAULT_SPILL_MAX_ENTRIES },\n );\n\n const spillStorageBudget = (currentValue: string | null): number => {\n if (!spillOptions) return 0;\n const ownBytes = currentValue ? storageByteLength(spillOptions.key, currentValue) : 0;\n const originBytes = estimateLocalStorageBytes(spillOptions.storage);\n if (originBytes === undefined) return spillOptions.maxBytes;\n return Math.max(\n 0,\n Math.min(spillOptions.maxBytes, spillOptions.maxOriginBytes - originBytes + ownBytes),\n );\n };\n\n const pendingEventsForSpill = (): LogEvent[] => {\n const events = [...(pendingFlushBatch ?? []), ...buffer];\n const seen = new Set<string>();\n const deduped: LogEvent[] = [];\n for (const event of events) {\n if (seen.has(event.id)) continue;\n seen.add(event.id);\n if (spillOptions?.minLevelValue !== undefined && event.level < spillOptions.minLevelValue) {\n continue;\n }\n deduped.push(eventWithResolvedSession(event).event);\n }\n return deduped;\n };\n\n const trimSpillEventsToBudget = (events: LogEvent[], budget: number): string | undefined => {\n if (!spillOptions) return undefined;\n while (events.length > spillOptions.maxEntries) {\n const dropped = events.shift();\n if (dropped) dropSpillEvent(dropped, \"max-entries\");\n }\n while (events.length > 0) {\n const value = stringifySpillPayload(events);\n if (storageByteLength(spillOptions.key, value) <= budget) return value;\n const dropped = events.shift();\n if (dropped) dropSpillEvent(dropped, \"max-bytes\");\n }\n return undefined;\n };\n\n const writeLocalStorageSpill = () => {\n if (!spillOptions) return;\n const pendingEvents = pendingEventsForSpill();\n if (pendingEvents.length === 0) return;\n\n try {\n const currentValue = spillOptions.storage.getItem(spillOptions.key);\n let events = pendingEvents;\n if (currentValue) {\n const merged = new Map<string, LogEvent>();\n try {\n for (const event of parseSpillPayload(currentValue) ?? []) merged.set(event.id, event);\n } catch {\n // Ignore malformed previous spill data; the current page tail is still worth saving.\n }\n for (const event of pendingEvents) merged.set(event.id, event);\n events = [...merged.values()];\n }\n const budget = spillStorageBudget(currentValue);\n const value = trimSpillEventsToBudget(events, budget);\n if (!value) return;\n try {\n spillOptions.storage.setItem(spillOptions.key, value);\n } catch (error) {\n if (!isQuotaExceededError(error)) throw error;\n while (events.length > 0) {\n const dropped = events.shift();\n if (dropped) dropSpillEvent(dropped, \"quota\");\n const retryValue = trimSpillEventsToBudget(events, budget);\n if (!retryValue) return;\n try {\n spillOptions.storage.setItem(spillOptions.key, retryValue);\n rememberLocalStorageSpill(retryValue, events);\n statsState.localStorageSpillWrites += 1;\n statsState.localStorageSpillEntries += events.length;\n return;\n } catch (retryError) {\n if (!isQuotaExceededError(retryError)) throw retryError;\n }\n }\n return;\n }\n rememberLocalStorageSpill(value, events);\n statsState.localStorageSpillWrites += 1;\n statsState.localStorageSpillEntries += events.length;\n } catch (error) {\n reportSpillError(error, \"write\");\n }\n };\n\n const drainLocalStorageSpill = async () => {\n if (!spillOptions) return;\n let raw: string | null;\n try {\n raw = spillOptions.storage.getItem(spillOptions.key);\n } catch (error) {\n reportSpillError(error, \"read\");\n return;\n }\n if (!raw) return;\n\n let events: LogEvent[] | undefined;\n try {\n events = parseSpillPayload(raw);\n } catch (error) {\n reportSpillError(error, \"parse\");\n clearLocalStorageSpill();\n return;\n }\n if (!events || events.length === 0) {\n clearLocalStorageSpill();\n return;\n }\n\n await writeBatch(events);\n clearLocalStorageSpill(raw);\n statsState.localStorageSpillDrains += 1;\n statsState.localStorageSpillDrainedEntries += events.length;\n };\n\n const ensureSpillDrained = async () => {\n const promise = spillDrainPromise;\n if (!promise) return;\n await promise;\n };\n\n if (spillOptions?.drainOnCreate) {\n spillDrainPromise = drainLocalStorageSpill()\n .catch((error: unknown) => reportSpillError(error, \"drain\"))\n .finally(() => {\n spillDrainPromise = undefined;\n });\n }\n\n const clearTimer = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n\n const flushPending = async () => {\n if (flushPromise) return flushPromise;\n clearTimer();\n const batch = buffer.splice(0, buffer.length);\n pendingFlushBatch = batch;\n const clearBarrier = clearPromise;\n flushPromise = (async () => {\n await clearBarrier;\n await ensureSpillDrained();\n await writeBatch(batch);\n })().finally(() => {\n if (pendingFlushBatch === batch) pendingFlushBatch = undefined;\n flushPromise = undefined;\n if (buffer.length > 0 && !closed) schedule();\n });\n return flushPromise;\n };\n\n const schedule = () => {\n if (timer || flushIntervalMs <= 0 || closed) return;\n timer = setTimeout(() => {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n }, flushIntervalMs);\n };\n\n const onPageHide = () => {\n if (spillOptions?.spillOnPageHide) writeLocalStorageSpill();\n if (flushOnPageHide) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"pagehide-flush\"));\n }\n };\n\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n if (spillOptions?.spillOnPageHide) writeLocalStorageSpill();\n if (flushOnPageHide) {\n void flushPending().catch((error: unknown) =>\n reportInternalError(error, \"visibility-flush\"),\n );\n }\n }\n };\n\n const addVisibilityChangeListener = (): (() => void) | undefined => {\n if (typeof document !== \"undefined\" && typeof document.addEventListener === \"function\") {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n if (typeof globalThis.addEventListener !== \"function\") return undefined;\n globalThis.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => globalThis.removeEventListener?.(\"visibilitychange\", onVisibilityChange);\n };\n\n let removeVisibilityChangeListener: (() => void) | undefined;\n if (flushOnPageHide || spillOptions?.spillOnPageHide) {\n globalThis.addEventListener?.(\"pagehide\", onPageHide);\n removeVisibilityChangeListener = addVisibilityChangeListener();\n }\n\n return {\n name: options.name ?? \"indexeddb\",\n minLevel: options.minLevel,\n log(event, context) {\n if (closed) return;\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n lastContext = context;\n if (maxBufferSize === 0 || buffer.length >= maxBufferSize) {\n if (dropPolicy === \"drop-newest\") {\n dropEvent(event, \"buffer-full\");\n return;\n }\n const dropped = buffer.shift();\n if (dropped) dropEvent(dropped, \"buffer-full\");\n }\n buffer.push(event);\n statsState.enqueued += 1;\n statsState.maxBufferDepth = Math.max(statsState.maxBufferDepth, buffer.length);\n if (buffer.length >= batchSize || flushIntervalMs === 0) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else {\n schedule();\n }\n },\n flush() {\n return flushPending();\n },\n async count() {\n await flushPending();\n return (await countEntries()) ?? (await getEntries()).length;\n },\n async clear() {\n if (clearPromise) return clearPromise;\n const inFlightFlush = flushPromise;\n const inFlightDrain = spillDrainPromise;\n buffer.length = 0;\n clearTimer();\n clearLocalStorageSpill();\n clearPromise = (async () => {\n await inFlightFlush;\n await inFlightDrain;\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n await requestToPromise(store.clear());\n await requestToPromise(sessionStore.clear());\n });\n })().finally(() => {\n clearPromise = undefined;\n });\n return clearPromise;\n },\n async remove(ids) {\n await flushPending();\n const items = typeof ids === \"string\" ? [ids] : ids;\n if (items.length === 0) return;\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const affectedSessionIds = new Set<string>();\n for (const id of items) {\n // oxlint-disable-next-line no-await-in-loop -- Reads must precede deletes for session metadata repair.\n const entry = await requestToPromise(\n store.get(id) as IDBRequest<IndexedDbLogEntry | undefined>,\n );\n if (entry?.sessionId) affectedSessionIds.add(entry.sessionId);\n // oxlint-disable-next-line no-await-in-loop -- Deletes must preserve fake IDB transaction ordering.\n await requestToPromise(store.delete(id));\n }\n await rebuildSessionSummaries(store, sessionStore, affectedSessionIds);\n });\n },\n async *query(queryOptions: IndexedDbTransportQueryOptions = {}) {\n await flushPending();\n const startedAt = nowMs();\n const cursorEntries = await queryEntriesByCursor(queryOptions);\n if (cursorEntries === undefined) statsState.queryFallbacks += 1;\n const entries =\n cursorEntries ??\n orderEntries(await getEntries(), queryOptions.order ?? \"asc\")\n .filter((entry) => shouldKeepEntry(entry, queryOptions))\n .slice(0, queryOptions.limit);\n statsState.queries += 1;\n statsState.lastQueryDurationMs = nowMs() - startedAt;\n for (const entry of entries) {\n const event = decodeEntry(entry, codec);\n if (event) yield event;\n }\n },\n async sessions(sessionQueryOptions: IndexedDbTransportSessionQueryOptions = {}) {\n await flushPending();\n return listSessions(sessionQueryOptions);\n },\n stats() {\n return snapshotStats();\n },\n close() {\n closed = true;\n clearTimer();\n globalThis.removeEventListener?.(\"pagehide\", onPageHide);\n removeVisibilityChangeListener?.();\n removeVisibilityChangeListener = undefined;\n const flushed = flushPending();\n return flushed.finally(() => {\n const promise = dbPromise;\n dbPromise = undefined;\n return promise?.then((db) => db.close());\n });\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexeddb-transport.js","names":[],"sources":["../src/indexeddb-transport.ts"],"sourcesContent":["import {\n incrementLoggerMetaCounter,\n safeJsonCodec,\n safeJsonStringify,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport type { BrowserHttpDropPolicy } from \"./http-transport\";\n\nexport interface IndexedDbLogEntry {\n id: string;\n sessionId?: string;\n seq: number;\n createdAt: number;\n level: number;\n levelName: string;\n logger: string;\n type?: string;\n byteLength: number;\n payload: string | Uint8Array;\n}\n\nexport interface IndexedDbTransportQueryOptions {\n from?: number;\n to?: number;\n sessionId?: string;\n minLevel?: LoggerLevel;\n logger?: string;\n type?: string;\n limit?: number;\n order?: \"asc\" | \"desc\";\n}\n\nexport type IndexedDbTransportDurability = \"default\" | \"strict\" | \"relaxed\";\n\nexport type IndexedDbStorageBucketDurability = \"strict\" | \"relaxed\";\n\nexport interface IndexedDbTransportSessionOptions {\n id?: string;\n getId?: (event: LogEvent) => string | undefined;\n contextKey?: string;\n}\n\nexport type IndexedDbTransportSession = string | false | IndexedDbTransportSessionOptions;\n\nexport interface IndexedDbLogSession {\n sessionId: string;\n firstSeen: number;\n lastSeen: number;\n count: number;\n byteLength: number;\n}\n\nexport interface IndexedDbTransportSessionQueryOptions {\n limit?: number;\n order?: \"asc\" | \"desc\";\n}\n\nexport interface IndexedDbLocalStorageSpillOptions {\n namespace?: string;\n maxEntries?: number;\n maxBytes?: number;\n maxOriginBytes?: number;\n minLevel?: LoggerLevel;\n drainOnCreate?: boolean;\n spillOnPageHide?: boolean;\n storage?: Storage;\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\nexport interface IndexedDbTransportStats {\n bufferDepth: number;\n maxBufferDepth: number;\n pendingFlush: boolean;\n enqueued: number;\n persisted: number;\n dropped: number;\n droppedByReason: Record<string, number>;\n persistedDropped: number;\n persistedDroppedByReason: Record<string, number>;\n flushes: number;\n flushErrors: number;\n lastFlushBatchSize: number;\n lastFlushDurationMs: number;\n prunes: number;\n pruneFallbacks: number;\n lastPruneDurationMs: number;\n queries: number;\n queryFallbacks: number;\n lastQueryDurationMs: number;\n databaseOpenCount: number;\n storageBucketFallbacks: number;\n transactionOptionFallbacks: number;\n errors: number;\n errorsByOperation: Record<string, number>;\n localStorageSpillWrites: number;\n localStorageSpillEntries: number;\n localStorageSpillDrains: number;\n localStorageSpillDrainedEntries: number;\n localStorageSpillDropped: number;\n localStorageSpillDroppedByReason: Record<string, number>;\n localStorageSpillErrors: number;\n localStorageSpillErrorsByOperation: Record<string, number>;\n}\n\nexport interface IndexedDbTransportOptions {\n name?: string;\n dbName?: string;\n storeName?: string;\n maxEntries?: number;\n maxBytes?: number;\n ttlMs?: number;\n batchSize?: number;\n flushIntervalMs?: number;\n maxBufferSize?: number;\n dropPolicy?: BrowserHttpDropPolicy;\n flushOnPageHide?: boolean;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n durability?: IndexedDbTransportDurability;\n storageBucketName?: string;\n storageBucketPersisted?: boolean;\n storageBucketDurability?: IndexedDbStorageBucketDurability;\n session?: IndexedDbTransportSession;\n localStorageSpill?: false | IndexedDbLocalStorageSpillOptions;\n indexedDB?: IDBFactory;\n onDrop?: (event: LogEvent, reason: string) => void;\n onPersistedDrop?: (entry: IndexedDbLogEntry, reason: string) => void;\n}\n\nexport interface IndexedDbTransport extends Transport {\n count: () => Promise<number>;\n clear: () => Promise<void>;\n remove: (ids: string | readonly string[]) => Promise<void>;\n query: (options?: IndexedDbTransportQueryOptions) => AsyncIterable<LogEvent>;\n sessions: (options?: IndexedDbTransportSessionQueryOptions) => Promise<IndexedDbLogSession[]>;\n stats: () => IndexedDbTransportStats;\n}\n\nconst DEFAULT_DB_NAME = \"loggerjs\";\nconst DEFAULT_STORE_NAME = \"logs\";\nconst DEFAULT_SESSION_CONTEXT_KEY = \"sessionId\";\nconst DEFAULT_SPILL_MAX_ENTRIES = 200;\nconst DEFAULT_SPILL_MAX_BYTES = 512 * 1024;\nconst DEFAULT_SPILL_MAX_ORIGIN_BYTES = 5 * 1024 * 1024;\nconst DB_VERSION = 4;\nconst ORDER_INDEX_NAME = \"createdAtSeq\";\nconst SESSION_INDEX_NAME = \"sessionId\";\nconst SESSION_ORDER_INDEX_NAME = \"sessionIdCreatedAtSeq\";\nconst SESSION_STORE_SUFFIX = \"__sessions\";\nconst SESSION_LAST_SEEN_INDEX_NAME = \"lastSeenSessionId\";\nconst SPILL_SCHEMA = \"loggerjs.indexeddb-spill.v1\";\n\ninterface NormalizedSessionOptions {\n id?: string;\n getId?: (event: LogEvent) => string | undefined;\n contextKey: string;\n}\n\ninterface NormalizedLocalStorageSpillOptions {\n key: string;\n maxEntries: number;\n maxBytes: number;\n maxOriginBytes: number;\n minLevelValue?: number;\n drainOnCreate: boolean;\n spillOnPageHide: boolean;\n storage: Storage;\n onDrop?: (event: LogEvent, reason: string) => void;\n}\n\ninterface LocalStorageSpillPayload {\n schema: typeof SPILL_SCHEMA;\n createdAt: number;\n entries: readonly LogEvent[];\n}\n\ninterface LocalStorageSpillClearCandidate {\n value: string;\n pendingIds: Set<string>;\n}\n\ninterface StorageBucketLike {\n indexedDB?: IDBFactory;\n}\n\ninterface StorageBucketManagerLike {\n open: (\n name: string,\n options?: {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n },\n ) => Promise<StorageBucketLike>;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value)) return fallback;\n return Math.max(0, Math.floor(value));\n}\n\nlet fallbackSessionSeq = 0;\n\nfunction defaultPageSessionId(): string {\n const randomUUID = globalThis.crypto?.randomUUID;\n if (randomUUID) return randomUUID.call(globalThis.crypto);\n return `${Date.now().toString(36)}-${(fallbackSessionSeq++).toString(36)}`;\n}\n\nfunction normalizeSessionId(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeSessionOptions(\n session: IndexedDbTransportSession | undefined,\n): NormalizedSessionOptions | undefined {\n if (session === false) return undefined;\n if (typeof session === \"string\") {\n return {\n contextKey: DEFAULT_SESSION_CONTEXT_KEY,\n id: normalizeSessionId(session) ?? defaultPageSessionId(),\n };\n }\n return {\n contextKey: session?.contextKey ?? DEFAULT_SESSION_CONTEXT_KEY,\n getId: session?.getId,\n id: normalizeSessionId(session?.id) ?? defaultPageSessionId(),\n };\n}\n\nfunction resolveLocalStorage(storage: Storage | undefined): Storage | undefined {\n if (storage) return storage;\n try {\n return globalThis.localStorage;\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeLocalStorageSpillOptions(\n spill: false | IndexedDbLocalStorageSpillOptions | undefined,\n dbName: string,\n storeName: string,\n): NormalizedLocalStorageSpillOptions | undefined {\n if (!spill) return undefined;\n const storage = resolveLocalStorage(spill.storage);\n if (!storage) return undefined;\n const namespace = spill.namespace ?? `${dbName}:${storeName}`;\n return {\n drainOnCreate: spill.drainOnCreate ?? true,\n key: `loggerjs:spill:v1:${namespace}`,\n maxBytes: normalizePositiveInteger(spill.maxBytes, DEFAULT_SPILL_MAX_BYTES),\n maxEntries: normalizePositiveInteger(spill.maxEntries, DEFAULT_SPILL_MAX_ENTRIES),\n maxOriginBytes: normalizePositiveInteger(spill.maxOriginBytes, DEFAULT_SPILL_MAX_ORIGIN_BYTES),\n minLevelValue: spill.minLevel === undefined ? undefined : toLevelValue(spill.minLevel),\n onDrop: spill.onDrop,\n spillOnPageHide: spill.spillOnPageHide ?? true,\n storage,\n };\n}\n\nfunction storageByteLength(key: string, value: string): number {\n return 2 * (key.length + value.length);\n}\n\nfunction estimateLocalStorageBytes(storage: Storage): number | undefined {\n try {\n let total = 0;\n for (let index = 0; index < storage.length; index += 1) {\n const key = storage.key(index);\n if (key === null) continue;\n total += storageByteLength(key, storage.getItem(key) ?? \"\");\n }\n return total;\n } catch {\n return undefined;\n }\n}\n\nfunction isQuotaExceededError(error: unknown): boolean {\n return (\n typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n (error.name === \"QuotaExceededError\" || error.name === \"NS_ERROR_DOM_QUOTA_REACHED\")\n );\n}\n\nfunction isSpillLogEvent(value: unknown): value is LogEvent {\n if (!value || typeof value !== \"object\") return false;\n const event = value as Partial<LogEvent>;\n return (\n typeof event.id === \"string\" &&\n typeof event.time === \"number\" &&\n typeof event.seq === \"number\" &&\n typeof event.level === \"number\" &&\n typeof event.levelName === \"string\" &&\n typeof event.logger === \"string\" &&\n typeof event.message === \"string\"\n );\n}\n\nfunction parseSpillPayload(raw: string): LogEvent[] | undefined {\n const parsed = JSON.parse(raw) as Partial<LocalStorageSpillPayload>;\n if (parsed.schema !== SPILL_SCHEMA || !Array.isArray(parsed.entries)) return undefined;\n return parsed.entries.filter(isSpillLogEvent);\n}\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\nfunction incrementRecord(record: Record<string, number>, key: string, amount = 1): void {\n record[key] = (record[key] ?? 0) + amount;\n}\n\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\"success\", () => resolve(request.result), { once: true });\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB request failed\")),\n { once: true },\n );\n });\n}\n\nfunction transactionToPromise(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.addEventListener(\"complete\", () => resolve(), { once: true });\n transaction.addEventListener(\n \"abort\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction aborted\")),\n { once: true },\n );\n transaction.addEventListener(\n \"error\",\n () => reject(transaction.error ?? new Error(\"IndexedDB transaction failed\")),\n { once: true },\n );\n });\n}\n\nfunction payloadByteLength(payload: string | Uint8Array): number {\n if (typeof payload !== \"string\") return payload.byteLength;\n if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(payload).byteLength;\n return new Blob([payload]).size;\n}\n\nfunction compareEntries(a: IndexedDbLogEntry, b: IndexedDbLogEntry): number {\n if (a.createdAt !== b.createdAt) return a.createdAt - b.createdAt;\n if (a.seq !== b.seq) return a.seq - b.seq;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction orderEntries(\n entries: readonly IndexedDbLogEntry[],\n order: \"asc\" | \"desc\" = \"asc\",\n): IndexedDbLogEntry[] {\n // oxlint-disable-next-line no-array-sort -- Sort a copy to preserve ES2020 compatibility and caller immutability.\n const sorted = [...entries].sort(compareEntries);\n if (order === \"asc\") return sorted;\n const reversed: IndexedDbLogEntry[] = [];\n for (let index = sorted.length - 1; index >= 0; index -= 1) {\n reversed.push(sorted[index] as IndexedDbLogEntry);\n }\n return reversed;\n}\n\nfunction indexExists(store: IDBObjectStore, name: string): boolean {\n return store.indexNames.contains(name);\n}\n\nfunction ensureIndex(store: IDBObjectStore, name: string, keyPath: string | readonly string[]) {\n if (!indexExists(store, name)) store.createIndex(name, keyPath);\n}\n\nfunction sessionStoreNameFor(storeName: string): string {\n return `${storeName}${SESSION_STORE_SUFFIX}`;\n}\n\nfunction getStoreIndex(store: IDBObjectStore, name: string): IDBIndex | undefined {\n const maybeStore = store as IDBObjectStore & {\n index?: (indexName: string) => IDBIndex;\n };\n if (typeof maybeStore.index !== \"function\" || !indexExists(store, name)) return undefined;\n return maybeStore.index(name);\n}\n\nfunction getStorageBucketManager(): StorageBucketManagerLike | undefined {\n return (globalThis.navigator as unknown as { storageBuckets?: StorageBucketManagerLike })\n ?.storageBuckets;\n}\n\nfunction storageBucketOpenOptions(options: IndexedDbTransportOptions):\n | {\n durability?: IndexedDbStorageBucketDurability;\n persisted?: boolean;\n }\n | undefined {\n if (\n options.storageBucketDurability === undefined &&\n options.storageBucketPersisted === undefined\n ) {\n return undefined;\n }\n return {\n durability: options.storageBucketDurability,\n persisted: options.storageBucketPersisted,\n };\n}\n\nfunction decodeEntry(\n entry: IndexedDbLogEntry,\n codec: Codec<string | Uint8Array>,\n): LogEvent | undefined {\n if (!codec.decode) throw new Error(\"indexedDbTransport query requires a codec with decode\");\n const decoded = codec.decode(entry.payload);\n return Array.isArray(decoded) ? decoded[0] : decoded;\n}\n\nfunction shouldKeepEntry(entry: IndexedDbLogEntry, options: IndexedDbTransportQueryOptions) {\n if (options.from !== undefined && entry.createdAt < options.from) return false;\n if (options.to !== undefined && entry.createdAt > options.to) return false;\n if (options.sessionId !== undefined && entry.sessionId !== options.sessionId) return false;\n if (options.minLevel !== undefined && entry.level < toLevelValue(options.minLevel)) return false;\n if (options.logger !== undefined && entry.logger !== options.logger) return false;\n if (options.type !== undefined && entry.type !== options.type) return false;\n return true;\n}\n\nfunction addSessionSummary(\n sessions: Map<string, IndexedDbLogSession>,\n entry: IndexedDbLogEntry,\n): void {\n if (!entry.sessionId) return;\n const current = sessions.get(entry.sessionId);\n if (current) {\n current.firstSeen = Math.min(current.firstSeen, entry.createdAt);\n current.lastSeen = Math.max(current.lastSeen, entry.createdAt);\n current.count += 1;\n current.byteLength += entry.byteLength;\n return;\n }\n sessions.set(entry.sessionId, {\n byteLength: entry.byteLength,\n count: 1,\n firstSeen: entry.createdAt,\n lastSeen: entry.createdAt,\n sessionId: entry.sessionId,\n });\n}\n\nfunction mergeSessionSummary(\n current: IndexedDbLogSession | undefined,\n incoming: IndexedDbLogSession,\n): IndexedDbLogSession {\n if (!current) return incoming;\n return {\n byteLength: current.byteLength + incoming.byteLength,\n count: current.count + incoming.count,\n firstSeen: Math.min(current.firstSeen, incoming.firstSeen),\n lastSeen: Math.max(current.lastSeen, incoming.lastSeen),\n sessionId: incoming.sessionId,\n };\n}\n\nfunction orderSessions(\n sessions: readonly IndexedDbLogSession[],\n order: \"asc\" | \"desc\" = \"desc\",\n): IndexedDbLogSession[] {\n // oxlint-disable-next-line no-array-sort -- Sort a copy for deterministic session lists.\n const sorted = [...sessions].sort((left, right) => {\n if (left.lastSeen !== right.lastSeen) return left.lastSeen - right.lastSeen;\n return left.sessionId < right.sessionId ? -1 : left.sessionId > right.sessionId ? 1 : 0;\n });\n if (order === \"asc\") return sorted;\n const reversed: IndexedDbLogSession[] = [];\n for (let index = sorted.length - 1; index >= 0; index -= 1) {\n reversed.push(sorted[index] as IndexedDbLogSession);\n }\n return reversed;\n}\n\nfunction orderRangeForQuery(options: IndexedDbTransportQueryOptions): IDBKeyRange | undefined {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n if (options.sessionId !== undefined) {\n const lower = [\n options.sessionId,\n options.from ?? Number.MIN_SAFE_INTEGER,\n Number.MIN_SAFE_INTEGER,\n \"\",\n ];\n const upper = [\n options.sessionId,\n options.to ?? Number.MAX_SAFE_INTEGER,\n Number.MAX_SAFE_INTEGER,\n \"\\uffff\",\n ];\n return IDBKeyRange.bound(lower, upper);\n }\n const lower =\n options.from === undefined ? undefined : [options.from, Number.MIN_SAFE_INTEGER, \"\"];\n const upper =\n options.to === undefined ? undefined : [options.to, Number.MAX_SAFE_INTEGER, \"\\uffff\"];\n if (lower && upper) return IDBKeyRange.bound(lower, upper);\n if (lower) return IDBKeyRange.lowerBound(lower);\n if (upper) return IDBKeyRange.upperBound(upper);\n return undefined;\n}\n\nfunction orderRangeForSessionId(sessionId: string): IDBKeyRange | undefined {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n return IDBKeyRange.bound(\n [sessionId, Number.MIN_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, \"\"],\n [sessionId, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, \"\\uffff\"],\n );\n}\n\nfunction migrateSessionSummaries(logStore: IDBObjectStore, sessionStore: IDBObjectStore): void {\n const summaries = new Map<string, IndexedDbLogSession>();\n const request = logStore.openCursor();\n request.addEventListener(\"success\", () => {\n const cursor = request.result;\n if (!cursor) {\n for (const summary of summaries.values()) sessionStore.put(summary);\n return;\n }\n addSessionSummary(summaries, cursor.value as IndexedDbLogEntry);\n cursor.continue();\n });\n}\n\nfunction iterateCursor(\n request: IDBRequest<IDBCursorWithValue | null>,\n visit: (cursor: IDBCursorWithValue) => boolean | void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n request.addEventListener(\n \"success\",\n () => {\n const cursor = request.result;\n if (!cursor) {\n resolve();\n return;\n }\n try {\n const shouldContinue = visit(cursor);\n if (shouldContinue === false) {\n resolve();\n return;\n }\n cursor.continue();\n } catch (error) {\n reject(error);\n }\n },\n false,\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB cursor failed\")),\n { once: true },\n );\n });\n}\n\nexport function indexedDbTransport(options: IndexedDbTransportOptions = {}): IndexedDbTransport {\n const dbName = options.dbName ?? DEFAULT_DB_NAME;\n const storeName = options.storeName ?? DEFAULT_STORE_NAME;\n const sessionStoreName = sessionStoreNameFor(storeName);\n const codec: Codec<string | Uint8Array> = options.codec ?? safeJsonCodec();\n const batchSize = normalizePositiveInteger(options.batchSize, 100);\n const flushIntervalMs = normalizePositiveInteger(options.flushIntervalMs, 1000);\n const maxBufferSize = normalizePositiveInteger(options.maxBufferSize, 1000);\n const maxEntries = normalizePositiveInteger(options.maxEntries, 50_000);\n const maxBytes = normalizePositiveInteger(options.maxBytes, 50 * 1024 * 1024);\n const dropPolicy = options.dropPolicy ?? \"drop-oldest\";\n const flushOnPageHide = options.flushOnPageHide ?? true;\n const durability = options.durability ?? \"default\";\n const rootIndexedDB = options.indexedDB ?? globalThis.indexedDB;\n const sessionOptions = normalizeSessionOptions(options.session);\n const spillOptions = normalizeLocalStorageSpillOptions(\n options.localStorageSpill,\n dbName,\n storeName,\n );\n const transactionOptions =\n durability === \"default\"\n ? undefined\n : ({\n durability,\n } satisfies IDBTransactionOptions);\n\n const buffer: LogEvent[] = [];\n let dbPromise: Promise<IDBDatabase> | undefined;\n let indexedDBFactoryPromise: Promise<IDBFactory | undefined> | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushPromise: Promise<void> | undefined;\n let clearPromise: Promise<void> | undefined;\n let pendingFlushBatch: LogEvent[] | undefined;\n let spillDrainPromise: Promise<void> | undefined;\n let localStorageSpillClearCandidate: LocalStorageSpillClearCandidate | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n const statsState: IndexedDbTransportStats = {\n bufferDepth: 0,\n maxBufferDepth: 0,\n pendingFlush: false,\n enqueued: 0,\n persisted: 0,\n dropped: 0,\n droppedByReason: {},\n persistedDropped: 0,\n persistedDroppedByReason: {},\n flushes: 0,\n flushErrors: 0,\n lastFlushBatchSize: 0,\n lastFlushDurationMs: 0,\n prunes: 0,\n pruneFallbacks: 0,\n lastPruneDurationMs: 0,\n queries: 0,\n queryFallbacks: 0,\n lastQueryDurationMs: 0,\n databaseOpenCount: 0,\n storageBucketFallbacks: 0,\n transactionOptionFallbacks: 0,\n errors: 0,\n errorsByOperation: {},\n localStorageSpillWrites: 0,\n localStorageSpillEntries: 0,\n localStorageSpillDrains: 0,\n localStorageSpillDrainedEntries: 0,\n localStorageSpillDropped: 0,\n localStorageSpillDroppedByReason: {},\n localStorageSpillErrors: 0,\n localStorageSpillErrorsByOperation: {},\n };\n\n const snapshotStats = (): IndexedDbTransportStats => ({\n ...statsState,\n bufferDepth: buffer.length,\n droppedByReason: { ...statsState.droppedByReason },\n errorsByOperation: { ...statsState.errorsByOperation },\n localStorageSpillDroppedByReason: { ...statsState.localStorageSpillDroppedByReason },\n localStorageSpillErrorsByOperation: { ...statsState.localStorageSpillErrorsByOperation },\n pendingFlush: flushPromise !== undefined,\n persistedDroppedByReason: { ...statsState.persistedDroppedByReason },\n });\n\n const reportInternalError = (error: unknown, operation: string) => {\n statsState.errors += 1;\n incrementRecord(statsState.errorsByOperation, operation);\n lastContext?.reportInternalError(error, {\n operation,\n phase: \"transport\",\n transport: options.name ?? \"indexeddb\",\n });\n };\n\n const dropEvent = (event: LogEvent, reason: string) => {\n statsState.dropped += 1;\n incrementRecord(statsState.droppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.dropped.${reason}`);\n options.onDrop?.(event, reason);\n };\n\n const dropPersistedEntry = (entry: IndexedDbLogEntry, reason: string) => {\n statsState.persistedDropped += 1;\n incrementRecord(statsState.persistedDroppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.persisted.dropped.${reason}`);\n options.onPersistedDrop?.(entry, reason);\n };\n\n const reportSpillError = (error: unknown, operation: string) => {\n statsState.localStorageSpillErrors += 1;\n incrementRecord(statsState.localStorageSpillErrorsByOperation, operation);\n reportInternalError(error, `localstorage-spill-${operation}`);\n };\n\n const dropSpillEvent = (event: LogEvent, reason: string) => {\n statsState.localStorageSpillDropped += 1;\n incrementRecord(statsState.localStorageSpillDroppedByReason, reason);\n incrementLoggerMetaCounter(\"transport.indexeddb.localstorage_spill.dropped\");\n incrementLoggerMetaCounter(`transport.indexeddb.localstorage_spill.dropped.${reason}`);\n spillOptions?.onDrop?.(event, reason);\n };\n\n const resolveIndexedDBFactory = async () => {\n if (options.indexedDB || !options.storageBucketName) return rootIndexedDB;\n indexedDBFactoryPromise ??= (async () => {\n const manager = getStorageBucketManager();\n if (!manager) {\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n }\n try {\n const bucket = await manager.open(\n options.storageBucketName as string,\n storageBucketOpenOptions(options),\n );\n if (bucket.indexedDB) return bucket.indexedDB;\n statsState.storageBucketFallbacks += 1;\n return rootIndexedDB;\n } catch (error) {\n statsState.storageBucketFallbacks += 1;\n reportInternalError(error, \"storage-bucket-open\");\n return rootIndexedDB;\n }\n })();\n return indexedDBFactoryPromise;\n };\n\n const openDb = () => {\n dbPromise ??= resolveIndexedDBFactory().then((idb) => {\n if (!idb) throw new Error(\"IndexedDB is not available for indexedDbTransport\");\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = idb.open(dbName, DB_VERSION);\n request.addEventListener(\"upgradeneeded\", (event) => {\n const db = request.result;\n const store = db.objectStoreNames.contains(storeName)\n ? request.transaction?.objectStore(storeName)\n : db.createObjectStore(storeName, { keyPath: \"id\" });\n if (!store) return;\n ensureIndex(store, \"createdAt\", \"createdAt\");\n ensureIndex(store, \"level\", \"level\");\n ensureIndex(store, \"logger\", \"logger\");\n ensureIndex(store, \"type\", \"type\");\n ensureIndex(store, ORDER_INDEX_NAME, [\"createdAt\", \"seq\", \"id\"]);\n ensureIndex(store, SESSION_INDEX_NAME, \"sessionId\");\n ensureIndex(store, SESSION_ORDER_INDEX_NAME, [\"sessionId\", \"createdAt\", \"seq\", \"id\"]);\n const sessionStore = db.objectStoreNames.contains(sessionStoreName)\n ? request.transaction?.objectStore(sessionStoreName)\n : db.createObjectStore(sessionStoreName, { keyPath: \"sessionId\" });\n if (!sessionStore) return;\n ensureIndex(sessionStore, SESSION_LAST_SEEN_INDEX_NAME, [\"lastSeen\", \"sessionId\"]);\n if (event.oldVersion < 4) migrateSessionSummaries(store, sessionStore);\n });\n request.addEventListener(\n \"success\",\n () => {\n statsState.databaseOpenCount += 1;\n const db = request.result;\n // Another tab, typically a newer app version, needs to upgrade or\n // delete this database. Holding the connection would block it\n // indefinitely, so close now and reopen on next use.\n db.onversionchange = () => {\n db.close();\n dbPromise = undefined;\n };\n resolve(db);\n },\n { once: true },\n );\n request.addEventListener(\n \"error\",\n () => reject(request.error ?? new Error(\"IndexedDB open failed\")),\n { once: true },\n );\n });\n });\n return dbPromise;\n };\n\n const createTransaction = (\n db: IDBDatabase,\n mode: IDBTransactionMode,\n stores: string | string[] = storeName,\n ) => {\n if (mode !== \"readwrite\" || !transactionOptions) return db.transaction(stores, mode);\n try {\n return db.transaction(stores, mode, transactionOptions);\n } catch {\n statsState.transactionOptionFallbacks += 1;\n return db.transaction(stores, mode);\n }\n };\n\n const withStore = async <T>(\n mode: IDBTransactionMode,\n run: (store: IDBObjectStore, transaction: IDBTransaction) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(storeName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const withLogAndSessionStores = async <T>(\n mode: IDBTransactionMode,\n run: (\n store: IDBObjectStore,\n sessionStore: IDBObjectStore,\n transaction: IDBTransaction,\n ) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode, [storeName, sessionStoreName]);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(storeName), tx.objectStore(sessionStoreName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const withSessionStore = async <T>(\n mode: IDBTransactionMode,\n run: (sessionStore: IDBObjectStore, transaction: IDBTransaction) => T | Promise<T>,\n ): Promise<T> => {\n const db = await openDb();\n const tx = createTransaction(db, mode, sessionStoreName);\n const settled = transactionToPromise(tx);\n try {\n const result = await run(tx.objectStore(sessionStoreName), tx);\n await settled;\n return result;\n } catch (error) {\n if (tx.error === null) {\n try {\n tx.abort();\n } catch {\n // The transaction may already be committed or aborted.\n }\n }\n throw error;\n }\n };\n\n const mergeSessionSummaries = async (\n sessionStore: IDBObjectStore,\n entries: readonly IndexedDbLogEntry[],\n ) => {\n const summaries = new Map<string, IndexedDbLogSession>();\n for (const entry of entries) addSessionSummary(summaries, entry);\n for (const summary of summaries.values()) {\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n const current = await requestToPromise(\n sessionStore.get(summary.sessionId) as IDBRequest<IndexedDbLogSession | undefined>,\n );\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(sessionStore.put(mergeSessionSummary(current, summary)));\n }\n };\n\n const rebuildSessionSummaries = async (\n store: IDBObjectStore,\n sessionStore: IDBObjectStore,\n sessionIds: ReadonlySet<string>,\n ) => {\n if (sessionIds.size === 0) return;\n const index = getStoreIndex(store, SESSION_ORDER_INDEX_NAME);\n for (const sessionId of sessionIds) {\n const summaries = new Map<string, IndexedDbLogSession>();\n const range = orderRangeForSessionId(sessionId);\n const request = index && range ? index.openCursor(range) : store.openCursor();\n // oxlint-disable-next-line no-await-in-loop -- Rebuilds one session at a time inside the active transaction.\n await iterateCursor(request, (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (entry.sessionId === sessionId) addSessionSummary(summaries, entry);\n });\n const summary = summaries.get(sessionId);\n if (summary) {\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(sessionStore.put(summary));\n } else {\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(sessionStore.delete(sessionId));\n }\n }\n };\n\n const getEntries = async () =>\n orderEntries(\n await withStore(\"readonly\", (store) =>\n requestToPromise(store.getAll() as IDBRequest<IndexedDbLogEntry[]>),\n ),\n );\n\n const countEntries = async (): Promise<number | undefined> =>\n withStore(\"readonly\", (store) => {\n const maybeStore = store as IDBObjectStore & {\n count?: () => IDBRequest<number>;\n };\n if (typeof maybeStore.count !== \"function\") return undefined;\n return requestToPromise(maybeStore.count.call(store));\n });\n\n const deleteEntries = async (entries: readonly IndexedDbLogEntry[], reason: string) => {\n if (entries.length === 0) return;\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const affectedSessionIds = new Set<string>();\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Deletes are sequenced for fake IDB compatibility.\n await requestToPromise(store.delete(entry.id));\n if (entry.sessionId) affectedSessionIds.add(entry.sessionId);\n dropPersistedEntry(entry, reason);\n }\n await rebuildSessionSummaries(store, sessionStore, affectedSessionIds);\n });\n };\n\n const deleteByCursor = async (\n reason: string,\n openCursor: (store: IDBObjectStore) => IDBRequest<IDBCursorWithValue | null> | undefined,\n shouldDelete: (entry: IndexedDbLogEntry, deleted: number) => boolean,\n ): Promise<number | undefined> =>\n withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const request = openCursor(store);\n if (!request) return undefined;\n let deleted = 0;\n const affectedSessionIds = new Set<string>();\n await iterateCursor(request, (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldDelete(entry, deleted)) return false;\n cursor.delete();\n deleted += 1;\n if (entry.sessionId) affectedSessionIds.add(entry.sessionId);\n dropPersistedEntry(entry, reason);\n return true;\n });\n await rebuildSessionSummaries(store, sessionStore, affectedSessionIds);\n return deleted;\n });\n\n const deleteExpiredByCursor = async (cutoff: number): Promise<number | undefined> => {\n if (typeof IDBKeyRange === \"undefined\") return undefined;\n const range = IDBKeyRange.upperBound(cutoff, true);\n return deleteByCursor(\n \"ttl\",\n (store) => getStoreIndex(store, \"createdAt\")?.openCursor(range),\n () => true,\n );\n };\n\n const deleteOldestByCursor = async (\n reason: string,\n count: number,\n ): Promise<number | undefined> => {\n if (count <= 0) return 0;\n return deleteByCursor(\n reason,\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (_entry, deleted) => deleted < count,\n );\n };\n\n const deleteOldestBytesByCursor = async (bytesToFree: number): Promise<number | undefined> => {\n if (bytesToFree <= 0) return 0;\n let freed = 0;\n return deleteByCursor(\n \"max-bytes\",\n (store) => getStoreIndex(store, ORDER_INDEX_NAME)?.openCursor(),\n (entry) => {\n if (freed >= bytesToFree) return false;\n freed += entry.byteLength;\n return true;\n },\n );\n };\n\n const sumBytesByCursor = async (): Promise<number | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(store, ORDER_INDEX_NAME);\n if (!index) return undefined;\n let total = 0;\n await iterateCursor(index.openCursor(), (cursor) => {\n total += (cursor.value as IndexedDbLogEntry).byteLength;\n });\n return total;\n });\n\n const queryEntriesByCursor = async (\n queryOptions: IndexedDbTransportQueryOptions,\n ): Promise<IndexedDbLogEntry[] | undefined> =>\n withStore(\"readonly\", async (store) => {\n const index = getStoreIndex(\n store,\n queryOptions.sessionId === undefined ? ORDER_INDEX_NAME : SESSION_ORDER_INDEX_NAME,\n );\n if (!index) return undefined;\n const entries: IndexedDbLogEntry[] = [];\n const limit = queryOptions.limit;\n if (limit !== undefined && limit <= 0) return entries;\n await iterateCursor(\n index.openCursor(\n orderRangeForQuery(queryOptions),\n queryOptions.order === \"desc\" ? \"prev\" : \"next\",\n ),\n (cursor) => {\n const entry = cursor.value as IndexedDbLogEntry;\n if (!shouldKeepEntry(entry, queryOptions)) return true;\n entries.push(entry);\n return limit === undefined || entries.length < limit;\n },\n );\n return entries;\n });\n\n const listSessions = async (\n sessionQueryOptions: IndexedDbTransportSessionQueryOptions = {},\n ): Promise<IndexedDbLogSession[]> => {\n const limit = sessionQueryOptions.limit;\n if (limit !== undefined && limit <= 0) return [];\n return withSessionStore(\"readonly\", async (sessionStore) => {\n const sessions: IndexedDbLogSession[] = [];\n const index = getStoreIndex(sessionStore, SESSION_LAST_SEEN_INDEX_NAME);\n if (!index) {\n const items = await requestToPromise(\n sessionStore.getAll() as IDBRequest<IndexedDbLogSession[]>,\n );\n return orderSessions(items, sessionQueryOptions.order).slice(0, limit);\n }\n await iterateCursor(\n index.openCursor(undefined, sessionQueryOptions.order === \"asc\" ? \"next\" : \"prev\"),\n (cursor) => {\n sessions.push(cursor.value as IndexedDbLogSession);\n return limit === undefined || sessions.length < limit;\n },\n );\n return sessions;\n });\n };\n\n const pruneWithEntries = async () => {\n const now = Date.now();\n let entries = await getEntries();\n const expired =\n options.ttlMs === undefined\n ? []\n : entries.filter((entry) => now - entry.createdAt > (options.ttlMs as number));\n if (expired.length > 0) {\n await deleteEntries(expired, \"ttl\");\n const expiredIds = new Set(expired.map((entry) => entry.id));\n entries = entries.filter((entry) => !expiredIds.has(entry.id));\n }\n\n if (maxEntries >= 0 && entries.length > maxEntries) {\n const dropped = entries.slice(0, entries.length - maxEntries);\n await deleteEntries(dropped, \"max-entries\");\n entries = entries.slice(entries.length - maxEntries);\n }\n\n if (maxBytes >= 0) {\n let total = entries.reduce((sum, entry) => sum + entry.byteLength, 0);\n const dropped: IndexedDbLogEntry[] = [];\n for (const entry of entries) {\n if (total <= maxBytes) break;\n total -= entry.byteLength;\n dropped.push(entry);\n }\n await deleteEntries(dropped, \"max-bytes\");\n }\n };\n\n const pruneWithCursors = async (): Promise<boolean> => {\n if (options.ttlMs !== undefined) {\n const deleted = await deleteExpiredByCursor(Date.now() - options.ttlMs);\n if (deleted === undefined) return false;\n }\n\n if (maxEntries >= 0) {\n const persistedCount = await countEntries();\n if (persistedCount === undefined) return false;\n if (persistedCount > maxEntries) {\n const deleted = await deleteOldestByCursor(\"max-entries\", persistedCount - maxEntries);\n if (deleted === undefined) return false;\n }\n }\n\n if (maxBytes >= 0) {\n const totalBytes = await sumBytesByCursor();\n if (totalBytes === undefined) return false;\n if (totalBytes > maxBytes) {\n const deleted = await deleteOldestBytesByCursor(totalBytes - maxBytes);\n if (deleted === undefined) return false;\n }\n }\n\n return true;\n };\n\n const prune = async () => {\n const startedAt = nowMs();\n try {\n if (await pruneWithCursors()) return;\n statsState.pruneFallbacks += 1;\n await pruneWithEntries();\n } finally {\n statsState.prunes += 1;\n statsState.lastPruneDurationMs = nowMs() - startedAt;\n }\n };\n\n const sessionIdForEvent = (event: LogEvent): string | undefined => {\n if (!sessionOptions) return undefined;\n return (\n normalizeSessionId(sessionOptions.getId?.(event)) ??\n normalizeSessionId(event.context?.[sessionOptions.contextKey]) ??\n sessionOptions.id\n );\n };\n\n const eventWithSessionContext = (event: LogEvent, sessionId: string | undefined): LogEvent => {\n if (!sessionId || !sessionOptions?.contextKey) return event;\n if (event.context?.[sessionOptions.contextKey] === sessionId) return event;\n return {\n ...event,\n context: {\n ...event.context,\n [sessionOptions.contextKey]: sessionId,\n },\n };\n };\n\n const eventWithResolvedSession = (\n event: LogEvent,\n ): {\n event: LogEvent;\n sessionId?: string;\n } => {\n const sessionId = sessionIdForEvent(event);\n return {\n event: eventWithSessionContext(event, sessionId),\n sessionId,\n };\n };\n\n const eventToEntry = (event: LogEvent): IndexedDbLogEntry => {\n const resolved = eventWithResolvedSession(event);\n const payload = codec.encode(resolved.event);\n return {\n id: event.id,\n sessionId: resolved.sessionId,\n seq: event.seq,\n createdAt: event.time,\n level: event.level,\n levelName: event.levelName,\n logger: event.logger,\n type: event.type,\n byteLength: payloadByteLength(payload),\n payload,\n };\n };\n\n const clearLocalStorageSpill = (expectedValue?: string): boolean => {\n if (!spillOptions) return false;\n try {\n if (\n expectedValue !== undefined &&\n spillOptions.storage.getItem(spillOptions.key) !== expectedValue\n ) {\n return false;\n }\n spillOptions.storage.removeItem(spillOptions.key);\n if (expectedValue === undefined || localStorageSpillClearCandidate?.value === expectedValue) {\n localStorageSpillClearCandidate = undefined;\n }\n return true;\n } catch (error) {\n reportSpillError(error, \"clear\");\n return false;\n }\n };\n\n const rememberLocalStorageSpill = (value: string, events: readonly LogEvent[]) => {\n localStorageSpillClearCandidate = {\n pendingIds: new Set(events.map((event) => event.id)),\n value,\n };\n };\n\n const markLocalStorageSpillPersisted = (events: readonly LogEvent[]) => {\n const candidate = localStorageSpillClearCandidate;\n if (!candidate || events.length === 0) return;\n for (const event of events) candidate.pendingIds.delete(event.id);\n if (candidate.pendingIds.size === 0) clearLocalStorageSpill(candidate.value);\n };\n\n const writeBatch = async (events: readonly LogEvent[]) => {\n if (events.length === 0) return;\n const startedAt = nowMs();\n statsState.lastFlushBatchSize = events.length;\n const entries = events.map(eventToEntry);\n let stored = false;\n try {\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const rebuildSessionIds = new Set<string>();\n for (const entry of entries) {\n // oxlint-disable-next-line no-await-in-loop -- Reads must precede the matching put for overwrite accounting.\n const existing = await requestToPromise(\n store.get(entry.id) as IDBRequest<IndexedDbLogEntry | undefined>,\n );\n if (existing?.sessionId) rebuildSessionIds.add(existing.sessionId);\n if (existing && entry.sessionId) rebuildSessionIds.add(entry.sessionId);\n // oxlint-disable-next-line no-await-in-loop -- IndexedDB requests must stay ordered in the active transaction.\n await requestToPromise(store.put(entry));\n }\n await rebuildSessionSummaries(store, sessionStore, rebuildSessionIds);\n await mergeSessionSummaries(\n sessionStore,\n entries.filter((entry) => !entry.sessionId || !rebuildSessionIds.has(entry.sessionId)),\n );\n });\n stored = true;\n statsState.persisted += entries.length;\n incrementLoggerMetaCounter(\"transport.indexeddb.persisted\", entries.length);\n markLocalStorageSpillPersisted(events);\n await prune();\n statsState.flushes += 1;\n } catch (error) {\n statsState.flushErrors += 1;\n // The failed transaction stored none of the batch, and the batch has\n // already left the buffer, so account for every event as dropped.\n if (!stored) {\n const reason = isQuotaExceededError(error) ? \"quota\" : \"write-failed\";\n for (const event of events) dropEvent(event, reason);\n }\n throw error;\n } finally {\n statsState.lastFlushDurationMs = nowMs() - startedAt;\n }\n };\n\n const stringifySpillPayload = (events: readonly LogEvent[]): string =>\n safeJsonStringify(\n {\n createdAt: Date.now(),\n entries: events,\n schema: SPILL_SCHEMA,\n } satisfies LocalStorageSpillPayload,\n { maxArrayLength: spillOptions?.maxEntries ?? DEFAULT_SPILL_MAX_ENTRIES },\n );\n\n const spillStorageBudget = (currentValue: string | null): number => {\n if (!spillOptions) return 0;\n const ownBytes = currentValue ? storageByteLength(spillOptions.key, currentValue) : 0;\n const originBytes = estimateLocalStorageBytes(spillOptions.storage);\n if (originBytes === undefined) return spillOptions.maxBytes;\n return Math.max(\n 0,\n Math.min(spillOptions.maxBytes, spillOptions.maxOriginBytes - originBytes + ownBytes),\n );\n };\n\n const pendingEventsForSpill = (): LogEvent[] => {\n const events = [...(pendingFlushBatch ?? []), ...buffer];\n const seen = new Set<string>();\n const deduped: LogEvent[] = [];\n for (const event of events) {\n if (seen.has(event.id)) continue;\n seen.add(event.id);\n if (spillOptions?.minLevelValue !== undefined && event.level < spillOptions.minLevelValue) {\n continue;\n }\n deduped.push(eventWithResolvedSession(event).event);\n }\n return deduped;\n };\n\n const trimSpillEventsToBudget = (events: LogEvent[], budget: number): string | undefined => {\n if (!spillOptions) return undefined;\n while (events.length > spillOptions.maxEntries) {\n const dropped = events.shift();\n if (dropped) dropSpillEvent(dropped, \"max-entries\");\n }\n while (events.length > 0) {\n const value = stringifySpillPayload(events);\n if (storageByteLength(spillOptions.key, value) <= budget) return value;\n const dropped = events.shift();\n if (dropped) dropSpillEvent(dropped, \"max-bytes\");\n }\n return undefined;\n };\n\n const writeLocalStorageSpill = () => {\n if (!spillOptions) return;\n const pendingEvents = pendingEventsForSpill();\n if (pendingEvents.length === 0) return;\n\n try {\n const currentValue = spillOptions.storage.getItem(spillOptions.key);\n let events = pendingEvents;\n if (currentValue) {\n const merged = new Map<string, LogEvent>();\n try {\n for (const event of parseSpillPayload(currentValue) ?? []) merged.set(event.id, event);\n } catch {\n // Ignore malformed previous spill data; the current page tail is still worth saving.\n }\n for (const event of pendingEvents) merged.set(event.id, event);\n events = [...merged.values()];\n }\n const budget = spillStorageBudget(currentValue);\n const value = trimSpillEventsToBudget(events, budget);\n if (!value) return;\n try {\n spillOptions.storage.setItem(spillOptions.key, value);\n } catch (error) {\n if (!isQuotaExceededError(error)) throw error;\n while (events.length > 0) {\n const dropped = events.shift();\n if (dropped) dropSpillEvent(dropped, \"quota\");\n const retryValue = trimSpillEventsToBudget(events, budget);\n if (!retryValue) return;\n try {\n spillOptions.storage.setItem(spillOptions.key, retryValue);\n rememberLocalStorageSpill(retryValue, events);\n statsState.localStorageSpillWrites += 1;\n statsState.localStorageSpillEntries += events.length;\n return;\n } catch (retryError) {\n if (!isQuotaExceededError(retryError)) throw retryError;\n }\n }\n return;\n }\n rememberLocalStorageSpill(value, events);\n statsState.localStorageSpillWrites += 1;\n statsState.localStorageSpillEntries += events.length;\n } catch (error) {\n reportSpillError(error, \"write\");\n }\n };\n\n const drainLocalStorageSpill = async () => {\n if (!spillOptions) return;\n let raw: string | null;\n try {\n raw = spillOptions.storage.getItem(spillOptions.key);\n } catch (error) {\n reportSpillError(error, \"read\");\n return;\n }\n if (!raw) return;\n\n let events: LogEvent[] | undefined;\n try {\n events = parseSpillPayload(raw);\n } catch (error) {\n reportSpillError(error, \"parse\");\n clearLocalStorageSpill();\n return;\n }\n if (!events || events.length === 0) {\n clearLocalStorageSpill();\n return;\n }\n\n await writeBatch(events);\n clearLocalStorageSpill(raw);\n statsState.localStorageSpillDrains += 1;\n statsState.localStorageSpillDrainedEntries += events.length;\n };\n\n const ensureSpillDrained = async () => {\n const promise = spillDrainPromise;\n if (!promise) return;\n await promise;\n };\n\n if (spillOptions?.drainOnCreate) {\n spillDrainPromise = drainLocalStorageSpill()\n .catch((error: unknown) => reportSpillError(error, \"drain\"))\n .finally(() => {\n spillDrainPromise = undefined;\n });\n }\n\n const clearTimer = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n };\n\n const flushPending = async (): Promise<void> => {\n if (flushPromise) {\n if (buffer.length === 0) return flushPromise;\n // Events buffered while a flush is in flight need a flush of their own;\n // returning the in-flight one let close() finish without writing them.\n await flushPromise.catch(() => undefined);\n return flushPending();\n }\n clearTimer();\n const batch = buffer.splice(0, buffer.length);\n pendingFlushBatch = batch;\n const clearBarrier = clearPromise;\n flushPromise = (async () => {\n await clearBarrier;\n await ensureSpillDrained();\n await writeBatch(batch);\n })().finally(() => {\n if (pendingFlushBatch === batch) pendingFlushBatch = undefined;\n flushPromise = undefined;\n if (buffer.length === 0 || closed) return;\n // With flushIntervalMs 0 there is no timer to pick up events logged\n // during this flush, so write them now.\n if (flushIntervalMs <= 0) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else schedule();\n });\n return flushPromise;\n };\n\n const schedule = () => {\n if (timer || flushIntervalMs <= 0 || closed) return;\n timer = setTimeout(() => {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n }, flushIntervalMs);\n };\n\n const onPageHide = () => {\n if (spillOptions?.spillOnPageHide) writeLocalStorageSpill();\n if (flushOnPageHide) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"pagehide-flush\"));\n }\n };\n\n const onVisibilityChange = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n if (spillOptions?.spillOnPageHide) writeLocalStorageSpill();\n if (flushOnPageHide) {\n void flushPending().catch((error: unknown) =>\n reportInternalError(error, \"visibility-flush\"),\n );\n }\n }\n };\n\n const addVisibilityChangeListener = (): (() => void) | undefined => {\n if (typeof document !== \"undefined\" && typeof document.addEventListener === \"function\") {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n if (typeof globalThis.addEventListener !== \"function\") return undefined;\n globalThis.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => globalThis.removeEventListener?.(\"visibilitychange\", onVisibilityChange);\n };\n\n let removeVisibilityChangeListener: (() => void) | undefined;\n if (flushOnPageHide || spillOptions?.spillOnPageHide) {\n globalThis.addEventListener?.(\"pagehide\", onPageHide);\n removeVisibilityChangeListener = addVisibilityChangeListener();\n }\n\n return {\n name: options.name ?? \"indexeddb\",\n minLevel: options.minLevel,\n log(event, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n if (closed) {\n dropEvent(event, \"closed\");\n return;\n }\n lastContext = context;\n if (maxBufferSize === 0 || buffer.length >= maxBufferSize) {\n if (dropPolicy === \"drop-newest\") {\n dropEvent(event, \"buffer-full\");\n return;\n }\n const dropped = buffer.shift();\n if (dropped) dropEvent(dropped, \"buffer-full\");\n }\n buffer.push(event);\n statsState.enqueued += 1;\n statsState.maxBufferDepth = Math.max(statsState.maxBufferDepth, buffer.length);\n if (buffer.length >= batchSize || flushIntervalMs === 0) {\n void flushPending().catch((error: unknown) => reportInternalError(error, \"flush\"));\n } else {\n schedule();\n }\n },\n flush() {\n return flushPending();\n },\n async count() {\n await flushPending();\n return (await countEntries()) ?? (await getEntries()).length;\n },\n async clear() {\n if (clearPromise) return clearPromise;\n const inFlightFlush = flushPromise;\n const inFlightDrain = spillDrainPromise;\n buffer.length = 0;\n clearTimer();\n clearLocalStorageSpill();\n clearPromise = (async () => {\n await inFlightFlush;\n await inFlightDrain;\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n await requestToPromise(store.clear());\n await requestToPromise(sessionStore.clear());\n });\n })().finally(() => {\n clearPromise = undefined;\n });\n return clearPromise;\n },\n async remove(ids) {\n await flushPending();\n const items = typeof ids === \"string\" ? [ids] : ids;\n if (items.length === 0) return;\n await withLogAndSessionStores(\"readwrite\", async (store, sessionStore) => {\n const affectedSessionIds = new Set<string>();\n for (const id of items) {\n // oxlint-disable-next-line no-await-in-loop -- Reads must precede deletes for session metadata repair.\n const entry = await requestToPromise(\n store.get(id) as IDBRequest<IndexedDbLogEntry | undefined>,\n );\n if (entry?.sessionId) affectedSessionIds.add(entry.sessionId);\n // oxlint-disable-next-line no-await-in-loop -- Deletes must preserve fake IDB transaction ordering.\n await requestToPromise(store.delete(id));\n }\n await rebuildSessionSummaries(store, sessionStore, affectedSessionIds);\n });\n },\n async *query(queryOptions: IndexedDbTransportQueryOptions = {}) {\n await flushPending();\n const startedAt = nowMs();\n const cursorEntries = await queryEntriesByCursor(queryOptions);\n if (cursorEntries === undefined) statsState.queryFallbacks += 1;\n const entries =\n cursorEntries ??\n orderEntries(await getEntries(), queryOptions.order ?? \"asc\")\n .filter((entry) => shouldKeepEntry(entry, queryOptions))\n .slice(0, queryOptions.limit);\n statsState.queries += 1;\n statsState.lastQueryDurationMs = nowMs() - startedAt;\n for (const entry of entries) {\n const event = decodeEntry(entry, codec);\n if (event) yield event;\n }\n },\n async sessions(sessionQueryOptions: IndexedDbTransportSessionQueryOptions = {}) {\n await flushPending();\n return listSessions(sessionQueryOptions);\n },\n stats() {\n return snapshotStats();\n },\n close() {\n closed = true;\n clearTimer();\n globalThis.removeEventListener?.(\"pagehide\", onPageHide);\n removeVisibilityChangeListener?.();\n removeVisibilityChangeListener = undefined;\n const flushed = flushPending();\n return flushed.finally(() => {\n const promise = dbPromise;\n dbPromise = undefined;\n return promise?.then((db) => db.close());\n });\n },\n };\n}\n"],"mappings":"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"}
|