@ducklings/browser 1.4.3-dev.1

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 ADDED
@@ -0,0 +1,178 @@
1
+ # @ducklings/browser
2
+
3
+ Minimal DuckDB WASM for browsers. Async worker-based API with full TypeScript support.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @ducklings/browser
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { init, DuckDB } from '@ducklings/browser';
15
+
16
+ // Initialize the WASM module (runs in Web Worker)
17
+ await init();
18
+
19
+ // Create database and connection
20
+ const db = new DuckDB();
21
+ const conn = await db.connect();
22
+
23
+ // Query returns array of JS objects
24
+ const rows = await conn.query<{answer: number}>('SELECT 42 as answer');
25
+ console.log(rows); // [{ answer: 42 }]
26
+
27
+ // Clean up
28
+ await conn.close();
29
+ await db.close();
30
+ ```
31
+
32
+ ## Features
33
+
34
+ - Async API - queries run in Web Worker, UI stays responsive
35
+ - ~5.7MB gzipped WASM
36
+ - Built-in Parquet, JSON, and httpfs extensions
37
+ - Arrow Table support via Flechette
38
+ - Prepared statements with type-safe parameter binding
39
+ - Streaming results for large datasets
40
+ - Transaction support
41
+ - File registration (URL, buffer, text)
42
+
43
+ ## API
44
+
45
+ ### Initialization
46
+
47
+ ```typescript
48
+ import { init, DuckDB, version } from '@ducklings/browser';
49
+
50
+ // Auto-locate WASM and worker files
51
+ await init();
52
+
53
+ // Custom URLs (optional)
54
+ await init({
55
+ wasmUrl: '/path/to/duckdb.wasm',
56
+ workerUrl: '/path/to/worker.js'
57
+ });
58
+
59
+ // Create database
60
+ const db = new DuckDB();
61
+
62
+ // Get DuckDB version
63
+ const v = await version(); // "v1.4.3"
64
+ ```
65
+
66
+ ### CDN Usage
67
+
68
+ Load directly from jsDelivr or unpkg - cross-origin workers are handled automatically:
69
+
70
+ ```html
71
+ <script type="module">
72
+ import { init, DuckDB } from 'https://cdn.jsdelivr.net/npm/@ducklings/browser@1.4.3/+esm';
73
+
74
+ await init();
75
+
76
+ const db = new DuckDB();
77
+ const conn = await db.connect();
78
+ const result = await conn.query('SELECT 42 as answer');
79
+ console.log(result); // [{ answer: 42 }]
80
+
81
+ await conn.close();
82
+ await db.close();
83
+ </script>
84
+ ```
85
+
86
+ ### Query Methods
87
+
88
+ ```typescript
89
+ const conn = await db.connect();
90
+
91
+ // Returns array of objects
92
+ const rows = await conn.query<{id: number, name: string}>('SELECT * FROM users');
93
+
94
+ // Returns Arrow Table (Flechette)
95
+ const table = await conn.queryArrow('SELECT * FROM users');
96
+
97
+ // Execute without returning results
98
+ await conn.execute('INSERT INTO users VALUES (1, "Alice")');
99
+ ```
100
+
101
+ ### Prepared Statements
102
+
103
+ ```typescript
104
+ const stmt = await conn.prepare('SELECT * FROM users WHERE id = ? AND active = ?');
105
+ stmt.bindInt32(1, 42); // Bind methods are sync
106
+ stmt.bindBoolean(2, true);
107
+ const results = await stmt.run(); // Execution is async
108
+ await stmt.close();
109
+ ```
110
+
111
+ ### Streaming Results
112
+
113
+ ```typescript
114
+ const stream = await conn.queryStreaming('SELECT * FROM large_table');
115
+
116
+ for await (const chunk of stream) {
117
+ console.log(`Processing ${chunk.rowCount} rows`);
118
+ for (const row of chunk.toArray()) {
119
+ processRow(row);
120
+ }
121
+ }
122
+ // Stream auto-closes after iteration
123
+ ```
124
+
125
+ ### File Registration
126
+
127
+ ```typescript
128
+ // Register remote file
129
+ await db.registerFileURL('data.parquet', 'https://example.com/data.parquet');
130
+
131
+ // Register in-memory data
132
+ const csvData = new TextEncoder().encode('id,name\n1,Alice');
133
+ await db.registerFileBuffer('data.csv', csvData);
134
+
135
+ // Query registered files
136
+ const rows = await conn.query("SELECT * FROM 'data.parquet'");
137
+ ```
138
+
139
+ ### Remote Files (httpfs)
140
+
141
+ ```typescript
142
+ // Query remote Parquet file directly
143
+ const rows = await conn.query(`
144
+ SELECT * FROM 'https://example.com/data.parquet'
145
+ LIMIT 10
146
+ `);
147
+ ```
148
+
149
+ ### Arrow Support
150
+
151
+ ```typescript
152
+ import { tableFromArrays, tableFromIPC, tableToIPC } from '@ducklings/browser';
153
+
154
+ // Query as Arrow Table
155
+ const table = await conn.queryArrow('SELECT * FROM users');
156
+
157
+ // Build Arrow tables
158
+ const custom = tableFromArrays({
159
+ id: [1, 2, 3],
160
+ name: ['Alice', 'Bob', 'Charlie']
161
+ });
162
+
163
+ // Insert Arrow data
164
+ const ipc = tableToIPC(custom, { format: 'stream' });
165
+ await conn.insertArrowFromIPCStream('users', ipc);
166
+ ```
167
+
168
+ ## Cloudflare Workers
169
+
170
+ For Cloudflare Workers, use the [`@ducklings/workers`](https://www.npmjs.com/package/@ducklings/workers) package instead, which uses Asyncify for proper httpfs support in the Workers runtime.
171
+
172
+ ## Limitations
173
+
174
+ - **No dynamic extension loading**: Only statically compiled extensions (Parquet, JSON, httpfs) are available. `INSTALL`/`LOAD` commands for other extensions will not work.
175
+
176
+ ## License
177
+
178
+ MIT