@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.
Files changed (111) 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/auth.d.ts.map +1 -1
  57. package/dist/worker/auth.js +16 -6
  58. package/dist/worker/auth.js.map +1 -1
  59. package/dist/worker/background-pglite-manager.d.ts +243 -0
  60. package/dist/worker/background-pglite-manager.d.ts.map +1 -0
  61. package/dist/worker/background-pglite-manager.js +528 -0
  62. package/dist/worker/background-pglite-manager.js.map +1 -0
  63. package/dist/worker/do-pglite-manager.d.ts +77 -0
  64. package/dist/worker/do-pglite-manager.d.ts.map +1 -1
  65. package/dist/worker/do-pglite-manager.js +189 -12
  66. package/dist/worker/do-pglite-manager.js.map +1 -1
  67. package/dist/worker/entry.d.ts.map +1 -1
  68. package/dist/worker/entry.js +108 -26
  69. package/dist/worker/entry.js.map +1 -1
  70. package/dist/worker/index.d.ts +7 -1
  71. package/dist/worker/index.d.ts.map +1 -1
  72. package/dist/worker/index.js +19 -1
  73. package/dist/worker/index.js.map +1 -1
  74. package/dist/worker/lazy-pglite-manager.d.ts +242 -0
  75. package/dist/worker/lazy-pglite-manager.d.ts.map +1 -0
  76. package/dist/worker/lazy-pglite-manager.js +463 -0
  77. package/dist/worker/lazy-pglite-manager.js.map +1 -0
  78. package/package.json +20 -6
  79. package/src/client/index.ts +61 -0
  80. package/src/client/postgres-client.ts +442 -0
  81. package/src/client/types.ts +211 -0
  82. package/src/do/index.ts +18 -0
  83. package/src/do/postgres.ts +367 -0
  84. package/src/do/sql.ts +280 -0
  85. package/src/index.ts +50 -30
  86. package/src/mcp/binding.ts +236 -0
  87. package/src/mcp/index.ts +122 -0
  88. package/src/mcp/server.ts +361 -0
  89. package/src/mcp/tools.ts +464 -0
  90. package/src/mcp/types.ts +148 -0
  91. package/src/pglite/workers-pglite.ts +141 -12
  92. package/src/pglite-assets/pglite.data +0 -0
  93. package/src/pglite-assets/pglite.wasm +0 -0
  94. package/src/worker/auth.ts +17 -6
  95. package/src/worker/background-pglite-manager.ts +680 -0
  96. package/src/worker/do-pglite-manager.ts +235 -19
  97. package/src/worker/entry.ts +112 -30
  98. package/src/worker/index.ts +71 -1
  99. package/src/worker/lazy-pglite-manager.ts +595 -0
  100. package/dist/iceberg/duckdb-wasm.d.ts +0 -447
  101. package/dist/iceberg/duckdb-wasm.d.ts.map +0 -1
  102. package/dist/iceberg/duckdb-wasm.js +0 -600
  103. package/dist/iceberg/duckdb-wasm.js.map +0 -1
  104. package/dist/iceberg/test-fixtures.d.ts +0 -151
  105. package/dist/iceberg/test-fixtures.d.ts.map +0 -1
  106. package/dist/iceberg/test-fixtures.js +0 -446
  107. package/dist/iceberg/test-fixtures.js.map +0 -1
  108. package/dist/worker/__mocks__/cloudflare-workers.d.ts +0 -31
  109. package/dist/worker/__mocks__/cloudflare-workers.d.ts.map +0 -1
  110. package/dist/worker/__mocks__/cloudflare-workers.js +0 -33
  111. package/dist/worker/__mocks__/cloudflare-workers.js.map +0 -1
