@kodexa-ai/document-wasm-ts 2026.2.0 → 2026.3.0-develop-22148967065
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/dist/KddbDocument.d.ts.map +1 -1
- package/dist/KddbDocument.js +17 -0
- package/dist/KddbDocument.js.map +1 -1
- package/dist/kodexa-shared-worker.js +1 -1
- package/dist/kodexa-shared-worker.js.map +2 -2
- package/dist/kodexa-worker.js +1 -1
- package/dist/kodexa-worker.js.map +2 -2
- package/dist/kodexa.wasm +0 -0
- package/dist/sqljs-bridge.bundle.js +1 -1
- package/dist/wasm/loader.d.ts.map +1 -1
- package/dist/wasm/loader.js +5 -1
- package/dist/wasm/loader.js.map +1 -1
- package/dist/wasm/sqljs-bridge.d.ts.map +1 -1
- package/dist/wasm/sqljs-bridge.js +5 -2
- package/dist/wasm/sqljs-bridge.js.map +1 -1
- package/dist/wasm/sqljs-core.js +1 -1
- package/dist/wasm/sqljs-core.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/wasm/sqljs-core.ts", "../src/worker/kodexa-worker.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Core sql.js bridge operations - shared between environments\n *\n * This module contains all the database operations that are common between\n * the npm package (sqljs-bridge.ts) and browser CDN (browser-bridge.ts) implementations.\n *\n * The SQL instance is passed in from the wrapper modules, allowing them to\n * load sql.js in different ways (npm import vs CDN global).\n */\n\n// Database handle management\nconst databases = new Map<number, any>();\nlet nextHandle = 1;\n\n// Store SQL instance reference for operations that need it\nlet sqlInstance: any = null;\n\n// ============================================================================\n// Performance Tracing\n// ============================================================================\n\ninterface SqlStats {\n count: number;\n totalMs: number;\n minMs: number;\n maxMs: number;\n errors: number;\n}\n\ninterface QueryTrace {\n sql: string;\n paramsJson: string;\n startTime: number;\n endTime: number;\n duration: number;\n rowCount: number;\n error?: string;\n}\n\nclass SqlPerformanceTracer {\n private enabled = false;\n private stats: Map<string, SqlStats> = new Map();\n private recentTraces: QueryTrace[] = [];\n private maxRecentTraces = 100;\n private sessionStart = 0;\n private logQueries = false;\n private slowQueryThreshold = 10; // ms\n\n enable(options?: { logQueries?: boolean; slowQueryThreshold?: number }): void {\n this.enabled = true;\n this.sessionStart = performance.now();\n this.logQueries = options?.logQueries ?? false;\n this.slowQueryThreshold = options?.slowQueryThreshold ?? 10;\n this.reset();\n console.log('[sql.js PERF] Performance tracing ENABLED', {\n logQueries: this.logQueries,\n slowQueryThreshold: this.slowQueryThreshold + 'ms'\n });\n }\n\n disable(): void {\n this.enabled = false;\n console.log('[sql.js PERF] Performance tracing DISABLED');\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n reset(): void {\n this.stats.clear();\n this.recentTraces = [];\n this.sessionStart = performance.now();\n }\n\n private extractQueryType(sql: string): string {\n const trimmed = sql.trim().toUpperCase();\n if (trimmed.startsWith('SELECT')) {\n // Extract table name for SELECT queries\n const match = sql.match(/FROM\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `SELECT:${match[1]}` : 'SELECT';\n }\n if (trimmed.startsWith('INSERT')) {\n const match = sql.match(/INTO\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `INSERT:${match[1]}` : 'INSERT';\n }\n if (trimmed.startsWith('UPDATE')) {\n const match = sql.match(/UPDATE\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `UPDATE:${match[1]}` : 'UPDATE';\n }\n if (trimmed.startsWith('DELETE')) {\n const match = sql.match(/FROM\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `DELETE:${match[1]}` : 'DELETE';\n }\n if (trimmed.startsWith('BEGIN')) return 'BEGIN';\n if (trimmed.startsWith('COMMIT')) return 'COMMIT';\n if (trimmed.startsWith('ROLLBACK')) return 'ROLLBACK';\n if (trimmed.startsWith('PRAGMA')) return 'PRAGMA';\n if (trimmed.startsWith('CREATE')) return 'CREATE';\n return 'OTHER';\n }\n\n recordQuery(sql: string, paramsJson: string, startTime: number, endTime: number, rowCount: number, error?: string): void {\n if (!this.enabled) return;\n\n const duration = endTime - startTime;\n const queryType = this.extractQueryType(sql);\n\n // Update stats\n let stat = this.stats.get(queryType);\n if (!stat) {\n stat = { count: 0, totalMs: 0, minMs: Infinity, maxMs: 0, errors: 0 };\n this.stats.set(queryType, stat);\n }\n stat.count++;\n stat.totalMs += duration;\n stat.minMs = Math.min(stat.minMs, duration);\n stat.maxMs = Math.max(stat.maxMs, duration);\n if (error) stat.errors++;\n\n // Store trace\n const trace: QueryTrace = { sql, paramsJson, startTime, endTime, duration, rowCount, error };\n this.recentTraces.push(trace);\n if (this.recentTraces.length > this.maxRecentTraces) {\n this.recentTraces.shift();\n }\n\n // Log slow queries or all queries if enabled\n if (duration >= this.slowQueryThreshold) {\n console.warn(`[sql.js PERF] SLOW QUERY (${duration.toFixed(2)}ms): ${queryType}`, {\n sql: sql.substring(0, 200),\n rowCount,\n duration: duration.toFixed(2) + 'ms'\n });\n } else if (this.logQueries) {\n console.log(`[sql.js PERF] ${queryType} (${duration.toFixed(2)}ms, ${rowCount} rows)`);\n }\n }\n\n getStats(): Record<string, SqlStats & { avgMs: number }> {\n const result: Record<string, SqlStats & { avgMs: number }> = {};\n for (const [queryType, stat] of this.stats) {\n result[queryType] = {\n ...stat,\n avgMs: stat.count > 0 ? stat.totalMs / stat.count : 0\n };\n }\n return result;\n }\n\n getSummary(): {\n sessionDuration: number;\n totalQueries: number;\n totalTimeMs: number;\n avgQueryMs: number;\n slowQueries: number;\n errors: number;\n topByCount: Array<{ type: string; count: number; totalMs: number; avgMs: number }>;\n topByTime: Array<{ type: string; count: number; totalMs: number; avgMs: number }>;\n } {\n const stats = this.getStats();\n let totalQueries = 0;\n let totalTimeMs = 0;\n let slowQueries = 0;\n let errors = 0;\n\n const entries: Array<{ type: string; count: number; totalMs: number; avgMs: number }> = [];\n\n for (const [type, stat] of Object.entries(stats)) {\n totalQueries += stat.count;\n totalTimeMs += stat.totalMs;\n slowQueries += this.recentTraces.filter(t =>\n this.extractQueryType(t.sql) === type && t.duration >= this.slowQueryThreshold\n ).length;\n errors += stat.errors;\n entries.push({ type, count: stat.count, totalMs: stat.totalMs, avgMs: stat.avgMs });\n }\n\n return {\n sessionDuration: performance.now() - this.sessionStart,\n totalQueries,\n totalTimeMs,\n avgQueryMs: totalQueries > 0 ? totalTimeMs / totalQueries : 0,\n slowQueries,\n errors,\n topByCount: [...entries].sort((a, b) => b.count - a.count).slice(0, 10),\n topByTime: [...entries].sort((a, b) => b.totalMs - a.totalMs).slice(0, 10)\n };\n }\n\n getRecentTraces(count = 20): QueryTrace[] {\n return this.recentTraces.slice(-count);\n }\n\n printReport(): void {\n const summary = this.getSummary();\n console.log('\\n========== SQL.JS PERFORMANCE REPORT ==========');\n console.log(`Session Duration: ${(summary.sessionDuration / 1000).toFixed(2)}s`);\n console.log(`Total Queries: ${summary.totalQueries}`);\n console.log(`Total SQL Time: ${summary.totalTimeMs.toFixed(2)}ms`);\n console.log(`Avg Query Time: ${summary.avgQueryMs.toFixed(3)}ms`);\n console.log(`Slow Queries (>${this.slowQueryThreshold}ms): ${summary.slowQueries}`);\n console.log(`Errors: ${summary.errors}`);\n\n console.log('\\n--- Top by Count ---');\n for (const entry of summary.topByCount) {\n console.log(` ${entry.type}: ${entry.count} calls, ${entry.totalMs.toFixed(2)}ms total, ${entry.avgMs.toFixed(3)}ms avg`);\n }\n\n console.log('\\n--- Top by Total Time ---');\n for (const entry of summary.topByTime) {\n console.log(` ${entry.type}: ${entry.totalMs.toFixed(2)}ms total, ${entry.count} calls, ${entry.avgMs.toFixed(3)}ms avg`);\n }\n\n console.log('================================================\\n');\n }\n}\n\n// Global tracer instance\nconst perfTracer = new SqlPerformanceTracer();\n\n/**\n * Convert Uint8Array to base64 string efficiently.\n * Uses chunked processing to handle large arrays without stack overflow.\n * @param bytes Uint8Array to convert\n * @returns Base64 encoded string\n */\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n // For small arrays, use the simple method\n if (bytes.length < 32768) {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n // For large arrays, process in chunks to avoid stack overflow\n const chunkSize = 32768;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, Math.min(i + chunkSize, bytes.length));\n binary += String.fromCharCode.apply(null, Array.from(chunk));\n }\n return btoa(binary);\n}\n\n/**\n * Convert a row object for JSON serialization.\n * Converts Uint8Array (BLOB) to base64-encoded string with \"base64:\" prefix.\n * @param obj Row object from sql.js\n * @returns Object safe for JSON.stringify\n */\nfunction processRowForJson(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const key in obj) {\n const value = obj[key];\n if (value instanceof Uint8Array) {\n // Convert BLOB to base64 with prefix for Go to recognize\n try {\n const base64 = uint8ArrayToBase64(value);\n result[key] = 'base64:' + base64;\n } catch (err) {\n console.error(`[sql.js] Failed to convert BLOB column '${key}' (${value.length} bytes):`, err);\n result[key] = null;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n// ============================================================================\n// Database Operations\n// ============================================================================\n\n/**\n * Create a new in-memory database\n * @returns Database handle (positive integer) or 0 on error\n */\nexport function createDatabaseOp(): number {\n if (!sqlInstance) {\n console.error('[sql.js] Not initialized');\n return 0;\n }\n\n try {\n const db = new sqlInstance.Database();\n const handle = nextHandle++;\n databases.set(handle, db);\n console.log(`[sql.js] Created database with handle ${handle}`);\n return handle;\n } catch (error) {\n console.error('[sql.js] Failed to create database:', error);\n return 0;\n }\n}\n\n/**\n * Execute SQL statement without returning results\n * @param handle Database handle\n * @param sql SQL statement\n * @returns 1 on success, 0 on error\n */\nexport function execOp(handle: number, sql: string): number {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return 0;\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n try {\n db.run(sql);\n return 1;\n } catch (err) {\n error = String(err);\n console.error('[sql.js] Exec failed:', err);\n return 0;\n } finally {\n perfTracer.recordQuery(sql, '[]', startTime, performance.now(), 0, error);\n }\n}\n\n/**\n * Execute SQL query with parameters and return results as JSON\n * @param handle Database handle\n * @param sql SQL query with ? placeholders\n * @param paramsJson JSON array of parameters\n * @returns JSON string of results (array of objects) or empty string on error\n */\nexport function queryOp(handle: number, sql: string, paramsJson: string): string {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return '[]';\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n let rowCount = 0;\n try {\n // Parse parameters\n let params: any[] = [];\n if (paramsJson && paramsJson !== '[]' && paramsJson !== 'null') {\n params = JSON.parse(paramsJson);\n }\n\n // Execute query\n const stmt = db.prepare(sql);\n if (params.length > 0) {\n stmt.bind(params);\n }\n\n // Collect results - convert Uint8Array to base64 for Go\n const results: any[] = [];\n while (stmt.step()) {\n results.push(processRowForJson(stmt.getAsObject()));\n }\n stmt.free();\n\n rowCount = results.length;\n return JSON.stringify(results);\n } catch (err) {\n error = String(err);\n console.error('[sql.js] Query failed:', sql, err);\n return '[]';\n } finally {\n perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), rowCount, error);\n }\n}\n\n/**\n * Convert base64 string to Uint8Array\n * @param base64 Base64 encoded string\n * @returns Uint8Array of decoded bytes\n */\nfunction base64ToUint8Array(base64: string): Uint8Array {\n // Use Buffer in Node.js for correct binary handling\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n // Browser fallback using atob\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Process params array, converting \"base64:\" prefixed strings to Uint8Array for BLOB storage\n * @param params Array of SQL parameters\n * @returns Processed params with binary data converted to Uint8Array\n */\nfunction processParamsForBlob(params: any[]): any[] {\n return params.map(param => {\n if (typeof param === 'string' && param.startsWith('base64:')) {\n // Convert base64-prefixed string to Uint8Array for BLOB storage\n return base64ToUint8Array(param.substring(7));\n }\n return param;\n });\n}\n\n/**\n * Execute INSERT statement and return the last inserted row ID\n * @param handle Database handle\n * @param sql INSERT statement with ? placeholders\n * @param paramsJson JSON array of parameters\n * @returns Last insert row ID or 0 on error\n */\nexport function insertOp(handle: number, sql: string, paramsJson: string): number {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return 0;\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n try {\n // Parse parameters\n let params: any[] = [];\n if (paramsJson && paramsJson !== '[]' && paramsJson !== 'null') {\n params = JSON.parse(paramsJson);\n // Convert \"base64:\" prefixed strings to Uint8Array for BLOB storage\n params = processParamsForBlob(params);\n }\n\n // Execute insert\n if (params.length > 0) {\n db.run(sql, params);\n } else {\n db.run(sql);\n }\n\n // Get last insert row ID\n const result = db.exec('SELECT last_insert_rowid() as id');\n if (result.length > 0 && result[0].values.length > 0) {\n return result[0].values[0][0] as number;\n }\n return 0;\n } catch (err) {\n error = String(err);\n console.error('[sql.js] Insert failed:', sql, err);\n return 0;\n } finally {\n perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), 1, error);\n }\n}\n\n/**\n * Execute UPDATE/DELETE statement and return rows affected\n * @param handle Database handle\n * @param sql UPDATE or DELETE statement with ? placeholders\n * @param paramsJson JSON array of parameters\n * @returns Number of rows affected or -1 on error\n */\nexport function execParamsOp(handle: number, sql: string, paramsJson: string): number {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return -1;\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n let rowsAffected = 0;\n try {\n // Parse parameters\n let params: any[] = [];\n if (paramsJson && paramsJson !== '[]' && paramsJson !== 'null') {\n params = JSON.parse(paramsJson);\n // Convert \"base64:\" prefixed strings to Uint8Array for BLOB storage\n params = processParamsForBlob(params);\n }\n\n // Execute statement\n if (params.length > 0) {\n db.run(sql, params);\n } else {\n db.run(sql);\n }\n\n // Get rows affected\n const result = db.exec('SELECT changes() as count');\n if (result.length > 0 && result[0].values.length > 0) {\n rowsAffected = result[0].values[0][0] as number;\n return rowsAffected;\n }\n return 0;\n } catch (err) {\n error = String(err);\n console.error('[sql.js] ExecParams failed:', sql, err);\n return -1;\n } finally {\n perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), rowsAffected, error);\n }\n}\n\n/**\n * Export database to binary format\n * @param handle Database handle\n * @returns Base64-encoded database bytes or empty string on error\n */\nexport function exportOp(handle: number): string {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return '';\n }\n\n try {\n const data = db.export();\n // Use chunked base64 conversion for potentially large databases\n return uint8ArrayToBase64(data);\n } catch (error) {\n console.error('[sql.js] Export failed:', error);\n return '';\n }\n}\n\n/**\n * Import database from binary format\n * @param base64Data Base64-encoded database bytes\n * @returns Database handle or 0 on error\n */\nexport function importOp(base64Data: string): number {\n if (!sqlInstance) {\n console.error('[sql.js] Not initialized');\n return 0;\n }\n\n try {\n // Decode base64 to Uint8Array\n const binary = atob(base64Data);\n const data = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n data[i] = binary.charCodeAt(i);\n }\n\n const db = new sqlInstance.Database(data);\n const handle = nextHandle++;\n databases.set(handle, db);\n console.log(`[sql.js] Imported database with handle ${handle}`);\n return handle;\n } catch (error) {\n console.error('[sql.js] Import failed:', error);\n return 0;\n }\n}\n\n/**\n * Load database directly from bytes\n * @param bytes Raw database bytes\n * @returns Database handle or 0 on error\n */\nexport function loadDirectOp(bytes: Uint8Array): number {\n if (!sqlInstance) {\n console.error('[sql.js] Not initialized');\n return 0;\n }\n\n try {\n const db = new sqlInstance.Database(bytes);\n const handle = nextHandle++;\n databases.set(handle, db);\n return handle;\n } catch (error) {\n console.error('[sql.js] Failed to load database directly:', error);\n return 0;\n }\n}\n\n/**\n * Close a database\n * @param handle Database handle\n */\nexport function closeOp(handle: number): void {\n const db = databases.get(handle);\n if (db) {\n try {\n db.close();\n } catch (error) {\n console.error('[sql.js] Close failed:', error);\n }\n databases.delete(handle);\n console.log(`[sql.js] Closed database with handle ${handle}`);\n }\n}\n\n/**\n * Get last error message (for debugging)\n * @param _handle Database handle\n * @returns Error message or empty string\n */\nexport function getErrorOp(_handle: number): string {\n // sql.js throws exceptions rather than storing error messages\n // This is a placeholder for API compatibility\n return '';\n}\n\n/**\n * Cleanup all databases and reset state\n */\nexport function cleanupOp(): void {\n for (const [_handle, db] of databases) {\n try {\n db.close();\n } catch (_e) {\n // Ignore close errors during cleanup\n }\n }\n databases.clear();\n nextHandle = 1;\n console.log('[sql.js] Cleaned up all databases');\n}\n\n// ============================================================================\n// Bridge Exposure\n// ============================================================================\n\n/**\n * Set the SQL instance for database operations\n * Must be called before any database operations\n */\nexport function setSqlInstance(SQL: any): void {\n sqlInstance = SQL;\n}\n\n/**\n * Expose sql.js bridge functions to globalThis for Go WASM access\n */\nexport function exposeBridgeFunctions(): void {\n const g = globalThis as any;\n\n g.sqljsCreateDatabase = createDatabaseOp;\n g.sqljsExec = execOp;\n g.sqljsQuery = queryOp;\n g.sqljsInsert = insertOp;\n g.sqljsExecParams = execParamsOp;\n g.sqljsExport = exportOp;\n g.sqljsImport = importOp;\n g.sqljsClose = closeOp;\n g.sqljsGetError = getErrorOp;\n g.sqljsLoadDirect = loadDirectOp;\n\n // Also expose database map for debugging\n g.sqljsDatabases = databases;\n\n // Expose performance tracing API for debugging\n g.sqljsPerf = {\n /**\n * Enable SQL performance tracing\n * @param options.logQueries - Log all queries (default: false, only slow queries are logged)\n * @param options.slowQueryThreshold - Threshold in ms for slow query warnings (default: 10)\n * @example sqljsPerf.enable({ logQueries: true, slowQueryThreshold: 5 })\n */\n enable: (options?: { logQueries?: boolean; slowQueryThreshold?: number }) => perfTracer.enable(options),\n\n /** Disable SQL performance tracing */\n disable: () => perfTracer.disable(),\n\n /** Check if tracing is enabled */\n isEnabled: () => perfTracer.isEnabled(),\n\n /** Reset all statistics and traces */\n reset: () => perfTracer.reset(),\n\n /** Get detailed statistics by query type */\n getStats: () => perfTracer.getStats(),\n\n /** Get summary with top queries by count and time */\n getSummary: () => perfTracer.getSummary(),\n\n /** Get recent query traces (default: last 20) */\n getRecentTraces: (count?: number) => perfTracer.getRecentTraces(count),\n\n /** Print formatted performance report to console */\n printReport: () => perfTracer.printReport(),\n };\n\n console.log('[sql.js] Bridge functions exposed to globalThis');\n console.log('[sql.js] Performance tracing available via sqljsPerf.enable()');\n}\n\n/**\n * Get a database by handle (for debugging from console)\n */\nexport function getDatabase(handle: number): any {\n return databases.get(handle);\n}\n\n// ============================================================================\n// Performance Tracing Exports\n// ============================================================================\n\n/**\n * Enable SQL performance tracing\n * @param options.logQueries - Log all queries (default: false, only slow queries are logged)\n * @param options.slowQueryThreshold - Threshold in ms for slow query warnings (default: 10)\n */\nexport function enableSqlPerformanceTracing(options?: { logQueries?: boolean; slowQueryThreshold?: number }): void {\n perfTracer.enable(options);\n}\n\n/** Disable SQL performance tracing */\nexport function disableSqlPerformanceTracing(): void {\n perfTracer.disable();\n}\n\n/** Get SQL performance statistics */\nexport function getSqlPerformanceStats() {\n return perfTracer.getStats();\n}\n\n/** Get SQL performance summary */\nexport function getSqlPerformanceSummary() {\n return perfTracer.getSummary();\n}\n\n/** Print SQL performance report to console */\nexport function printSqlPerformanceReport(): void {\n perfTracer.printReport();\n}\n\n/** Get recent SQL query traces */\nexport function getRecentSqlTraces(count = 20) {\n return perfTracer.getRecentTraces(count);\n}\n\n/** Reset SQL performance statistics */\nexport function resetSqlPerformanceStats(): void {\n perfTracer.reset();\n}\n", "/**\n * Kodexa Web Worker Entry Point\n *\n * This worker owns the Go WASM instance and exposes an RPC-style API\n * via postMessage. All heavy document processing happens here,\n * keeping the main thread responsive.\n *\n * Initialization order (critical):\n * 1. sql.js WASM loaded and bridge exposed to globalThis\n * 2. wasm_exec.js loaded (defines globalThis.Go)\n * 3. kodexa.wasm instantiated and Go runtime started\n * 4. Worker signals 'ready' to main thread\n */\n\n/// <reference lib=\"webworker\" />\n\nimport type { WorkerRequest, WorkerResponse, WorkerReadyMessage, WorkerErrorMessage, WorkerConfig, WorkerWasmEventMessage } from './types';\nimport { setSqlInstance, exposeBridgeFunctions, loadDirectOp } from '../wasm/sqljs-core';\n\ndeclare const self: DedicatedWorkerGlobalScope;\n\n// Worker state\nlet initialized = false;\nlet initPromise: Promise<void> | null = null;\nlet config: WorkerConfig = {};\n\n// Test log to verify worker is loading fresh\nself.postMessage({ type: 'debugLog', level: 'log', message: '[worker] kodexa-worker.ts loaded at ' + Date.now() });\n\n// Intercept console.log to forward WASM logs to main thread via postMessage\nconst originalConsoleLog = console.log.bind(console);\nconst originalConsoleWarn = console.warn.bind(console);\nconst originalConsoleError = console.error.bind(console);\n\nconsole.log = (...args: unknown[]) => {\n originalConsoleLog(...args);\n const msg = args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ');\n if (msg.includes('[WASM]') || msg.includes('[worker]')) {\n self.postMessage({ type: 'debugLog', level: 'log', message: msg.substring(0, 500) });\n }\n};\nconsole.warn = (...args: unknown[]) => {\n originalConsoleWarn(...args);\n const msg = args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ');\n if (msg.includes('[WASM]') || msg.includes('[worker]')) {\n self.postMessage({ type: 'debugLog', level: 'warn', message: msg.substring(0, 500) });\n }\n};\nconsole.error = (...args: unknown[]) => {\n originalConsoleError(...args);\n const msg = args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ');\n if (msg.includes('[WASM]') || msg.includes('[worker]')) {\n self.postMessage({ type: 'debugLog', level: 'error', message: msg.substring(0, 500) });\n }\n};\n\n/**\n * Set up event forwarding from WASM to main thread.\n * The Go WASM runtime dispatches events using CustomEvent on a document-like object.\n * In worker context, we create a shim that captures these events and forwards them.\n */\nfunction setupEventForwarding(): void {\n // Create a document shim that the Go WASM can use to dispatch events\n // This allows the existing Go code to work unchanged in worker context\n const documentShim = {\n addEventListener: (type: string, handler: EventListener) => {\n console.log(`[worker] Event listener registered for: ${type}`);\n self.addEventListener(type, handler);\n },\n removeEventListener: (type: string, handler: EventListener) => {\n self.removeEventListener(type, handler);\n },\n dispatchEvent: (event: Event) => {\n // When Go dispatches an event, forward it to both:\n // 1. Local listeners in the worker (for any worker-side handling)\n // 2. Main thread via postMessage\n self.dispatchEvent(event);\n\n // Forward to main thread\n if (event instanceof CustomEvent) {\n const message: WorkerWasmEventMessage = {\n type: 'wasmEvent',\n eventType: event.type,\n detail: event.detail,\n };\n self.postMessage(message);\n }\n return true;\n },\n createElement: () => null, // No-op for worker\n body: null,\n documentElement: null,\n };\n\n // Expose the shim as 'document' in worker global scope\n // This allows Go WASM code that uses document.dispatchEvent to work\n (self as any).document = documentShim;\n\n // Also set up a direct listener on self for kodexaDataChange events\n // in case Go uses a different mechanism\n self.addEventListener('kodexaDataChange', (event: Event) => {\n if (event instanceof CustomEvent) {\n const message: WorkerWasmEventMessage = {\n type: 'wasmEvent',\n eventType: 'kodexaDataChange',\n detail: event.detail,\n };\n self.postMessage(message);\n }\n });\n\n // Listener for kodexaTagChange events (tag add/remove for spatial view)\n self.addEventListener('kodexaTagChange', (event: Event) => {\n if (event instanceof CustomEvent) {\n const message: WorkerWasmEventMessage = {\n type: 'wasmEvent',\n eventType: 'kodexaTagChange',\n detail: event.detail,\n };\n self.postMessage(message);\n }\n });\n\n console.log('[worker] Event forwarding configured');\n}\n\n/**\n * Initialize sql.js in the worker context.\n * Uses the official sql.js CDN which provides proper browser-only builds.\n *\n * NOTE: We use fetch + eval instead of importScripts because:\n * - The worker is loaded as a module worker (type: \"module\")\n * - Module workers don't support importScripts()\n * - esm.sh bundles Node.js polyfills that break in browser workers\n * - The official CDN provides a pure browser UMD build\n */\nasync function initializeSqlJs(): Promise<void> {\n // Use the official sql.js CDN which has proper browser builds\n const sqlJsUrl = 'https://sql.js.org/dist/sql-wasm.js';\n const sqlWasmUrl = 'https://sql.js.org/dist/sql-wasm.wasm';\n\n try {\n // Load sql.js using fetch + eval (since module workers don't support importScripts)\n const response = await fetch(sqlJsUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch sql-wasm.js: ${response.statusText}`);\n }\n const code = await response.text();\n\n // The UMD build checks for CommonJS (module.exports) before global assignment.\n // We wrap the code to provide module/exports in scope for the UMD detection.\n // UMD pattern: if (typeof exports === 'object' && typeof module === 'object') module.exports = initSqlJs;\n const wrappedCode = `\n (function(module, exports) {\n ${code}\n return module.exports;\n })\n `;\n\n // eslint-disable-next-line no-eval\n const moduleFactory = eval(wrappedCode);\n const mockModule = { exports: {} as any };\n const initSqlJs = moduleFactory(mockModule, mockModule.exports);\n\n if (typeof initSqlJs !== 'function') {\n throw new Error('initSqlJs not found after loading sql-wasm.js');\n }\n\n // Configure sql.js WASM location\n const sqlConfig = {\n locateFile: () => sqlWasmUrl,\n };\n\n const SQL = await initSqlJs(sqlConfig);\n setSqlInstance(SQL);\n exposeBridgeFunctions();\n\n // Expose loadDocument function\n (self as any).loadDocument = (bytes: Uint8Array): number => {\n const handle = loadDirectOp(bytes);\n if (handle === 0) {\n console.error('[worker] Failed to load database');\n return 0;\n }\n return (self as any).createDocumentFromHandle(handle);\n };\n\n console.log('[worker] sql.js initialized from official CDN');\n } catch (error) {\n console.error('[worker] Failed to initialize sql.js:', error);\n throw new Error(`Failed to initialize sql.js: ${error}`);\n }\n}\n\n/**\n * Load wasm_exec.js in the worker context.\n * We use fetch + eval since workers don't have document.createElement.\n */\nasync function loadWasmExec(): Promise<void> {\n if ((self as any).Go) {\n return; // Already loaded\n }\n\n const baseUrl = config.wasmBaseUrl || self.location.origin;\n const wasmExecUrl = `${baseUrl}/wasm_exec.js`;\n\n try {\n const response = await fetch(wasmExecUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch wasm_exec.js: ${response.statusText}`);\n }\n const code = await response.text();\n // eslint-disable-next-line no-eval\n eval(code);\n console.log('[worker] wasm_exec.js loaded');\n } catch (error) {\n throw new Error(`Failed to load wasm_exec.js: ${error}`);\n }\n}\n\n/**\n * Load and instantiate the Go WASM module.\n */\nasync function loadGoWasm(): Promise<void> {\n const baseUrl = config.wasmBaseUrl || self.location.origin;\n // Add cache-busting version if provided\n const versionParam = config.wasmVersion ? `?v=${config.wasmVersion}` : '';\n const wasmUrl = `${baseUrl}/kodexa.wasm${versionParam}`;\n\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch kodexa.wasm: ${response.statusText}`);\n }\n const wasmBytes = await response.arrayBuffer();\n\n // Create Go runtime and instantiate WASM\n const go = new (self as any).Go();\n const result = await WebAssembly.instantiate(wasmBytes, go.importObject);\n\n // Start the Go program (registers functions on globalThis)\n go.run(result.instance);\n\n // Configure log level\n const logLevel = config.logLevel || 'warn';\n if ((self as any).kodexa_setLogLevel) {\n (self as any).kodexa_setLogLevel(logLevel);\n }\n\n console.log('[worker] Go WASM loaded');\n}\n\n/**\n * Initialize the worker with all WASM components.\n */\nasync function initialize(workerConfig?: WorkerConfig): Promise<void> {\n if (initialized) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n config = workerConfig || {};\n\n initPromise = (async () => {\n try {\n // Step 0: Set up event forwarding BEFORE loading WASM\n // This ensures the document shim is in place when Go initializes\n setupEventForwarding();\n\n // Step 1: Initialize sql.js (MUST be first)\n await initializeSqlJs();\n\n // Step 2: Load wasm_exec.js\n await loadWasmExec();\n\n // Step 3: Load Go WASM\n await loadGoWasm();\n\n initialized = true;\n console.log('[worker] Kodexa WASM fully initialized');\n } catch (error) {\n console.error('[worker] Initialization failed:', error);\n throw error;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Handle RPC call from main thread.\n */\nfunction handleCall(request: WorkerRequest): WorkerResponse {\n const { id, method, args } = request;\n\n try {\n const fn = (self as any)[method];\n if (typeof fn !== 'function') {\n return {\n id,\n success: false,\n error: `Function '${method}' not found on globalThis`,\n };\n }\n\n const result = fn(...(args || []));\n return { id, success: true, result };\n } catch (error) {\n return {\n id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Main message handler.\n */\nself.onmessage = async (event: MessageEvent<WorkerRequest | { type: 'init'; config?: WorkerConfig }>) => {\n const data = event.data;\n\n // Handle init message\n if ('type' in data && data.type === 'init') {\n try {\n await initialize(data.config);\n const readyMessage: WorkerReadyMessage = { type: 'ready' };\n self.postMessage(readyMessage);\n } catch (error) {\n const errorMessage: WorkerErrorMessage = {\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n self.postMessage(errorMessage);\n }\n return;\n }\n\n // Handle RPC call\n if ('type' in data && data.type === 'call') {\n // Ensure initialized\n if (!initialized) {\n const response: WorkerResponse = {\n id: (data as WorkerRequest).id,\n success: false,\n error: 'Worker not initialized. Send init message first.',\n };\n self.postMessage(response);\n return;\n }\n\n const response = handleCall(data as WorkerRequest);\n self.postMessage(response);\n }\n};\n\n// Auto-initialize on load if config is in URL params\n// This allows the worker to be used without explicit init message\nconst urlParams = new URLSearchParams(self.location.search);\nconst autoInit = urlParams.get('autoInit');\nif (autoInit === 'true') {\n const wasmBaseUrl = urlParams.get('wasmBaseUrl') || undefined;\n const logLevel = (urlParams.get('logLevel') as WorkerConfig['logLevel']) || undefined;\n initialize({ wasmBaseUrl, logLevel }).then(() => {\n const readyMessage: WorkerReadyMessage = { type: 'ready' };\n self.postMessage(readyMessage);\n }).catch((error) => {\n const errorMessage: WorkerErrorMessage = {\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n self.postMessage(errorMessage);\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Core sql.js bridge operations - shared between environments\n *\n * This module contains all the database operations that are common between\n * the npm package (sqljs-bridge.ts) and browser CDN (browser-bridge.ts) implementations.\n *\n * The SQL instance is passed in from the wrapper modules, allowing them to\n * load sql.js in different ways (npm import vs CDN global).\n */\n\n// Database handle management\nconst databases = new Map<number, any>();\nlet nextHandle = 1;\n\n// Store SQL instance reference for operations that need it\nlet sqlInstance: any = null;\n\n// ============================================================================\n// Performance Tracing\n// ============================================================================\n\ninterface SqlStats {\n count: number;\n totalMs: number;\n minMs: number;\n maxMs: number;\n errors: number;\n}\n\ninterface QueryTrace {\n sql: string;\n paramsJson: string;\n startTime: number;\n endTime: number;\n duration: number;\n rowCount: number;\n error?: string;\n}\n\nclass SqlPerformanceTracer {\n private enabled = false;\n private stats: Map<string, SqlStats> = new Map();\n private recentTraces: QueryTrace[] = [];\n private maxRecentTraces = 100;\n private sessionStart = 0;\n private logQueries = false;\n private slowQueryThreshold = 10; // ms\n\n enable(options?: { logQueries?: boolean; slowQueryThreshold?: number }): void {\n this.enabled = true;\n this.sessionStart = performance.now();\n this.logQueries = options?.logQueries ?? false;\n this.slowQueryThreshold = options?.slowQueryThreshold ?? 10;\n this.reset();\n console.log('[sql.js PERF] Performance tracing ENABLED', {\n logQueries: this.logQueries,\n slowQueryThreshold: this.slowQueryThreshold + 'ms'\n });\n }\n\n disable(): void {\n this.enabled = false;\n console.log('[sql.js PERF] Performance tracing DISABLED');\n }\n\n isEnabled(): boolean {\n return this.enabled;\n }\n\n reset(): void {\n this.stats.clear();\n this.recentTraces = [];\n this.sessionStart = performance.now();\n }\n\n private extractQueryType(sql: string): string {\n const trimmed = sql.trim().toUpperCase();\n if (trimmed.startsWith('SELECT')) {\n // Extract table name for SELECT queries\n const match = sql.match(/FROM\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `SELECT:${match[1]}` : 'SELECT';\n }\n if (trimmed.startsWith('INSERT')) {\n const match = sql.match(/INTO\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `INSERT:${match[1]}` : 'INSERT';\n }\n if (trimmed.startsWith('UPDATE')) {\n const match = sql.match(/UPDATE\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `UPDATE:${match[1]}` : 'UPDATE';\n }\n if (trimmed.startsWith('DELETE')) {\n const match = sql.match(/FROM\\s+[\"']?(\\w+)[\"']?/i);\n return match ? `DELETE:${match[1]}` : 'DELETE';\n }\n if (trimmed.startsWith('BEGIN')) return 'BEGIN';\n if (trimmed.startsWith('COMMIT')) return 'COMMIT';\n if (trimmed.startsWith('ROLLBACK')) return 'ROLLBACK';\n if (trimmed.startsWith('PRAGMA')) return 'PRAGMA';\n if (trimmed.startsWith('CREATE')) return 'CREATE';\n return 'OTHER';\n }\n\n recordQuery(sql: string, paramsJson: string, startTime: number, endTime: number, rowCount: number, error?: string): void {\n if (!this.enabled) return;\n\n const duration = endTime - startTime;\n const queryType = this.extractQueryType(sql);\n\n // Update stats\n let stat = this.stats.get(queryType);\n if (!stat) {\n stat = { count: 0, totalMs: 0, minMs: Infinity, maxMs: 0, errors: 0 };\n this.stats.set(queryType, stat);\n }\n stat.count++;\n stat.totalMs += duration;\n stat.minMs = Math.min(stat.minMs, duration);\n stat.maxMs = Math.max(stat.maxMs, duration);\n if (error) stat.errors++;\n\n // Store trace\n const trace: QueryTrace = { sql, paramsJson, startTime, endTime, duration, rowCount, error };\n this.recentTraces.push(trace);\n if (this.recentTraces.length > this.maxRecentTraces) {\n this.recentTraces.shift();\n }\n\n // Log slow queries or all queries if enabled\n if (duration >= this.slowQueryThreshold) {\n console.warn(`[sql.js PERF] SLOW QUERY (${duration.toFixed(2)}ms): ${queryType}`, {\n sql: sql.substring(0, 200),\n rowCount,\n duration: duration.toFixed(2) + 'ms'\n });\n } else if (this.logQueries) {\n console.log(`[sql.js PERF] ${queryType} (${duration.toFixed(2)}ms, ${rowCount} rows)`);\n }\n }\n\n getStats(): Record<string, SqlStats & { avgMs: number }> {\n const result: Record<string, SqlStats & { avgMs: number }> = {};\n for (const [queryType, stat] of this.stats) {\n result[queryType] = {\n ...stat,\n avgMs: stat.count > 0 ? stat.totalMs / stat.count : 0\n };\n }\n return result;\n }\n\n getSummary(): {\n sessionDuration: number;\n totalQueries: number;\n totalTimeMs: number;\n avgQueryMs: number;\n slowQueries: number;\n errors: number;\n topByCount: Array<{ type: string; count: number; totalMs: number; avgMs: number }>;\n topByTime: Array<{ type: string; count: number; totalMs: number; avgMs: number }>;\n } {\n const stats = this.getStats();\n let totalQueries = 0;\n let totalTimeMs = 0;\n let slowQueries = 0;\n let errors = 0;\n\n const entries: Array<{ type: string; count: number; totalMs: number; avgMs: number }> = [];\n\n for (const [type, stat] of Object.entries(stats)) {\n totalQueries += stat.count;\n totalTimeMs += stat.totalMs;\n slowQueries += this.recentTraces.filter(t =>\n this.extractQueryType(t.sql) === type && t.duration >= this.slowQueryThreshold\n ).length;\n errors += stat.errors;\n entries.push({ type, count: stat.count, totalMs: stat.totalMs, avgMs: stat.avgMs });\n }\n\n return {\n sessionDuration: performance.now() - this.sessionStart,\n totalQueries,\n totalTimeMs,\n avgQueryMs: totalQueries > 0 ? totalTimeMs / totalQueries : 0,\n slowQueries,\n errors,\n topByCount: [...entries].sort((a, b) => b.count - a.count).slice(0, 10),\n topByTime: [...entries].sort((a, b) => b.totalMs - a.totalMs).slice(0, 10)\n };\n }\n\n getRecentTraces(count = 20): QueryTrace[] {\n return this.recentTraces.slice(-count);\n }\n\n printReport(): void {\n const summary = this.getSummary();\n console.log('\\n========== SQL.JS PERFORMANCE REPORT ==========');\n console.log(`Session Duration: ${(summary.sessionDuration / 1000).toFixed(2)}s`);\n console.log(`Total Queries: ${summary.totalQueries}`);\n console.log(`Total SQL Time: ${summary.totalTimeMs.toFixed(2)}ms`);\n console.log(`Avg Query Time: ${summary.avgQueryMs.toFixed(3)}ms`);\n console.log(`Slow Queries (>${this.slowQueryThreshold}ms): ${summary.slowQueries}`);\n console.log(`Errors: ${summary.errors}`);\n\n console.log('\\n--- Top by Count ---');\n for (const entry of summary.topByCount) {\n console.log(` ${entry.type}: ${entry.count} calls, ${entry.totalMs.toFixed(2)}ms total, ${entry.avgMs.toFixed(3)}ms avg`);\n }\n\n console.log('\\n--- Top by Total Time ---');\n for (const entry of summary.topByTime) {\n console.log(` ${entry.type}: ${entry.totalMs.toFixed(2)}ms total, ${entry.count} calls, ${entry.avgMs.toFixed(3)}ms avg`);\n }\n\n console.log('================================================\\n');\n }\n}\n\n// Global tracer instance\nconst perfTracer = new SqlPerformanceTracer();\n\n/**\n * Convert Uint8Array to base64 string efficiently.\n * Uses chunked processing to handle large arrays without stack overflow.\n * @param bytes Uint8Array to convert\n * @returns Base64 encoded string\n */\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n // For small arrays, use the simple method\n if (bytes.length < 32768) {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n // For large arrays, process in chunks to avoid stack overflow\n const chunkSize = 32768;\n let binary = '';\n for (let i = 0; i < bytes.length; i += chunkSize) {\n const chunk = bytes.subarray(i, Math.min(i + chunkSize, bytes.length));\n binary += String.fromCharCode.apply(null, Array.from(chunk));\n }\n return btoa(binary);\n}\n\n/**\n * Convert a row object for JSON serialization.\n * Converts Uint8Array (BLOB) to base64-encoded string with \"base64:\" prefix.\n * @param obj Row object from sql.js\n * @returns Object safe for JSON.stringify\n */\nfunction processRowForJson(obj: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const key in obj) {\n const value = obj[key];\n if (value instanceof Uint8Array) {\n // Convert BLOB to base64 with prefix for Go to recognize\n try {\n const base64 = uint8ArrayToBase64(value);\n result[key] = 'base64:' + base64;\n } catch (err) {\n console.error(`[sql.js] Failed to convert BLOB column '${key}' (${value.length} bytes):`, err);\n result[key] = null;\n }\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n// ============================================================================\n// Database Operations\n// ============================================================================\n\n/**\n * Create a new in-memory database\n * @returns Database handle (positive integer) or 0 on error\n */\nexport function createDatabaseOp(): number {\n if (!sqlInstance) {\n console.error('[sql.js] Not initialized');\n return 0;\n }\n\n try {\n const db = new sqlInstance.Database();\n const handle = nextHandle++;\n databases.set(handle, db);\n console.log(`[sql.js] Created database with handle ${handle}`);\n return handle;\n } catch (error) {\n console.error('[sql.js] Failed to create database:', error);\n return 0;\n }\n}\n\n/**\n * Execute SQL statement without returning results\n * @param handle Database handle\n * @param sql SQL statement\n * @returns 1 on success, 0 on error\n */\nexport function execOp(handle: number, sql: string): number {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return 0;\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n try {\n db.run(sql);\n return 1;\n } catch (err) {\n error = String(err);\n console.error('[sql.js] Exec failed:', err);\n return 0;\n } finally {\n perfTracer.recordQuery(sql, '[]', startTime, performance.now(), 0, error);\n }\n}\n\n/**\n * Execute SQL query with parameters and return results as JSON\n * @param handle Database handle\n * @param sql SQL query with ? placeholders\n * @param paramsJson JSON array of parameters\n * @returns JSON string of results (array of objects) or empty string on error\n */\nexport function queryOp(handle: number, sql: string, paramsJson: string): string {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return '[]';\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n let rowCount = 0;\n try {\n // Parse parameters\n let params: any[] = [];\n if (paramsJson && paramsJson !== '[]' && paramsJson !== 'null') {\n params = JSON.parse(paramsJson);\n }\n\n // Execute query\n const stmt = db.prepare(sql);\n if (params.length > 0) {\n stmt.bind(params);\n }\n\n // Collect results - convert Uint8Array to base64 for Go\n const results: any[] = [];\n while (stmt.step()) {\n results.push(processRowForJson(stmt.getAsObject()));\n }\n stmt.free();\n\n rowCount = results.length;\n return JSON.stringify(results);\n } catch (err) {\n error = String(err);\n console.error('[sql.js] Query failed:', sql, err);\n throw err;\n } finally {\n perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), rowCount, error);\n }\n}\n\n/**\n * Convert base64 string to Uint8Array\n * @param base64 Base64 encoded string\n * @returns Uint8Array of decoded bytes\n */\nfunction base64ToUint8Array(base64: string): Uint8Array {\n // Use Buffer in Node.js for correct binary handling\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n // Browser fallback using atob\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Process params array, converting \"base64:\" prefixed strings to Uint8Array for BLOB storage\n * @param params Array of SQL parameters\n * @returns Processed params with binary data converted to Uint8Array\n */\nfunction processParamsForBlob(params: any[]): any[] {\n return params.map(param => {\n if (typeof param === 'string' && param.startsWith('base64:')) {\n // Convert base64-prefixed string to Uint8Array for BLOB storage\n return base64ToUint8Array(param.substring(7));\n }\n return param;\n });\n}\n\n/**\n * Execute INSERT statement and return the last inserted row ID\n * @param handle Database handle\n * @param sql INSERT statement with ? placeholders\n * @param paramsJson JSON array of parameters\n * @returns Last insert row ID or 0 on error\n */\nexport function insertOp(handle: number, sql: string, paramsJson: string): number {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return 0;\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n try {\n // Parse parameters\n let params: any[] = [];\n if (paramsJson && paramsJson !== '[]' && paramsJson !== 'null') {\n params = JSON.parse(paramsJson);\n // Convert \"base64:\" prefixed strings to Uint8Array for BLOB storage\n params = processParamsForBlob(params);\n }\n\n // Execute insert\n if (params.length > 0) {\n db.run(sql, params);\n } else {\n db.run(sql);\n }\n\n // Get last insert row ID\n const result = db.exec('SELECT last_insert_rowid() as id');\n if (result.length > 0 && result[0].values.length > 0) {\n return result[0].values[0][0] as number;\n }\n return 0;\n } catch (err) {\n error = String(err);\n console.error('[sql.js] Insert failed:', sql, err);\n return 0;\n } finally {\n perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), 1, error);\n }\n}\n\n/**\n * Execute UPDATE/DELETE statement and return rows affected\n * @param handle Database handle\n * @param sql UPDATE or DELETE statement with ? placeholders\n * @param paramsJson JSON array of parameters\n * @returns Number of rows affected or -1 on error\n */\nexport function execParamsOp(handle: number, sql: string, paramsJson: string): number {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return -1;\n }\n\n const startTime = performance.now();\n let error: string | undefined;\n let rowsAffected = 0;\n try {\n // Parse parameters\n let params: any[] = [];\n if (paramsJson && paramsJson !== '[]' && paramsJson !== 'null') {\n params = JSON.parse(paramsJson);\n // Convert \"base64:\" prefixed strings to Uint8Array for BLOB storage\n params = processParamsForBlob(params);\n }\n\n // Execute statement\n if (params.length > 0) {\n db.run(sql, params);\n } else {\n db.run(sql);\n }\n\n // Get rows affected\n const result = db.exec('SELECT changes() as count');\n if (result.length > 0 && result[0].values.length > 0) {\n rowsAffected = result[0].values[0][0] as number;\n return rowsAffected;\n }\n return 0;\n } catch (err) {\n error = String(err);\n console.error('[sql.js] ExecParams failed:', sql, err);\n return -1;\n } finally {\n perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), rowsAffected, error);\n }\n}\n\n/**\n * Export database to binary format\n * @param handle Database handle\n * @returns Base64-encoded database bytes or empty string on error\n */\nexport function exportOp(handle: number): string {\n const db = databases.get(handle);\n if (!db) {\n console.error(`[sql.js] Invalid database handle: ${handle}`);\n return '';\n }\n\n try {\n const data = db.export();\n // Use chunked base64 conversion for potentially large databases\n return uint8ArrayToBase64(data);\n } catch (error) {\n console.error('[sql.js] Export failed:', error);\n return '';\n }\n}\n\n/**\n * Import database from binary format\n * @param base64Data Base64-encoded database bytes\n * @returns Database handle or 0 on error\n */\nexport function importOp(base64Data: string): number {\n if (!sqlInstance) {\n console.error('[sql.js] Not initialized');\n return 0;\n }\n\n try {\n // Decode base64 to Uint8Array\n const binary = atob(base64Data);\n const data = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n data[i] = binary.charCodeAt(i);\n }\n\n const db = new sqlInstance.Database(data);\n const handle = nextHandle++;\n databases.set(handle, db);\n console.log(`[sql.js] Imported database with handle ${handle}`);\n return handle;\n } catch (error) {\n console.error('[sql.js] Import failed:', error);\n return 0;\n }\n}\n\n/**\n * Load database directly from bytes\n * @param bytes Raw database bytes\n * @returns Database handle or 0 on error\n */\nexport function loadDirectOp(bytes: Uint8Array): number {\n if (!sqlInstance) {\n console.error('[sql.js] Not initialized');\n return 0;\n }\n\n try {\n const db = new sqlInstance.Database(bytes);\n const handle = nextHandle++;\n databases.set(handle, db);\n return handle;\n } catch (error) {\n console.error('[sql.js] Failed to load database directly:', error);\n return 0;\n }\n}\n\n/**\n * Close a database\n * @param handle Database handle\n */\nexport function closeOp(handle: number): void {\n const db = databases.get(handle);\n if (db) {\n try {\n db.close();\n } catch (error) {\n console.error('[sql.js] Close failed:', error);\n }\n databases.delete(handle);\n console.log(`[sql.js] Closed database with handle ${handle}`);\n }\n}\n\n/**\n * Get last error message (for debugging)\n * @param _handle Database handle\n * @returns Error message or empty string\n */\nexport function getErrorOp(_handle: number): string {\n // sql.js throws exceptions rather than storing error messages\n // This is a placeholder for API compatibility\n return '';\n}\n\n/**\n * Cleanup all databases and reset state\n */\nexport function cleanupOp(): void {\n for (const [_handle, db] of databases) {\n try {\n db.close();\n } catch (_e) {\n // Ignore close errors during cleanup\n }\n }\n databases.clear();\n nextHandle = 1;\n console.log('[sql.js] Cleaned up all databases');\n}\n\n// ============================================================================\n// Bridge Exposure\n// ============================================================================\n\n/**\n * Set the SQL instance for database operations\n * Must be called before any database operations\n */\nexport function setSqlInstance(SQL: any): void {\n sqlInstance = SQL;\n}\n\n/**\n * Expose sql.js bridge functions to globalThis for Go WASM access\n */\nexport function exposeBridgeFunctions(): void {\n const g = globalThis as any;\n\n g.sqljsCreateDatabase = createDatabaseOp;\n g.sqljsExec = execOp;\n g.sqljsQuery = queryOp;\n g.sqljsInsert = insertOp;\n g.sqljsExecParams = execParamsOp;\n g.sqljsExport = exportOp;\n g.sqljsImport = importOp;\n g.sqljsClose = closeOp;\n g.sqljsGetError = getErrorOp;\n g.sqljsLoadDirect = loadDirectOp;\n\n // Also expose database map for debugging\n g.sqljsDatabases = databases;\n\n // Expose performance tracing API for debugging\n g.sqljsPerf = {\n /**\n * Enable SQL performance tracing\n * @param options.logQueries - Log all queries (default: false, only slow queries are logged)\n * @param options.slowQueryThreshold - Threshold in ms for slow query warnings (default: 10)\n * @example sqljsPerf.enable({ logQueries: true, slowQueryThreshold: 5 })\n */\n enable: (options?: { logQueries?: boolean; slowQueryThreshold?: number }) => perfTracer.enable(options),\n\n /** Disable SQL performance tracing */\n disable: () => perfTracer.disable(),\n\n /** Check if tracing is enabled */\n isEnabled: () => perfTracer.isEnabled(),\n\n /** Reset all statistics and traces */\n reset: () => perfTracer.reset(),\n\n /** Get detailed statistics by query type */\n getStats: () => perfTracer.getStats(),\n\n /** Get summary with top queries by count and time */\n getSummary: () => perfTracer.getSummary(),\n\n /** Get recent query traces (default: last 20) */\n getRecentTraces: (count?: number) => perfTracer.getRecentTraces(count),\n\n /** Print formatted performance report to console */\n printReport: () => perfTracer.printReport(),\n };\n\n console.log('[sql.js] Bridge functions exposed to globalThis');\n console.log('[sql.js] Performance tracing available via sqljsPerf.enable()');\n}\n\n/**\n * Get a database by handle (for debugging from console)\n */\nexport function getDatabase(handle: number): any {\n return databases.get(handle);\n}\n\n// ============================================================================\n// Performance Tracing Exports\n// ============================================================================\n\n/**\n * Enable SQL performance tracing\n * @param options.logQueries - Log all queries (default: false, only slow queries are logged)\n * @param options.slowQueryThreshold - Threshold in ms for slow query warnings (default: 10)\n */\nexport function enableSqlPerformanceTracing(options?: { logQueries?: boolean; slowQueryThreshold?: number }): void {\n perfTracer.enable(options);\n}\n\n/** Disable SQL performance tracing */\nexport function disableSqlPerformanceTracing(): void {\n perfTracer.disable();\n}\n\n/** Get SQL performance statistics */\nexport function getSqlPerformanceStats() {\n return perfTracer.getStats();\n}\n\n/** Get SQL performance summary */\nexport function getSqlPerformanceSummary() {\n return perfTracer.getSummary();\n}\n\n/** Print SQL performance report to console */\nexport function printSqlPerformanceReport(): void {\n perfTracer.printReport();\n}\n\n/** Get recent SQL query traces */\nexport function getRecentSqlTraces(count = 20) {\n return perfTracer.getRecentTraces(count);\n}\n\n/** Reset SQL performance statistics */\nexport function resetSqlPerformanceStats(): void {\n perfTracer.reset();\n}\n", "/**\n * Kodexa Web Worker Entry Point\n *\n * This worker owns the Go WASM instance and exposes an RPC-style API\n * via postMessage. All heavy document processing happens here,\n * keeping the main thread responsive.\n *\n * Initialization order (critical):\n * 1. sql.js WASM loaded and bridge exposed to globalThis\n * 2. wasm_exec.js loaded (defines globalThis.Go)\n * 3. kodexa.wasm instantiated and Go runtime started\n * 4. Worker signals 'ready' to main thread\n */\n\n/// <reference lib=\"webworker\" />\n\nimport type { WorkerRequest, WorkerResponse, WorkerReadyMessage, WorkerErrorMessage, WorkerConfig, WorkerWasmEventMessage } from './types';\nimport { setSqlInstance, exposeBridgeFunctions, loadDirectOp } from '../wasm/sqljs-core';\n\ndeclare const self: DedicatedWorkerGlobalScope;\n\n// Worker state\nlet initialized = false;\nlet initPromise: Promise<void> | null = null;\nlet config: WorkerConfig = {};\n\n// Test log to verify worker is loading fresh\nself.postMessage({ type: 'debugLog', level: 'log', message: '[worker] kodexa-worker.ts loaded at ' + Date.now() });\n\n// Intercept console.log to forward WASM logs to main thread via postMessage\nconst originalConsoleLog = console.log.bind(console);\nconst originalConsoleWarn = console.warn.bind(console);\nconst originalConsoleError = console.error.bind(console);\n\nconsole.log = (...args: unknown[]) => {\n originalConsoleLog(...args);\n const msg = args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ');\n if (msg.includes('[WASM]') || msg.includes('[worker]')) {\n self.postMessage({ type: 'debugLog', level: 'log', message: msg.substring(0, 500) });\n }\n};\nconsole.warn = (...args: unknown[]) => {\n originalConsoleWarn(...args);\n const msg = args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ');\n if (msg.includes('[WASM]') || msg.includes('[worker]')) {\n self.postMessage({ type: 'debugLog', level: 'warn', message: msg.substring(0, 500) });\n }\n};\nconsole.error = (...args: unknown[]) => {\n originalConsoleError(...args);\n const msg = args.map(a => typeof a === 'string' ? a : JSON.stringify(a)).join(' ');\n if (msg.includes('[WASM]') || msg.includes('[worker]')) {\n self.postMessage({ type: 'debugLog', level: 'error', message: msg.substring(0, 500) });\n }\n};\n\n/**\n * Set up event forwarding from WASM to main thread.\n * The Go WASM runtime dispatches events using CustomEvent on a document-like object.\n * In worker context, we create a shim that captures these events and forwards them.\n */\nfunction setupEventForwarding(): void {\n // Create a document shim that the Go WASM can use to dispatch events\n // This allows the existing Go code to work unchanged in worker context\n const documentShim = {\n addEventListener: (type: string, handler: EventListener) => {\n console.log(`[worker] Event listener registered for: ${type}`);\n self.addEventListener(type, handler);\n },\n removeEventListener: (type: string, handler: EventListener) => {\n self.removeEventListener(type, handler);\n },\n dispatchEvent: (event: Event) => {\n // When Go dispatches an event, forward it to both:\n // 1. Local listeners in the worker (for any worker-side handling)\n // 2. Main thread via postMessage\n self.dispatchEvent(event);\n\n // Forward to main thread\n if (event instanceof CustomEvent) {\n const message: WorkerWasmEventMessage = {\n type: 'wasmEvent',\n eventType: event.type,\n detail: event.detail,\n };\n self.postMessage(message);\n }\n return true;\n },\n createElement: () => null, // No-op for worker\n body: null,\n documentElement: null,\n };\n\n // Expose the shim as 'document' in worker global scope\n // This allows Go WASM code that uses document.dispatchEvent to work\n (self as any).document = documentShim;\n\n // Also set up a direct listener on self for kodexaDataChange events\n // in case Go uses a different mechanism\n self.addEventListener('kodexaDataChange', (event: Event) => {\n if (event instanceof CustomEvent) {\n const message: WorkerWasmEventMessage = {\n type: 'wasmEvent',\n eventType: 'kodexaDataChange',\n detail: event.detail,\n };\n self.postMessage(message);\n }\n });\n\n // Listener for kodexaTagChange events (tag add/remove for spatial view)\n self.addEventListener('kodexaTagChange', (event: Event) => {\n if (event instanceof CustomEvent) {\n const message: WorkerWasmEventMessage = {\n type: 'wasmEvent',\n eventType: 'kodexaTagChange',\n detail: event.detail,\n };\n self.postMessage(message);\n }\n });\n\n console.log('[worker] Event forwarding configured');\n}\n\n/**\n * Initialize sql.js in the worker context.\n * Uses the official sql.js CDN which provides proper browser-only builds.\n *\n * NOTE: We use fetch + eval instead of importScripts because:\n * - The worker is loaded as a module worker (type: \"module\")\n * - Module workers don't support importScripts()\n * - esm.sh bundles Node.js polyfills that break in browser workers\n * - The official CDN provides a pure browser UMD build\n */\nasync function initializeSqlJs(): Promise<void> {\n // Use the official sql.js CDN which has proper browser builds\n const sqlJsUrl = 'https://sql.js.org/dist/sql-wasm.js';\n const sqlWasmUrl = 'https://sql.js.org/dist/sql-wasm.wasm';\n\n try {\n // Load sql.js using fetch + eval (since module workers don't support importScripts)\n const response = await fetch(sqlJsUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch sql-wasm.js: ${response.statusText}`);\n }\n const code = await response.text();\n\n // The UMD build checks for CommonJS (module.exports) before global assignment.\n // We wrap the code to provide module/exports in scope for the UMD detection.\n // UMD pattern: if (typeof exports === 'object' && typeof module === 'object') module.exports = initSqlJs;\n const wrappedCode = `\n (function(module, exports) {\n ${code}\n return module.exports;\n })\n `;\n\n // eslint-disable-next-line no-eval\n const moduleFactory = eval(wrappedCode);\n const mockModule = { exports: {} as any };\n const initSqlJs = moduleFactory(mockModule, mockModule.exports);\n\n if (typeof initSqlJs !== 'function') {\n throw new Error('initSqlJs not found after loading sql-wasm.js');\n }\n\n // Configure sql.js WASM location\n const sqlConfig = {\n locateFile: () => sqlWasmUrl,\n };\n\n const SQL = await initSqlJs(sqlConfig);\n setSqlInstance(SQL);\n exposeBridgeFunctions();\n\n // Expose loadDocument function\n (self as any).loadDocument = (bytes: Uint8Array): number => {\n const handle = loadDirectOp(bytes);\n if (handle === 0) {\n console.error('[worker] Failed to load database');\n return 0;\n }\n return (self as any).createDocumentFromHandle(handle);\n };\n\n console.log('[worker] sql.js initialized from official CDN');\n } catch (error) {\n console.error('[worker] Failed to initialize sql.js:', error);\n throw new Error(`Failed to initialize sql.js: ${error}`);\n }\n}\n\n/**\n * Load wasm_exec.js in the worker context.\n * We use fetch + eval since workers don't have document.createElement.\n */\nasync function loadWasmExec(): Promise<void> {\n if ((self as any).Go) {\n return; // Already loaded\n }\n\n const baseUrl = config.wasmBaseUrl || self.location.origin;\n const wasmExecUrl = `${baseUrl}/wasm_exec.js`;\n\n try {\n const response = await fetch(wasmExecUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch wasm_exec.js: ${response.statusText}`);\n }\n const code = await response.text();\n // eslint-disable-next-line no-eval\n eval(code);\n console.log('[worker] wasm_exec.js loaded');\n } catch (error) {\n throw new Error(`Failed to load wasm_exec.js: ${error}`);\n }\n}\n\n/**\n * Load and instantiate the Go WASM module.\n */\nasync function loadGoWasm(): Promise<void> {\n const baseUrl = config.wasmBaseUrl || self.location.origin;\n // Add cache-busting version if provided\n const versionParam = config.wasmVersion ? `?v=${config.wasmVersion}` : '';\n const wasmUrl = `${baseUrl}/kodexa.wasm${versionParam}`;\n\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch kodexa.wasm: ${response.statusText}`);\n }\n const wasmBytes = await response.arrayBuffer();\n\n // Create Go runtime and instantiate WASM\n const go = new (self as any).Go();\n const result = await WebAssembly.instantiate(wasmBytes, go.importObject);\n\n // Start the Go program (registers functions on globalThis)\n go.run(result.instance);\n\n // Configure log level\n const logLevel = config.logLevel || 'warn';\n if ((self as any).kodexa_setLogLevel) {\n (self as any).kodexa_setLogLevel(logLevel);\n }\n\n console.log('[worker] Go WASM loaded');\n}\n\n/**\n * Initialize the worker with all WASM components.\n */\nasync function initialize(workerConfig?: WorkerConfig): Promise<void> {\n if (initialized) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n config = workerConfig || {};\n\n initPromise = (async () => {\n try {\n // Step 0: Set up event forwarding BEFORE loading WASM\n // This ensures the document shim is in place when Go initializes\n setupEventForwarding();\n\n // Step 1: Initialize sql.js (MUST be first)\n await initializeSqlJs();\n\n // Step 2: Load wasm_exec.js\n await loadWasmExec();\n\n // Step 3: Load Go WASM\n await loadGoWasm();\n\n initialized = true;\n console.log('[worker] Kodexa WASM fully initialized');\n } catch (error) {\n console.error('[worker] Initialization failed:', error);\n throw error;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Handle RPC call from main thread.\n */\nfunction handleCall(request: WorkerRequest): WorkerResponse {\n const { id, method, args } = request;\n\n try {\n const fn = (self as any)[method];\n if (typeof fn !== 'function') {\n return {\n id,\n success: false,\n error: `Function '${method}' not found on globalThis`,\n };\n }\n\n const result = fn(...(args || []));\n return { id, success: true, result };\n } catch (error) {\n return {\n id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Main message handler.\n */\nself.onmessage = async (event: MessageEvent<WorkerRequest | { type: 'init'; config?: WorkerConfig }>) => {\n const data = event.data;\n\n // Handle init message\n if ('type' in data && data.type === 'init') {\n try {\n await initialize(data.config);\n const readyMessage: WorkerReadyMessage = { type: 'ready' };\n self.postMessage(readyMessage);\n } catch (error) {\n const errorMessage: WorkerErrorMessage = {\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n self.postMessage(errorMessage);\n }\n return;\n }\n\n // Handle RPC call\n if ('type' in data && data.type === 'call') {\n // Ensure initialized\n if (!initialized) {\n const response: WorkerResponse = {\n id: (data as WorkerRequest).id,\n success: false,\n error: 'Worker not initialized. Send init message first.',\n };\n self.postMessage(response);\n return;\n }\n\n const response = handleCall(data as WorkerRequest);\n self.postMessage(response);\n }\n};\n\n// Auto-initialize on load if config is in URL params\n// This allows the worker to be used without explicit init message\nconst urlParams = new URLSearchParams(self.location.search);\nconst autoInit = urlParams.get('autoInit');\nif (autoInit === 'true') {\n const wasmBaseUrl = urlParams.get('wasmBaseUrl') || undefined;\n const logLevel = (urlParams.get('logLevel') as WorkerConfig['logLevel']) || undefined;\n initialize({ wasmBaseUrl, logLevel }).then(() => {\n const readyMessage: WorkerReadyMessage = { type: 'ready' };\n self.postMessage(readyMessage);\n }).catch((error) => {\n const errorMessage: WorkerErrorMessage = {\n type: 'error',\n error: error instanceof Error ? error.message : String(error),\n };\n self.postMessage(errorMessage);\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["binary", "SQL", "baseUrl", "response"]
|
|
7
7
|
}
|
package/dist/kodexa.wasm
CHANGED
|
Binary file
|
|
@@ -278,7 +278,7 @@ var KodexaBridge = (() => {
|
|
|
278
278
|
} catch (err) {
|
|
279
279
|
error = String(err);
|
|
280
280
|
console.error("[sql.js] Query failed:", sql, err);
|
|
281
|
-
|
|
281
|
+
throw err;
|
|
282
282
|
} finally {
|
|
283
283
|
perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), rowCount, error);
|
|
284
284
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/wasm/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQzC;;;;;GAKG;AACH,qBAAa,UAAU;gBACT,SAAS,EAAE,cAAc;IAIrC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG;IAUrC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;CAGzB;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/wasm/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQzC;;;;;GAKG;AACH,qBAAa,UAAU;gBACT,SAAS,EAAE,cAAc;IAIrC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG;IAUrC;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;CAGzB;AAgGD;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC,CAW/D;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CAGzD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAO9C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAclC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAO/E"}
|
package/dist/wasm/loader.js
CHANGED
|
@@ -56,7 +56,11 @@ async function loadWasm() {
|
|
|
56
56
|
// when Go WASM starts and tries to use them
|
|
57
57
|
if (!isSqlJsInitialized()) {
|
|
58
58
|
console.log('[loader] Initializing sql.js...');
|
|
59
|
-
|
|
59
|
+
// Pass the sql.js WASM URL so it doesn't fall back to the CDN (which 404s)
|
|
60
|
+
const sqlWasmUrl = typeof window !== 'undefined'
|
|
61
|
+
? `${globalThis.KODEXA_WASM_BASE_URL || '/f/dist'}/sql-wasm.wasm`
|
|
62
|
+
: undefined;
|
|
63
|
+
await initializeSqlJs(sqlWasmUrl);
|
|
60
64
|
exposeSqljsBridge();
|
|
61
65
|
console.log('[loader] sql.js ready');
|
|
62
66
|
}
|
package/dist/wasm/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/wasm/loader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * WebAssembly loader for Kodexa Go library\n *\n * NOTE: Go WASM with syscall/js uses a different model than typical WASM.\n * Functions are registered on globalThis and accept/return JS values directly.\n * No pointer-based memory management is needed for strings.\n *\n * IMPORTANT: sql.js is initialized BEFORE Go WASM to provide SQLite support.\n */\n\nimport { GoWasmInstance } from './types';\nimport { initializeSqlJs, exposeSqljsBridge, cleanupSqlJs, isSqlJsInitialized } from './sqljs-bridge';\n\n// Global WASM instance\nlet wasmInstance: GoWasmInstance | null = null;\nlet wasmLoaded = false;\nlet wasmLoadPromise: Promise<GoWasmInstance> | null = null;\n\n/**\n * WASM helper for Go-based WASM modules\n *\n * With Go's syscall/js, strings are passed directly between JS and Go.\n * This helper provides utilities for JSON serialization and result parsing.\n */\nexport class WasmHelper {\n constructor(_instance: GoWasmInstance) {\n // Instance stored for potential future use\n }\n\n /**\n * Parse JSON string returned from Go\n */\n parseJsonResult(jsonStr: string): any {\n if (!jsonStr) return null;\n try {\n return JSON.parse(jsonStr);\n } catch (e) {\n console.error('Failed to parse JSON result:', jsonStr, e);\n return null;\n }\n }\n\n /**\n * Create JSON string for Go functions\n */\n toJson(obj: any): string {\n return JSON.stringify(obj);\n }\n}\n\n/**\n * Load the WebAssembly module\n */\nasync function loadWasm(): Promise<GoWasmInstance> {\n if (wasmInstance) {\n return wasmInstance;\n }\n\n try {\n // CRITICAL: Initialize sql.js FIRST, before Go WASM\n // This ensures the sql.js bridge functions are available on globalThis\n // when Go WASM starts and tries to use them\n if (!isSqlJsInitialized()) {\n console.log('[loader] Initializing sql.js...');\n await initializeSqlJs();\n exposeSqljsBridge();\n console.log('[loader] sql.js ready');\n }\n\n let wasmBytes: ArrayBuffer;\n\n // Check if we're in Node.js or browser\n if (typeof window === 'undefined') {\n // Node.js environment\n const fs = require('fs');\n const path = require('path');\n\n // Add crypto polyfill for Node.js\n if (!globalThis.crypto) {\n const crypto = require('crypto');\n (globalThis as any).crypto = {\n getRandomValues: (arr: any) => crypto.randomFillSync(arr)\n };\n }\n\n // Load the Go WASM runtime\n const wasmExecPath = path.join(__dirname, '../../dist/wasm_exec.js');\n require(wasmExecPath);\n\n const wasmPath = path.join(__dirname, '../../dist/kodexa.wasm');\n wasmBytes = fs.readFileSync(wasmPath);\n } else {\n // Browser environment\n // Get WASM base URL from global config or use default\n const wasmBaseUrl = (globalThis as any).KODEXA_WASM_BASE_URL || '/f/dist';\n \n // Load wasm_exec.js first (defines globalThis.Go)\n if (!(globalThis as any).Go) {\n const wasmExecUrl = `${wasmBaseUrl}/wasm_exec.js`;\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = wasmExecUrl;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load wasm_exec.js'));\n document.head.appendChild(script);\n });\n }\n\n const wasmUrl = `${wasmBaseUrl}/kodexa.wasm`;\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.statusText}`);\n }\n wasmBytes = await response.arrayBuffer();\n }\n\n // Create Go runtime imports\n const go = new (globalThis as any).Go(); // Go WASM runtime\n const result = await WebAssembly.instantiate(wasmBytes, go.importObject);\n\n // Start the Go program\n go.run(result.instance);\n\n // Configure log level: check for override, default to \"warn\"\n // Users can set window.KODEXA_LOG_LEVEL before loading, or call kodexa_setLogLevel() after\n const logLevel = (globalThis as any).KODEXA_LOG_LEVEL || 'warn';\n if ((globalThis as any).kodexa_setLogLevel) {\n (globalThis as any).kodexa_setLogLevel(logLevel);\n }\n\n wasmInstance = result.instance as unknown as GoWasmInstance;\n wasmLoaded = true;\n\n return wasmInstance;\n } catch (error) {\n console.error('Failed to load WASM module:', error);\n throw new Error(`WASM loading failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get the loaded WASM instance\n */\nexport async function getWasmInstance(): Promise<GoWasmInstance> {\n if (wasmInstance) {\n return wasmInstance;\n }\n\n if (wasmLoadPromise) {\n return wasmLoadPromise;\n }\n\n wasmLoadPromise = loadWasm();\n return wasmLoadPromise;\n}\n\n/**\n * Get WASM helper for the current instance\n */\nexport async function getWasmHelper(): Promise<WasmHelper> {\n const instance = await getWasmInstance();\n return new WasmHelper(instance);\n}\n\n/**\n * Check if WASM is loaded\n */\nexport function isWasmLoaded(): boolean {\n return wasmLoaded;\n}\n\n/**\n * Initialize WASM (call this before using any Go functions)\n */\nexport async function initWasm(): Promise<void> {\n if (wasmLoaded) {\n return;\n }\n\n await getWasmInstance();\n console.log('✅ Kodexa WASM module loaded successfully');\n}\n\n/**\n * Cleanup WASM resources\n */\nexport function cleanupWasm(): void {\n if (wasmInstance) {\n try {\n (globalThis as any).cleanup();\n } catch (e) {\n console.warn('Error during WASM cleanup:', e);\n }\n wasmInstance = null;\n wasmLoaded = false;\n wasmLoadPromise = null;\n }\n\n // Also cleanup sql.js databases\n cleanupSqlJs();\n}\n\n/**\n * Set the log level for Go WASM logging.\n * Valid levels: \"debug\", \"info\", \"warn\", \"error\"\n * Default is \"warn\" (set during initialization).\n *\n * Can be called anytime after WASM is loaded.\n * To set before loading, use: window.KODEXA_LOG_LEVEL = \"debug\"\n */\nexport function setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): boolean {\n if ((globalThis as any).kodexa_setLogLevel) {\n const result = (globalThis as any).kodexa_setLogLevel(level);\n return result === 'ok';\n }\n console.warn('WASM not loaded yet. Set window.KODEXA_LOG_LEVEL before loading instead.');\n return false;\n} "]}
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/wasm/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEtG,uBAAuB;AACvB,IAAI,YAAY,GAA0B,IAAI,CAAC;AAC/C,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,eAAe,GAAmC,IAAI,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,OAAO,UAAU;IACrB,YAAY,SAAyB;QACnC,2CAA2C;IAC7C,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAe;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,GAAQ;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ;IACrB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,CAAC;QACH,oDAAoD;QACpD,uEAAuE;QACvE,4CAA4C;QAC5C,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,2EAA2E;YAC3E,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW;gBAC9C,CAAC,CAAC,GAAI,UAAkB,CAAC,oBAAoB,IAAI,SAAS,gBAAgB;gBAC1E,CAAC,CAAC,SAAS,CAAC;YACd,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;YAClC,iBAAiB,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,SAAsB,CAAC;QAE3B,uCAAuC;QACvC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,sBAAsB;YACtB,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAE7B,kCAAkC;YAClC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAChC,UAAkB,CAAC,MAAM,GAAG;oBAC3B,eAAe,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;iBAC1D,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;YACrE,OAAO,CAAC,YAAY,CAAC,CAAC;YAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;YAChE,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,sBAAsB;YACtB,sDAAsD;YACtD,MAAM,WAAW,GAAI,UAAkB,CAAC,oBAAoB,IAAI,SAAS,CAAC;YAE1E,kDAAkD;YAClD,IAAI,CAAE,UAAkB,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,WAAW,GAAG,GAAG,WAAW,eAAe,CAAC;gBAClD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC;oBACzB,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;oBAChC,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;oBACxE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpC,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,WAAW,cAAc,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAClE,CAAC;YACD,SAAS,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC3C,CAAC;QAED,4BAA4B;QAC5B,MAAM,EAAE,GAAG,IAAK,UAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB;QAC3D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC;QAEzE,uBAAuB;QACvB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAExB,6DAA6D;QAC7D,2FAA2F;QAC3F,MAAM,QAAQ,GAAI,UAAkB,CAAC,gBAAgB,IAAI,MAAM,CAAC;QAChE,IAAK,UAAkB,CAAC,kBAAkB,EAAE,CAAC;YAC1C,UAAkB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,YAAY,GAAG,MAAM,CAAC,QAAqC,CAAC;QAC5D,UAAU,GAAG,IAAI,CAAC;QAElB,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,eAAe,GAAG,QAAQ,EAAE,CAAC;IAC7B,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;IACzC,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,MAAM,eAAe,EAAE,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC;YACF,UAAkB,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;QACpB,UAAU,GAAG,KAAK,CAAC;QACnB,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,gCAAgC;IAChC,YAAY,EAAE,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,KAA0C;IACpE,IAAK,UAAkB,CAAC,kBAAkB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAI,UAAkB,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC7D,OAAO,MAAM,KAAK,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["/**\n * WebAssembly loader for Kodexa Go library\n *\n * NOTE: Go WASM with syscall/js uses a different model than typical WASM.\n * Functions are registered on globalThis and accept/return JS values directly.\n * No pointer-based memory management is needed for strings.\n *\n * IMPORTANT: sql.js is initialized BEFORE Go WASM to provide SQLite support.\n */\n\nimport { GoWasmInstance } from './types';\nimport { initializeSqlJs, exposeSqljsBridge, cleanupSqlJs, isSqlJsInitialized } from './sqljs-bridge';\n\n// Global WASM instance\nlet wasmInstance: GoWasmInstance | null = null;\nlet wasmLoaded = false;\nlet wasmLoadPromise: Promise<GoWasmInstance> | null = null;\n\n/**\n * WASM helper for Go-based WASM modules\n *\n * With Go's syscall/js, strings are passed directly between JS and Go.\n * This helper provides utilities for JSON serialization and result parsing.\n */\nexport class WasmHelper {\n constructor(_instance: GoWasmInstance) {\n // Instance stored for potential future use\n }\n\n /**\n * Parse JSON string returned from Go\n */\n parseJsonResult(jsonStr: string): any {\n if (!jsonStr) return null;\n try {\n return JSON.parse(jsonStr);\n } catch (e) {\n console.error('Failed to parse JSON result:', jsonStr, e);\n return null;\n }\n }\n\n /**\n * Create JSON string for Go functions\n */\n toJson(obj: any): string {\n return JSON.stringify(obj);\n }\n}\n\n/**\n * Load the WebAssembly module\n */\nasync function loadWasm(): Promise<GoWasmInstance> {\n if (wasmInstance) {\n return wasmInstance;\n }\n\n try {\n // CRITICAL: Initialize sql.js FIRST, before Go WASM\n // This ensures the sql.js bridge functions are available on globalThis\n // when Go WASM starts and tries to use them\n if (!isSqlJsInitialized()) {\n console.log('[loader] Initializing sql.js...');\n // Pass the sql.js WASM URL so it doesn't fall back to the CDN (which 404s)\n const sqlWasmUrl = typeof window !== 'undefined'\n ? `${(globalThis as any).KODEXA_WASM_BASE_URL || '/f/dist'}/sql-wasm.wasm`\n : undefined;\n await initializeSqlJs(sqlWasmUrl);\n exposeSqljsBridge();\n console.log('[loader] sql.js ready');\n }\n\n let wasmBytes: ArrayBuffer;\n\n // Check if we're in Node.js or browser\n if (typeof window === 'undefined') {\n // Node.js environment\n const fs = require('fs');\n const path = require('path');\n\n // Add crypto polyfill for Node.js\n if (!globalThis.crypto) {\n const crypto = require('crypto');\n (globalThis as any).crypto = {\n getRandomValues: (arr: any) => crypto.randomFillSync(arr)\n };\n }\n\n // Load the Go WASM runtime\n const wasmExecPath = path.join(__dirname, '../../dist/wasm_exec.js');\n require(wasmExecPath);\n\n const wasmPath = path.join(__dirname, '../../dist/kodexa.wasm');\n wasmBytes = fs.readFileSync(wasmPath);\n } else {\n // Browser environment\n // Get WASM base URL from global config or use default\n const wasmBaseUrl = (globalThis as any).KODEXA_WASM_BASE_URL || '/f/dist';\n \n // Load wasm_exec.js first (defines globalThis.Go)\n if (!(globalThis as any).Go) {\n const wasmExecUrl = `${wasmBaseUrl}/wasm_exec.js`;\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = wasmExecUrl;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load wasm_exec.js'));\n document.head.appendChild(script);\n });\n }\n\n const wasmUrl = `${wasmBaseUrl}/kodexa.wasm`;\n const response = await fetch(wasmUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch WASM: ${response.statusText}`);\n }\n wasmBytes = await response.arrayBuffer();\n }\n\n // Create Go runtime imports\n const go = new (globalThis as any).Go(); // Go WASM runtime\n const result = await WebAssembly.instantiate(wasmBytes, go.importObject);\n\n // Start the Go program\n go.run(result.instance);\n\n // Configure log level: check for override, default to \"warn\"\n // Users can set window.KODEXA_LOG_LEVEL before loading, or call kodexa_setLogLevel() after\n const logLevel = (globalThis as any).KODEXA_LOG_LEVEL || 'warn';\n if ((globalThis as any).kodexa_setLogLevel) {\n (globalThis as any).kodexa_setLogLevel(logLevel);\n }\n\n wasmInstance = result.instance as unknown as GoWasmInstance;\n wasmLoaded = true;\n\n return wasmInstance;\n } catch (error) {\n console.error('Failed to load WASM module:', error);\n throw new Error(`WASM loading failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Get the loaded WASM instance\n */\nexport async function getWasmInstance(): Promise<GoWasmInstance> {\n if (wasmInstance) {\n return wasmInstance;\n }\n\n if (wasmLoadPromise) {\n return wasmLoadPromise;\n }\n\n wasmLoadPromise = loadWasm();\n return wasmLoadPromise;\n}\n\n/**\n * Get WASM helper for the current instance\n */\nexport async function getWasmHelper(): Promise<WasmHelper> {\n const instance = await getWasmInstance();\n return new WasmHelper(instance);\n}\n\n/**\n * Check if WASM is loaded\n */\nexport function isWasmLoaded(): boolean {\n return wasmLoaded;\n}\n\n/**\n * Initialize WASM (call this before using any Go functions)\n */\nexport async function initWasm(): Promise<void> {\n if (wasmLoaded) {\n return;\n }\n\n await getWasmInstance();\n console.log('✅ Kodexa WASM module loaded successfully');\n}\n\n/**\n * Cleanup WASM resources\n */\nexport function cleanupWasm(): void {\n if (wasmInstance) {\n try {\n (globalThis as any).cleanup();\n } catch (e) {\n console.warn('Error during WASM cleanup:', e);\n }\n wasmInstance = null;\n wasmLoaded = false;\n wasmLoadPromise = null;\n }\n\n // Also cleanup sql.js databases\n cleanupSqlJs();\n}\n\n/**\n * Set the log level for Go WASM logging.\n * Valid levels: \"debug\", \"info\", \"warn\", \"error\"\n * Default is \"warn\" (set during initialization).\n *\n * Can be called anytime after WASM is loaded.\n * To set before loading, use: window.KODEXA_LOG_LEVEL = \"debug\"\n */\nexport function setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): boolean {\n if ((globalThis as any).kodexa_setLogLevel) {\n const result = (globalThis as any).kodexa_setLogLevel(level);\n return result === 'ok';\n }\n console.warn('WASM not loaded yet. Set window.KODEXA_LOG_LEVEL before loading instead.');\n return false;\n} "]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqljs-bridge.d.ts","sourceRoot":"","sources":["../../src/wasm/sqljs-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"sqljs-bridge.d.ts","sourceRoot":"","sources":["../../src/wasm/sqljs-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCrE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAYtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAE/C"}
|
|
@@ -34,8 +34,11 @@ export async function initializeSqlJs(wasmUrl) {
|
|
|
34
34
|
config.locateFile = () => wasmUrl;
|
|
35
35
|
}
|
|
36
36
|
else if (typeof window !== 'undefined') {
|
|
37
|
-
// Browser:
|
|
38
|
-
|
|
37
|
+
// Browser: resolve from the same base URL used for Kodexa WASM files.
|
|
38
|
+
// The CDN fallback (sql.js.org) doesn't reliably serve the correct filename
|
|
39
|
+
// (sql.js requests "sql-wasm-browser.wasm" which 404s on the CDN).
|
|
40
|
+
const baseUrl = globalThis.KODEXA_WASM_BASE_URL || '/f/dist';
|
|
41
|
+
config.locateFile = () => `${baseUrl}/sql-wasm.wasm`;
|
|
39
42
|
}
|
|
40
43
|
// Node.js: sql.js will find the WASM file automatically
|
|
41
44
|
SQL = await initSqlJs(config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqljs-bridge.js","sourceRoot":"","sources":["../../src/wasm/sqljs-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,SAA0B,MAAM,QAAQ,CAAC;AAChD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,SAAS,EACT,WAAW,IAAI,eAAe,EAC9B,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,yBAAyB;AACzB,IAAI,GAAG,GAAuB,IAAI,CAAC;AAEnC,6BAA6B;AAC7B,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB;IACpD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,MAAM,GAA8C,EAAE,CAAC;YAE7D,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;YACpC,CAAC;iBAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBACzC,
|
|
1
|
+
{"version":3,"file":"sqljs-bridge.js","sourceRoot":"","sources":["../../src/wasm/sqljs-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,SAA0B,MAAM,QAAQ,CAAC;AAChD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,SAAS,EACT,WAAW,IAAI,eAAe,EAC9B,YAAY,GACb,MAAM,cAAc,CAAC;AAEtB,yBAAyB;AACzB,IAAI,GAAG,GAAuB,IAAI,CAAC;AAEnC,6BAA6B;AAC7B,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAgB;IACpD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,MAAM,GAA8C,EAAE,CAAC;YAE7D,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;YACpC,CAAC;iBAAM,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBACzC,sEAAsE;gBACtE,4EAA4E;gBAC5E,mEAAmE;gBACnE,MAAM,OAAO,GAAI,UAAkB,CAAC,oBAAoB,IAAI,SAAS,CAAC;gBACtE,MAAM,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,GAAG,OAAO,gBAAgB,CAAC;YACvD,CAAC;YACD,wDAAwD;YAExD,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9B,cAAc,CAAC,GAAG,CAAC,CAAC;YACpB,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,qBAAqB,EAAE,CAAC;IAExB,2CAA2C;IAC3C,MAAM,CAAC,GAAG,UAAiB,CAAC;IAC5B,CAAC,CAAC,YAAY,GAAG,YAAY,CAAC;IAE9B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,SAAS,EAAE,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,CAAC,GAAG,UAAiB,CAAC;IAE5B,oEAAoE;IACpE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,2DAA2D;IAC3D,OAAO,CAAC,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC","sourcesContent":["/**\n * sql.js Bridge for Go WASM (npm package version)\n *\n * This module initializes sql.js (JavaScript SQLite) via npm import\n * and exposes bridge functions to globalThis for Go WASM access.\n *\n * For browser CDN usage, see browser-bridge.ts instead.\n *\n * CRITICAL: This must be initialized BEFORE Go WASM is loaded.\n */\n\nimport initSqlJs, { SqlJsStatic } from 'sql.js';\nimport {\n setSqlInstance,\n exposeBridgeFunctions,\n cleanupOp,\n getDatabase as getDatabaseCore,\n loadDirectOp,\n} from './sqljs-core';\n\n// sql.js static instance\nlet SQL: SqlJsStatic | null = null;\n\n// Track initialization state\nlet initialized = false;\nlet initPromise: Promise<void> | null = null;\n\n/**\n * Initialize sql.js WASM\n * Must be called before any database operations\n */\nexport async function initializeSqlJs(wasmUrl?: string): Promise<void> {\n if (initialized) {\n return;\n }\n\n if (initPromise) {\n return initPromise;\n }\n\n initPromise = (async () => {\n try {\n // Configure sql.js WASM location\n const config: { locateFile?: (file: string) => string } = {};\n\n if (wasmUrl) {\n config.locateFile = () => wasmUrl;\n } else if (typeof window !== 'undefined') {\n // Browser: resolve from the same base URL used for Kodexa WASM files.\n // The CDN fallback (sql.js.org) doesn't reliably serve the correct filename\n // (sql.js requests \"sql-wasm-browser.wasm\" which 404s on the CDN).\n const baseUrl = (globalThis as any).KODEXA_WASM_BASE_URL || '/f/dist';\n config.locateFile = () => `${baseUrl}/sql-wasm.wasm`;\n }\n // Node.js: sql.js will find the WASM file automatically\n\n SQL = await initSqlJs(config);\n setSqlInstance(SQL);\n initialized = true;\n } catch (error) {\n console.error('[sql.js] Initialization failed:', error);\n throw error;\n }\n })();\n\n return initPromise;\n}\n\n/**\n * Check if sql.js is initialized\n */\nexport function isSqlJsInitialized(): boolean {\n return initialized;\n}\n\n/**\n * Expose sql.js bridge functions to globalThis for Go WASM access\n * Must be called after initializeSqlJs() and before loading Go WASM\n */\nexport function exposeSqljsBridge(): void {\n exposeBridgeFunctions();\n\n // Expose additional npm-specific functions\n const g = globalThis as any;\n g.loadDocument = loadDocument;\n\n console.log('[sql.js] Bridge functions exposed to globalThis');\n}\n\n/**\n * Cleanup all databases and reset state\n */\nexport function cleanupSqlJs(): void {\n cleanupOp();\n}\n\n/**\n * Load document: loads bytes directly into sql.js and passes handle to Go.\n * Go handles migration if needed. This avoids the bytes round-trip for ALL documents.\n * @param bytes Raw KDDB file bytes (Uint8Array)\n * @returns Document reference or 0 on error\n */\nexport function loadDocument(bytes: Uint8Array): number {\n const g = globalThis as any;\n\n // Load directly into sql.js (fast - no bytes round-trip through Go)\n const handle = loadDirectOp(bytes);\n if (handle === 0) {\n console.error('[sql.js] Failed to load database');\n return 0;\n }\n\n // Pass handle to Go - it will detect and migrate if needed\n return g.createDocumentFromHandle(handle);\n}\n\n/**\n * Get a database by handle (for debugging from console)\n */\nexport function getDatabase(handle: number): any {\n return getDatabaseCore(handle);\n}\n"]}
|
package/dist/wasm/sqljs-core.js
CHANGED
|
@@ -312,7 +312,7 @@ export function queryOp(handle, sql, paramsJson) {
|
|
|
312
312
|
catch (err) {
|
|
313
313
|
error = String(err);
|
|
314
314
|
console.error('[sql.js] Query failed:', sql, err);
|
|
315
|
-
|
|
315
|
+
throw err;
|
|
316
316
|
}
|
|
317
317
|
finally {
|
|
318
318
|
perfTracer.recordQuery(sql, paramsJson, startTime, performance.now(), rowCount, error);
|