@dotdo/postgres 0.1.1 → 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/auth.d.ts.map +1 -1
- package/dist/worker/auth.js +16 -6
- package/dist/worker/auth.js.map +1 -1
- 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/entry.d.ts.map +1 -1
- package/dist/worker/entry.js +108 -26
- package/dist/worker/entry.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 +20 -6
- 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/auth.ts +17 -6
- package/src/worker/background-pglite-manager.ts +680 -0
- package/src/worker/do-pglite-manager.ts +235 -19
- package/src/worker/entry.ts +112 -30
- 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
|
@@ -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.
|
|
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": [
|
|
@@ -50,10 +62,11 @@
|
|
|
50
62
|
"scripts": {
|
|
51
63
|
"build": "tsc && pnpm copy-assets",
|
|
52
64
|
"copy-assets": "mkdir -p dist/pglite-assets && cp src/pglite-assets/* dist/pglite-assets/",
|
|
65
|
+
"sync-pglite": "cp ../pglite/packages/pglite/dist/pglite.wasm src/pglite-assets/ && cp ../pglite/packages/pglite/dist/pglite.data src/pglite-assets/",
|
|
53
66
|
"dev": "tsc --watch",
|
|
54
67
|
"dev:worker": "wrangler dev",
|
|
55
|
-
"deploy": "pnpm build && wrangler deploy",
|
|
56
|
-
"deploy:dry-run": "pnpm build && wrangler deploy --dry-run",
|
|
68
|
+
"deploy": "pnpm sync-pglite && pnpm build && wrangler deploy",
|
|
69
|
+
"deploy:dry-run": "pnpm sync-pglite && pnpm build && wrangler deploy --dry-run",
|
|
57
70
|
"tail": "wrangler tail",
|
|
58
71
|
"test": "vitest run",
|
|
59
72
|
"test:unit": "vitest run --config vitest.config.ts",
|
|
@@ -64,11 +77,12 @@
|
|
|
64
77
|
"clean": "rm -rf dist"
|
|
65
78
|
},
|
|
66
79
|
"dependencies": {
|
|
67
|
-
"@dotdo/pglite": "^0.1.
|
|
68
|
-
"@dotdo/postgres-shared": "^0.1.
|
|
80
|
+
"@dotdo/pglite": "^0.1.4",
|
|
81
|
+
"@dotdo/postgres-shared": "^0.1.2",
|
|
69
82
|
"capnweb": "^0.4.0",
|
|
70
83
|
"hono": "^4.0.0",
|
|
71
|
-
"postgres.do": "^0.1.
|
|
84
|
+
"postgres.do": "^0.1.2",
|
|
85
|
+
"rpc.do": "^0.2.1"
|
|
72
86
|
},
|
|
73
87
|
"devDependencies": {
|
|
74
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'
|
|
@@ -0,0 +1,442 @@
|
|
|
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
|
+
import type {
|
|
52
|
+
PostgresClientConfig,
|
|
53
|
+
PostgresDORpcApi,
|
|
54
|
+
RpcQueryResult,
|
|
55
|
+
RpcBatchQuery,
|
|
56
|
+
RpcBatchResult,
|
|
57
|
+
RpcTransactionOptions,
|
|
58
|
+
TransactionApi,
|
|
59
|
+
ColumnInfo,
|
|
60
|
+
DatabaseStats,
|
|
61
|
+
ConnectionState,
|
|
62
|
+
} from './types'
|
|
63
|
+
import type { QueryResultRow } from '../worker/types'
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* PostgresClient - typed WebSocket client for PostgresDO
|
|
67
|
+
*
|
|
68
|
+
* Uses rpc.do's capnweb transport for efficient RPC communication
|
|
69
|
+
* with automatic reconnection and hibernation support.
|
|
70
|
+
*/
|
|
71
|
+
export class PostgresClient {
|
|
72
|
+
private config: PostgresClientConfig
|
|
73
|
+
private rpcClient: PostgresDORpcApi | null = null
|
|
74
|
+
private transport: { close: () => void } | null = null
|
|
75
|
+
private connectionPromise: Promise<void> | null = null
|
|
76
|
+
private state: ConnectionState = 'disconnected'
|
|
77
|
+
|
|
78
|
+
constructor(config: PostgresClientConfig) {
|
|
79
|
+
this.config = {
|
|
80
|
+
autoReconnect: true,
|
|
81
|
+
maxReconnectAttempts: Infinity,
|
|
82
|
+
reconnectBackoff: 1000,
|
|
83
|
+
maxReconnectBackoff: 30000,
|
|
84
|
+
heartbeatInterval: 30000,
|
|
85
|
+
allowInsecureAuth: false,
|
|
86
|
+
debug: false,
|
|
87
|
+
...config,
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Connect to the PostgresDO WebSocket endpoint
|
|
93
|
+
*/
|
|
94
|
+
private async connect(): Promise<void> {
|
|
95
|
+
if (this.connectionPromise) {
|
|
96
|
+
return this.connectionPromise
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (this.state === 'connected' && this.rpcClient) {
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
this.state = 'connecting'
|
|
104
|
+
|
|
105
|
+
this.connectionPromise = this.establishConnection()
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
await this.connectionPromise
|
|
109
|
+
} finally {
|
|
110
|
+
this.connectionPromise = null
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Establish the WebSocket connection using rpc.do
|
|
116
|
+
*/
|
|
117
|
+
private async establishConnection(): Promise<void> {
|
|
118
|
+
try {
|
|
119
|
+
// Dynamic import of rpc.do modules to avoid bundling issues
|
|
120
|
+
const [{ RPC }, { ws }] = await Promise.all([
|
|
121
|
+
import('rpc.do'),
|
|
122
|
+
import('rpc.do/transports'),
|
|
123
|
+
])
|
|
124
|
+
|
|
125
|
+
// Create WebSocket transport
|
|
126
|
+
// Note: For basic authentication and WebSocket connection
|
|
127
|
+
// Advanced reconnection can be added in future rpc.do versions
|
|
128
|
+
const transport = ws(this.config.url, {
|
|
129
|
+
auth: this.config.auth,
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
this.transport = transport as { close: () => void }
|
|
133
|
+
|
|
134
|
+
// Create typed RPC client - use 'any' to avoid complex generic inference issues
|
|
135
|
+
// The PostgresDORpcApi interface ensures proper typing at the API surface
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
137
|
+
this.rpcClient = RPC<any>(transport) as unknown as PostgresDORpcApi
|
|
138
|
+
|
|
139
|
+
this.state = 'connected'
|
|
140
|
+
this.config.onConnect?.()
|
|
141
|
+
} catch (error) {
|
|
142
|
+
this.state = 'disconnected'
|
|
143
|
+
this.config.onError?.(error instanceof Error ? error : new Error(String(error)))
|
|
144
|
+
throw error
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Ensure we're connected before making RPC calls
|
|
150
|
+
*/
|
|
151
|
+
private async ensureConnected(): Promise<PostgresDORpcApi> {
|
|
152
|
+
if (!this.rpcClient || this.state !== 'connected') {
|
|
153
|
+
await this.connect()
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (!this.rpcClient) {
|
|
157
|
+
throw new Error('Failed to establish connection')
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return this.rpcClient
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ===========================================================================
|
|
164
|
+
// Query Methods
|
|
165
|
+
// ===========================================================================
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Execute a SQL query and return full results
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const result = await client.query('SELECT * FROM users WHERE active = $1', [true])
|
|
173
|
+
* console.log(result.rows)
|
|
174
|
+
* console.log(`${result.rowCount} rows returned in ${result.durationMs}ms`)
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
async query<T extends QueryResultRow = QueryResultRow>(
|
|
178
|
+
sql: string,
|
|
179
|
+
params?: unknown[]
|
|
180
|
+
): Promise<RpcQueryResult<T>> {
|
|
181
|
+
const rpc = await this.ensureConnected()
|
|
182
|
+
return rpc.rpcQuery<T>(sql, params)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Execute a query and return only the first row
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* const user = await client.queryOne('SELECT * FROM users WHERE id = $1', [1])
|
|
191
|
+
* if (user) {
|
|
192
|
+
* console.log(user.name)
|
|
193
|
+
* }
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
async queryOne<T extends QueryResultRow = QueryResultRow>(
|
|
197
|
+
sql: string,
|
|
198
|
+
params?: unknown[]
|
|
199
|
+
): Promise<T | null> {
|
|
200
|
+
const rpc = await this.ensureConnected()
|
|
201
|
+
return rpc.rpcQueryOne<T>(sql, params)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Execute a query and return a scalar value (first column of first row)
|
|
206
|
+
*
|
|
207
|
+
* @example
|
|
208
|
+
* ```typescript
|
|
209
|
+
* const count = await client.queryScalar<number>('SELECT COUNT(*) FROM users')
|
|
210
|
+
* console.log(`Total users: ${count}`)
|
|
211
|
+
* ```
|
|
212
|
+
*/
|
|
213
|
+
async queryScalar<T = unknown>(sql: string, params?: unknown[]): Promise<T | null> {
|
|
214
|
+
const rpc = await this.ensureConnected()
|
|
215
|
+
return rpc.rpcQueryScalar<T>(sql, params)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Execute a statement that doesn't return rows
|
|
220
|
+
*
|
|
221
|
+
* @example
|
|
222
|
+
* ```typescript
|
|
223
|
+
* const { rowCount } = await client.execute('DELETE FROM users WHERE inactive = true')
|
|
224
|
+
* console.log(`Deleted ${rowCount} inactive users`)
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
async execute(sql: string, params?: unknown[]): Promise<{ rowCount: number; durationMs: number }> {
|
|
228
|
+
const rpc = await this.ensureConnected()
|
|
229
|
+
return rpc.rpcExecute(sql, params)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ===========================================================================
|
|
233
|
+
// Batch Methods
|
|
234
|
+
// ===========================================================================
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Execute multiple queries in a single round trip
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```typescript
|
|
241
|
+
* const result = await client.batch([
|
|
242
|
+
* { sql: 'SELECT * FROM users' },
|
|
243
|
+
* { sql: 'SELECT * FROM orders' },
|
|
244
|
+
* { sql: 'SELECT * FROM products' },
|
|
245
|
+
* ])
|
|
246
|
+
* const [users, orders, products] = result.results
|
|
247
|
+
* ```
|
|
248
|
+
*/
|
|
249
|
+
async batch(queries: RpcBatchQuery[]): Promise<RpcBatchResult> {
|
|
250
|
+
const rpc = await this.ensureConnected()
|
|
251
|
+
return rpc.rpcBatch(queries)
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Execute multiple queries within a transaction
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* ```typescript
|
|
259
|
+
* const result = await client.batchTransaction([
|
|
260
|
+
* { sql: 'INSERT INTO users (name) VALUES ($1)', params: ['Alice'] },
|
|
261
|
+
* { sql: 'INSERT INTO audit_log (action) VALUES ($1)', params: ['user_created'] },
|
|
262
|
+
* ])
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
async batchTransaction(queries: RpcBatchQuery[]): Promise<RpcBatchResult> {
|
|
266
|
+
const rpc = await this.ensureConnected()
|
|
267
|
+
return rpc.rpcBatchTransaction(queries)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ===========================================================================
|
|
271
|
+
// Transaction Methods
|
|
272
|
+
// ===========================================================================
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Start a transaction and return a transaction API
|
|
276
|
+
*
|
|
277
|
+
* @example
|
|
278
|
+
* ```typescript
|
|
279
|
+
* const tx = await client.transaction()
|
|
280
|
+
* try {
|
|
281
|
+
* await tx.execute('INSERT INTO users (name) VALUES ($1)', ['Alice'])
|
|
282
|
+
* await tx.execute('INSERT INTO audit_log (action) VALUES ($1)', ['user_created'])
|
|
283
|
+
* await tx.commit()
|
|
284
|
+
* } catch (error) {
|
|
285
|
+
* await tx.rollback()
|
|
286
|
+
* throw error
|
|
287
|
+
* }
|
|
288
|
+
* ```
|
|
289
|
+
*
|
|
290
|
+
* @example With isolation level
|
|
291
|
+
* ```typescript
|
|
292
|
+
* const tx = await client.transaction({ isolationLevel: 'SERIALIZABLE' })
|
|
293
|
+
* // ... perform queries
|
|
294
|
+
* await tx.commit()
|
|
295
|
+
* ```
|
|
296
|
+
*/
|
|
297
|
+
async transaction(options?: RpcTransactionOptions): Promise<TransactionApi> {
|
|
298
|
+
const rpc = await this.ensureConnected()
|
|
299
|
+
return rpc.rpcTransaction(options)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// ===========================================================================
|
|
303
|
+
// Utility Methods
|
|
304
|
+
// ===========================================================================
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Health check - verify the database is responsive
|
|
308
|
+
*
|
|
309
|
+
* @example
|
|
310
|
+
* ```typescript
|
|
311
|
+
* const { ok, durationMs } = await client.ping()
|
|
312
|
+
* console.log(`Database responded in ${durationMs}ms`)
|
|
313
|
+
* ```
|
|
314
|
+
*/
|
|
315
|
+
async ping(): Promise<{ ok: true; durationMs: number }> {
|
|
316
|
+
const rpc = await this.ensureConnected()
|
|
317
|
+
return rpc.rpcPing()
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Get the PostgreSQL version
|
|
322
|
+
*
|
|
323
|
+
* @example
|
|
324
|
+
* ```typescript
|
|
325
|
+
* const version = await client.version()
|
|
326
|
+
* console.log(`PostgreSQL version: ${version}`)
|
|
327
|
+
* ```
|
|
328
|
+
*/
|
|
329
|
+
async version(): Promise<string> {
|
|
330
|
+
const rpc = await this.ensureConnected()
|
|
331
|
+
return rpc.rpcVersion()
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* List all tables in the public schema
|
|
336
|
+
*
|
|
337
|
+
* @example
|
|
338
|
+
* ```typescript
|
|
339
|
+
* const tables = await client.listTables()
|
|
340
|
+
* console.log('Tables:', tables)
|
|
341
|
+
* ```
|
|
342
|
+
*/
|
|
343
|
+
async listTables(): Promise<string[]> {
|
|
344
|
+
const rpc = await this.ensureConnected()
|
|
345
|
+
return rpc.rpcListTables()
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Get schema information for a table
|
|
350
|
+
*
|
|
351
|
+
* @example
|
|
352
|
+
* ```typescript
|
|
353
|
+
* const columns = await client.describeTable('users')
|
|
354
|
+
* for (const col of columns) {
|
|
355
|
+
* console.log(`${col.column_name}: ${col.data_type}`)
|
|
356
|
+
* }
|
|
357
|
+
* ```
|
|
358
|
+
*/
|
|
359
|
+
async describeTable(tableName: string): Promise<ColumnInfo[]> {
|
|
360
|
+
const rpc = await this.ensureConnected()
|
|
361
|
+
return rpc.rpcDescribeTable(tableName)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Get database statistics
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* ```typescript
|
|
369
|
+
* const stats = await client.getStats()
|
|
370
|
+
* console.log(`Queries: ${stats.queryCount}, Avg: ${stats.avgDurationMs}ms`)
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
async getStats(): Promise<DatabaseStats> {
|
|
374
|
+
const rpc = await this.ensureConnected()
|
|
375
|
+
return rpc.rpcGetStats()
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// ===========================================================================
|
|
379
|
+
// Connection Management
|
|
380
|
+
// ===========================================================================
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Get current connection state
|
|
384
|
+
*/
|
|
385
|
+
getConnectionState(): ConnectionState {
|
|
386
|
+
return this.state
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Check if currently connected
|
|
391
|
+
*/
|
|
392
|
+
isConnected(): boolean {
|
|
393
|
+
return this.state === 'connected'
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Close the connection
|
|
398
|
+
*
|
|
399
|
+
* @example
|
|
400
|
+
* ```typescript
|
|
401
|
+
* await client.close()
|
|
402
|
+
* ```
|
|
403
|
+
*/
|
|
404
|
+
async close(): Promise<void> {
|
|
405
|
+
if (this.transport) {
|
|
406
|
+
this.transport.close()
|
|
407
|
+
this.transport = null
|
|
408
|
+
}
|
|
409
|
+
this.rpcClient = null
|
|
410
|
+
this.state = 'closed'
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Create a PostgresClient instance
|
|
416
|
+
*
|
|
417
|
+
* @example Basic usage
|
|
418
|
+
* ```typescript
|
|
419
|
+
* import { createPostgresClient } from '@dotdo/postgres/client'
|
|
420
|
+
*
|
|
421
|
+
* const client = createPostgresClient({
|
|
422
|
+
* url: 'wss://postgres.example.com/ws',
|
|
423
|
+
* auth: 'your-api-key',
|
|
424
|
+
* })
|
|
425
|
+
*
|
|
426
|
+
* const users = await client.query('SELECT * FROM users')
|
|
427
|
+
* ```
|
|
428
|
+
*
|
|
429
|
+
* @example With reconnection callbacks
|
|
430
|
+
* ```typescript
|
|
431
|
+
* const client = createPostgresClient({
|
|
432
|
+
* url: 'wss://postgres.example.com/ws',
|
|
433
|
+
* auth: () => getAuthToken(),
|
|
434
|
+
* onConnect: () => console.log('Connected!'),
|
|
435
|
+
* onDisconnect: (reason) => console.log('Disconnected:', reason),
|
|
436
|
+
* onReconnecting: (attempt) => console.log(`Reconnecting (${attempt})...`),
|
|
437
|
+
* })
|
|
438
|
+
* ```
|
|
439
|
+
*/
|
|
440
|
+
export function createPostgresClient(config: PostgresClientConfig): PostgresClient {
|
|
441
|
+
return new PostgresClient(config)
|
|
442
|
+
}
|