@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
@@ -0,0 +1,463 @@
1
+ /**
2
+ * Lazy PGLite Manager for PostgresDO
3
+ *
4
+ * SPIKE: Lazy WASM Loading Experiment
5
+ *
6
+ * This module implements a lazy loading variant of PGLiteManager that defers
7
+ * WASM loading until the first query is executed, rather than loading on
8
+ * DO instantiation.
9
+ *
10
+ * ## Hypothesis
11
+ *
12
+ * Loading WASM only on first query (not on DO instantiation) may improve:
13
+ * 1. Cold start perception (faster initial response for non-query endpoints)
14
+ * 2. Memory usage (don't load if no queries made)
15
+ *
16
+ * ## Trade-offs
17
+ *
18
+ * - Eager loading: ~1200ms cold start, all subsequent requests fast
19
+ * - Lazy loading: ~0ms until first query, first query pays ~1200ms, subsequent fast
20
+ *
21
+ * For workloads where:
22
+ * - Many requests hit non-query endpoints (health checks, metadata) -> lazy wins
23
+ * - All requests are queries -> eager wins (same total latency, better predictability)
24
+ * - Mixed workload -> depends on query ratio
25
+ *
26
+ * ## Implementation
27
+ *
28
+ * The manager provides:
29
+ * - `isWASMLoaded()` - Check if WASM is loaded without triggering load
30
+ * - `ensureWASMLoaded()` - Explicitly trigger WASM loading
31
+ * - `query()` - Execute query (lazy loads WASM if needed)
32
+ * - Promise deduplication for concurrent first queries
33
+ *
34
+ * @module worker/lazy-pglite-manager
35
+ */
36
+ import { PluginManager } from './plugin-manager';
37
+ // Import WASM module and data bundle for Workers
38
+ // These are bundled at build time as CompiledWasm and Data modules
39
+ import pgliteWasm from '../pglite-assets/pglite.wasm';
40
+ import pgliteData from '../pglite-assets/pglite.data';
41
+ // Import Workers-compatible PGLite wrapper
42
+ import { createWorkersPGLite } from '../pglite/workers-pglite';
43
+ // =============================================================================
44
+ // Module-Level Lazy WASM State (for hoisting across DO reinstantiation)
45
+ // =============================================================================
46
+ /**
47
+ * Hoisted PGLite instance - survives DO class reinstantiation within same isolate.
48
+ * Same as eager loading, but only populated on first query.
49
+ */
50
+ let lazyHoistedPglite = null;
51
+ /**
52
+ * Promise for in-progress PGLite initialization.
53
+ * Prevents duplicate WASM loading when multiple queries execute concurrently.
54
+ */
55
+ let lazyHoistedPglitePromise = null;
56
+ /**
57
+ * Timestamp when WASM was first loaded (for diagnostics)
58
+ */
59
+ let wasmLoadedAt = null;
60
+ /**
61
+ * Unique identifier for this module instance (for debugging/diagnostics).
62
+ */
63
+ const LAZY_MODULE_INSTANCE_ID = Math.random().toString(36).slice(2, 10);
64
+ /**
65
+ * Check if the lazy hoisted PGLite instance exists.
66
+ */
67
+ export function hasLazyHoistedPglite() {
68
+ return lazyHoistedPglite !== null;
69
+ }
70
+ /**
71
+ * Get diagnostics about the lazy hoisted WASM state.
72
+ */
73
+ export function getLazyHoistedPgliteDiagnostics() {
74
+ const now = Date.now();
75
+ return {
76
+ hasInstance: lazyHoistedPglite !== null,
77
+ hasPendingPromise: lazyHoistedPglitePromise !== null,
78
+ moduleInstanceId: LAZY_MODULE_INSTANCE_ID,
79
+ wasmLoadedAt,
80
+ timeSinceLoad: wasmLoadedAt !== null ? now - wasmLoadedAt : null,
81
+ };
82
+ }
83
+ /**
84
+ * Reset the lazy hoisted PGLite instance.
85
+ * WARNING: This should only be used in tests.
86
+ * @internal
87
+ */
88
+ export function resetLazyHoistedPglite() {
89
+ lazyHoistedPglite = null;
90
+ lazyHoistedPglitePromise = null;
91
+ wasmLoadedAt = null;
92
+ }
93
+ /**
94
+ * Lazily get or create the hoisted PGLite instance.
95
+ *
96
+ * This function is called ONLY when a query is executed, not during
97
+ * manager initialization.
98
+ */
99
+ async function lazyGetOrCreateHoistedPglite(options) {
100
+ // Fast path: already initialized
101
+ if (lazyHoistedPglite) {
102
+ return lazyHoistedPglite;
103
+ }
104
+ // Deduplication: return existing promise if initialization in progress
105
+ if (lazyHoistedPglitePromise) {
106
+ return lazyHoistedPglitePromise;
107
+ }
108
+ const loadStartTime = performance.now();
109
+ // Start initialization
110
+ lazyHoistedPglitePromise = createWorkersPGLite({
111
+ wasmModule: pgliteWasm,
112
+ fsBundle: pgliteData,
113
+ database: options.database ?? 'postgres',
114
+ debug: options.debug ?? 0,
115
+ });
116
+ try {
117
+ lazyHoistedPglite = await lazyHoistedPglitePromise;
118
+ wasmLoadedAt = Date.now();
119
+ const loadDuration = performance.now() - loadStartTime;
120
+ console.log(`[LazyPGLiteManager] WASM LOADED (lazy, on first query) - took ${loadDuration.toFixed(2)}ms, instance: ${LAZY_MODULE_INSTANCE_ID}`);
121
+ return lazyHoistedPglite;
122
+ }
123
+ finally {
124
+ // Clear the promise after resolution (success or failure)
125
+ lazyHoistedPglitePromise = null;
126
+ }
127
+ }
128
+ // =============================================================================
129
+ // LazyPGLiteManager Class
130
+ // =============================================================================
131
+ /**
132
+ * LazyPGLiteManager defers WASM loading until the first query.
133
+ *
134
+ * Unlike the eager PGLiteManager, this manager does NOT load WASM during
135
+ * initialize(). WASM is only loaded when query() or ensureWASMLoaded() is called.
136
+ *
137
+ * Benefits:
138
+ * - Non-query endpoints (health, metadata, stats) respond immediately
139
+ * - Memory is not consumed until queries are actually executed
140
+ * - Better cold start perception for mixed workloads
141
+ *
142
+ * Trade-offs:
143
+ * - First query incurs the full WASM loading time (~1200ms)
144
+ * - Less predictable query latency (first vs subsequent)
145
+ *
146
+ * @example
147
+ * ```typescript
148
+ * const manager = new LazyPGLiteManager({ database: 'mydb' })
149
+ *
150
+ * // Initialize (fast - no WASM loading)
151
+ * await manager.initialize()
152
+ *
153
+ * // Check if WASM is loaded (without triggering load)
154
+ * console.log(manager.isWASMLoaded()) // false
155
+ *
156
+ * // First query triggers WASM load (~1200ms)
157
+ * const result1 = await manager.query('SELECT 1')
158
+ *
159
+ * // Now WASM is loaded
160
+ * console.log(manager.isWASMLoaded()) // true
161
+ *
162
+ * // Subsequent queries are fast (~ms)
163
+ * const result2 = await manager.query('SELECT 2')
164
+ * ```
165
+ */
166
+ export class LazyPGLiteManager {
167
+ pglite = null;
168
+ initialized = false;
169
+ loadingState = 'not_loaded';
170
+ loadError = null;
171
+ config;
172
+ pluginManager;
173
+ /** Track whether this manager is using the hoisted instance */
174
+ usingHoistedInstance = false;
175
+ /** Timing metrics for diagnostics */
176
+ metrics = {
177
+ initializeCalledAt: null,
178
+ firstQueryAt: null,
179
+ wasmLoadStartAt: null,
180
+ wasmLoadEndAt: null,
181
+ };
182
+ constructor(config = {}) {
183
+ this.config = {
184
+ database: config.database ?? 'postgres',
185
+ debug: config.debug ?? false,
186
+ };
187
+ if (config.plugins !== undefined) {
188
+ this.config.plugins = config.plugins;
189
+ }
190
+ if (config.createPGLite !== undefined) {
191
+ this.config.createPGLite = config.createPGLite;
192
+ }
193
+ if (config.disableHoisting !== undefined) {
194
+ this.config.disableHoisting = config.disableHoisting;
195
+ }
196
+ // Build plugin manager config
197
+ const pluginManagerConfig = {};
198
+ if (config.plugins !== undefined) {
199
+ pluginManagerConfig.plugins = config.plugins;
200
+ }
201
+ if (config.debug !== undefined) {
202
+ pluginManagerConfig.debug = config.debug;
203
+ }
204
+ this.pluginManager = new PluginManager(pluginManagerConfig);
205
+ }
206
+ /**
207
+ * Check if the manager is initialized.
208
+ * Note: This returns true after initialize() is called, even if WASM is not loaded.
209
+ */
210
+ isInitialized() {
211
+ return this.initialized;
212
+ }
213
+ /**
214
+ * Check if WASM is loaded (without triggering load).
215
+ * This is the key difference from eager loading.
216
+ */
217
+ isWASMLoaded() {
218
+ return this.pglite !== null;
219
+ }
220
+ /**
221
+ * Get the current WASM loading state.
222
+ */
223
+ getLoadingState() {
224
+ return this.loadingState;
225
+ }
226
+ /**
227
+ * Get any error that occurred during WASM loading.
228
+ */
229
+ getLoadError() {
230
+ return this.loadError;
231
+ }
232
+ /**
233
+ * Get the PGLite instance (throws if not loaded).
234
+ * For lazy loading, prefer using query() which handles loading automatically.
235
+ */
236
+ getInstance() {
237
+ if (!this.pglite) {
238
+ throw new Error('PGLite WASM not loaded. Call ensureWASMLoaded() or query() first.');
239
+ }
240
+ return this.pglite;
241
+ }
242
+ /**
243
+ * Get the PGLite instance or null if not loaded.
244
+ */
245
+ getInstanceOrNull() {
246
+ return this.pglite;
247
+ }
248
+ /**
249
+ * Get the plugin manager.
250
+ */
251
+ getPluginManager() {
252
+ return this.pluginManager;
253
+ }
254
+ /**
255
+ * Get timing metrics for diagnostics.
256
+ */
257
+ getMetrics() {
258
+ const wasmLoadDurationMs = this.metrics.wasmLoadStartAt !== null && this.metrics.wasmLoadEndAt !== null
259
+ ? this.metrics.wasmLoadEndAt - this.metrics.wasmLoadStartAt
260
+ : null;
261
+ const timeToFirstQuery = this.metrics.initializeCalledAt !== null && this.metrics.firstQueryAt !== null
262
+ ? this.metrics.firstQueryAt - this.metrics.initializeCalledAt
263
+ : null;
264
+ return {
265
+ ...this.metrics,
266
+ wasmLoadDurationMs,
267
+ timeToFirstQuery,
268
+ };
269
+ }
270
+ /**
271
+ * Initialize the manager (does NOT load WASM).
272
+ *
273
+ * This is intentionally fast - WASM loading is deferred to first query.
274
+ * Safe to call multiple times.
275
+ */
276
+ async initialize() {
277
+ if (this.initialized) {
278
+ return;
279
+ }
280
+ this.metrics.initializeCalledAt = performance.now();
281
+ this.initialized = true;
282
+ console.log(`[LazyPGLiteManager] Initialized (WASM not loaded yet)`);
283
+ }
284
+ /**
285
+ * Explicitly ensure WASM is loaded.
286
+ *
287
+ * Use this if you want to pre-warm WASM loading before the first query,
288
+ * but still want the option to skip loading entirely for non-query requests.
289
+ */
290
+ async ensureWASMLoaded() {
291
+ if (this.pglite) {
292
+ return;
293
+ }
294
+ await this.loadWASM();
295
+ }
296
+ /**
297
+ * Internal method to load WASM.
298
+ */
299
+ async loadWASM() {
300
+ if (this.pglite) {
301
+ return this.pglite;
302
+ }
303
+ if (this.loadingState === 'loading') {
304
+ // Wait for existing load to complete
305
+ if (lazyHoistedPglitePromise) {
306
+ const result = await lazyHoistedPglitePromise;
307
+ this.pglite = result;
308
+ this.loadingState = 'loaded';
309
+ return result;
310
+ }
311
+ }
312
+ this.loadingState = 'loading';
313
+ this.metrics.wasmLoadStartAt = performance.now();
314
+ try {
315
+ // Use custom factory if provided (for testing)
316
+ if (this.config.createPGLite) {
317
+ this.usingHoistedInstance = false;
318
+ this.pglite = await this.config.createPGLite();
319
+ }
320
+ else if (this.config.disableHoisting) {
321
+ // Create new instance without hoisting
322
+ this.usingHoistedInstance = false;
323
+ console.log(`[LazyPGLiteManager] WASM hoisting disabled - creating new instance`);
324
+ this.pglite = await createWorkersPGLite({
325
+ wasmModule: pgliteWasm,
326
+ fsBundle: pgliteData,
327
+ database: this.config.database ?? 'postgres',
328
+ debug: this.config.debug ? 1 : 0,
329
+ });
330
+ }
331
+ else {
332
+ // Use the lazy hoisted instance
333
+ const wasmWasAlreadyLoaded = lazyHoistedPglite !== null;
334
+ this.pglite = await lazyGetOrCreateHoistedPglite({
335
+ database: this.config.database,
336
+ debug: this.config.debug ? 1 : 0,
337
+ });
338
+ this.usingHoistedInstance = true;
339
+ if (wasmWasAlreadyLoaded) {
340
+ const diagnostics = getLazyHoistedPgliteDiagnostics();
341
+ console.log(`[LazyPGLiteManager] WASM REUSED (lazy hoisted) - loaded ${diagnostics.timeSinceLoad}ms ago, instance: ${diagnostics.moduleInstanceId}`);
342
+ }
343
+ }
344
+ this.metrics.wasmLoadEndAt = performance.now();
345
+ this.loadingState = 'loaded';
346
+ // Wait for ready if needed
347
+ if (this.pglite.waitReady) {
348
+ await this.pglite.waitReady;
349
+ }
350
+ // Run auto-create for plugins
351
+ await this.pluginManager.runAutoCreate(this.pglite);
352
+ return this.pglite;
353
+ }
354
+ catch (error) {
355
+ this.loadingState = 'error';
356
+ this.loadError = error instanceof Error ? error : new Error(String(error));
357
+ throw error;
358
+ }
359
+ }
360
+ /**
361
+ * Execute a query (lazy loads WASM if needed).
362
+ *
363
+ * This is the primary method for interacting with the database.
364
+ * On first call, it will trigger WASM loading.
365
+ */
366
+ async query(sql, params) {
367
+ // Track first query time
368
+ if (this.metrics.firstQueryAt === null) {
369
+ this.metrics.firstQueryAt = performance.now();
370
+ }
371
+ // Lazy load WASM if not loaded
372
+ const pglite = await this.loadWASM();
373
+ // Execute query
374
+ return pglite.query(sql, params);
375
+ }
376
+ /**
377
+ * Check if PGLite is responsive by running a simple query.
378
+ * This will trigger WASM loading if not already loaded.
379
+ */
380
+ async checkLiveness() {
381
+ try {
382
+ const result = await this.query('SELECT 1 as alive');
383
+ return result.rows.length > 0;
384
+ }
385
+ catch {
386
+ return false;
387
+ }
388
+ }
389
+ /**
390
+ * Close PGLite instance.
391
+ */
392
+ async close(timeoutMs = 5000) {
393
+ // If using hoisted instance, don't close it
394
+ if (this.usingHoistedInstance) {
395
+ console.log(`[LazyPGLiteManager] Skipping close of hoisted WASM instance (will be reused)`);
396
+ this.pglite = null;
397
+ this.initialized = false;
398
+ this.usingHoistedInstance = false;
399
+ this.loadingState = 'not_loaded';
400
+ return;
401
+ }
402
+ if (!this.pglite?.close) {
403
+ this.pglite = null;
404
+ this.initialized = false;
405
+ this.loadingState = 'not_loaded';
406
+ return;
407
+ }
408
+ try {
409
+ await Promise.race([
410
+ this.pglite.close(),
411
+ new Promise((_, reject) => setTimeout(() => reject(new Error('PGlite close timeout')), timeoutMs)),
412
+ ]);
413
+ }
414
+ catch (error) {
415
+ console.error('Error closing PGlite:', error);
416
+ }
417
+ this.pglite = null;
418
+ this.initialized = false;
419
+ this.loadingState = 'not_loaded';
420
+ }
421
+ /**
422
+ * Reset manager state (for testing or hibernation recovery).
423
+ */
424
+ reset() {
425
+ this.pglite = null;
426
+ this.initialized = false;
427
+ this.usingHoistedInstance = false;
428
+ this.loadingState = 'not_loaded';
429
+ this.loadError = null;
430
+ this.metrics = {
431
+ initializeCalledAt: null,
432
+ firstQueryAt: null,
433
+ wasmLoadStartAt: null,
434
+ wasmLoadEndAt: null,
435
+ };
436
+ }
437
+ /**
438
+ * Check if this manager is using the hoisted WASM instance.
439
+ */
440
+ isUsingHoistedInstance() {
441
+ return this.usingHoistedInstance;
442
+ }
443
+ /**
444
+ * Get comprehensive diagnostics about lazy loading state.
445
+ */
446
+ getDiagnostics() {
447
+ return {
448
+ initialized: this.initialized,
449
+ wasmLoaded: this.pglite !== null,
450
+ loadingState: this.loadingState,
451
+ usingHoistedInstance: this.usingHoistedInstance,
452
+ metrics: this.getMetrics(),
453
+ hoisted: getLazyHoistedPgliteDiagnostics(),
454
+ };
455
+ }
456
+ }
457
+ /**
458
+ * Factory function to create a LazyPGLiteManager.
459
+ */
460
+ export function createLazyPGLiteManager(config) {
461
+ return new LazyPGLiteManager(config);
462
+ }
463
+ //# sourceMappingURL=lazy-pglite-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-pglite-manager.js","sourceRoot":"","sources":["../../src/worker/lazy-pglite-manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotdo/postgres",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "PostgreSQL server for Cloudflare Workers/DOs with PGLite WASM and tiered storage",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,6 +10,10 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
12
  },
