@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.
Files changed (103) hide show
  1. package/README.md +73 -1
  2. package/dist/client/index.d.ts +47 -0
  3. package/dist/client/index.d.ts.map +1 -0
  4. package/dist/client/index.js +47 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/client/postgres-client.d.ts +273 -0
  7. package/dist/client/postgres-client.d.ts.map +1 -0
  8. package/dist/client/postgres-client.js +389 -0
  9. package/dist/client/postgres-client.js.map +1 -0
  10. package/dist/client/types.d.ts +167 -0
  11. package/dist/client/types.d.ts.map +1 -0
  12. package/dist/client/types.js +7 -0
  13. package/dist/client/types.js.map +1 -0
  14. package/dist/do/index.d.ts +18 -0
  15. package/dist/do/index.d.ts.map +1 -0
  16. package/dist/do/index.js +18 -0
  17. package/dist/do/index.js.map +1 -0
  18. package/dist/do/postgres.d.ts +110 -0
  19. package/dist/do/postgres.d.ts.map +1 -0
  20. package/dist/do/postgres.js +266 -0
  21. package/dist/do/postgres.js.map +1 -0
  22. package/dist/do/sql.d.ts +92 -0
  23. package/dist/do/sql.d.ts.map +1 -0
  24. package/dist/do/sql.js +204 -0
  25. package/dist/do/sql.js.map +1 -0
  26. package/dist/index.d.ts +25 -30
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +29 -30
  29. package/dist/index.js.map +1 -1
  30. package/dist/mcp/binding.d.ts +47 -0
  31. package/dist/mcp/binding.d.ts.map +1 -0
  32. package/dist/mcp/binding.js +183 -0
  33. package/dist/mcp/binding.js.map +1 -0
  34. package/dist/mcp/index.d.ts +92 -0
  35. package/dist/mcp/index.d.ts.map +1 -0
  36. package/dist/mcp/index.js +91 -0
  37. package/dist/mcp/index.js.map +1 -0
  38. package/dist/mcp/server.d.ts +62 -0
  39. package/dist/mcp/server.d.ts.map +1 -0
  40. package/dist/mcp/server.js +278 -0
  41. package/dist/mcp/server.js.map +1 -0
  42. package/dist/mcp/tools.d.ts +58 -0
  43. package/dist/mcp/tools.d.ts.map +1 -0
  44. package/dist/mcp/tools.js +356 -0
  45. package/dist/mcp/tools.js.map +1 -0
  46. package/dist/mcp/types.d.ts +139 -0
  47. package/dist/mcp/types.d.ts.map +1 -0
  48. package/dist/mcp/types.js +7 -0
  49. package/dist/mcp/types.js.map +1 -0
  50. package/dist/pglite/workers-pglite.d.ts +13 -4
  51. package/dist/pglite/workers-pglite.d.ts.map +1 -1
  52. package/dist/pglite/workers-pglite.js +110 -5
  53. package/dist/pglite/workers-pglite.js.map +1 -1
  54. package/dist/pglite-assets/pglite.data +0 -0
  55. package/dist/pglite-assets/pglite.wasm +0 -0
  56. package/dist/worker/background-pglite-manager.d.ts +243 -0
  57. package/dist/worker/background-pglite-manager.d.ts.map +1 -0
  58. package/dist/worker/background-pglite-manager.js +528 -0
  59. package/dist/worker/background-pglite-manager.js.map +1 -0
  60. package/dist/worker/do-pglite-manager.d.ts +77 -0
  61. package/dist/worker/do-pglite-manager.d.ts.map +1 -1
  62. package/dist/worker/do-pglite-manager.js +189 -12
  63. package/dist/worker/do-pglite-manager.js.map +1 -1
  64. package/dist/worker/index.d.ts +7 -1
  65. package/dist/worker/index.d.ts.map +1 -1
  66. package/dist/worker/index.js +19 -1
  67. package/dist/worker/index.js.map +1 -1
  68. package/dist/worker/lazy-pglite-manager.d.ts +242 -0
  69. package/dist/worker/lazy-pglite-manager.d.ts.map +1 -0
  70. package/dist/worker/lazy-pglite-manager.js +463 -0
  71. package/dist/worker/lazy-pglite-manager.js.map +1 -0
  72. package/package.json +16 -3
  73. package/src/client/index.ts +61 -0
  74. package/src/client/postgres-client.ts +442 -0
  75. package/src/client/types.ts +211 -0
  76. package/src/do/index.ts +18 -0
  77. package/src/do/postgres.ts +367 -0
  78. package/src/do/sql.ts +280 -0
  79. package/src/index.ts +50 -30
  80. package/src/mcp/binding.ts +236 -0
  81. package/src/mcp/index.ts +122 -0
  82. package/src/mcp/server.ts +361 -0
  83. package/src/mcp/tools.ts +464 -0
  84. package/src/mcp/types.ts +148 -0
  85. package/src/pglite/workers-pglite.ts +141 -12
  86. package/src/pglite-assets/pglite.data +0 -0
  87. package/src/pglite-assets/pglite.wasm +0 -0
  88. package/src/worker/background-pglite-manager.ts +680 -0
  89. package/src/worker/do-pglite-manager.ts +235 -19
  90. package/src/worker/index.ts +71 -1
  91. package/src/worker/lazy-pglite-manager.ts +595 -0
  92. package/dist/iceberg/duckdb-wasm.d.ts +0 -447
  93. package/dist/iceberg/duckdb-wasm.d.ts.map +0 -1
  94. package/dist/iceberg/duckdb-wasm.js +0 -600
  95. package/dist/iceberg/duckdb-wasm.js.map +0 -1
  96. package/dist/iceberg/test-fixtures.d.ts +0 -151
  97. package/dist/iceberg/test-fixtures.d.ts.map +0 -1
  98. package/dist/iceberg/test-fixtures.js +0 -446
  99. package/dist/iceberg/test-fixtures.js.map +0 -1
  100. package/dist/worker/__mocks__/cloudflare-workers.d.ts +0 -31
  101. package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +0 -1
  102. package/dist/worker/__mocks__/cloudflare-workers.js +0 -33
  103. 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
- import { PGlite } from '@dotdo/pglite';
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 PGliteWorkers that provides a compatible interface
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
- // Convert fsBundle to ArrayBuffer if needed
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 PGliteWorkers instance
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
- const pglite = await PGlite.create(pgliteOptions);
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":"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"}
1
+ {"version":3,"file":"workers-pglite.js","sourceRoot":"","sources":["../../src/pglite/workers-pglite.ts"],"names":[],"mappings":"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"}
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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"}