@editor-x/wme-logstream 0.1.0-alpha.1
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/LICENSE +190 -0
- package/README.md +216 -0
- package/dist/index.cjs.js +980 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.esm.js +954 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.iife.js +2 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/types/core/Dispatcher.d.ts +8 -0
- package/dist/types/core/LogPayload.d.ts +17 -0
- package/dist/types/core/LogStream.d.ts +128 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/pipes/BasePipe.d.ts +5 -0
- package/dist/types/pipes/ConsolePipe.d.ts +14 -0
- package/dist/types/pipes/IndexedDBPipe.d.ts +11 -0
- package/dist/types/storage/IndexedDBManager.d.ts +85 -0
- package/dist/types/storage/SessionManager.d.ts +32 -0
- package/dist/types/storage/ZipStreamer.d.ts +9 -0
- package/dist/types/utils/EventChannel.d.ts +21 -0
- package/dist/types/utils/idb.d.ts +16 -0
- package/dist/types/utils/session.d.ts +4 -0
- package/dist/types/utils/window.d.ts +4 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/core/Dispatcher.ts","../src/pipes/BasePipe.ts","../src/pipes/ConsolePipe.ts","../src/pipes/IndexedDBPipe.ts","../src/utils/idb.ts","../src/storage/IndexedDBManager.ts","../src/utils/session.ts","../src/utils/EventChannel.ts","../src/utils/window.ts","../src/storage/SessionManager.ts","../src/storage/ZipStreamer.ts","../src/core/LogStream.ts"],"sourcesContent":["import { BasePipe } from '../pipes/BasePipe.js';\nimport { LogPayload } from './LogPayload.js';\n\nexport class Dispatcher {\n private pipes: BasePipe[] = [];\n\n addPipe(pipe: BasePipe): void {\n this.pipes.push(pipe);\n }\n\n dispatch(payload: LogPayload): void {\n for (const pipe of this.pipes) {\n try {\n const result = pipe.write(payload);\n if (result instanceof Promise) {\n result.catch((err) => {\n console.error('Error writing to pipe:', err);\n });\n }\n } catch (err) {\n console.error('Error writing to pipe:', err);\n }\n }\n }\n\n async flush(): Promise<void> {\n const flushPromises = this.pipes.map(async (pipe) => {\n try {\n await pipe.flush();\n } catch (err) {\n console.error('Error flushing pipe:', err);\n }\n });\n await Promise.all(flushPromises);\n }\n}\n","import { LogPayload } from '../core/LogPayload.js';\n\nexport abstract class BasePipe {\n abstract write(payload: LogPayload): void | Promise<void>;\n abstract flush(): void | Promise<void>;\n}\n","import { BasePipe } from './BasePipe.js';\nimport { LogPayload, LogLevel } from '../core/LogPayload.js';\n\nexport interface ConsolePipeConfig {\n scriptPrefix?: string;\n brandColor?: string; // Hex color for the script prefix\n}\n\nexport class ConsolePipe extends BasePipe {\n private scriptPrefix: string;\n private brandColor: string;\n\n private styles: Record<LogLevel, string> = {\n TRACE: 'color: #888888; font-weight: normal;',\n DEBUG: 'color: #03A9F4; font-weight: bold;',\n INFO: 'color: #4CAF50; font-weight: bold;',\n WARN: 'color: #FF9800; font-weight: bold;',\n ERROR: 'color: #F44336; font-weight: bold;',\n FATAL:\n 'color: #FFFFFF; background-color: #B71C1C; font-weight: bold; padding: 2px 4px; border-radius: 2px;',\n };\n\n constructor(config?: ConsolePipeConfig) {\n super();\n this.scriptPrefix = config?.scriptPrefix ?? 'EditorX';\n this.brandColor = config?.brandColor ?? '#00E676';\n }\n\n write(payload: LogPayload): void {\n const timestampStr = new Date(payload.timestamp).toISOString().split('T')[1].slice(0, -1);\n const scopesStr = payload.scopes.map((s) => `[${s}]`).join('');\n const levelStr = payload.level;\n\n const prefixStyle = `color: ${this.brandColor}; font-weight: bold;`;\n const timeStyle = 'color: #9E9E9E;';\n const levelStyle = this.styles[levelStr];\n const scopeStyle = 'color: #9C27B0; font-weight: bold;';\n\n const format = `%c[${this.scriptPrefix}] %c${timestampStr} %c[${levelStr}]%c%c${scopesStr}%c ${payload.message}`;\n\n const args = [\n format,\n prefixStyle,\n timeStyle,\n levelStyle,\n '', // reset level style\n scopeStyle,\n '', // reset scope style\n ];\n\n if (payload.data !== undefined) {\n console.log(...args, payload.data);\n } else {\n console.log(...args);\n }\n }\n\n flush(): void {}\n}\n","import { BasePipe } from './BasePipe.js';\nimport { IndexedDBManager } from '../storage/IndexedDBManager.js';\nimport { LogPayload } from '../core/LogPayload.js';\n\nexport class IndexedDBPipe extends BasePipe {\n private dbManager: IndexedDBManager | null = null;\n private initPromise: Promise<IndexedDBManager> | null = null;\n private buffer: LogPayload[] = [];\n\n constructor(dbManagerOrPromise: IndexedDBManager | Promise<IndexedDBManager>) {\n super();\n if (dbManagerOrPromise instanceof Promise) {\n this.initPromise = dbManagerOrPromise.then((manager) => {\n this.dbManager = manager;\n for (const payload of this.buffer) {\n manager.writeLog(payload).catch(() => {});\n }\n this.buffer = [];\n return manager;\n });\n } else {\n this.dbManager = dbManagerOrPromise;\n }\n }\n\n async write(payload: LogPayload): Promise<void> {\n if (this.dbManager) {\n await this.dbManager.writeLog(payload);\n } else if (this.initPromise) {\n this.buffer.push(payload);\n }\n }\n\n async flush(): Promise<void> {\n if (this.dbManager) {\n await this.dbManager.flush();\n } else if (this.initPromise) {\n const manager = await this.initPromise;\n await manager.flush();\n }\n }\n}\n","export interface IDBOpenOptions {\n onUpgradeNeeded?: (db: IDBDatabase, event: IDBVersionChangeEvent) => void;\n onBlocked?: (event: Event) => void;\n}\n\n/**\n * Opens an IndexedDB connection and wraps the request in a Promise.\n */\nexport function openDB(\n name: string,\n version: number,\n options?: IDBOpenOptions,\n): Promise<IDBDatabase> {\n return new Promise<IDBDatabase>((resolve, reject) => {\n const request = indexedDB.open(name, version);\n\n if (options?.onUpgradeNeeded) {\n request.onupgradeneeded = (event) => {\n options.onUpgradeNeeded!(request.result, event);\n };\n }\n\n if (options?.onBlocked) {\n request.onblocked = (event) => {\n options.onBlocked!(event);\n };\n }\n\n request.onsuccess = () => {\n resolve(request.result);\n };\n\n request.onerror = () => {\n reject(request.error);\n };\n });\n}\n\n/**\n * Wraps a standard IDBRequest in a Promise.\n */\nexport function wrapRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Runs a transaction on the database and resolves when the transaction completes.\n */\nexport function runTransaction(\n db: IDBDatabase,\n storeNames: string | string[],\n mode: IDBTransactionMode,\n callback: (tx: IDBTransaction) => void,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const tx = db.transaction(storeNames, mode);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n callback(tx);\n });\n}\n","import { LogPayload, SessionMetadata } from '../core/LogPayload.js';\nimport { openDB, wrapRequest, runTransaction } from '../utils/idb.js';\n\nexport interface IndexedDBManagerConfig {\n dbPrefix: string;\n scriptVersion: string;\n sessionId: string;\n wmeVersion: string | null;\n maxArchivedSessions?: number;\n flushIntervalMs?: number;\n}\n\nconst DEFAULT_CONFIG = {\n maxArchivedSessions: 15,\n flushIntervalMs: 2000,\n};\n\nexport class IndexedDBManager {\n private dbPrefix: string;\n private maxArchivedSessions: number;\n private scriptVersion: string;\n private sessionId: string;\n private wmeVersion: string | null;\n private flushIntervalMs: number;\n private db: IDBDatabase | null = null;\n private queue: LogPayload[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private loggerVersion = '1.0.0';\n private schemaVersion = '1.0.0';\n\n constructor(config: IndexedDBManagerConfig) {\n const merged = Object.assign({}, DEFAULT_CONFIG, config);\n this.dbPrefix = merged.dbPrefix;\n this.maxArchivedSessions = merged.maxArchivedSessions;\n this.scriptVersion = merged.scriptVersion;\n this.sessionId = merged.sessionId;\n this.wmeVersion = merged.wmeVersion;\n this.flushIntervalMs = merged.flushIntervalMs;\n }\n\n /**\n * Returns the database name with prefix.\n */\n getDatabaseName(): string {\n return `LogStreamDB_${this.dbPrefix}`;\n }\n\n /**\n * Initializes the database connection and saves session metadata.\n */\n async init(): Promise<void> {\n const dbName = this.getDatabaseName();\n\n this.db = await openDB(dbName, 1, {\n onUpgradeNeeded: (db) => {\n if (!db.objectStoreNames.contains('sessions')) {\n db.createObjectStore('sessions', { keyPath: 'id' });\n }\n if (!db.objectStoreNames.contains('logs')) {\n const logStore = db.createObjectStore('logs', { keyPath: 'id', autoIncrement: true });\n logStore.createIndex('sessionId', 'sessionId', { unique: false });\n }\n },\n });\n\n const now = Date.now();\n const metadata: SessionMetadata = {\n id: this.sessionId,\n createdAt: now,\n lastUpdated: now,\n scriptVersion: this.scriptVersion,\n wmeVersion: this.wmeVersion ?? 'unknown',\n loggerVersion: this.loggerVersion,\n schemaVersion: this.schemaVersion,\n };\n\n try {\n await this.saveSessionMetadata(metadata);\n this.startHeartbeat();\n } catch (err) {\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n throw err;\n }\n }\n\n /**\n * Saves a session metadata record.\n */\n async saveSessionMetadata(metadata: SessionMetadata): Promise<void> {\n if (!this.db) throw new Error('Database not initialized');\n const transaction = this.db.transaction('sessions', 'readwrite');\n const store = transaction.objectStore('sessions');\n await wrapRequest(store.put(metadata));\n }\n\n /**\n * Periodically updates the current session's lastUpdated timestamp.\n */\n async touchSession(): Promise<void> {\n if (!this.db) return;\n const transaction = this.db.transaction('sessions', 'readwrite');\n const store = transaction.objectStore('sessions');\n const metadata = (await wrapRequest(store.get(this.sessionId))) as SessionMetadata;\n if (metadata) {\n metadata.lastUpdated = Date.now();\n await wrapRequest(store.put(metadata));\n }\n }\n\n /**\n * Starts the session heartbeat interval.\n */\n private startHeartbeat(): void {\n this.stopHeartbeat();\n this.heartbeatTimer = setInterval(() => {\n this.touchSession().catch(() => {});\n }, 10000); // 10-second heartbeat\n }\n\n /**\n * Stops the session heartbeat interval.\n */\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n /**\n * Writes a log entry, scheduling a flush or flushing immediately for high priority.\n */\n async writeLog(payload: LogPayload): Promise<void> {\n const enrichedPayload = {\n ...payload,\n sessionId: this.sessionId,\n };\n\n const isHighPriority =\n payload.level === 'WARN' || payload.level === 'ERROR' || payload.level === 'FATAL';\n\n if (isHighPriority) {\n this.queue.push(enrichedPayload);\n await this.flush();\n } else {\n this.queue.push(enrichedPayload);\n if (this.queue.length >= 50) {\n await this.flush();\n } else if (!this.flushTimer) {\n this.scheduleFlush();\n }\n }\n }\n\n /**\n * Schedules a background flush if not already scheduled.\n */\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => {\n this.flush().catch(() => {});\n }, this.flushIntervalMs);\n }\n\n /**\n * Instantly flushes the in-memory queue to IndexedDB.\n */\n async flush(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n const batch = [...this.queue];\n this.queue = [];\n\n await this.writeLogsBatch(batch);\n }\n\n /**\n * Writes a batch of logs in a single transaction.\n */\n async writeLogsBatch(logs: LogPayload[]): Promise<void> {\n if (!this.db) throw new Error('Database not initialized');\n await runTransaction(this.db, 'logs', 'readwrite', (tx) => {\n const store = tx.objectStore('logs');\n for (const log of logs) {\n store.add(log);\n }\n });\n }\n\n /**\n * Retrieves all logs for a specific session.\n */\n async getLogsForSession(sessionId: string): Promise<LogPayload[]> {\n if (!this.db) throw new Error('Database not initialized');\n const transaction = this.db.transaction('logs', 'readonly');\n const store = transaction.objectStore('logs');\n const index = store.index('sessionId');\n return wrapRequest(index.getAll(IDBKeyRange.only(sessionId)));\n }\n\n /**\n * Retrieves all archived session records.\n */\n async getAllSessions(): Promise<SessionMetadata[]> {\n if (!this.db) throw new Error('Database not initialized');\n const transaction = this.db.transaction('sessions', 'readonly');\n const store = transaction.objectStore('sessions');\n const result = await wrapRequest(store.getAll());\n return result || [];\n }\n\n /**\n * Prunes older sessions, keeping maxArchivedSessions.\n * Protects active sessions in other tabs (updated in last 30s) and the current active session.\n */\n async pruneSessions(): Promise<void> {\n if (!this.db) throw new Error('Database not initialized');\n\n const sessions = await this.getAllSessions();\n if (sessions.length <= this.maxArchivedSessions) {\n return;\n }\n\n // Sort by createdAt ascending (oldest first)\n sessions.sort((a, b) => a.createdAt - b.createdAt);\n\n const now = Date.now();\n // Exclude active sessions:\n // 1. Current session\n // 2. Active sessions in other tabs (heartbeat within 2m / 120s)\n const candidates = sessions.filter((s) => {\n const isActiveSelf = s.id === this.sessionId;\n const isActiveOther = s.lastUpdated && now - s.lastUpdated < 120000;\n return !isActiveSelf && !isActiveOther;\n });\n\n const totalToPrune = sessions.length - this.maxArchivedSessions;\n if (totalToPrune <= 0) {\n return;\n }\n\n const sessionsToPrune = candidates.slice(0, totalToPrune);\n\n for (const session of sessionsToPrune) {\n const transaction = this.db.transaction('sessions', 'readwrite');\n const store = transaction.objectStore('sessions');\n await wrapRequest(store.delete(session.id));\n\n await new Promise<void>((resolve, reject) => {\n const transaction = this.db!.transaction('logs', 'readwrite');\n const store = transaction.objectStore('logs');\n const index = store.index('sessionId');\n const request = index.openCursor(IDBKeyRange.only(session.id));\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n }\n }\n\n /**\n * Streams logs for a session via cursor.\n */\n async streamLogsForSession(sessionId: string, onLog: (log: LogPayload) => void): Promise<void> {\n if (!this.db) throw new Error('Database not initialized');\n\n return new Promise<void>((resolve, reject) => {\n const transaction = this.db!.transaction('logs', 'readonly');\n const store = transaction.objectStore('logs');\n const index = store.index('sessionId');\n const request = index.openCursor(IDBKeyRange.only(sessionId));\n\n request.onsuccess = () => {\n const cursor = request.result;\n if (cursor) {\n onLog(cursor.value);\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n /**\n * Flushes outstanding logs, stops heartbeat, and closes connection.\n */\n async close(): Promise<void> {\n this.stopHeartbeat();\n await this.flush();\n if (this.db) {\n this.db.close();\n this.db = null;\n }\n }\n}\n","/**\n * Generates a unique, randomized Session ID string.\n */\nexport function generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n}\n","export interface EventChannelMessage<T = any> {\n type: string;\n payload: T;\n}\n\nexport class EventChannel {\n private channel: BroadcastChannel;\n private listeners = new Map<string, Set<(payload: any) => void>>();\n\n constructor(name: string) {\n this.channel = new BroadcastChannel(name);\n this.channel.onmessage = (event: MessageEvent) => {\n const data = event.data as EventChannelMessage;\n if (data && typeof data.type === 'string') {\n const callbacks = this.listeners.get(data.type);\n if (callbacks) {\n for (const callback of callbacks) {\n try {\n callback(data.payload);\n } catch (e) {\n console.error('Error in EventChannel callback:', e);\n }\n }\n }\n }\n };\n }\n\n /**\n * Publishes an event to the BroadcastChannel.\n */\n publish<T>(type: string, payload: T): void {\n this.channel.postMessage({ type, payload });\n }\n\n /**\n * Subscribes to a specific event type. Returns an unsubscribe function.\n */\n subscribe<T>(type: string, callback: (payload: T) => void): () => void {\n if (!this.listeners.has(type)) {\n this.listeners.set(type, new Set());\n }\n this.listeners.get(type)!.add(callback);\n return () => {\n const callbacks = this.listeners.get(type);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(type);\n }\n }\n };\n }\n\n /**\n * Closes the underlying BroadcastChannel.\n */\n close(): void {\n this.channel.close();\n this.listeners.clear();\n }\n}\n","/**\n * Returns the actual active window object, prioritizing unsafeWindow in Tampermonkey.\n */\nexport function getWazeWindow(): any {\n if (typeof (globalThis as any).unsafeWindow !== 'undefined') {\n return (globalThis as any).unsafeWindow;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n return globalThis;\n}\n","import type { WmeSDK } from 'wme-sdk-typings';\nimport { generateSessionId } from '../utils/session.js';\nimport { EventChannel } from '../utils/EventChannel.js';\nimport { getWazeWindow } from '../utils/window.js';\n\nexport interface SessionManagerConfig {\n dbPrefix: string;\n scriptVersion: string;\n wmeSDK?: WmeSDK;\n}\n\nexport class SessionManager {\n private dbPrefix: string;\n private scriptVersion: string;\n private wmeSDK?: WmeSDK;\n private sessionId: string | null = null;\n private tabId: string;\n private channel: EventChannel | null = null;\n\n constructor(config: SessionManagerConfig) {\n this.dbPrefix = config.dbPrefix;\n this.scriptVersion = config.scriptVersion;\n this.wmeSDK = config.wmeSDK;\n this.tabId = `tab_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n }\n\n /**\n * Initializes the session, handling tab isolation and duplicates.\n */\n async initSession(): Promise<string> {\n const channelName = `wme-logstream-tab-isolation-${this.dbPrefix}`;\n this.channel = new EventChannel(channelName);\n\n let candidateId = sessionStorage.getItem('wme_logstream_session_id');\n\n if (!candidateId || (await this._probeConflict(candidateId))) {\n candidateId = generateSessionId();\n sessionStorage.setItem('wme_logstream_session_id', candidateId);\n }\n\n this.sessionId = candidateId;\n\n // Listen to respond to other tabs' probes\n this.channel.subscribe<{ sessionId: string; tabId: string }>('PROBE', (payload) => {\n if (payload.sessionId === this.sessionId && payload.tabId !== this.tabId) {\n // Send conflict response\n this.channel?.publish('CONFLICT', {\n sessionId: this.sessionId,\n });\n }\n });\n\n return this.sessionId;\n }\n\n private async _probeConflict(sessionId = this.sessionId): Promise<boolean> {\n if (!sessionId || !this.channel) {\n throw new Error('Session has not been initialized or channel is closed.');\n }\n\n return new Promise<boolean>((resolve) => {\n const timeout = setTimeout(() => {\n resolve(false);\n }, 50);\n\n const unsubscribeConflict = this.channel!.subscribe<{ sessionId: string }>(\n 'CONFLICT',\n (payload) => {\n if (payload.sessionId === sessionId) {\n unsubscribeConflict?.();\n clearTimeout(timeout);\n resolve(true);\n }\n },\n );\n\n this.channel!.publish('PROBE', {\n sessionId,\n tabId: this.tabId,\n });\n });\n }\n\n /**\n * Defensively extract the WME version from passed SDK or global window context.\n */\n getWmeVersion(): string | null {\n try {\n // 1. Try passed SDK\n if (typeof this.wmeSDK?.getWMEVersion === 'function') {\n return this.wmeSDK.getWMEVersion();\n }\n\n // 2. Try window.W.version or unsafeWindow.W.version via getWazeWindow\n const wazeWin = getWazeWindow();\n if (wazeWin?.W?.version) {\n return wazeWin.W.version;\n }\n } catch {\n // Safe fallback\n }\n return null;\n }\n\n /**\n * Returns current session ID if initialized\n */\n getSessionId(): string {\n if (!this.sessionId) {\n throw new Error('Session has not been initialized. Call initSession() first.');\n }\n return this.sessionId;\n }\n\n /**\n * Closes the session event channel\n */\n close() {\n if (this.channel) {\n this.channel.close();\n this.channel = null;\n }\n }\n}\n","import * as fflate from 'fflate';\nimport { IndexedDBManager } from './IndexedDBManager.js';\n\nexport class ZipStreamer {\n private dbManager: IndexedDBManager;\n\n constructor(dbManager: IndexedDBManager) {\n this.dbManager = dbManager;\n }\n\n /**\n * Exports all sessions and their logs from IndexedDB into a Zip compressed Blob.\n */\n async exportAllSessions(): Promise<Blob> {\n // Flush any pending logs to IndexedDB first\n await this.dbManager.flush();\n\n const sessions = await this.dbManager.getAllSessions();\n const chunks: BlobPart[] = [];\n\n return new Promise<Blob>((resolve, reject) => {\n const zip = new fflate.Zip();\n\n zip.ondata = (err, data, final) => {\n if (err) {\n reject(err);\n return;\n }\n chunks.push(data);\n if (final) {\n resolve(new Blob(chunks, { type: 'application/zip' }));\n }\n };\n\n const run = async () => {\n const encoder = new TextEncoder();\n\n for (const session of sessions) {\n const folderName = session.id.startsWith('session_')\n ? session.id\n : `session_${session.id}`;\n\n // 1. Add session details file\n const detailsFile = new fflate.ZipDeflate(`${folderName}/details.json`);\n zip.add(detailsFile);\n\n const detailsJson = JSON.stringify(session);\n detailsFile.push(encoder.encode(detailsJson), true);\n\n // 2. Add session logs file (streamed)\n const logsFile = new fflate.ZipDeflate(`${folderName}/logs.json`);\n zip.add(logsFile);\n\n // Write starting bracket\n logsFile.push(encoder.encode('['));\n\n let first = true;\n\n // Stream logs directly from IndexedDB cursor\n await this.dbManager.streamLogsForSession(session.id, (log) => {\n const logContent = (first ? '' : ',') + JSON.stringify(log);\n first = false;\n logsFile.push(encoder.encode(logContent));\n });\n\n // Write closing bracket and finalize this file\n logsFile.push(encoder.encode(']'), true);\n }\n\n // Finalize the zip archive\n zip.end();\n };\n\n run().catch(reject);\n });\n }\n}\n","import { create } from 'jsondiffpatch';\nimport { Dispatcher } from './Dispatcher.js';\nimport { BasePipe } from '../pipes/BasePipe.js';\nimport { LogPayload, LogLevel } from './LogPayload.js';\nimport { ConsolePipe, ConsolePipeConfig } from '../pipes/ConsolePipe.js';\nimport { IndexedDBPipe } from '../pipes/IndexedDBPipe.js';\nimport { IndexedDBManager } from '../storage/IndexedDBManager.js';\nimport { SessionManager } from '../storage/SessionManager.js';\nimport { ZipStreamer } from '../storage/ZipStreamer.js';\n\n/**\n * Configuration options for the standard LogStream constructor.\n */\nexport interface LogStreamConfig {\n /** The minimum log level required for a log to be processed. Defaults to 'INFO'. */\n minLogLevel?: LogLevel;\n /** Custom base pipes to dispatch logs to. */\n pipes?: BasePipe[];\n /** Optional pre-configured IndexedDBManager to enable export and download methods. */\n dbManager?: IndexedDBManager;\n}\n\n/**\n * Configuration options for creating a WME LogStream using the simplified factory method.\n */\nexport interface UnifiedLogStreamConfig {\n /** The minimum log level required for a log to be processed. Defaults to 'INFO'. */\n minLogLevel?: LogLevel;\n /** Whether to enable IndexedDB persistence and multi-tab isolation. Defaults to false. */\n persist?: boolean;\n /** Unique database prefix identifier. Required if `persist` is true. */\n dbPrefix?: string;\n /** Current userscript or extension version. Required if `persist` is true. */\n scriptVersion?: string;\n /** Native WME SDK instance to defensively query editor versions. */\n wmeSDK?: any;\n /** Maximum number of completed archived database sessions to preserve. Defaults to 5. */\n maxArchivedSessions?: number;\n /** Delay in milliseconds before flushing logs in queue to IndexedDB. Defaults to 2000. */\n flushIntervalMs?: number;\n /** Custom console styling prefix and color options. Set to `null` to disable console logging. */\n brand?: ConsolePipeConfig | null;\n}\n\nconst SEVERITY: Record<LogLevel, number> = {\n TRACE: 0,\n DEBUG: 1,\n INFO: 2,\n WARN: 3,\n ERROR: 4,\n FATAL: 5,\n};\n\nfunction cloneDeep<T>(val: T): T {\n if (val === undefined) return undefined as any;\n if (typeof structuredClone !== 'undefined') {\n try {\n return structuredClone(val);\n } catch {\n // Fallback on serialization error\n }\n }\n return JSON.parse(JSON.stringify(val));\n}\n\n/**\n * Prunes an object to a maximum depth, stringifying any nested objects/arrays at that depth limit.\n */\nfunction pruneToDepth(val: any, depth: number, maxDepth: number): any {\n if (typeof val !== 'object' || val === null) {\n return val;\n }\n if (depth >= maxDepth) {\n try {\n return JSON.stringify(val);\n } catch {\n return '[Object]';\n }\n }\n if (Array.isArray(val)) {\n return val.map((item) => pruneToDepth(item, depth + 1, maxDepth));\n }\n const result: any = {};\n for (const key of Object.keys(val)) {\n result[key] = pruneToDepth(val[key], depth + 1, maxDepth);\n }\n return result;\n}\n\n/**\n * The main logger class for WME LogStream.\n * Handles hierarchical scoping, console styling, state diff tracking, and persistent database exports.\n */\nexport class LogStream {\n private minLogLevel: LogLevel;\n private dispatcher: Dispatcher;\n private scopes: string[];\n private states: Map<string, any>;\n private patcher = create();\n private dbManagerPromise: Promise<IndexedDBManager> | null = null;\n\n /**\n * Initializes a LogStream instance.\n * Prefer using `LogStream.create()` for a simplified, zero-boilerplate setup.\n */\n constructor(\n config: LogStreamConfig,\n internal?: {\n dispatcher: Dispatcher;\n scopes: string[];\n states: Map<string, any>;\n dbManagerPromise?: Promise<IndexedDBManager> | null;\n },\n ) {\n this.minLogLevel = config.minLogLevel ?? 'INFO';\n if (internal) {\n this.dispatcher = internal.dispatcher;\n this.scopes = internal.scopes;\n this.states = internal.states;\n this.dbManagerPromise = internal.dbManagerPromise ?? null;\n } else {\n this.dispatcher = new Dispatcher();\n this.scopes = [];\n this.states = new Map();\n if (config.dbManager) {\n this.dbManagerPromise = Promise.resolve(config.dbManager);\n }\n if (config.pipes) {\n for (const pipe of config.pipes) {\n this.dispatcher.addPipe(pipe);\n }\n }\n }\n }\n\n /**\n * Synchronously creates a configured LogStream instance, initializing console outputs\n * and setting up background persistence/session managers if enabled.\n *\n * @param config The unified configuration options for console branding and persistence.\n * @returns A pre-configured LogStream instance ready to log immediately.\n */\n static create(config: UnifiedLogStreamConfig): LogStream {\n const pipes: BasePipe[] = [];\n let dbManagerPromise: Promise<IndexedDBManager> | null = null;\n\n if (config.brand !== null) {\n pipes.push(new ConsolePipe(config.brand));\n }\n\n if (config.persist) {\n if (!config.dbPrefix || !config.scriptVersion) {\n throw new Error('dbPrefix and scriptVersion are required when persist is true');\n }\n\n dbManagerPromise = (async () => {\n const sessionManager = new SessionManager({\n dbPrefix: config.dbPrefix!,\n scriptVersion: config.scriptVersion!,\n wmeSDK: config.wmeSDK,\n });\n\n const sessionId = await sessionManager.initSession();\n const wmeVersion = sessionManager.getWmeVersion();\n\n const dbManager = new IndexedDBManager({\n dbPrefix: config.dbPrefix!,\n scriptVersion: config.scriptVersion!,\n sessionId,\n wmeVersion,\n maxArchivedSessions: config.maxArchivedSessions,\n flushIntervalMs: config.flushIntervalMs,\n });\n\n await dbManager.init();\n await dbManager.pruneSessions();\n return dbManager;\n })();\n\n pipes.push(new IndexedDBPipe(dbManagerPromise));\n }\n\n const dispatcher = new Dispatcher();\n for (const pipe of pipes) {\n dispatcher.addPipe(pipe);\n }\n\n return new LogStream(\n {\n minLogLevel: config.minLogLevel,\n },\n {\n dispatcher,\n scopes: [],\n states: new Map(),\n dbManagerPromise,\n },\n );\n }\n\n /**\n * Spawns a child logger with a hierarchical scope prefix appended to the console/db entries.\n *\n * @param name The scope namespace (e.g. 'API', 'Auth').\n * @returns A new LogStream child instance carrying the hierarchical scope.\n */\n scope(name: string): LogStream {\n return new LogStream(\n { minLogLevel: this.minLogLevel },\n {\n dispatcher: this.dispatcher,\n scopes: [...this.scopes, name],\n states: this.states,\n dbManagerPromise: this.dbManagerPromise,\n },\n );\n }\n\n /** Logs a TRACE level message. */\n trace(message: string, data?: any): void {\n this.log('TRACE', message, data);\n }\n\n /** Logs a DEBUG level message. */\n debug(message: string, data?: any): void {\n this.log('DEBUG', message, data);\n }\n\n /** Logs an INFO level message. */\n info(message: string, data?: any): void {\n this.log('INFO', message, data);\n }\n\n /** Logs a WARN level message. */\n warn(message: string, data?: any): void {\n this.log('WARN', message, data);\n }\n\n /** Logs an ERROR level message. */\n error(message: string, data?: any): void {\n this.log('ERROR', message, data);\n }\n\n /** Logs a FATAL level message. */\n fatal(message: string, data?: any): void {\n this.log('FATAL', message, data);\n }\n\n /**\n * Compares the given state object against its previous version, calculating the deep-diff\n * and logging only modified properties as a DEBUG entry.\n *\n * @param name The state tracking key.\n * @param state The state object to track.\n * @param options Config options, e.g., max depth for nested objects.\n */\n stateDelta(name: string, state: any, options?: { maxDepth?: number }): void {\n const maxDepth = options?.maxDepth ?? 3;\n\n if (!this.states.has(name)) {\n this.states.set(name, cloneDeep(state));\n this.log('DEBUG', `State Delta: ${name} (initial)`, { delta: state });\n return;\n }\n\n const prevState = this.states.get(name);\n\n // Prune both objects up to maxDepth before diffing\n const prunedPrev = pruneToDepth(prevState, 0, maxDepth);\n const prunedState = pruneToDepth(state, 0, maxDepth);\n\n const delta = this.patcher.diff(prunedPrev, prunedState);\n\n if (delta !== undefined) {\n this.states.set(name, cloneDeep(state));\n this.log('DEBUG', `State Delta: ${name}`, { delta });\n }\n }\n\n /**\n * Returns a bound function that tracks changes to a specific state key over time.\n *\n * @param name The state tracking key.\n * @param options Config options, e.g., max depth for nested objects.\n * @returns A function accepting a state object to diff and log.\n */\n createStateTracker(name: string, options?: { maxDepth?: number }): (state: any) => void {\n return (state: any) => {\n this.stateDelta(name, state, options);\n };\n }\n\n /**\n * Asynchronously exports all stored database sessions and logs into a single compressed ZIP file.\n *\n * @returns A promise resolving to the compressed ZIP Blob.\n */\n async exportLogs(): Promise<Blob> {\n if (!this.dbManagerPromise) {\n throw new Error('Persistence (IndexedDB) is not enabled on this LogStream.');\n }\n const dbManager = await this.dbManagerPromise;\n const streamer = new ZipStreamer(dbManager);\n return streamer.exportAllSessions();\n }\n\n /**\n * Triggers a browser-native file download of the compressed log sessions.\n *\n * @param filename Custom download filename. Defaults to `wme-logs-<timestamp>.xlog`.\n */\n async downloadLogs(filename?: string): Promise<void> {\n const blob = await this.exportLogs();\n if (typeof document === 'undefined') {\n throw new Error('downloadLogs can only be called in a browser environment.');\n }\n const name = filename || `wme-logs-${Date.now()}.xlog`;\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = name;\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 100);\n }\n\n /**\n * Triggers a flush of all buffered logs on registered pipes.\n */\n async flush(): Promise<void> {\n await this.dispatcher.flush();\n }\n\n /**\n * Closes underlying active database connections if persistence is enabled.\n */\n async close(): Promise<void> {\n if (this.dbManagerPromise) {\n const dbManager = await this.dbManagerPromise;\n await dbManager.close();\n }\n }\n\n private log(level: LogLevel, message: string, data?: any): void {\n if (SEVERITY[level] < SEVERITY[this.minLogLevel]) {\n return;\n }\n\n const payload: LogPayload = {\n timestamp: Date.now(),\n level,\n scopes: [...this.scopes],\n message,\n };\n\n if (data !== undefined) {\n payload.data = data;\n }\n\n this.dispatcher.dispatch(payload);\n }\n}\n"],"names":["fflate","create"],"mappings":"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"}
|