13
+ "./do": {
14
+ "types": "./dist/do/index.d.ts",
15
+ "import": "./dist/do/index.js"
16
+ },
13
17
  "./pglite": {
14
18
  "types": "./dist/pglite/index.d.ts",
15
19
  "import": "./dist/pglite/index.js"
@@ -41,6 +45,14 @@
41
45
  "./migration-tooling": {
42
46
  "types": "./dist/migration-tooling/index.d.ts",
43
47
  "import": "./dist/migration-tooling/index.js"
48
+ },
49
+ "./mcp": {
50
+ "types": "./dist/mcp/index.d.ts",
51
+ "import": "./dist/mcp/index.js"
52
+ },
53
+ "./client": {
54
+ "types": "./dist/client/index.d.ts",
55
+ "import": "./dist/client/index.js"
44
56
  }
45
57
  },
46
58
  "files": [
@@ -65,11 +77,12 @@
65
77
  "clean": "rm -rf dist"
66
78
  },
67
79
  "dependencies": {
68
- "@dotdo/pglite": "^0.1.1",
80
+ "@dotdo/pglite": "^0.1.4",
69
81
  "@dotdo/postgres-shared": "^0.1.2",
70
82
  "capnweb": "^0.4.0",
71
83
  "hono": "^4.0.0",
72
- "postgres.do": "^0.1.2"
84
+ "postgres.do": "^0.1.2",
85
+ "rpc.do": "^0.2.1"
73
86
  },