@@ -1,600 +0,0 @@
1
- /**
2
- * DuckDB-WASM Integration for Iceberg Tables
3
- * Task: postgres-m5p - pg_lake: Add Iceberg/data lake extension support
4
- *
5
- * Provides utilities for querying Iceberg tables from browser/WASM environments
6
- * using DuckDB-WASM as the query engine. This is the recommended approach for
7
- * data lake access since direct pg_lake is not feasible in WASM.
8
- *
9
- * Architecture:
10
- * ```
11
- * Browser/Worker <-> DuckDB-WASM <-> R2/S3 (via HTTP) <-> Iceberg Tables
12
- * ```
13
- *
14
- * @example
15
- * ```typescript
16
- * import { createDuckDBIcebergClient, IcebergQueryBuilder } from '@dotdo/postgres/iceberg'
17
- *
18
- * // Create client with R2 Data Catalog
19
- * const client = await createDuckDBIcebergClient({
20
- * catalogEndpoint: 'https://account.r2.cloudflarestorage.com',
21
- * catalogName: 'my_catalog',
22
- * accessKeyId: process.env.R2_ACCESS_KEY_ID,
23
- * secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
24
- * })
25
- *
26
- * // Query Iceberg table
27
- * const result = await client.query(`
28
- * SELECT * FROM my_catalog.namespace.table
29
- * WHERE timestamp >= '2024-01-01'
30
- * LIMIT 100
31
- * `)
32
- * ```
33
- *
34
- * @module iceberg/duckdb-wasm
35
- */
36
- // ============================================================================
37
- // DuckDB-WASM Iceberg Client
38
- // ============================================================================
39
- /**
40
- * DuckDB-WASM Iceberg Client
41
- *
42
- * A client for querying Iceberg tables using DuckDB-WASM in browser environments.
43
- * Supports R2 Data Catalog and any Iceberg REST Catalog compatible endpoint.
44
- *
45
- * @example
46
- * ```typescript
47
- * const client = new DuckDBIcebergClient({
48
- * catalogEndpoint: 'https://account.r2.cloudflarestorage.com',
49
- * catalogName: 'analytics',
50
- * accessKeyId: '...',
51
- * secretAccessKey: '...',
52
- * })
53
- *
54
- * await client.initialize()
55
- *
56
- * // Query with time travel
57
- * const result = await client.query(`
58
- * SELECT * FROM analytics.events.page_views
59
- * WHERE event_date = '2024-01-15'
60
- * `, { asOf: '2024-01-16T00:00:00Z' })
61
- * ```
62
- */
63
- export class DuckDBIcebergClient {
64
- config;
65
- db = null;
66
- conn = null;
67
- initialized = false;
68
- constructor(config) {
69
- this.config = {
70
- catalogEndpoint: config.catalogEndpoint,
71
- catalogName: config.catalogName,
72
- accessKeyId: config.accessKeyId ?? '',
73
- secretAccessKey: config.secretAccessKey ?? '',
74
- region: config.region ?? 'auto',
75
- s3Endpoint: config.s3Endpoint ?? config.catalogEndpoint,
76
- bundle: config.bundle ?? 'eh',
77
- memoryLimit: config.memoryLimit ?? 256 * 1024 * 1024,
78
- enableLogging: config.enableLogging ?? false,
79
- };
80
- }
81
- /**
82
- * Initialize the DuckDB-WASM instance and attach Iceberg catalog
83
- *
84
- * @param duckdbModule - DuckDB WASM module (from @duckdb/duckdb-wasm)
85
- */
86
- async initialize(duckdbModule) {
87
- if (this.initialized) {
88
- return;
89
- }
90
- // Instantiate DuckDB
91
- this.db = await duckdbModule.instantiate();
92
- this.conn = await this.db.connect();
93
- // Load required extensions
94
- await this.loadExtensions();
95
- // Attach Iceberg catalog
96
- await this.attachCatalog();
97
- this.initialized = true;
98
- }
99
- /**
100
- * Load required DuckDB extensions
101
- */
102
- async loadExtensions() {
103
- if (!this.conn)
104
- throw new Error('Connection not initialized');
105
- // Load and install extensions
106
- await this.conn.run('INSTALL iceberg');
107
- await this.conn.run('LOAD iceberg');
108
- await this.conn.run('INSTALL httpfs');
109
- await this.conn.run('LOAD httpfs');
110
- await this.conn.run('INSTALL parquet');
111
- await this.conn.run('LOAD parquet');
112
- // Configure S3/R2 credentials if provided
113
- if (this.config.accessKeyId && this.config.secretAccessKey) {
114
- await this.conn.run(`
115
- SET s3_access_key_id='${this.config.accessKeyId}';
116
- SET s3_secret_access_key='${this.config.secretAccessKey}';
117
- SET s3_region='${this.config.region}';
118
- SET s3_endpoint='${this.config.s3Endpoint}';
119
- `);
120
- }
121
- }
122
- /**
123
- * Attach Iceberg catalog
124
- */
125
- async attachCatalog() {
126
- if (!this.conn)
127
- throw new Error('Connection not initialized');
128
- // Attach Iceberg REST catalog
129
- await this.conn.run(`
130
- ATTACH '${this.config.catalogEndpoint}' AS ${this.config.catalogName} (
131
- TYPE ICEBERG,
132
- ENDPOINT '${this.config.catalogEndpoint}'
133
- )
134
- `);
135
- if (this.config.enableLogging) {
136
- console.log(`[DuckDBIcebergClient] Attached catalog: ${this.config.catalogName}`);
137
- }
138
- }
139
- /**
140
- * Execute a SQL query
141
- *
142
- * @param sql - SQL query to execute
143
- * @param options - Optional time travel options
144
- * @returns Query result
145
- */
146
- async query(sql, options) {
147
- if (!this.conn)
148
- throw new Error('Client not initialized');
149
- const startTime = performance.now();
150
- // Apply time travel if specified
151
- let modifiedSql = sql;
152
- if (options?.snapshotId) {
153
- modifiedSql = this.addSnapshotIdHint(sql, options.snapshotId);
154
- }
155
- else if (options?.asOf) {
156
- modifiedSql = this.addAsOfHint(sql, options.asOf);
157
- }
158
- // Execute query
159
- const result = await this.conn.query(modifiedSql);
160
- const executionTimeMs = performance.now() - startTime;
161
- // Convert Arrow result to plain objects
162
- const rows = result.toArray();
163
- const columns = result.schema.fields.map((f) => f.name);
164
- const types = result.schema.fields.map((f) => f.type.toString());
165
- if (this.config.enableLogging) {
166
- console.log(`[DuckDBIcebergClient] Query completed: ${result.numRows} rows in ${executionTimeMs.toFixed(2)}ms`);
167
- }
168
- return {
169
- rows,
170
- columns,
171
- types,
172
- executionTimeMs,
173
- };
174
- }
175
- /**
176
- * Add snapshot ID hint to query for time travel
177
- */
178
- addSnapshotIdHint(sql, snapshotId) {
179
- // DuckDB Iceberg time travel syntax
180
- return sql.replace(/FROM\s+([a-zA-Z0-9_.]+)/gi, `FROM iceberg_scan('$1', allow_moved_paths = true, snapshot_id = ${snapshotId})`);
181
- }
182
- /**
183
- * Add AS OF timestamp hint to query
184
- */
185
- addAsOfHint(sql, asOf) {
186
- const timestamp = typeof asOf === 'string' ? asOf : asOf.toISOString();
187
- return sql.replace(/FROM\s+([a-zA-Z0-9_.]+)/gi, `FROM iceberg_scan('$1', allow_moved_paths = true, as_of_timestamp = '${timestamp}')`);
188
- }
189
- /**
190
- * List all namespaces in the catalog
191
- */
192
- async listNamespaces() {
193
- const result = await this.query(`SELECT * FROM information_schema.schemata WHERE catalog_name = '${this.config.catalogName}'`);
194
- return result.rows.map((r) => r.namespace);
195
- }
196
- /**
197
- * List all tables in a namespace
198
- */
199
- async listTables(namespace) {
200
- const result = await this.query(`SELECT table_name FROM information_schema.tables
201
- WHERE table_catalog = '${this.config.catalogName}'
202
- AND table_schema = '${namespace}'`);
203
- return result.rows.map((r) => r.table_name);
204
- }
205
- /**
206
- * Get table metadata
207
- */
208
- async getTableMetadata(namespace, tableName) {
209
- try {
210
- const fullName = `${this.config.catalogName}.${namespace}.${tableName}`;
211
- // Get schema info
212
- const schemaResult = await this.query(`SELECT column_name, ordinal_position, data_type, is_nullable, column_comment
213
- FROM information_schema.columns
214
- WHERE table_catalog = '${this.config.catalogName}'
215
- AND table_schema = '${namespace}'
216
- AND table_name = '${tableName}'
217
- ORDER BY ordinal_position`);
218
- if (schemaResult.rows.length === 0) {
219
- return null;
220
- }
221
- const schema = schemaResult.rows.map((col) => {
222
- const field = {
223
- id: col.ordinal_position,
224
- name: col.column_name,
225
- type: col.data_type,
226
- required: col.is_nullable === 'NO',
227
- };
228
- if (col.column_comment !== null) {
229
- field.doc = col.column_comment;
230
- }
231
- return field;
232
- });
233
- return {
234
- identifier: fullName,
235
- name: tableName,
236
- namespace: [namespace],
237
- schema,
238
- partitionColumns: [], // Would need iceberg metadata for this
239
- properties: {},
240
- };
241
- }
242
- catch {
243
- return null;
244
- }
245
- }
246
- /**
247
- * Get table snapshots for time travel
248
- */
249
- async getSnapshots(namespace, tableName) {
250
- const fullName = `${this.config.catalogName}.${namespace}.${tableName}`;
251
- const result = await this.query(`SELECT * FROM iceberg_snapshots('${fullName}')`);
252
- return result.rows.map((row) => ({
253
- snapshotId: Number(row.snapshot_id),
254
- timestamp: new Date(Number(row.timestamp_ms)),
255
- operation: row.operation,
256
- summary: row.summary ? JSON.parse(row.summary) : {},
257
- }));
258
- }
259
- /**
260
- * Close the connection and cleanup
261
- */
262
- async close() {
263
- if (this.conn) {
264
- await this.conn.close();
265
- this.conn = null;
266
- }
267
- if (this.db) {
268
- await this.db.close();
269
- this.db = null;
270
- }
271
- this.initialized = false;
272
- }
273
- }
274
- /**
275
- * Create a DuckDB-WASM Iceberg client
276
- *
277
- * @example
278
- * ```typescript
279
- * import * as duckdb from '@duckdb/duckdb-wasm'
280
- *
281
- * const client = createDuckDBIcebergClient({
282
- * catalogEndpoint: 'https://account.r2.cloudflarestorage.com',
283
- * catalogName: 'my_catalog',
284
- * })
285
- *
286
- * await client.initialize(duckdb)
287
- *
288
- * const result = await client.query('SELECT * FROM my_catalog.ns.table LIMIT 10')
289
- * ```
290
- */
291
- export function createDuckDBIcebergClient(config) {
292
- return new DuckDBIcebergClient(config);
293
- }
294
- // ============================================================================
295
- // Iceberg Query Builder
296
- // ============================================================================
297
- /**
298
- * Fluent query builder for Iceberg tables
299
- *
300
- * Provides a type-safe, fluent API for building Iceberg queries with
301
- * automatic partition pruning, time travel, and column projection.
302
- *
303
- * @example
304
- * ```typescript
305
- * const query = new IcebergQueryBuilder('my_catalog.events.page_views')
306
- * .select('user_id', 'page_url', 'timestamp')
307
- * .where('event_date', '>=', '2024-01-01')
308
- * .where('country', 'IN', ['US', 'CA', 'UK'])
309
- * .asOf('2024-01-15T00:00:00Z')
310
- * .orderBy('timestamp', 'DESC')
311
- * .limit(100)
312
- * .build()
313
- * ```
314
- */
315
- export class IcebergQueryBuilder {
316
- tableName;
317
- selectColumns = ['*'];
318
- whereClauses = [];
319
- orderByClauses = [];
320
- groupByClauses = [];
321
- havingClauses = [];
322
- limitValue;
323
- offsetValue;
324
- timeTravelOptions;
325
- constructor(tableName) {
326
- this.tableName = tableName;
327
- }
328
- /**
329
- * Specify columns to select
330
- */
331
- select(...columns) {
332
- this.selectColumns = columns.length > 0 ? columns : ['*'];
333
- return this;
334
- }
335
- /**
336
- * Add a WHERE clause
337
- */
338
- where(column, operator, value) {
339
- let clause;
340
- if (operator === 'IN' && Array.isArray(value)) {
341
- const values = value.map((v) => (typeof v === 'string' ? `'${v}'` : v)).join(', ');
342
- clause = `${column} IN (${values})`;
343
- }
344
- else if (operator === 'BETWEEN' && Array.isArray(value) && value.length === 2) {
345
- const [start, end] = value;
346
- const startVal = typeof start === 'string' ? `'${start}'` : start;
347
- const endVal = typeof end === 'string' ? `'${end}'` : end;
348
- clause = `${column} BETWEEN ${startVal} AND ${endVal}`;
349
- }
350
- else if (typeof value === 'string') {
351
- clause = `${column} ${operator} '${value}'`;
352
- }
353
- else if (value === null) {
354
- clause = operator === '=' ? `${column} IS NULL` : `${column} IS NOT NULL`;
355
- }
356
- else {
357
- clause = `${column} ${operator} ${value}`;
358
- }
359
- this.whereClauses.push(clause);
360
- return this;
361
- }
362
- /**
363
- * Add raw WHERE clause
364
- */
365
- whereRaw(clause) {
366
- this.whereClauses.push(clause);
367
- return this;
368
- }
369
- /**
370
- * Add GROUP BY clause
371
- */
372
- groupBy(...columns) {
373
- this.groupByClauses.push(...columns);
374
- return this;
375
- }
376
- /**
377
- * Add HAVING clause
378
- */
379
- having(clause) {
380
- this.havingClauses.push(clause);
381
- return this;
382
- }
383
- /**
384
- * Add ORDER BY clause
385
- */
386
- orderBy(column, direction = 'ASC') {
387
- this.orderByClauses.push(`${column} ${direction}`);
388
- return this;
389
- }
390
- /**
391
- * Set LIMIT
392
- */
393
- limit(n) {
394
- this.limitValue = n;
395
- return this;
396
- }
397
- /**
398
- * Set OFFSET
399
- */
400
- offset(n) {
401
- this.offsetValue = n;
402
- return this;
403
- }
404
- /**
405
- * Query at specific snapshot ID
406
- */
407
- atSnapshot(snapshotId) {
408
- this.timeTravelOptions = { snapshotId };
409
- return this;
410
- }
411
- /**
412
- * Query as of specific timestamp
413
- */
414
- asOf(timestamp) {
415
- this.timeTravelOptions = { asOf: timestamp };
416
- return this;
417
- }
418
- /**
419
- * Build the SQL query string
420
- */
421
- build() {
422
- const parts = [];
423
- // SELECT
424
- parts.push(`SELECT ${this.selectColumns.join(', ')}`);
425
- // FROM (with optional time travel)
426
- if (this.timeTravelOptions?.snapshotId) {
427
- parts.push(`FROM iceberg_scan('${this.tableName}', snapshot_id = ${this.timeTravelOptions.snapshotId})`);
428
- }
429
- else if (this.timeTravelOptions?.asOf) {
430
- const ts = typeof this.timeTravelOptions.asOf === 'string'
431
- ? this.timeTravelOptions.asOf
432
- : this.timeTravelOptions.asOf.toISOString();
433
- parts.push(`FROM iceberg_scan('${this.tableName}', as_of_timestamp = '${ts}')`);
434
- }
435
- else {
436
- parts.push(`FROM ${this.tableName}`);
437
- }
438
- // WHERE
439
- if (this.whereClauses.length > 0) {
440
- parts.push(`WHERE ${this.whereClauses.join(' AND ')}`);
441
- }
442
- // GROUP BY
443
- if (this.groupByClauses.length > 0) {
444
- parts.push(`GROUP BY ${this.groupByClauses.join(', ')}`);
445
- }
446
- // HAVING
447
- if (this.havingClauses.length > 0) {
448
- parts.push(`HAVING ${this.havingClauses.join(' AND ')}`);
449
- }
450
- // ORDER BY
451
- if (this.orderByClauses.length > 0) {
452
- parts.push(`ORDER BY ${this.orderByClauses.join(', ')}`);
453
- }
454
- // LIMIT
455
- if (this.limitValue !== undefined) {
456
- parts.push(`LIMIT ${this.limitValue}`);
457
- }
458
- // OFFSET
459
- if (this.offsetValue !== undefined) {
460
- parts.push(`OFFSET ${this.offsetValue}`);
461
- }
462
- return {
463
- sql: parts.join('\n'),
464
- timeTravel: this.timeTravelOptions,
465
- };
466
- }
467
- }
468
- /**
469
- * Create an Iceberg query builder
470
- */
471
- export function icebergQuery(tableName) {
472
- return new IcebergQueryBuilder(tableName);
473
- }
474
- /**
475
- * Build R2 Data Catalog endpoint URL
476
- */
477
- export function buildR2CatalogEndpoint(accountId) {
478
- return `https://${accountId}.r2.cloudflarestorage.com`;
479
- }
480
- /**
481
- * Build DuckDB attach statement for R2 Data Catalog
482
- *
483
- * @example
484
- * ```typescript
485
- * const attachSql = buildR2AttachStatement({
486
- * accountId: 'abc123',
487
- * bucketName: 'my-iceberg-bucket',
488
- * catalogName: 'my_catalog',
489
- * })
490
- *
491
- * // Returns:
492
- * // ATTACH 'r2://my-iceberg-bucket' AS my_catalog (
493
- * // TYPE ICEBERG,
494
- * // ENDPOINT 'https://abc123.r2.cloudflarestorage.com'
495
- * // );
496
- * ```
497
- */
498
- export function buildR2AttachStatement(config) {
499
- const endpoint = buildR2CatalogEndpoint(config.accountId);
500
- return `ATTACH 'r2://${config.bucketName}' AS ${config.catalogName} (
501
- TYPE ICEBERG,
502
- ENDPOINT '${endpoint}'
503
- );`;
504
- }
505
- /**
506
- * Build DuckDB S3 credentials configuration
507
- */
508
- export function buildR2CredentialsSQL(config) {
509
- const endpoint = buildR2CatalogEndpoint(config.accountId);
510
- return `
511
- SET s3_access_key_id='${config.accessKeyId}';
512
- SET s3_secret_access_key='${config.secretAccessKey}';
513
- SET s3_region='auto';
514
- SET s3_endpoint='${endpoint}';
515
- SET s3_url_style='path';
516
- `.trim();
517
- }
518
- /**
519
- * Read Iceberg table metadata from R2
520
- *
521
- * This is a lightweight approach that doesn't require DuckDB-WASM,
522
- * suitable for scenarios where you need minimal bundle size.
523
- *
524
- * @example
525
- * ```typescript
526
- * const metadata = await readIcebergMetadata(
527
- * 'r2://my-bucket/iceberg/my-table',
528
- * { endpoint: 'https://account.r2.cloudflarestorage.com' }
529
- * )
530
- *
531
- * console.log(metadata.currentSnapshotId)
532
- * console.log(metadata.schema)
533
- * ```
534
- */
535
- export async function readIcebergMetadata(tableUrl, config) {
536
- try {
537
- // Parse table URL
538
- const urlMatch = tableUrl.match(/^r2:\/\/([^/]+)\/(.+)$/);
539
- if (!urlMatch) {
540
- throw new Error('Invalid table URL format. Expected: r2://bucket/path');
541
- }
542
- const [, bucket, tablePath] = urlMatch;
543
- // Build metadata URL
544
- const metadataUrl = `${config.endpoint}/${bucket}/${tablePath}/metadata/version-hint.text`;
545
- // Fetch version hint
546
- const headers = {};
547
- if (config.accessKeyId && config.secretAccessKey) {
548
- // Would need to implement AWS Signature V4 here
549
- // For simplicity, assuming public access or pre-signed URLs
550
- }
551
- const versionHintResponse = await fetch(metadataUrl, { headers });
552
- if (!versionHintResponse.ok) {
553
- return null;
554
- }
555
- const version = await versionHintResponse.text();
556
- // Fetch metadata file
557
- const metadataFileUrl = `${config.endpoint}/${bucket}/${tablePath}/metadata/v${version.trim()}.metadata.json`;
558
- const metadataResponse = await fetch(metadataFileUrl, { headers });
559
- if (!metadataResponse.ok) {
560
- return null;
561
- }
562
- const metadata = (await metadataResponse.json());
563
- return {
564
- formatVersion: metadata['format-version'],
565
- tableUuid: metadata['table-uuid'],
566
- location: metadata.location,
567
- currentSnapshotId: metadata['current-snapshot-id'] ?? null,
568
- lastSequenceNumber: metadata['last-sequence-number'],
569
- schemas: metadata.schemas.map((s) => ({
570
- schemaId: s['schema-id'],
571
- fields: s.fields.map((f) => ({
572
- id: f.id,
573
- name: f.name,
574
- type: typeof f.type === 'string' ? f.type : JSON.stringify(f.type),
575
- required: f.required,
576
- })),
577
- })),
578
- partitionSpecs: metadata['partition-specs'].map((p) => ({
579
- specId: p['spec-id'],
580
- fields: p.fields.map((f) => ({
581
- sourceId: f['source-id'],
582
- fieldId: f['field-id'],
583
- name: f.name,
584
- transform: f.transform,
585
- })),
586
- })),
587
- snapshots: (metadata.snapshots ?? []).map((s) => ({
588
- snapshotId: s['snapshot-id'],
589
- sequenceNumber: s['sequence-number'],
590
- timestampMs: s['timestamp-ms'],
591
- operation: s.summary.operation,
592
- manifestList: s['manifest-list'],
593
- })),
594
- };
595
- }
596
- catch {
597
- return null;
598
- }
599
- }
600
- //# sourceMappingURL=duckdb-wasm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"duckdb-wasm.js","sourceRoot":"","sources":["../../src/iceberg/duckdb-wasm.ts"],"names":[],"mappings":"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"}