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.
@@ -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
+ }