74
87
  "devDependencies": {
75
88
  "@cloudflare/vitest-pool-workers": "^0.8.0",
@@ -0,0 +1,61 @@
1
+ /**
2
+ * PostgresDO WebSocket Client
3
+ *
4
+ * A typed WebSocket client for PostgresDO with rpc.do integration.
5
+ * Provides automatic reconnection, heartbeat, and first-message authentication.
6
+ *
7
+ * @module client
8
+ *
9
+ * @example Basic usage
10
+ * ```typescript
11
+ * import { createPostgresClient } from '@dotdo/postgres/client'
12
+ *
13
+ * const client = createPostgresClient({
14
+ * url: 'wss://postgres.example.com/ws',
15
+ * auth: 'your-api-key',
16
+ * })
17
+ *
18
+ * // Execute queries
19
+ * const users = await client.query('SELECT * FROM users')
20
+ * const user = await client.queryOne('SELECT * FROM users WHERE id = $1', [1])
21
+ * const count = await client.queryScalar<number>('SELECT COUNT(*) FROM users')
22
+ *
23
+ * // Transactions
24
+ * const tx = await client.transaction()
25
+ * await tx.execute('INSERT INTO users (name) VALUES ($1)', ['Alice'])
26
+ * await tx.commit()
27
+ *
28
+ * // Clean up
29
+ * await client.close()
30
+ * ```
31
+ *
32
+ * @example With oauth.do authentication
33
+ * ```typescript
34
+ * import { createPostgresClient } from '@dotdo/postgres/client'
35
+ * import { oauthProvider } from 'rpc.do/auth'
36
+ *
37
+ * const client = createPostgresClient({
38
+ * url: 'wss://postgres.example.com/ws',
39
+ * auth: oauthProvider(),
40
+ * onConnect: () => console.log('Connected!'),
41
+ * onReconnecting: (attempt) => console.log(`Reconnecting (${attempt})...`),
42
+ * })
43
+ * ```
44
+ */
45
+
46
+ // Main client export
47
+ export { PostgresClient, createPostgresClient } from './postgres-client'
48
+
49
+ // Type exports
50
+ export type {
51
+ PostgresClientConfig,
52
+ PostgresDORpcApi,
53
+ RpcQueryResult,
54
+ RpcBatchQuery,
55
+ RpcBatchResult,
56
+ RpcTransactionOptions,
57
+ TransactionApi,
58
+ ColumnInfo,
59
+ DatabaseStats,
60
+ ConnectionState,
61
+ } from './types'