@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,389 @@
1
+ /**
2
+ * PostgresClient - WebSocket client for PostgresDO with rpc.do integration
3
+ *
4
+ * Provides typed access to PostgresDO's RPC methods over WebSocket with:
5
+ * - Automatic reconnection with exponential backoff
6
+ * - Heartbeat ping/pong for connection health
7
+ * - First-message authentication
8
+ * - Full TypeScript support
9
+ *
10
+ * @module client/postgres-client
11
+ *
12
+ * @example Basic usage
13
+ * ```typescript
14
+ * import { createPostgresClient } from '@dotdo/postgres/client'
15
+ *
16
+ * const client = createPostgresClient({
17
+ * url: 'wss://postgres.example.com/ws',
18
+ * auth: 'your-api-key',
19
+ * })
20
+ *
21
+ * // Execute queries
22
+ * const users = await client.query('SELECT * FROM users')
23
+ * console.log(users.rows)
24
+ *
25
+ * // Single row
26
+ * const user = await client.queryOne('SELECT * FROM users WHERE id = $1', [1])
27
+ *
28
+ * // Scalar value
29
+ * const count = await client.queryScalar<number>('SELECT COUNT(*) FROM users')
30
+ *
31
+ * // Clean up
32
+ * await client.close()
33
+ * ```
34
+ *
35
+ * @example With rpc.do transport
36
+ * ```typescript
37
+ * import { createPostgresClient } from '@dotdo/postgres/client'
38
+ * import { capnweb } from 'rpc.do/transports'
39
+ *
40
+ * // Using capnweb transport with reconnection
41
+ * const client = createPostgresClient({
42
+ * url: 'wss://postgres.example.com/ws',
43
+ * auth: () => localStorage.getItem('token'),
44
+ * autoReconnect: true,
45
+ * onConnect: () => console.log('Connected!'),
46
+ * onReconnecting: (attempt) => console.log(`Reconnecting... (${attempt})`),
47
+ * })
48
+ * ```
49
+ */
50
+ /**
51
+ * PostgresClient - typed WebSocket client for PostgresDO
52
+ *
53
+ * Uses rpc.do's capnweb transport for efficient RPC communication
54
+ * with automatic reconnection and hibernation support.
55
+ */
56
+ export class PostgresClient {
57
+ config;
58
+ rpcClient = null;
59
+ transport = null;
60
+ connectionPromise = null;
61
+ state = 'disconnected';
62
+ constructor(config) {
63
+ this.config = {
64
+ autoReconnect: true,
65
+ maxReconnectAttempts: Infinity,
66
+ reconnectBackoff: 1000,
67
+ maxReconnectBackoff: 30000,
68
+ heartbeatInterval: 30000,
69
+ allowInsecureAuth: false,
70
+ debug: false,
71
+ ...config,
72
+ };
73
+ }
74
+ /**
75
+ * Connect to the PostgresDO WebSocket endpoint
76
+ */
77
+ async connect() {
78
+ if (this.connectionPromise) {
79
+ return this.connectionPromise;
80
+ }
81
+ if (this.state === 'connected' && this.rpcClient) {
82
+ return;
83
+ }
84
+ this.state = 'connecting';
85
+ this.connectionPromise = this.establishConnection();
86
+ try {
87
+ await this.connectionPromise;
88
+ }
89
+ finally {
90
+ this.connectionPromise = null;
91
+ }
92
+ }
93
+ /**
94
+ * Establish the WebSocket connection using rpc.do
95
+ */
96
+ async establishConnection() {
97
+ try {
98
+ // Dynamic import of rpc.do modules to avoid bundling issues
99
+ const [{ RPC }, { ws }] = await Promise.all([
100
+ import('rpc.do'),
101
+ import('rpc.do/transports'),
102
+ ]);
103
+ // Create WebSocket transport
104
+ // Note: For basic authentication and WebSocket connection
105
+ // Advanced reconnection can be added in future rpc.do versions
106
+ const transport = ws(this.config.url, {
107
+ auth: this.config.auth,
108
+ });
109
+ this.transport = transport;
110
+ // Create typed RPC client - use 'any' to avoid complex generic inference issues
111
+ // The PostgresDORpcApi interface ensures proper typing at the API surface
112
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
113
+ this.rpcClient = RPC(transport);
114
+ this.state = 'connected';
115
+ this.config.onConnect?.();
116
+ }
117
+ catch (error) {
118
+ this.state = 'disconnected';
119
+ this.config.onError?.(error instanceof Error ? error : new Error(String(error)));
120
+ throw error;
121
+ }
122
+ }
123
+ /**
124
+ * Ensure we're connected before making RPC calls
125
+ */
126
+ async ensureConnected() {
127
+ if (!this.rpcClient || this.state !== 'connected') {
128
+ await this.connect();
129
+ }
130
+ if (!this.rpcClient) {
131
+ throw new Error('Failed to establish connection');
132
+ }
133
+ return this.rpcClient;
134
+ }
135
+ // ===========================================================================
136
+ // Query Methods
137
+ // ===========================================================================
138
+ /**
139
+ * Execute a SQL query and return full results
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * const result = await client.query('SELECT * FROM users WHERE active = $1', [true])
144
+ * console.log(result.rows)
145
+ * console.log(`${result.rowCount} rows returned in ${result.durationMs}ms`)
146
+ * ```
147
+ */
148
+ async query(sql, params) {
149
+ const rpc = await this.ensureConnected();
150
+ return rpc.rpcQuery(sql, params);
151
+ }
152
+ /**
153
+ * Execute a query and return only the first row
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const user = await client.queryOne('SELECT * FROM users WHERE id = $1', [1])
158
+ * if (user) {
159
+ * console.log(user.name)
160
+ * }
161
+ * ```
162
+ */
163
+ async queryOne(sql, params) {
164
+ const rpc = await this.ensureConnected();
165
+ return rpc.rpcQueryOne(sql, params);
166
+ }
167
+ /**
168
+ * Execute a query and return a scalar value (first column of first row)
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * const count = await client.queryScalar<number>('SELECT COUNT(*) FROM users')
173
+ * console.log(`Total users: ${count}`)
174
+ * ```
175
+ */
176
+ async queryScalar(sql, params) {
177
+ const rpc = await this.ensureConnected();
178
+ return rpc.rpcQueryScalar(sql, params);
179
+ }
180
+ /**
181
+ * Execute a statement that doesn't return rows
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const { rowCount } = await client.execute('DELETE FROM users WHERE inactive = true')
186
+ * console.log(`Deleted ${rowCount} inactive users`)
187
+ * ```
188
+ */
189
+ async execute(sql, params) {
190
+ const rpc = await this.ensureConnected();
191
+ return rpc.rpcExecute(sql, params);
192
+ }
193
+ // ===========================================================================
194
+ // Batch Methods
195
+ // ===========================================================================
196
+ /**
197
+ * Execute multiple queries in a single round trip
198
+ *
199
+ * @example
200
+ * ```typescript
201
+ * const result = await client.batch([
202
+ * { sql: 'SELECT * FROM users' },
203
+ * { sql: 'SELECT * FROM orders' },
204
+ * { sql: 'SELECT * FROM products' },
205
+ * ])
206
+ * const [users, orders, products] = result.results
207
+ * ```
208
+ */
209
+ async batch(queries) {
210
+ const rpc = await this.ensureConnected();
211
+ return rpc.rpcBatch(queries);
212
+ }
213
+ /**
214
+ * Execute multiple queries within a transaction
215
+ *
216
+ * @example
217
+ * ```typescript
218
+ * const result = await client.batchTransaction([
219
+ * { sql: 'INSERT INTO users (name) VALUES ($1)', params: ['Alice'] },
220
+ * { sql: 'INSERT INTO audit_log (action) VALUES ($1)', params: ['user_created'] },
221
+ * ])
222
+ * ```
223
+ */
224
+ async batchTransaction(queries) {
225
+ const rpc = await this.ensureConnected();
226
+ return rpc.rpcBatchTransaction(queries);
227
+ }
228
+ // ===========================================================================
229
+ // Transaction Methods
230
+ // ===========================================================================
231
+ /**
232
+ * Start a transaction and return a transaction API
233
+ *
234
+ * @example
235
+ * ```typescript
236
+ * const tx = await client.transaction()
237
+ * try {
238
+ * await tx.execute('INSERT INTO users (name) VALUES ($1)', ['Alice'])
239
+ * await tx.execute('INSERT INTO audit_log (action) VALUES ($1)', ['user_created'])
240
+ * await tx.commit()
241
+ * } catch (error) {
242
+ * await tx.rollback()
243
+ * throw error
244
+ * }
245
+ * ```
246
+ *
247
+ * @example With isolation level
248
+ * ```typescript
249
+ * const tx = await client.transaction({ isolationLevel: 'SERIALIZABLE' })
250
+ * // ... perform queries
251
+ * await tx.commit()
252
+ * ```
253
+ */
254
+ async transaction(options) {
255
+ const rpc = await this.ensureConnected();
256
+ return rpc.rpcTransaction(options);
257
+ }
258
+ // ===========================================================================
259
+ // Utility Methods
260
+ // ===========================================================================
261
+ /**
262
+ * Health check - verify the database is responsive
263
+ *
264
+ * @example
265
+ * ```typescript
266
+ * const { ok, durationMs } = await client.ping()
267
+ * console.log(`Database responded in ${durationMs}ms`)
268
+ * ```
269
+ */
270
+ async ping() {
271
+ const rpc = await this.ensureConnected();
272
+ return rpc.rpcPing();
273
+ }
274
+ /**
275
+ * Get the PostgreSQL version
276
+ *
277
+ * @example
278
+ * ```typescript
279
+ * const version = await client.version()
280
+ * console.log(`PostgreSQL version: ${version}`)
281
+ * ```
282
+ */
283
+ async version() {
284
+ const rpc = await this.ensureConnected();
285
+ return rpc.rpcVersion();
286
+ }
287
+ /**
288
+ * List all tables in the public schema
289
+ *
290
+ * @example
291
+ * ```typescript
292
+ * const tables = await client.listTables()
293
+ * console.log('Tables:', tables)
294
+ * ```
295
+ */
296
+ async listTables() {
297
+ const rpc = await this.ensureConnected();
298
+ return rpc.rpcListTables();
299
+ }
300
+ /**
301
+ * Get schema information for a table
302
+ *
303
+ * @example
304
+ * ```typescript
305
+ * const columns = await client.describeTable('users')
306
+ * for (const col of columns) {
307
+ * console.log(`${col.column_name}: ${col.data_type}`)
308
+ * }
309
+ * ```
310
+ */
311
+ async describeTable(tableName) {
312
+ const rpc = await this.ensureConnected();
313
+ return rpc.rpcDescribeTable(tableName);
314
+ }
315
+ /**
316
+ * Get database statistics
317
+ *
318
+ * @example
319
+ * ```typescript
320
+ * const stats = await client.getStats()
321
+ * console.log(`Queries: ${stats.queryCount}, Avg: ${stats.avgDurationMs}ms`)
322
+ * ```
323
+ */
324
+ async getStats() {
325
+ const rpc = await this.ensureConnected();
326
+ return rpc.rpcGetStats();
327
+ }
328
+ // ===========================================================================
329
+ // Connection Management
330
+ // ===========================================================================
331
+ /**
332
+ * Get current connection state
333
+ */
334
+ getConnectionState() {
335
+ return this.state;
336
+ }
337
+ /**
338
+ * Check if currently connected
339
+ */
340
+ isConnected() {
341
+ return this.state === 'connected';
342
+ }
343
+ /**
344
+ * Close the connection
345
+ *
346
+ * @example
347
+ * ```typescript
348
+ * await client.close()
349
+ * ```
350
+ */
351
+ async close() {
352
+ if (this.transport) {
353
+ this.transport.close();
354
+ this.transport = null;
355
+ }
356
+ this.rpcClient = null;
357
+ this.state = 'closed';
358
+ }
359
+ }
360
+ /**
361
+ * Create a PostgresClient instance
362
+ *
363
+ * @example Basic usage
364
+ * ```typescript
365
+ * import { createPostgresClient } from '@dotdo/postgres/client'
366
+ *
367
+ * const client = createPostgresClient({
368
+ * url: 'wss://postgres.example.com/ws',
369
+ * auth: 'your-api-key',
370
+ * })
371
+ *
372
+ * const users = await client.query('SELECT * FROM users')
373
+ * ```
374
+ *
375
+ * @example With reconnection callbacks
376
+ * ```typescript
377
+ * const client = createPostgresClient({
378
+ * url: 'wss://postgres.example.com/ws',
379
+ * auth: () => getAuthToken(),
380
+ * onConnect: () => console.log('Connected!'),
381
+ * onDisconnect: (reason) => console.log('Disconnected:', reason),
382
+ * onReconnecting: (attempt) => console.log(`Reconnecting (${attempt})...`),
383
+ * })
384
+ * ```
385
+ */
386
+ export function createPostgresClient(config) {
387
+ return new PostgresClient(config);
388
+ }
389
+ //# sourceMappingURL=postgres-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-client.js","sourceRoot":"","sources":["../../src/client/postgres-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAgBH;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACjB,MAAM,CAAsB;IAC5B,SAAS,GAA4B,IAAI,CAAA;IACzC,SAAS,GAAiC,IAAI,CAAA;IAC9C,iBAAiB,GAAyB,IAAI,CAAA;IAC9C,KAAK,GAAoB,cAAc,CAAA;IAE/C,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,aAAa,EAAE,IAAI;YACnB,oBAAoB,EAAE,QAAQ;YAC9B,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,KAAK;YAC1B,iBAAiB,EAAE,KAAK;YACxB,iBAAiB,EAAE,KAAK;YACxB,KAAK,EAAE,KAAK;YACZ,GAAG,MAAM;SACV,CAAA;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAA;QAC/B,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,YAAY,CAAA;QAEzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,CAAA;QAC9B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC;YACH,4DAA4D;YAC5D,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1C,MAAM,CAAC,QAAQ,CAAC;gBAChB,MAAM,CAAC,mBAAmB,CAAC;aAC5B,CAAC,CAAA;YAEF,6BAA6B;YAC7B,0DAA0D;YAC1D,+DAA+D;YAC/D,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;gBACpC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;aACvB,CAAC,CAAA;YAEF,IAAI,CAAC,SAAS,GAAG,SAAkC,CAAA;YAEnD,gFAAgF;YAChF,0EAA0E;YAC1E,8DAA8D;YAC9D,IAAI,CAAC,SAAS,GAAG,GAAG,CAAM,SAAS,CAAgC,CAAA;YAEnE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;YACxB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAA;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,cAAc,CAAA;YAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAChF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAClD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QACtB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,8EAA8E;IAC9E,gBAAgB;IAChB,8EAA8E;IAE9E;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK,CACT,GAAW,EACX,MAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,QAAQ,CAAI,GAAG,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,QAAQ,CACZ,GAAW,EACX,MAAkB;QAElB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,WAAW,CAAI,GAAG,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,CAAc,GAAW,EAAE,MAAkB;QAC5D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,cAAc,CAAI,GAAG,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAkB;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IACpC,CAAC;IAED,8EAA8E;IAC9E,gBAAgB;IAChB,8EAA8E;IAE9E;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,KAAK,CAAC,OAAwB;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAwB;QAC7C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,8EAA8E;IAC9E,sBAAsB;IACtB,8EAA8E;IAE9E;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,KAAK,CAAC,WAAW,CAAC,OAA+B;QAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,8EAA8E;IAC9E,kBAAkB;IAClB,8EAA8E;IAE9E;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,UAAU,EAAE,CAAA;IACzB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,aAAa,EAAE,CAAA;IAC5B,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACxC,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QACxC,OAAO,GAAG,CAAC,WAAW,EAAE,CAAA;IAC1B,CAAC;IAED,8EAA8E;IAC9E,wBAAwB;IACxB,8EAA8E;IAE9E;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,KAAK,WAAW,CAAA;IACnC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACvB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;IACvB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAA4B;IAC/D,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Type definitions for the PostgresDO WebSocket client
3
+ *
4
+ * @module client/types
5
+ */
6
+ import type { QueryResultRow, QueryField } from '../worker/types';
7
+ /**
8
+ * Query result from PostgresDO RPC
9
+ */
10
+ export interface RpcQueryResult<T extends QueryResultRow = QueryResultRow> {
11
+ rows: T[];
12
+ fields: QueryField[];
13
+ rowCount: number;
14
+ durationMs: number;
15
+ }
16
+ /**
17
+ * Batch query input
18
+ */
19
+ export interface RpcBatchQuery {
20
+ sql: string;
21
+ params?: unknown[];
22
+ }
23
+ /**
24
+ * Batch result from PostgresDO RPC
25
+ */
26
+ export interface RpcBatchResult {
27
+ results: RpcQueryResult[];
28
+ durationMs: number;
29
+ }
30
+ /**
31
+ * Transaction options for RPC
32
+ */
33
+ export interface RpcTransactionOptions {
34
+ isolationLevel?: 'READ UNCOMMITTED' | 'READ COMMITTED' | 'REPEATABLE READ' | 'SERIALIZABLE';
35
+ readOnly?: boolean;
36
+ }
37
+ /**
38
+ * Table column information
39
+ */
40
+ export interface ColumnInfo {
41
+ column_name: string;
42
+ data_type: string;
43
+ is_nullable: boolean;
44
+ column_default: string | null;
45
+ }
46
+ /**
47
+ * Database statistics
48
+ */
49
+ export interface DatabaseStats {
50
+ queryCount: number;
51
+ totalDurationMs: number;
52
+ avgDurationMs: number;
53
+ lastQueryAt: Date | null;
54
+ uptime: number;
55
+ shutdownStatus: 'running' | 'draining' | 'shutdown';
56
+ }
57
+ /**
58
+ * PostgresDO RPC API interface
59
+ *
60
+ * This interface defines all the RPC methods available on PostgresDO.
61
+ * Used for type-safe client generation with rpc.do.
62
+ */
63
+ export interface PostgresDORpcApi {
64
+ rpcQuery<T extends QueryResultRow = QueryResultRow>(sql: string, params?: unknown[]): Promise<RpcQueryResult<T>>;
65
+ rpcQueryOne<T extends QueryResultRow = QueryResultRow>(sql: string, params?: unknown[]): Promise<T | null>;
66
+ rpcQueryScalar<T = unknown>(sql: string, params?: unknown[]): Promise<T | null>;
67
+ rpcExecute(sql: string, params?: unknown[]): Promise<{
68
+ rowCount: number;
69
+ durationMs: number;
70
+ }>;
71
+ rpcBatch(queries: RpcBatchQuery[]): Promise<RpcBatchResult>;
72
+ rpcBatchTransaction(queries: RpcBatchQuery[]): Promise<RpcBatchResult>;
73
+ rpcTransaction(options?: RpcTransactionOptions): Promise<TransactionApi>;
74
+ rpcPing(): Promise<{
75
+ ok: true;
76
+ durationMs: number;
77
+ }>;
78
+ rpcVersion(): Promise<string>;
79
+ rpcListTables(): Promise<string[]>;
80
+ rpcDescribeTable(tableName: string): Promise<ColumnInfo[]>;
81
+ rpcGetStats(): Promise<DatabaseStats>;
82
+ }
83
+ /**
84
+ * Transaction API returned by rpcTransaction
85
+ */
86
+ export interface TransactionApi {
87
+ query<T extends QueryResultRow = QueryResultRow>(sql: string, params?: unknown[]): Promise<RpcQueryResult<T>>;
88
+ queryOne<T extends QueryResultRow = QueryResultRow>(sql: string, params?: unknown[]): Promise<T | null>;
89
+ execute(sql: string, params?: unknown[]): Promise<{
90
+ rowCount: number;
91
+ durationMs: number;
92
+ }>;
93
+ commit(): Promise<void>;
94
+ rollback(): Promise<void>;
95
+ }
96
+ /**
97
+ * Client configuration options
98
+ */
99
+ export interface PostgresClientConfig {
100
+ /**
101
+ * WebSocket URL for the PostgresDO endpoint
102
+ * @example 'wss://postgres.example.com/ws'
103
+ */
104
+ url: string;
105
+ /**
106
+ * Authentication token or provider function
107
+ * Can be a static token string or an async function that returns a token
108
+ */
109
+ auth?: string | (() => string | null | Promise<string | null>);
110
+ /**
111
+ * Enable automatic reconnection on disconnect
112
+ * @default true
113
+ */
114
+ autoReconnect?: boolean;
115
+ /**
116
+ * Maximum number of reconnection attempts
117
+ * @default Infinity
118
+ */
119
+ maxReconnectAttempts?: number;
120
+ /**
121
+ * Initial backoff delay in ms for reconnection
122
+ * @default 1000
123
+ */
124
+ reconnectBackoff?: number;
125
+ /**
126
+ * Maximum backoff delay in ms for reconnection
127
+ * @default 30000
128
+ */
129
+ maxReconnectBackoff?: number;
130
+ /**
131
+ * Heartbeat interval in ms (0 to disable)
132
+ * @default 30000
133
+ */
134
+ heartbeatInterval?: number;
135
+ /**
136
+ * Callback when connection is established
137
+ */
138
+ onConnect?: () => void;
139
+ /**
140
+ * Callback when connection is lost
141
+ */
142
+ onDisconnect?: (reason: string) => void;
143
+ /**
144
+ * Callback when attempting to reconnect
145
+ */
146
+ onReconnecting?: (attempt: number, maxAttempts: number) => void;
147
+ /**
148
+ * Callback on any error
149
+ */
150
+ onError?: (error: Error) => void;
151
+ /**
152
+ * Allow auth over insecure ws:// connections
153
+ * WARNING: Only for local development
154
+ * @default false
155
+ */
156
+ allowInsecureAuth?: boolean;
157
+ /**
158
+ * Enable debug logging
159
+ * @default false
160
+ */
161
+ debug?: boolean;
162
+ }
163
+ /**
164
+ * Connection state for the client
165
+ */
166
+ export type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'closed';
167
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Type definitions for the PostgresDO WebSocket client
3
+ *
4
+ * @module client/types
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Postgres Durable Object Module
3
+ *
4
+ * Minimal API for PostgreSQL in Cloudflare Workers.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { sql, db, Postgres } from '@dotdo/postgres'
9
+ * export { Postgres }
10
+ *
11
+ * export default {
12
+ * fetch: async () => Response.json(await sql`SELECT * FROM posts`)
13
+ * }
14
+ * ```
15
+ */
16
+ export { Postgres, type PostgresEnv, type QueryResult } from './postgres';
17
+ export { sql, db, createSql, createDb, type SqlConfig, type SqlResult } from './sql';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/do/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Postgres Durable Object Module
3
+ *
4
+ * Minimal API for PostgreSQL in Cloudflare Workers.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { sql, db, Postgres } from '@dotdo/postgres'
9
+ * export { Postgres }
10
+ *
11
+ * export default {
12
+ * fetch: async () => Response.json(await sql`SELECT * FROM posts`)
13
+ * }
14
+ * ```
15
+ */
16
+ export { Postgres } from './postgres';
17
+ export { sql, db, createSql, createDb } from './sql';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/do/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAsC,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAkC,MAAM,OAAO,CAAA"}