@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 +178 -0
- package/dist/index.d.ts +1177 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/wasm/duckdb.js +8 -0
- package/dist/wasm/duckdb.wasm +0 -0
- package/dist/worker.js +3 -0
- package/dist/worker.js.map +1 -0
- package/package.json +77 -0
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
|