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 @@
1
+ export {};
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ (() => {
3
+ // wasm_bindings.ts
4
+ var resultStates = ["ok", "pending", "chunk", "done", "error", "busy"];
5
+ function safeInteger(value, name) {
6
+ const number = typeof value === "bigint" && value <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(value) : value;
7
+ if (typeof number !== "number" || !Number.isSafeInteger(number) || number < 0) throw new Error(`${name} must be a nonnegative safe integer`);
8
+ return number;
9
+ }
10
+ var HyperDBBindings = class {
11
+ module;
12
+ connect;
13
+ disconnect;
14
+ startQuery;
15
+ pollQuery;
16
+ cancelQuery;
17
+ releaseQuery;
18
+ resultState;
19
+ resultPayloadLength;
20
+ free;
21
+ constructor(module) {
22
+ this.module = module;
23
+ this.connect = module.cwrap("hyperdb_wasm_connect", "pointer", []);
24
+ this.disconnect = module.cwrap("hyperdb_wasm_disconnect", "pointer", ["number"]);
25
+ this.startQuery = module.cwrap("hyperdb_wasm_query_start", "pointer", ["number", "string"]);
26
+ this.pollQuery = module.cwrap("hyperdb_wasm_query_poll", "pointer", ["number"]);
27
+ this.cancelQuery = module.cwrap("hyperdb_wasm_query_cancel", "pointer", ["number"]);
28
+ this.releaseQuery = module.cwrap("hyperdb_wasm_query_release", "pointer", ["number"]);
29
+ this.resultState = module.cwrap("hyperdb_wasm_result_state", "number", ["number"]);
30
+ this.resultPayloadLength = module.cwrap("hyperdb_wasm_result_payload_len", "number", ["number"]);
31
+ this.free = module.cwrap("hyperdb_wasm_free", null, ["pointer"]);
32
+ }
33
+ handle(request) {
34
+ const pointer = safeInteger(this.invoke(request), "result pointer");
35
+ const result = this.decodeResult(pointer);
36
+ const response = { id: request.id, type: "response", result };
37
+ return { response, transfer: result.state === "chunk" ? [result.payload.buffer] : [] };
38
+ }
39
+ invoke(request) {
40
+ switch (request.type) {
41
+ case "connect":
42
+ return this.connect();
43
+ case "disconnect":
44
+ return this.disconnect(request.connection);
45
+ case "startQuery":
46
+ return this.startQuery(request.connection, request.sql);
47
+ case "pollQuery":
48
+ return this.pollQuery(request.query);
49
+ case "cancelQuery":
50
+ return this.cancelQuery(request.query);
51
+ case "releaseQuery":
52
+ return this.releaseQuery(request.query);
53
+ }
54
+ }
55
+ decodeResult(pointer) {
56
+ if (pointer === 0) return { state: "error", error: "out of memory" };
57
+ try {
58
+ const rawState = safeInteger(this.resultState(pointer), "result state");
59
+ const state = resultStates[rawState];
60
+ if (!state) return { state: "error", error: `invalid result state ${rawState}` };
61
+ const payloadLength = safeInteger(this.resultPayloadLength(pointer), "result payload length");
62
+ const payloadStart = safeInteger(pointer + 8, "result payload start");
63
+ const payloadEnd = safeInteger(payloadStart + payloadLength, "result payload end");
64
+ if (payloadEnd > this.module.HEAPU8.byteLength) throw new Error("result payload exceeds the wasm heap");
65
+ const payload = new Uint8Array(payloadLength);
66
+ payload.set(this.module.HEAPU8.subarray(payloadStart, payloadEnd));
67
+ switch (state) {
68
+ case "ok":
69
+ return { state, payload };
70
+ case "pending":
71
+ return { state };
72
+ case "chunk":
73
+ return { state, payload };
74
+ case "done":
75
+ return { state };
76
+ case "error":
77
+ return { state, error: new TextDecoder().decode(payload) };
78
+ case "busy":
79
+ return { state, error: new TextDecoder().decode(payload) };
80
+ }
81
+ } finally {
82
+ this.free(pointer);
83
+ }
84
+ }
85
+ };
86
+
87
+ // protocol.ts
88
+ function isRecord(value) {
89
+ return typeof value === "object" && value !== null;
90
+ }
91
+ function hasKeys(value, keys) {
92
+ const actual = Object.keys(value).sort();
93
+ const expected = [...keys].sort();
94
+ return actual.length === expected.length && actual.every((key, index) => key === expected[index]);
95
+ }
96
+ function isEngineRequest(value) {
97
+ if (!isRecord(value) || !Number.isSafeInteger(value.id) || typeof value.type !== "string") return false;
98
+ switch (value.type) {
99
+ case "connect":
100
+ return hasKeys(value, ["id", "type"]);
101
+ case "disconnect":
102
+ return hasKeys(value, ["id", "type", "connection"]) && Number.isSafeInteger(value.connection);
103
+ case "startQuery":
104
+ return hasKeys(value, ["id", "type", "connection", "sql"]) && Number.isSafeInteger(value.connection) && typeof value.sql === "string";
105
+ case "pollQuery":
106
+ case "cancelQuery":
107
+ case "releaseQuery":
108
+ return hasKeys(value, ["id", "type", "query"]) && Number.isSafeInteger(value.query);
109
+ default:
110
+ return false;
111
+ }
112
+ }
113
+
114
+ // worker_setup.ts
115
+ function errorText(error) {
116
+ return error instanceof Error ? error.message : String(error);
117
+ }
118
+ function safePointer(value, name) {
119
+ const pointer = typeof value === "bigint" && value <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(value) : value;
120
+ if (typeof pointer !== "number" || !Number.isSafeInteger(pointer) || pointer < 0) throw new Error(`${name} must be a nonnegative safe integer`);
121
+ return pointer;
122
+ }
123
+ function allocate(module, bytes) {
124
+ const pointer = safePointer(module._malloc(bytes.byteLength || 1), "allocation pointer");
125
+ if (pointer === 0) throw new Error("wasm allocation failed");
126
+ if (pointer + bytes.byteLength > module.HEAPU8.byteLength) throw new Error("allocation exceeds the wasm heap");
127
+ module.HEAPU8.set(bytes, pointer);
128
+ return pointer;
129
+ }
130
+ function installHttpRuntime(module, transport) {
131
+ module.hyperdbWasmFetchStart = (id, url, offset, length) => {
132
+ const headers = new Headers();
133
+ if (length > 0) headers.set("Range", `bytes=${offset}-${offset + length - 1}`);
134
+ void fetch(url, { headers }).then(async (response) => {
135
+ if (!response.ok && response.status !== 206) {
136
+ module._hyperdb_wasm_fetch_complete(id, 0, -1);
137
+ return;
138
+ }
139
+ const bytes = new Uint8Array(await response.arrayBuffer());
140
+ module._hyperdb_wasm_fetch_complete(id, allocate(module, bytes), bytes.byteLength);
141
+ }).catch((error) => {
142
+ transport.postMessage({ type: "log", text: `fetch failed: ${errorText(error)}` });
143
+ module._hyperdb_wasm_fetch_complete(id, 0, -1);
144
+ });
145
+ };
146
+ module.hyperdbWasmHttpStart = (id, method, url, headerLines, bodyPointer, bodyLength) => {
147
+ const headers = new Headers();
148
+ for (const line of headerLines.split("\n")) {
149
+ const separator = line.indexOf(":");
150
+ if (separator > 0) headers.set(line.slice(0, separator), line.slice(separator + 1));
151
+ }
152
+ const pointer = safePointer(bodyPointer, "HTTP body pointer");
153
+ const bodyEnd = safePointer(pointer + bodyLength, "HTTP body end");
154
+ if (bodyEnd > module.HEAPU8.byteLength) throw new Error("HTTP body exceeds the wasm heap");
155
+ const body = bodyLength > 0 ? module.HEAPU8.slice(pointer, bodyEnd) : void 0;
156
+ const init = { method, headers };
157
+ if (body) init.body = body;
158
+ void fetch(url, init).then(async (response) => {
159
+ const responseBody = new Uint8Array(await response.arrayBuffer());
160
+ let responseHeaders = "";
161
+ response.headers.forEach((value, name) => {
162
+ responseHeaders += `${name.toLowerCase()}:${value}
163
+ `;
164
+ });
165
+ const headersPointer = responseHeaders ? safePointer(module.stringToNewUTF8(responseHeaders), "headers pointer") : 0;
166
+ const responseBodyPointer = responseBody.byteLength ? allocate(module, responseBody) : 0;
167
+ module._hyperdb_wasm_http_complete(id, response.status, headersPointer, responseBodyPointer, responseBody.byteLength);
168
+ }).catch((error) => {
169
+ const errorBytes = new TextEncoder().encode(errorText(error));
170
+ module._hyperdb_wasm_http_complete(id, -1, 0, allocate(module, errorBytes), errorBytes.byteLength);
171
+ });
172
+ };
173
+ }
174
+ function configureWorker(module, transport) {
175
+ const queuedRequests = [];
176
+ let bindings;
177
+ const handle = (request) => {
178
+ if (!bindings) {
179
+ queuedRequests.push(request);
180
+ return;
181
+ }
182
+ try {
183
+ const result = bindings.handle(request);
184
+ transport.postMessage(result.response, result.transfer);
185
+ } catch (error) {
186
+ transport.postMessage({ id: request.id, type: "response", result: { state: "error", error: errorText(error) } });
187
+ }
188
+ };
189
+ transport.onMessage((message) => {
190
+ if (isEngineRequest(message)) handle(message);
191
+ });
192
+ module.arguments = ["--no-demo"];
193
+ module.print = (text) => transport.postMessage({ type: "log", text });
194
+ module.printErr = (text) => transport.postMessage({ type: "log", text });
195
+ module.onRuntimeInitialized = () => {
196
+ installHttpRuntime(module, transport);
197
+ bindings = new HyperDBBindings(module);
198
+ transport.postMessage({ type: "ready" });
199
+ for (const request of queuedRequests.splice(0)) handle(request);
200
+ };
201
+ module.onAbort = (reason) => transport.postMessage({ type: "fatal", error: `engine aborted: ${String(reason)}` });
202
+ }
203
+
204
+ // browser_worker.ts
205
+ var configuredEngineUrl = new URL(self.location.href).searchParams.get("engineUrl");
206
+ var engineUrl = self.HYPERDB_WASM_ENGINE_URL ?? configuredEngineUrl ?? "hyperdb-wasm.js";
207
+ var resolvedEngineUrl = new URL(engineUrl, self.location.href);
208
+ function isPthreadWorker() {
209
+ const location = self.location;
210
+ return self.name === "em-pthread" || location.search?.includes("pthread") === true;
211
+ }
212
+ if (isPthreadWorker()) {
213
+ self.importScripts(resolvedEngineUrl.href);
214
+ } else {
215
+ const module = {
216
+ locateFile: (path, prefix) => path === "hyperdb-wasm.wasm" ? new URL("hyperdb-wasm.wasm.br", resolvedEngineUrl).href : `${prefix}${path}`
217
+ };
218
+ self.Module = module;
219
+ const transport = {
220
+ postMessage: (message, transfer = []) => self.postMessage(message, [...transfer]),
221
+ onMessage: (listener) => self.addEventListener("message", (event) => listener(event.data))
222
+ };
223
+ configureWorker(module, transport);
224
+ self.importScripts(resolvedEngineUrl.href);
225
+ }
226
+ })();
@@ -0,0 +1,23 @@
1
+ import type { WasmResult, WorkerTransport } from './protocol.js';
2
+ export declare class HyperDBEngineClient {
3
+ private readonly transport;
4
+ private readonly pending;
5
+ private readonly readyPromise;
6
+ private resolveReady;
7
+ private rejectReady;
8
+ private nextId;
9
+ private failed;
10
+ private readonly unsubscribe;
11
+ constructor(transport: WorkerTransport);
12
+ ready(): Promise<void>;
13
+ connect(): Promise<WasmResult>;
14
+ disconnect(connection: number): Promise<WasmResult>;
15
+ startQuery(connection: number, sql: string): Promise<WasmResult>;
16
+ pollQuery(query: number): Promise<WasmResult>;
17
+ cancelQuery(query: number): Promise<WasmResult>;
18
+ releaseQuery(query: number): Promise<WasmResult>;
19
+ terminate(): Promise<void>;
20
+ private request;
21
+ private onMessage;
22
+ private fail;
23
+ }