hyperdb-wasm 0.0.26281-dev.wasm.g39d82636
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/dist/api.d.ts +50 -0
- package/dist/browser.d.ts +25 -0
- package/dist/browser.js +12080 -0
- package/dist/browser_worker.d.ts +1 -0
- package/dist/browser_worker.js +226 -0
- package/dist/client.d.ts +23 -0
- package/dist/hyperdb-wasm.cjs +3 -0
- package/dist/hyperdb-wasm.js +3 -0
- package/dist/hyperdb-wasm.wasm.br +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.node.d.ts +6 -0
- package/dist/node.d.ts +25 -0
- package/dist/node.js +456 -0
- package/dist/node_worker.d.ts +1 -0
- package/dist/node_worker.js +236 -0
- package/dist/protocol.d.ts +67 -0
- package/dist/raw.browser.d.ts +3 -0
- package/dist/raw.browser.js +252 -0
- package/dist/raw.d.ts +3 -0
- package/dist/raw.node.d.ts +3 -0
- package/dist/raw.node.js +254 -0
- package/dist/wasm_bindings.d.ts +27 -0
- package/dist/worker_setup.d.ts +22 -0
- package/examples/browser.html +84 -0
- package/examples/node.mjs +43 -0
- package/examples/serve.mjs +35 -0
- package/package.json +41 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>HyperDB WebAssembly Example</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root { color-scheme: light dark; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
|
|
9
|
+
body { margin: 0 auto; max-width: 960px; padding: 2rem; }
|
|
10
|
+
textarea { box-sizing: border-box; min-height: 10rem; padding: 1rem; resize: vertical; width: 100%; }
|
|
11
|
+
button { cursor: pointer; margin: 1rem 0; padding: 0.6rem 1rem; }
|
|
12
|
+
table { border-collapse: collapse; width: 100%; }
|
|
13
|
+
th, td { border: 1px solid currentColor; padding: 0.5rem; text-align: left; }
|
|
14
|
+
#status { min-height: 1.5rem; }
|
|
15
|
+
</style>
|
|
16
|
+
</head>
|
|
17
|
+
<body>
|
|
18
|
+
<h1>HyperDB in the browser</h1>
|
|
19
|
+
<p>Edit the SQL and run it locally in the WebAssembly worker.</p>
|
|
20
|
+
<textarea id="sql">select department, count(*) as employees, sum(salary) as payroll
|
|
21
|
+
from (values
|
|
22
|
+
('Engineering', 120000),
|
|
23
|
+
('Engineering', 135000),
|
|
24
|
+
('Sales', 95000)
|
|
25
|
+
) as employees(department, salary)
|
|
26
|
+
group by department
|
|
27
|
+
order by department</textarea>
|
|
28
|
+
<button id="run" type="button">Run query</button>
|
|
29
|
+
<p id="status">Loading HyperDB...</p>
|
|
30
|
+
<div id="result"></div>
|
|
31
|
+
|
|
32
|
+
<script type="module">
|
|
33
|
+
import { HyperDB } from '../dist/browser.js';
|
|
34
|
+
|
|
35
|
+
const sql = document.querySelector('#sql');
|
|
36
|
+
const run = document.querySelector('#run');
|
|
37
|
+
const status = document.querySelector('#status');
|
|
38
|
+
const result = document.querySelector('#result');
|
|
39
|
+
|
|
40
|
+
const database = await HyperDB.create();
|
|
41
|
+
const connection = await database.connect();
|
|
42
|
+
status.textContent = 'Ready';
|
|
43
|
+
|
|
44
|
+
function render(table) {
|
|
45
|
+
const names = table.schema.fields.map(({ name }) => name);
|
|
46
|
+
const rows = Array.from({ length: table.numRows }, (_, row) =>
|
|
47
|
+
names.map((name) => String(table.getChild(name)?.get(row) ?? 'NULL')),
|
|
48
|
+
);
|
|
49
|
+
const tableElement = document.createElement('table');
|
|
50
|
+
const header = tableElement.createTHead().insertRow();
|
|
51
|
+
for (const name of names) {
|
|
52
|
+
const cell = document.createElement('th');
|
|
53
|
+
cell.textContent = name;
|
|
54
|
+
header.append(cell);
|
|
55
|
+
}
|
|
56
|
+
const body = tableElement.createTBody();
|
|
57
|
+
for (const values of rows) {
|
|
58
|
+
const row = body.insertRow();
|
|
59
|
+
for (const value of values) row.insertCell().textContent = value;
|
|
60
|
+
}
|
|
61
|
+
result.replaceChildren(tableElement);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
run.addEventListener('click', async () => {
|
|
65
|
+
run.disabled = true;
|
|
66
|
+
status.textContent = 'Running...';
|
|
67
|
+
try {
|
|
68
|
+
const table = await connection.query(sql.value);
|
|
69
|
+
render(table);
|
|
70
|
+
status.textContent = `${table.numRows} row(s)`;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
result.textContent = error instanceof Error ? error.message : String(error);
|
|
73
|
+
status.textContent = 'Query failed';
|
|
74
|
+
} finally {
|
|
75
|
+
run.disabled = false;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
window.addEventListener('pagehide', () => {
|
|
80
|
+
void connection.close().then(() => database.terminate());
|
|
81
|
+
});
|
|
82
|
+
</script>
|
|
83
|
+
</body>
|
|
84
|
+
</html>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { HyperDB } from 'hyperdb-wasm';
|
|
2
|
+
|
|
3
|
+
function rows(table) {
|
|
4
|
+
return Array.from({ length: table.numRows }, (_, row) => Object.fromEntries(
|
|
5
|
+
table.schema.fields.map(({ name }) => [name, table.getChild(name)?.get(row)]),
|
|
6
|
+
));
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const database = await HyperDB.create();
|
|
10
|
+
const connection = await database.connect();
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
const expressions = await connection.query(`
|
|
14
|
+
select
|
|
15
|
+
6 * 7 as answer,
|
|
16
|
+
upper('query Hyper from Node.js') as message
|
|
17
|
+
`);
|
|
18
|
+
console.table(rows(expressions));
|
|
19
|
+
|
|
20
|
+
const grouped = await connection.query(`
|
|
21
|
+
select department, count(*) as employees, sum(salary) as payroll
|
|
22
|
+
from (values
|
|
23
|
+
('Engineering', 120000),
|
|
24
|
+
('Engineering', 135000),
|
|
25
|
+
('Sales', 95000)
|
|
26
|
+
) as employees(department, salary)
|
|
27
|
+
group by department
|
|
28
|
+
order by department
|
|
29
|
+
`);
|
|
30
|
+
console.table(rows(grouped));
|
|
31
|
+
|
|
32
|
+
const reader = await connection.send(`
|
|
33
|
+
select value, value * value as square
|
|
34
|
+
from generate_series(1, 5) as numbers(value)
|
|
35
|
+
order by value
|
|
36
|
+
`);
|
|
37
|
+
for await (const batch of reader) {
|
|
38
|
+
console.log(`streamed Arrow batch with ${batch.numRows} rows`);
|
|
39
|
+
}
|
|
40
|
+
} finally {
|
|
41
|
+
await connection.close();
|
|
42
|
+
await database.terminate();
|
|
43
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createReadStream, existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { extname, resolve, sep } from 'node:path';
|
|
4
|
+
|
|
5
|
+
const packageRoot = resolve(import.meta.dirname, '..');
|
|
6
|
+
const port = Number(process.env.PORT ?? 8000);
|
|
7
|
+
const contentTypes = {
|
|
8
|
+
'.html': 'text/html; charset=utf-8',
|
|
9
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
10
|
+
'.map': 'application/json',
|
|
11
|
+
'.wasm': 'application/wasm',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
createServer((request, response) => {
|
|
15
|
+
response.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
|
16
|
+
response.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
|
|
17
|
+
|
|
18
|
+
const pathname = new URL(request.url ?? '/', 'http://localhost').pathname;
|
|
19
|
+
const relativePath = pathname === '/' ? 'examples/browser.html' : pathname.slice(1);
|
|
20
|
+
const file = resolve(packageRoot, relativePath);
|
|
21
|
+
if (!file.startsWith(`${packageRoot}${sep}`) || !existsSync(file) || !statSync(file).isFile()) {
|
|
22
|
+
response.writeHead(404).end('Not found');
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const compressedWasm = file.endsWith('.wasm.br');
|
|
27
|
+
response.writeHead(200, {
|
|
28
|
+
...(compressedWasm ? { 'Content-Encoding': 'br' } : {}),
|
|
29
|
+
'Content-Length': statSync(file).size,
|
|
30
|
+
'Content-Type': compressedWasm ? 'application/wasm' : contentTypes[extname(file)] ?? 'application/octet-stream',
|
|
31
|
+
});
|
|
32
|
+
createReadStream(file).pipe(response);
|
|
33
|
+
}).listen(port, '127.0.0.1', () => {
|
|
34
|
+
console.log(`HyperDB browser example: http://127.0.0.1:${port}/`);
|
|
35
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hyperdb-wasm",
|
|
3
|
+
"version": "0.0.26281-dev.wasm.g39d82636",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"engines": {
|
|
6
|
+
"node": ">=24"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"examples"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"browser": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/browser.js"
|
|
17
|
+
},
|
|
18
|
+
"node": {
|
|
19
|
+
"types": "./dist/index.node.d.ts",
|
|
20
|
+
"default": "./dist/node.js"
|
|
21
|
+
},
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/browser.js"
|
|
24
|
+
},
|
|
25
|
+
"./raw": {
|
|
26
|
+
"browser": {
|
|
27
|
+
"types": "./dist/raw.browser.d.ts",
|
|
28
|
+
"default": "./dist/raw.browser.js"
|
|
29
|
+
},
|
|
30
|
+
"node": {
|
|
31
|
+
"types": "./dist/raw.node.d.ts",
|
|
32
|
+
"default": "./dist/raw.node.js"
|
|
33
|
+
},
|
|
34
|
+
"types": "./dist/raw.browser.d.ts",
|
|
35
|
+
"default": "./dist/raw.browser.js"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"apache-arrow": "^19.0.1"
|
|
40
|
+
}
|
|
41
|
+
}
|