@dotdo/postgres 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -1
- package/dist/client/index.d.ts +47 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +47 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/postgres-client.d.ts +273 -0
- package/dist/client/postgres-client.d.ts.map +1 -0
- package/dist/client/postgres-client.js +389 -0
- package/dist/client/postgres-client.js.map +1 -0
- package/dist/client/types.d.ts +167 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +7 -0
- package/dist/client/types.js.map +1 -0
- package/dist/do/index.d.ts +18 -0
- package/dist/do/index.d.ts.map +1 -0
- package/dist/do/index.js +18 -0
- package/dist/do/index.js.map +1 -0
- package/dist/do/postgres.d.ts +110 -0
- package/dist/do/postgres.d.ts.map +1 -0
- package/dist/do/postgres.js +266 -0
- package/dist/do/postgres.js.map +1 -0
- package/dist/do/sql.d.ts +92 -0
- package/dist/do/sql.d.ts.map +1 -0
- package/dist/do/sql.js +204 -0
- package/dist/do/sql.js.map +1 -0
- package/dist/index.d.ts +25 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +29 -30
- package/dist/index.js.map +1 -1
- package/dist/mcp/binding.d.ts +47 -0
- package/dist/mcp/binding.d.ts.map +1 -0
- package/dist/mcp/binding.js +183 -0
- package/dist/mcp/binding.js.map +1 -0
- package/dist/mcp/index.d.ts +92 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +91 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +62 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +278 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +58 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +356 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +139 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +7 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/pglite/workers-pglite.d.ts +13 -4
- package/dist/pglite/workers-pglite.d.ts.map +1 -1
- package/dist/pglite/workers-pglite.js +110 -5
- package/dist/pglite/workers-pglite.js.map +1 -1
- package/dist/pglite-assets/pglite.data +0 -0
- package/dist/pglite-assets/pglite.wasm +0 -0
- package/dist/worker/background-pglite-manager.d.ts +243 -0
- package/dist/worker/background-pglite-manager.d.ts.map +1 -0
- package/dist/worker/background-pglite-manager.js +528 -0
- package/dist/worker/background-pglite-manager.js.map +1 -0
- package/dist/worker/do-pglite-manager.d.ts +77 -0
- package/dist/worker/do-pglite-manager.d.ts.map +1 -1
- package/dist/worker/do-pglite-manager.js +189 -12
- package/dist/worker/do-pglite-manager.js.map +1 -1
- package/dist/worker/index.d.ts +7 -1
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +19 -1
- package/dist/worker/index.js.map +1 -1
- package/dist/worker/lazy-pglite-manager.d.ts +242 -0
- package/dist/worker/lazy-pglite-manager.d.ts.map +1 -0
- package/dist/worker/lazy-pglite-manager.js +463 -0
- package/dist/worker/lazy-pglite-manager.js.map +1 -0
- package/package.json +16 -3
- package/src/client/index.ts +61 -0
- package/src/client/postgres-client.ts +442 -0
- package/src/client/types.ts +211 -0
- package/src/do/index.ts +18 -0
- package/src/do/postgres.ts +367 -0
- package/src/do/sql.ts +280 -0
- package/src/index.ts +50 -30
- package/src/mcp/binding.ts +236 -0
- package/src/mcp/index.ts +122 -0
- package/src/mcp/server.ts +361 -0
- package/src/mcp/tools.ts +464 -0
- package/src/mcp/types.ts +148 -0
- package/src/pglite/workers-pglite.ts +141 -12
- package/src/pglite-assets/pglite.data +0 -0
- package/src/pglite-assets/pglite.wasm +0 -0
- package/src/worker/background-pglite-manager.ts +680 -0
- package/src/worker/do-pglite-manager.ts +235 -19
- package/src/worker/index.ts +71 -1
- package/src/worker/lazy-pglite-manager.ts +595 -0
- package/dist/iceberg/duckdb-wasm.d.ts +0 -447
- package/dist/iceberg/duckdb-wasm.d.ts.map +0 -1
- package/dist/iceberg/duckdb-wasm.js +0 -600
- package/dist/iceberg/duckdb-wasm.js.map +0 -1
- package/dist/iceberg/test-fixtures.d.ts +0 -151
- package/dist/iceberg/test-fixtures.d.ts.map +0 -1
- package/dist/iceberg/test-fixtures.js +0 -446
- package/dist/iceberg/test-fixtures.js.map +0 -1
- package/dist/worker/__mocks__/cloudflare-workers.d.ts +0 -31
- package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +0 -1
- package/dist/worker/__mocks__/cloudflare-workers.js +0 -33
- package/dist/worker/__mocks__/cloudflare-workers.js.map +0 -1
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
* - Properly handles fsBundle as ArrayBuffer or Blob
|
|
12
12
|
* - Provides query/exec/transaction interface compatible with PostgresDO
|
|
13
13
|
*
|
|
14
|
+
* IMPORTANT: This module uses dynamic imports to ensure environment patches
|
|
15
|
+
* are applied BEFORE pglite.js is evaluated. The Emscripten-generated code
|
|
16
|
+
* checks `typeof WorkerGlobalScope` at module load time, which must happen
|
|
17
|
+
* AFTER we've patched the global environment.
|
|
18
|
+
*
|
|
14
19
|
* @example
|
|
15
20
|
* ```typescript
|
|
16
21
|
* import { createWorkersPGLite } from './workers-pglite'
|
|
@@ -27,12 +32,73 @@
|
|
|
27
32
|
* console.log(result.rows[0].sum) // 2
|
|
28
33
|
* ```
|
|
29
34
|
*/
|
|
30
|
-
|
|
35
|
+
// Flag to track if patches have been applied
|
|
36
|
+
let patchesApplied = false;
|
|
37
|
+
/**
|
|
38
|
+
* Apply Cloudflare Workers compatibility patches for Emscripten.
|
|
39
|
+
*
|
|
40
|
+
* CRITICAL: This must be called BEFORE importing @dotdo/pglite.
|
|
41
|
+
* The pglite.js module checks `typeof WorkerGlobalScope` at module load time
|
|
42
|
+
* to determine if it's running in a web worker. In Cloudflare Workers,
|
|
43
|
+
* WorkerGlobalScope exists but the environment is not a full web worker,
|
|
44
|
+
* causing Emscripten to use incompatible code paths.
|
|
45
|
+
*
|
|
46
|
+
* This function patches the global environment to make Emscripten think
|
|
47
|
+
* it's running in a regular web browser environment.
|
|
48
|
+
*/
|
|
49
|
+
function applyWorkersPatches() {
|
|
50
|
+
if (patchesApplied) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const g = globalThis;
|
|
54
|
+
// Create a minimal browser-like environment
|
|
55
|
+
// This helps Emscripten's ENVIRONMENT=web mode work in CF Workers
|
|
56
|
+
const mockLocation = {
|
|
57
|
+
href: 'https://localhost/',
|
|
58
|
+
pathname: '/',
|
|
59
|
+
protocol: 'https:',
|
|
60
|
+
host: 'localhost',
|
|
61
|
+
hostname: 'localhost',
|
|
62
|
+
port: '',
|
|
63
|
+
search: '',
|
|
64
|
+
hash: '',
|
|
65
|
+
origin: 'https://localhost',
|
|
66
|
+
};
|
|
67
|
+
g.window = {
|
|
68
|
+
sessionStorage: {},
|
|
69
|
+
localStorage: {},
|
|
70
|
+
location: mockLocation,
|
|
71
|
+
encodeURIComponent: encodeURIComponent,
|
|
72
|
+
decodeURIComponent: decodeURIComponent,
|
|
73
|
+
encodeURI: encodeURI,
|
|
74
|
+
decodeURI: decodeURI,
|
|
75
|
+
atob: atob,
|
|
76
|
+
btoa: btoa,
|
|
77
|
+
fetch: fetch,
|
|
78
|
+
URL: URL,
|
|
79
|
+
Blob: Blob,
|
|
80
|
+
crypto: crypto,
|
|
81
|
+
};
|
|
82
|
+
g.document = {
|
|
83
|
+
createElement: () => ({}),
|
|
84
|
+
currentScript: null,
|
|
85
|
+
location: mockLocation,
|
|
86
|
+
};
|
|
87
|
+
g.location = mockLocation;
|
|
88
|
+
g.sessionStorage = {};
|
|
89
|
+
// CRITICAL: Disable WorkerGlobalScope to prevent Emscripten from detecting
|
|
90
|
+
// this as a worker and trying to use worker-specific APIs that CF Workers
|
|
91
|
+
// don't fully support
|
|
92
|
+
g.WorkerGlobalScope = undefined;
|
|
93
|
+
patchesApplied = true;
|
|
94
|
+
}
|
|
31
95
|
/**
|
|
32
|
-
* Wrapper around
|
|
96
|
+
* Wrapper around PGlite that provides a compatible interface
|
|
33
97
|
* for PostgresDO and handles fsBundle conversion
|
|
34
98
|
*/
|
|
35
99
|
export class WorkersPGLite {
|
|
100
|
+
// Using 'any' here because PGlite type is not available at compile time
|
|
101
|
+
// due to dynamic import. The actual type is PGlite from @dotdo/pglite.
|
|
36
102
|
pglite;
|
|
37
103
|
_ready = false;
|
|
38
104
|
constructor(pglite) {
|
|
@@ -41,9 +107,19 @@ export class WorkersPGLite {
|
|
|
41
107
|
}
|
|
42
108
|
/**
|
|
43
109
|
* Create a new WorkersPGLite instance
|
|
110
|
+
*
|
|
111
|
+
* IMPORTANT: This method uses dynamic import to load @dotdo/pglite
|
|
112
|
+
* AFTER applying environment patches. This is necessary because
|
|
113
|
+
* pglite.js evaluates environment detection code at module load time.
|
|
44
114
|
*/
|
|
45
115
|
static async create(options) {
|
|
46
|
-
//
|
|
116
|
+
// Step 1: Apply Cloudflare Workers compatibility patches FIRST
|
|
117
|
+
// This MUST happen before importing @dotdo/pglite
|
|
118
|
+
applyWorkersPatches();
|
|
119
|
+
// Step 2: Now dynamically import @dotdo/pglite
|
|
120
|
+
// The patches are already applied, so Emscripten will see the correct environment
|
|
121
|
+
const { PGlite } = await import('@dotdo/pglite');
|
|
122
|
+
// Step 3: Convert fsBundle to ArrayBuffer if needed
|
|
47
123
|
let fsBundleBuffer;
|
|
48
124
|
if (options.fsBundle instanceof ArrayBuffer) {
|
|
49
125
|
fsBundleBuffer = options.fsBundle;
|
|
@@ -73,7 +149,7 @@ export class WorkersPGLite {
|
|
|
73
149
|
// Fallback for any other type - attempt to use as-is
|
|
74
150
|
fsBundleBuffer = options.fsBundle;
|
|
75
151
|
}
|
|
76
|
-
// Create
|
|
152
|
+
// Step 4: Create PGlite instance
|
|
77
153
|
// fsBundle expects Blob | File, so wrap the ArrayBuffer in a Blob
|
|
78
154
|
const pgliteOptions = {
|
|
79
155
|
wasmModule: options.wasmModule,
|
|
@@ -81,7 +157,36 @@ export class WorkersPGLite {
|
|
|
81
157
|
database: options.database ?? 'postgres',
|
|
82
158
|
debug: options.debug ?? 0,
|
|
83
159
|
};
|
|
84
|
-
|
|
160
|
+
console.log('[WorkersPGLite] Starting PGlite initialization...');
|
|
161
|
+
console.log('[WorkersPGLite] wasmModule type:', typeof options.wasmModule);
|
|
162
|
+
console.log('[WorkersPGLite] fsBundle size:', fsBundleBuffer.byteLength);
|
|
163
|
+
console.log('[WorkersPGLite] Patches applied before import:', patchesApplied);
|
|
164
|
+
// Environment debug info
|
|
165
|
+
const g = globalThis;
|
|
166
|
+
console.log('[WorkersPGLite] ENV CHECK - window:', typeof g.window);
|
|
167
|
+
console.log('[WorkersPGLite] ENV CHECK - WorkerGlobalScope:', typeof g.WorkerGlobalScope);
|
|
168
|
+
console.log('[WorkersPGLite] ENV CHECK - document:', typeof g.document);
|
|
169
|
+
console.log('[WorkersPGLite] ENV CHECK - location:', typeof g.location);
|
|
170
|
+
console.log('[WorkersPGLite] ENV CHECK - process:', typeof g.process);
|
|
171
|
+
let pglite;
|
|
172
|
+
try {
|
|
173
|
+
console.log('[WorkersPGLite] Calling PGlite.create()...');
|
|
174
|
+
pglite = await PGlite.create(pgliteOptions);
|
|
175
|
+
console.log('[WorkersPGLite] PGlite created successfully');
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
console.error('[WorkersPGLite] PGlite.create failed:', error);
|
|
179
|
+
// Try to get more information about the error
|
|
180
|
+
if (error instanceof Error) {
|
|
181
|
+
console.error('[WorkersPGLite] Error name:', error.name);
|
|
182
|
+
console.error('[WorkersPGLite] Error message:', error.message);
|
|
183
|
+
console.error('[WorkersPGLite] Error stack:', error.stack);
|
|
184
|
+
}
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
// Note: We intentionally do NOT restore the original globals after initialization
|
|
188
|
+
// because pglite.js caches the environment detection results and may still need
|
|
189
|
+
// the mocked globals for subsequent operations.
|
|
85
190
|
return new WorkersPGLite(pglite);
|
|
86
191
|
}
|
|
87
192
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers-pglite.js","sourceRoot":"","sources":["../../src/pglite/workers-pglite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"workers-pglite.js","sourceRoot":"","sources":["../../src/pglite/workers-pglite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAoEH,6CAA6C;AAC7C,IAAI,cAAc,GAAG,KAAK,CAAA;AAE1B;;;;;;;;;;;GAWG;AACH,SAAS,mBAAmB;IAC1B,IAAI,cAAc,EAAE,CAAC;QACnB,OAAM;IACR,CAAC;IAED,MAAM,CAAC,GAAG,UAAqC,CAAA;IAE/C,4CAA4C;IAC5C,kEAAkE;IAClE,MAAM,YAAY,GAAG;QACnB,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;QACV,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,mBAAmB;KAC5B,CAAA;IAED,CAAC,CAAC,MAAM,GAAG;QACT,cAAc,EAAE,EAAE;QAClB,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,YAAY;QACtB,kBAAkB,EAAE,kBAAkB;QACtC,kBAAkB,EAAE,kBAAkB;QACtC,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;KACf,CAAA;IAED,CAAC,CAAC,QAAQ,GAAG;QACX,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACzB,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,YAAY;KACvB,CAAA;IAED,CAAC,CAAC,QAAQ,GAAG,YAAY,CAAA;IACzB,CAAC,CAAC,cAAc,GAAG,EAAE,CAAA;IAErB,2EAA2E;IAC3E,0EAA0E;IAC1E,sBAAsB;IACtB,CAAC,CAAC,iBAAiB,GAAG,SAAS,CAAA;IAE/B,cAAc,GAAG,IAAI,CAAA;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB,wEAAwE;IACxE,uEAAuE;IAC/D,MAAM,CAAK;IACX,MAAM,GAAY,KAAK,CAAA;IAE/B,YAAoB,MAAW;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAA6B;QAC/C,+DAA+D;QAC/D,kDAAkD;QAClD,mBAAmB,EAAE,CAAA;QAErB,+CAA+C;QAC/C,kFAAkF;QAClF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;QAEhD,oDAAoD;QACpD,IAAI,cAA2B,CAAA;QAE/B,IAAI,OAAO,CAAC,QAAQ,YAAY,WAAW,EAAE,CAAC;YAC5C,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAA;QACnC,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,YAAY,IAAI,EAAE,CAAC;YAC5C,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,YAAY,cAAc,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;YAC/C,cAAc,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAA;QAC/C,CAAC;aAAM,IAAI,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,qEAAqE;YACrE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAA;YAC7B,IAAI,IAAI,CAAC,MAAM,YAAY,WAAW,EAAE,CAAC;gBACvC,0CAA0C;gBAC1C,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAA;YACxF,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;gBAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;gBACvE,cAAc,GAAG,IAAI,CAAC,MAAM,CAAA;YAC9B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,qDAAqD;YACrD,cAAc,GAAG,OAAO,CAAC,QAAuB,CAAA;QAClD,CAAC;QAED,iCAAiC;QACjC,kEAAkE;QAClE,MAAM,aAAa,GAAkB;YACnC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC;YACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,UAAU;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;SAC1B,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAA;QAChE,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE,OAAO,OAAO,CAAC,UAAU,CAAC,CAAA;QAC1E,OAAO,CAAC,GAAG,CAAC,gCAAgC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;QACxE,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,cAAc,CAAC,CAAA;QAE7E,yBAAyB;QACzB,MAAM,CAAC,GAAG,UAAqC,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;QACnE,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAA;QACzF,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;QAErE,IAAI,MAAmC,CAAA;QACvC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAA;YACzD,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;YAC3C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAA;YAC7D,8CAA8C;YAC9C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;gBACxD,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC9D,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;YAC5D,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QAED,kFAAkF;QAClF,gFAAgF;QAChF,gDAAgD;QAEhD,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED;;;OAGG;IACH,IAAI,SAAS;QACX,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAc,GAAW,EAAE,MAAkB;QAKtD,+DAA+D;QAC/D,gEAAgE;QAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAIjD,CAAA;QAED,MAAM,WAAW,GAIb;YACF,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC5B,CAAA;QACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,WAAW,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAA;QAChD,CAAC;QACD,OAAO,WAAW,CAAA;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA6B;IACrE,OAAO,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,aAAa,CAAA;AACvC,CAAC"}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background PGLite Manager for PostgresDO
|
|
3
|
+
*
|
|
4
|
+
* This module implements a "eager-but-non-blocking" loading pattern:
|
|
5
|
+
* - WASM loading starts immediately on initialize() but doesn't block
|
|
6
|
+
* - Non-query endpoints respond instantly while WASM loads in background
|
|
7
|
+
* - Queries wait for WASM if not ready, but loading already started
|
|
8
|
+
* - Uses ctx.waitUntil() to keep DO alive during background loading
|
|
9
|
+
*
|
|
10
|
+
* ## Why This is Better Than Pure Lazy Loading
|
|
11
|
+
*
|
|
12
|
+
* Pure lazy loading just kicks the can down the road:
|
|
13
|
+
* - First query still pays full ~1200ms WASM load time
|
|
14
|
+
*
|
|
15
|
+
* Background loading gives us the best of both worlds:
|
|
16
|
+
* - Non-query endpoints respond instantly
|
|
17
|
+
* - WASM starts loading immediately
|
|
18
|
+
* - First query only waits for remaining load time (often near-zero)
|
|
19
|
+
* - If query arrives before WASM ready, it waits but loading is already in progress
|
|
20
|
+
*
|
|
21
|
+
* ## Usage with Durable Objects
|
|
22
|
+
*
|
|
23
|
+
* ```typescript
|
|
24
|
+
* export class MyDO extends DurableObject {
|
|
25
|
+
* private manager: BackgroundPGLiteManager
|
|
26
|
+
*
|
|
27
|
+
* constructor(ctx: DurableObjectState, env: Env) {
|
|
28
|
+
* super(ctx, env)
|
|
29
|
+
* this.manager = new BackgroundPGLiteManager({
|
|
30
|
+
* database: 'mydb',
|
|
31
|
+
* waitUntil: (p) => ctx.waitUntil(p), // Keep DO alive during load
|
|
32
|
+
* })
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* async init() {
|
|
36
|
+
* // Starts WASM loading in background, returns immediately
|
|
37
|
+
* await this.manager.initialize()
|
|
38
|
+
* }
|
|
39
|
+
*
|
|
40
|
+
* // Health check - responds instantly, triggers background load if needed
|
|
41
|
+
* async ping() {
|
|
42
|
+
* return { ok: true, wasmLoading: this.manager.isLoading() }
|
|
43
|
+
* }
|
|
44
|
+
*
|
|
45
|
+
* // Query - waits for WASM if not ready
|
|
46
|
+
* async query(sql: string) {
|
|
47
|
+
* return this.manager.query(sql)
|
|
48
|
+
* }
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @module worker/background-pglite-manager
|
|
53
|
+
*/
|
|
54
|
+
import type { PostgresConfig } from './types';
|
|
55
|
+
import { PluginManager } from './plugin-manager';
|
|
56
|
+
import type { PGliteLike } from './do-pglite-manager';
|
|
57
|
+
/**
|
|
58
|
+
* Check if the hoisted PGLite instance exists.
|
|
59
|
+
*/
|
|
60
|
+
export declare function hasBgHoistedPglite(): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Check if WASM loading is in progress.
|
|
63
|
+
*/
|
|
64
|
+
export declare function isBgWasmLoading(): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Get diagnostics about the background hoisted WASM state.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getBgHoistedPgliteDiagnostics(): {
|
|
69
|
+
hasInstance: boolean;
|
|
70
|
+
isLoading: boolean;
|
|
71
|
+
moduleInstanceId: string;
|
|
72
|
+
wasmLoadStartedAt: number | null;
|
|
73
|
+
wasmLoadedAt: number | null;
|
|
74
|
+
loadDurationMs: number | null;
|
|
75
|
+
timeSinceLoadMs: number | null;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Reset the hoisted PGLite instance.
|
|
79
|
+
* WARNING: This should only be used in tests.
|
|
80
|
+
* @internal
|
|
81
|
+
*/
|
|
82
|
+
export declare function resetBgHoistedPglite(): void;
|
|
83
|
+
export type BGWASMLoadingState = 'not_started' | 'loading' | 'loaded' | 'error';
|
|
84
|
+
export interface BackgroundPGLiteManagerConfig {
|
|
85
|
+
/** Database name */
|
|
86
|
+
database?: string;
|
|
87
|
+
/** Enable debug mode */
|
|
88
|
+
debug?: boolean;
|
|
89
|
+
/** Plugin configuration */
|
|
90
|
+
plugins?: PostgresConfig['plugins'];
|
|
91
|
+
/** Custom PGLite factory for testing */
|
|
92
|
+
createPGLite?: () => Promise<PGliteLike>;
|
|
93
|
+
/**
|
|
94
|
+
* Disable WASM hoisting optimization.
|
|
95
|
+
* @default false
|
|
96
|
+
*/
|
|
97
|
+
disableHoisting?: boolean;
|
|
98
|
+
/**
|
|
99
|
+
* waitUntil function from Durable Object context.
|
|
100
|
+
* Used to keep the DO alive while WASM loads in background.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```typescript
|
|
104
|
+
* new BackgroundPGLiteManager({
|
|
105
|
+
* waitUntil: (p) => ctx.waitUntil(p)
|
|
106
|
+
* })
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* BackgroundPGLiteManager starts WASM loading immediately but doesn't block.
|
|
113
|
+
*
|
|
114
|
+
* This gives the best of both worlds:
|
|
115
|
+
* - Non-query endpoints respond instantly
|
|
116
|
+
* - WASM starts loading on first init
|
|
117
|
+
* - Queries wait only for remaining load time (often zero if loaded)
|
|
118
|
+
* - Uses ctx.waitUntil() to keep DO alive during background loading
|
|
119
|
+
*/
|
|
120
|
+
export declare class BackgroundPGLiteManager {
|
|
121
|
+
private pglite;
|
|
122
|
+
private initialized;
|
|
123
|
+
private loadingState;
|
|
124
|
+
private loadError;
|
|
125
|
+
private config;
|
|
126
|
+
private pluginManager;
|
|
127
|
+
private usingHoistedInstance;
|
|
128
|
+
private loadPromise;
|
|
129
|
+
/** Timing metrics for diagnostics */
|
|
130
|
+
private metrics;
|
|
131
|
+
constructor(config?: BackgroundPGLiteManagerConfig);
|
|
132
|
+
/**
|
|
133
|
+
* Initialize the manager.
|
|
134
|
+
*
|
|
135
|
+
* This starts WASM loading in the background but returns immediately.
|
|
136
|
+
* Non-query operations can proceed while WASM loads.
|
|
137
|
+
*
|
|
138
|
+
* If waitUntil is provided, it's used to keep the DO alive during loading.
|
|
139
|
+
*/
|
|
140
|
+
initialize(): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Check if WASM is fully loaded and ready for queries.
|
|
143
|
+
*/
|
|
144
|
+
isWASMLoaded(): boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Check if WASM is currently loading.
|
|
147
|
+
*/
|
|
148
|
+
isLoading(): boolean;
|
|
149
|
+
/**
|
|
150
|
+
* Get the current loading state.
|
|
151
|
+
*/
|
|
152
|
+
getLoadingState(): BGWASMLoadingState;
|
|
153
|
+
/**
|
|
154
|
+
* Get the PGLite instance, waiting for loading to complete if needed.
|
|
155
|
+
* This is called internally by query methods.
|
|
156
|
+
*/
|
|
157
|
+
private getPglite;
|
|
158
|
+
/**
|
|
159
|
+
* Execute a query.
|
|
160
|
+
*
|
|
161
|
+
* If WASM is not loaded yet, this will wait for loading to complete.
|
|
162
|
+
* If WASM is already loaded, this returns immediately after query execution.
|
|
163
|
+
*/
|
|
164
|
+
query<T = unknown>(sql: string, params?: unknown[]): Promise<{
|
|
165
|
+
rows: T[];
|
|
166
|
+
fields: {
|
|
167
|
+
name: string;
|
|
168
|
+
dataTypeID: number;
|
|
169
|
+
}[];
|
|
170
|
+
affectedRows?: number;
|
|
171
|
+
}>;
|
|
172
|
+
/**
|
|
173
|
+
* Execute a SQL statement without returning rows.
|
|
174
|
+
*/
|
|
175
|
+
exec(sql: string): Promise<void>;
|
|
176
|
+
/**
|
|
177
|
+
* Check if the manager is initialized (not the same as WASM loaded).
|
|
178
|
+
*/
|
|
179
|
+
isInitialized(): boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Get the PGLite instance if loaded, null otherwise.
|
|
182
|
+
* Does NOT wait for loading - use for checking readiness.
|
|
183
|
+
*/
|
|
184
|
+
getInstanceOrNull(): PGliteLike | null;
|
|
185
|
+
/**
|
|
186
|
+
* Get the PGLite instance (throws if not loaded).
|
|
187
|
+
* Use query() instead to automatically wait for loading.
|
|
188
|
+
*/
|
|
189
|
+
getInstance(): PGliteLike;
|
|
190
|
+
/**
|
|
191
|
+
* Wait for WASM to be loaded.
|
|
192
|
+
* Call this if you want to ensure WASM is ready before proceeding.
|
|
193
|
+
*/
|
|
194
|
+
ensureWASMLoaded(): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* Check if PGLite is responsive.
|
|
197
|
+
*/
|
|
198
|
+
checkLiveness(): Promise<boolean>;
|
|
199
|
+
/**
|
|
200
|
+
* Get timing metrics for diagnostics.
|
|
201
|
+
*/
|
|
202
|
+
getMetrics(): {
|
|
203
|
+
initializeCalledAt: number | null;
|
|
204
|
+
wasmLoadStartAt: number | null;
|
|
205
|
+
wasmLoadEndAt: number | null;
|
|
206
|
+
wasmLoadDurationMs: number | null;
|
|
207
|
+
firstQueryAt: number | null;
|
|
208
|
+
timeFromInitToFirstQueryMs: number | null;
|
|
209
|
+
isUsingHoistedInstance: boolean;
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Get comprehensive diagnostics.
|
|
213
|
+
*/
|
|
214
|
+
getDiagnostics(): {
|
|
215
|
+
manager: {
|
|
216
|
+
initialized: boolean;
|
|
217
|
+
loadingState: BGWASMLoadingState;
|
|
218
|
+
hasInstance: boolean;
|
|
219
|
+
usingHoistedInstance: boolean;
|
|
220
|
+
error: string | null;
|
|
221
|
+
};
|
|
222
|
+
module: ReturnType<typeof getBgHoistedPgliteDiagnostics>;
|
|
223
|
+
metrics: ReturnType<BackgroundPGLiteManager['getMetrics']>;
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* Close the manager.
|
|
227
|
+
* Note: Does NOT close hoisted instances (they're reused across DO reinstantiations).
|
|
228
|
+
*/
|
|
229
|
+
close(timeoutMs?: number): Promise<void>;
|
|
230
|
+
/**
|
|
231
|
+
* Reset the manager state.
|
|
232
|
+
*/
|
|
233
|
+
reset(): void;
|
|
234
|
+
/**
|
|
235
|
+
* Get the plugin manager.
|
|
236
|
+
*/
|
|
237
|
+
getPluginManager(): PluginManager;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Factory function to create a BackgroundPGLiteManager.
|
|
241
|
+
*/
|
|
242
|
+
export declare function createBackgroundPGLiteManager(config?: BackgroundPGLiteManagerConfig): BackgroundPGLiteManager;
|
|
243
|
+
//# sourceMappingURL=background-pglite-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-pglite-manager.d.ts","sourceRoot":"","sources":["../../src/worker/background-pglite-manager.ts"],"names":[],"mappings":"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"}
|