From 8da1f61959d7ec0cfe1a80c4c65f2c6d50241a0f Mon Sep 17 00:00:00 2001 From: Jordan Santell Date: Thu, 9 Jan 2025 13:33:24 -0800 Subject: [PATCH] ctstore init --- typescript/package-lock.json | 13 + typescript/packages/common-engine/README.md | 20 + .../packages/common-engine/ct_engine.d.ts | 72 ++ .../packages/common-engine/ct_engine.js | 927 ++++++++++++++++++ .../packages/common-engine/ct_engine_bg.wasm | Bin 0 -> 279850 bytes .../common-engine/ct_engine_bg.wasm.d.ts | 19 + .../packages/common-engine/example.html | 100 ++ .../packages/common-engine/package.json | 16 + .../packages/common-system/package.json | 3 +- .../packages/common-system/src/ctstore.ts | 173 ++++ typescript/packages/common-system/src/db.ts | 15 +- .../packages/lookslike-high-level/src/data.ts | 13 +- .../lookslike-high-level/vite.config.js | 18 +- 13 files changed, 1378 insertions(+), 11 deletions(-) create mode 100644 typescript/packages/common-engine/README.md create mode 100644 typescript/packages/common-engine/ct_engine.d.ts create mode 100644 typescript/packages/common-engine/ct_engine.js create mode 100644 typescript/packages/common-engine/ct_engine_bg.wasm create mode 100644 typescript/packages/common-engine/ct_engine_bg.wasm.d.ts create mode 100644 typescript/packages/common-engine/example.html create mode 100644 typescript/packages/common-engine/package.json create mode 100644 typescript/packages/common-system/src/ctstore.ts diff --git a/typescript/package-lock.json b/typescript/package-lock.json index 95b79af58..9b10742c6 100644 --- a/typescript/package-lock.json +++ b/typescript/package-lock.json @@ -2144,6 +2144,10 @@ "resolved": "packages/common-builder", "link": true }, + "node_modules/@commontools/common-engine": { + "resolved": "packages/common-engine", + "link": true + }, "node_modules/@commontools/common-frp": { "resolved": "packages/common-frp", "link": true @@ -7517,6 +7521,10 @@ "version": "3.1.3", "license": "MIT" }, + "node_modules/ct-engine": { + "resolved": "packages/common-engine", + "link": true + }, "node_modules/cytoscape": { "version": "3.30.4", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz", @@ -19202,6 +19210,10 @@ "wireit": "^0.14.4" } }, + "packages/common-engine": { + "name": "ct-engine", + "version": "0.1.0" + }, "packages/common-frp": { "name": "@commontools/common-frp", "version": "0.0.1", @@ -19361,6 +19373,7 @@ "license": "UNLICENSED", "dependencies": { "@commontools/common-builder": "^0.0.1", + "@commontools/common-engine": "file:../common-engine", "@commontools/common-html": "^0.0.1", "@commontools/common-runner": "^0.0.1", "@commontools/llm-client": "^0.0.1", diff --git a/typescript/packages/common-engine/README.md b/typescript/packages/common-engine/README.md new file mode 100644 index 000000000..c6c407c3d --- /dev/null +++ b/typescript/packages/common-engine/README.md @@ -0,0 +1,20 @@ +# ct-engine + +JavaScript module implementation of [ct-engine]. + +## Using + +See `example.html` on usage. + +## Building + +Only this documentation, example, and tests can be found in the repository. All of the code is generated from compiling [ct-engine] via [wasm-pack]. + +Perform the build via nix: + +```sh +nix build .#engine-web +``` + +[wasm-pack]: https://rustwasm.github.io +[ct-engine]: ./rust/ct-engine diff --git a/typescript/packages/common-engine/ct_engine.d.ts b/typescript/packages/common-engine/ct_engine.d.ts new file mode 100644 index 000000000..afe855dae --- /dev/null +++ b/typescript/packages/common-engine/ct_engine.d.ts @@ -0,0 +1,72 @@ +/* tslint:disable */ +/* eslint-disable */ +/** + * The [`CtStore`] provides direct access to the underlying web store. + */ +export class CTStore { + free(): void; + /** + * Create a new [`CtStore`]. + */ + constructor(db_name: string, store_name: string, hash?: Uint8Array); + /** + * Returns the root hash of the storage, if it contains data. + */ + hash(): Uint8Array | undefined; + /** + * Sets `key` to `value`. + */ + set(key: Uint8Array, value: Uint8Array): Promise; + /** + * Retrieves value with `key`. + */ + get(key: Uint8Array): Promise; + /** + * Calls `callback` with `key` and `value` arguments + * for each entry within `start` and `end` range. + */ + getRange(start: Uint8Array, end: Uint8Array, start_inclusive: boolean, end_inclusive: boolean, callback: Function): Promise; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_ctstore_free: (a: number, b: number) => void; + readonly ctstore_new: (a: number, b: number, c: number, d: number, e: number, f: number) => number; + readonly ctstore_hash: (a: number, b: number) => void; + readonly ctstore_set: (a: number, b: number, c: number, d: number, e: number) => number; + readonly ctstore_get: (a: number, b: number, c: number) => number; + readonly ctstore_getRange: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => number; + readonly __wbindgen_export_0: (a: number) => void; + readonly __wbindgen_export_1: (a: number, b: number, c: number) => void; + readonly __wbindgen_export_2: (a: number, b: number) => number; + readonly __wbindgen_export_3: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_export_4: WebAssembly.Table; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_export_5: (a: number, b: number, c: number) => void; + readonly __wbindgen_export_6: (a: number, b: number, c: number) => void; + readonly __wbindgen_export_7: (a: number, b: number, c: number) => void; + readonly __wbindgen_export_8: (a: number, b: number, c: number, d: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/typescript/packages/common-engine/ct_engine.js b/typescript/packages/common-engine/ct_engine.js new file mode 100644 index 000000000..c6f3bfe66 --- /dev/null +++ b/typescript/packages/common-engine/ct_engine.js @@ -0,0 +1,927 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_export_0(addHeapObject(e)); + } +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(state => { + wasm.__wbindgen_export_4.get(state.dtor)(state.a, state.b) +}); + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_4.get(state.dtor)(a, state.b); + CLOSURE_DTORS.unregister(state); + } else { + state.a = a; + } + } + }; + real.original = state; + CLOSURE_DTORS.register(real, state, state); + return real; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches && builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +function getArrayU8FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len); +} + +function passArray8ToWasm0(arg, malloc) { + const ptr = malloc(arg.length * 1, 1) >>> 0; + getUint8ArrayMemory0().set(arg, ptr / 1); + WASM_VECTOR_LEN = arg.length; + return ptr; +} +function __wbg_adapter_28(arg0, arg1, arg2) { + wasm.__wbindgen_export_5(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_31(arg0, arg1, arg2) { + wasm.__wbindgen_export_6(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_34(arg0, arg1, arg2) { + wasm.__wbindgen_export_7(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_164(arg0, arg1, arg2, arg3) { + wasm.__wbindgen_export_8(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3)); +} + +const __wbindgen_enum_IdbTransactionMode = ["readonly", "readwrite", "versionchange", "readwriteflush", "cleanup"]; + +const CTStoreFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_ctstore_free(ptr >>> 0, 1)); +/** + * The [`CtStore`] provides direct access to the underlying web store. + */ +export class CTStore { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(CTStore.prototype); + obj.__wbg_ptr = ptr; + CTStoreFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + CTStoreFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_ctstore_free(ptr, 0); + } + /** + * Create a new [`CtStore`]. + * @param {string} db_name + * @param {string} store_name + * @param {Uint8Array | undefined} [hash] + */ + constructor(db_name, store_name, hash) { + const ptr0 = passStringToWasm0(db_name, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(store_name, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + const len1 = WASM_VECTOR_LEN; + var ptr2 = isLikeNone(hash) ? 0 : passArray8ToWasm0(hash, wasm.__wbindgen_export_2); + var len2 = WASM_VECTOR_LEN; + const ret = wasm.ctstore_new(ptr0, len0, ptr1, len1, ptr2, len2); + return takeObject(ret); + } + /** + * Returns the root hash of the storage, if it contains data. + * @returns {Uint8Array | undefined} + */ + hash() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.ctstore_hash(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + let v1; + if (r0 !== 0) { + v1 = getArrayU8FromWasm0(r0, r1).slice(); + wasm.__wbindgen_export_1(r0, r1 * 1, 1); + } + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * Sets `key` to `value`. + * @param {Uint8Array} key + * @param {Uint8Array} value + * @returns {Promise} + */ + set(key, value) { + const ptr0 = passArray8ToWasm0(key, wasm.__wbindgen_export_2); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(value, wasm.__wbindgen_export_2); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.ctstore_set(this.__wbg_ptr, ptr0, len0, ptr1, len1); + return takeObject(ret); + } + /** + * Retrieves value with `key`. + * @param {Uint8Array} key + * @returns {Promise} + */ + get(key) { + const ptr0 = passArray8ToWasm0(key, wasm.__wbindgen_export_2); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.ctstore_get(this.__wbg_ptr, ptr0, len0); + return takeObject(ret); + } + /** + * Calls `callback` with `key` and `value` arguments + * for each entry within `start` and `end` range. + * @param {Uint8Array} start + * @param {Uint8Array} end + * @param {boolean} start_inclusive + * @param {boolean} end_inclusive + * @param {Function} callback + * @returns {Promise} + */ + getRange(start, end, start_inclusive, end_inclusive, callback) { + const ptr0 = passArray8ToWasm0(start, wasm.__wbindgen_export_2); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passArray8ToWasm0(end, wasm.__wbindgen_export_2); + const len1 = WASM_VECTOR_LEN; + const ret = wasm.ctstore_getRange(this.__wbg_ptr, ptr0, len0, ptr1, len1, start_inclusive, end_inclusive, addHeapObject(callback)); + return takeObject(ret); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_buffer_61b7ce01341d7f88 = function(arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_3b770f0d6eb4720e = function() { return handleError(function (arg0, arg1, arg2, arg3) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2), getObject(arg3)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_call_500db948e69c7330 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).call(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_call_b0d8e36992d9900d = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_close_f6e618ed8b0326a3 = function(arg0) { + getObject(arg0).close(); + }; + imports.wbg.__wbg_createIndex_14571b3c4eec1628 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + const ret = getObject(arg0).createIndex(getStringFromWasm0(arg1, arg2), getObject(arg3)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_createIndex_1d4b2bbb6b21b8f8 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + const ret = getObject(arg0).createIndex(getStringFromWasm0(arg1, arg2), getObject(arg3), getObject(arg4)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_createObjectStore_8d7577746ff46a7d = function() { return handleError(function (arg0, arg1, arg2, arg3) { + const ret = getObject(arg0).createObjectStore(getStringFromWasm0(arg1, arg2), getObject(arg3)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_ctstore_new = function(arg0) { + const ret = CTStore.__wrap(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_deleteIndex_86ec4c1be2675058 = function() { return handleError(function (arg0, arg1, arg2) { + getObject(arg0).deleteIndex(getStringFromWasm0(arg1, arg2)); + }, arguments) }; + imports.wbg.__wbg_deleteObjectStore_1f50ba0263875deb = function() { return handleError(function (arg0, arg1, arg2) { + getObject(arg0).deleteObjectStore(getStringFromWasm0(arg1, arg2)); + }, arguments) }; + imports.wbg.__wbg_error_7534b8e9a36f1ab4 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_export_1(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_error_77233c625ed0c533 = function() { return handleError(function (arg0) { + const ret = getObject(arg0).error; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_error_aabb2ea1160edfa2 = function(arg0) { + const ret = getObject(arg0).error; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_get_6a4f854f5cca7403 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).get(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_9aa3dff3f0266054 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_bbccf8970793c087 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_get_bfcfa7d168a923b6 = function(arg0, arg1, arg2) { + const ret = getObject(arg1)[arg2 >>> 0]; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_indexNames_ea5a29611c881483 = function(arg0) { + const ret = getObject(arg0).indexNames; + return addHeapObject(ret); + }; + imports.wbg.__wbg_index_871d874253bae760 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).index(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_instanceof_IdbDatabase_4728aafa594bcd0f = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof IDBDatabase; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_instanceof_IdbFactory_58497a6cd3e3a103 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof IDBFactory; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_instanceof_IdbOpenDbRequest_a5b41ce7ffc27340 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof IDBOpenDBRequest; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_instanceof_IdbRequest_6cd11201baf6632f = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof IDBRequest; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_instanceof_IdbTransaction_ab63aadc06fe81be = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof IDBTransaction; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_28af5bc19d6acad8 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isArray_1ba11a930108ec51 = function(arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_keyPath_0905ca0995f8c81d = function() { return handleError(function (arg0) { + const ret = getObject(arg0).keyPath; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_length_5e3f0bd7902bc4ce = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_length_65d1cd11729ced11 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_length_d65cf0786bfc5739 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_log_0cc1b7768397bcfe = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_export_1(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_log_cb9e190acc5753fb = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_export_1(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbg_mark_7438147ce31e9d4b = function(arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbg_measure_fb7825c11612c823 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_export_1(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_export_1(deferred1_0, deferred1_1, 1); + } + }, arguments) }; + imports.wbg.__wbg_multiEntry_08ef01df0c584217 = function(arg0) { + const ret = getObject(arg0).multiEntry; + return ret; + }; + imports.wbg.__wbg_new_254fa9eac11932ae = function() { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_3d446df9155128ef = function(arg0, arg1) { + try { + var state0 = {a: arg0, b: arg1}; + var cb0 = (arg0, arg1) => { + const a = state0.a; + state0.a = 0; + try { + return __wbg_adapter_164(a, state0.b, arg0, arg1); + } finally { + state0.a = a; + } + }; + const ret = new Promise(cb0); + return addHeapObject(ret); + } finally { + state0.a = state0.b = 0; + } + }; + imports.wbg.__wbg_new_3ff5b33b1ce712df = function(arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_688846f374351c92 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_8a6f238a6ece86ea = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newnoargs_fd9e4bf8be2bc16d = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithbyteoffsetandlength_ba35896968751d91 = function(arg0, arg1, arg2) { + const ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithlength_34ce8f1051e74449 = function(arg0) { + const ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_objectStoreNames_cb00c8113b3cf5df = function(arg0) { + const ret = getObject(arg0).objectStoreNames; + return addHeapObject(ret); + }; + imports.wbg.__wbg_objectStore_cdbc73ee600a2cfa = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).objectStore(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_open_4588c85c0c43671d = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_open_5c51d4d6d7ab6da6 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + const ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), arg3 >>> 0); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_push_6edad0df4b546b2c = function(arg0, arg1) { + const ret = getObject(arg0).push(getObject(arg1)); + return ret; + }; + imports.wbg.__wbg_put_5393e88dbe742e8f = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).put(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_put_78726bde9e67ce9c = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).put(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_queueMicrotask_2181040e064c0dc8 = function(arg0) { + queueMicrotask(getObject(arg0)); + }; + imports.wbg.__wbg_queueMicrotask_ef9ac43769cbcc4f = function(arg0) { + const ret = getObject(arg0).queueMicrotask; + return addHeapObject(ret); + }; + imports.wbg.__wbg_resolve_0bf7c44d641804f9 = function(arg0) { + const ret = Promise.resolve(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_result_e6ba6a347dcb7470 = function() { return handleError(function (arg0) { + const ret = getObject(arg0).result; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_set_23d69db4e5c66a6e = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_setautoincrement_01d0c0050f6c3ac7 = function(arg0, arg1) { + getObject(arg0).autoIncrement = arg1 !== 0; + }; + imports.wbg.__wbg_setkeypath_ba11b9fa7ea79484 = function(arg0, arg1) { + getObject(arg0).keyPath = getObject(arg1); + }; + imports.wbg.__wbg_setmultientry_44d7522905f48f7b = function(arg0, arg1) { + getObject(arg0).multiEntry = arg1 !== 0; + }; + imports.wbg.__wbg_setonabort_ade6cac5c35a572f = function(arg0, arg1) { + getObject(arg0).onabort = getObject(arg1); + }; + imports.wbg.__wbg_setoncomplete_2747fb71ae0af4a8 = function(arg0, arg1) { + getObject(arg0).oncomplete = getObject(arg1); + }; + imports.wbg.__wbg_setonerror_72b33e31f9edb045 = function(arg0, arg1) { + getObject(arg0).onerror = getObject(arg1); + }; + imports.wbg.__wbg_setonerror_e4beb2652cf66635 = function(arg0, arg1) { + getObject(arg0).onerror = getObject(arg1); + }; + imports.wbg.__wbg_setonsuccess_57167b1c2650357c = function(arg0, arg1) { + getObject(arg0).onsuccess = getObject(arg1); + }; + imports.wbg.__wbg_setonupgradeneeded_887c7a5fca66011e = function(arg0, arg1) { + getObject(arg0).onupgradeneeded = getObject(arg1); + }; + imports.wbg.__wbg_setonversionchange_a6f60bd1d110795d = function(arg0, arg1) { + getObject(arg0).onversionchange = getObject(arg1); + }; + imports.wbg.__wbg_setunique_cfc477dc5825e1c4 = function(arg0, arg1) { + getObject(arg0).unique = arg1 !== 0; + }; + imports.wbg.__wbg_stack_0ed75d68575b0f3c = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_static_accessor_GLOBAL_0be7472e492ad3e3 = function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_static_accessor_GLOBAL_THIS_1a6eb482d12c9bfb = function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_static_accessor_SELF_1dc398a895c82351 = function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_static_accessor_WINDOW_ae1c80c7eea8d64a = function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_stringify_f4f701bc34ceda61 = function() { return handleError(function (arg0) { + const ret = JSON.stringify(getObject(arg0)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_target_a8fe593e7ee79c21 = function(arg0) { + const ret = getObject(arg0).target; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_then_0438fad860fe38e1 = function(arg0, arg1) { + const ret = getObject(arg0).then(getObject(arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_transaction_d2b6d520837fbe7f = function(arg0) { + const ret = getObject(arg0).transaction; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_transaction_dbab9cd9ea849958 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).transaction(getObject(arg1), __wbindgen_enum_IdbTransactionMode[arg2]); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_unique_0192502abf384518 = function(arg0) { + const ret = getObject(arg0).unique; + return ret; + }; + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + imports.wbg.__wbindgen_closure_wrapper237 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 49, __wbg_adapter_28); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_closure_wrapper369 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 79, __wbg_adapter_31); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_closure_wrapper872 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 223, __wbg_adapter_34); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_is_function = function(arg0) { + const ret = typeof(getObject(arg0)) === 'function'; + return ret; + }; + imports.wbg.__wbindgen_is_null = function(arg0) { + const ret = getObject(arg0) === null; + return ret; + }; + imports.wbg.__wbindgen_is_string = function(arg0) { + const ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_memory = function() { + const ret = wasm.memory; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export_2, wasm.__wbindgen_export_3); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_uint8_array_new = function(arg0, arg1) { + var v0 = getArrayU8FromWasm0(arg0, arg1).slice(); + wasm.__wbindgen_export_1(arg0, arg1 * 1, 1); + const ret = v0; + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('ct_engine_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/typescript/packages/common-engine/ct_engine_bg.wasm b/typescript/packages/common-engine/ct_engine_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..cbde6eff5e6af415cf4f0e210f42436909eb64ba GIT binary patch literal 279850 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 HkdpFWONpH1 literal 0 HcmV?d00001 diff --git a/typescript/packages/common-engine/ct_engine_bg.wasm.d.ts b/typescript/packages/common-engine/ct_engine_bg.wasm.d.ts new file mode 100644 index 000000000..c51514e06 --- /dev/null +++ b/typescript/packages/common-engine/ct_engine_bg.wasm.d.ts @@ -0,0 +1,19 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export const __wbg_ctstore_free: (a: number, b: number) => void; +export const ctstore_new: (a: number, b: number, c: number, d: number, e: number, f: number) => number; +export const ctstore_hash: (a: number, b: number) => void; +export const ctstore_set: (a: number, b: number, c: number, d: number, e: number) => number; +export const ctstore_get: (a: number, b: number, c: number) => number; +export const ctstore_getRange: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => number; +export const __wbindgen_export_0: (a: number) => void; +export const __wbindgen_export_1: (a: number, b: number, c: number) => void; +export const __wbindgen_export_2: (a: number, b: number) => number; +export const __wbindgen_export_3: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_export_4: WebAssembly.Table; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_export_5: (a: number, b: number, c: number) => void; +export const __wbindgen_export_6: (a: number, b: number, c: number) => void; +export const __wbindgen_export_7: (a: number, b: number, c: number) => void; +export const __wbindgen_export_8: (a: number, b: number, c: number, d: number) => void; diff --git a/typescript/packages/common-engine/example.html b/typescript/packages/common-engine/example.html new file mode 100644 index 000000000..7dc271bb3 --- /dev/null +++ b/typescript/packages/common-engine/example.html @@ -0,0 +1,100 @@ + \ No newline at end of file diff --git a/typescript/packages/common-engine/package.json b/typescript/packages/common-engine/package.json new file mode 100644 index 000000000..357115040 --- /dev/null +++ b/typescript/packages/common-engine/package.json @@ -0,0 +1,16 @@ +{ + "name": "ct-engine", + "type": "module", + "description": "Common engine", + "version": "0.1.0", + "files": [ + "ct_engine_bg.wasm", + "ct_engine.js", + "ct_engine.d.ts" + ], + "main": "ct_engine.js", + "types": "ct_engine.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/typescript/packages/common-system/package.json b/typescript/packages/common-system/package.json index 452f1737f..377b3b54d 100644 --- a/typescript/packages/common-system/package.json +++ b/typescript/packages/common-system/package.json @@ -29,6 +29,7 @@ "@commontools/common-builder": "^0.0.1", "@commontools/common-html": "^0.0.1", "@commontools/common-runner": "^0.0.1", + "@commontools/common-engine": "file:../common-engine", "@commontools/llm-client": "^0.0.1", "@gozala/co-dom": "^0.4.0", "datalogia": "^0.9.2", @@ -67,4 +68,4 @@ "command": "rm -rf ./lib ./dist ./.wireit ./node_modules tsconfig.tsbuildinfo" } } -} +} \ No newline at end of file diff --git a/typescript/packages/common-system/src/ctstore.ts b/typescript/packages/common-system/src/ctstore.ts new file mode 100644 index 000000000..cf7b7da7a --- /dev/null +++ b/typescript/packages/common-system/src/ctstore.ts @@ -0,0 +1,173 @@ +import { + Type, + Task, +} from "synopsys"; +import init, { CTStore } from "@commontools/common-engine"; + +// This isn't exported from "synopsis/store/sequence" +//import { IterationFinished } from "synopsys/store/sequence"; +class CTStoreIterationFinished implements Type.IterationFinished { + name: 'IterationFinished'; + message = 'IterationFinished'; +} + +let READ = 0; +let ENTRIES = 0; + +class CTStoreSequence implements Type.Sequence { + private index: number; + private entries: Type.Entry[]; + private store: CTStore; + private lowerBound: Type.Bound; + private upperBound: Type.Bound; + + constructor(store: CTStore, lowerBound: Type.Bound, upperBound: Type.Bound) { + if (!lowerBound.key || !upperBound.key) { + throw new Error("Null bounds not yet supported."); + } + upperBound.key = padKey(upperBound.key); + lowerBound.key = padKey(lowerBound.key); + this.index = 0; + this.entries = []; + this.store = store; + this.upperBound = upperBound; + this.lowerBound = lowerBound; + } + + *next(): Type.API.Task, Error, typeof Task.SUSPEND | Task.Join | Task.Throw> { + if (this.index === 0) { + if (!this.lowerBound.key || !this.upperBound.key) { + throw new Error("Null bounds not yet supported."); + } + let entries = this.entries; + yield* Task.wait(this.store.getRange(this.lowerBound.key, this.upperBound.key, this.lowerBound.inclusive, this.upperBound.inclusive, (key: Uint8Array, value: Uint8Array) => { + entries.push([key, value]); + })); + } + if (this.index < this.entries.length) { + return { ok: this.entries[this.index++] }; + } else { + return { error: new CTStoreIterationFinished() }; + } + } +} + +export function* open(dbName: string, tableName: string) { + yield* Task.wait(init()); + let store = yield* Task.wait(new CTStore(dbName, tableName, undefined)); + return new CTSynopsisStore(store); +} + +export class CTSynopsisStore implements Type.Store, Type.StoreReader, Type.StoreWriter { + private store: CTStore; + constructor(store: CTStore) { + this.store = store; + } + + // /!\ Should be unnecessary + *getRoot(): Type.API.Task { + let key = new Uint8Array(96); + let hash = this.store.hash() ?? new Uint8Array(32); + return { + level: 0, + key, + hash, + value: undefined, + }; + } + + // /!\ Should be unnecessary + *getChildren(_level: number, _key: Uint8Array): Type.API.Task { + throw new Error("getChildren() not implemented"); + } + // /!\ Should be unnecessary + *getNode(_level: number, _key: Type.Key): Type.API.Task { + throw new Error("getNode() not implemented"); + } + // /!\ Should be unnecessary + nodes(_level: number, _lowerBound?: Type.Bound | null, _upperBound?: Type.Bound | null, _options?: { reverse?: boolean; }): + Type.Sequence { + throw new Error("nodes() not implemented"); + } + + entries(lowerBound?: Type.Bound | null, upperBound?: Type.Bound | null, _options?: { reverse?: boolean; }): + Type.Sequence { + if (!lowerBound || !upperBound) { + throw new Error("Bounds must be defined."); + } + console.log('!entries', ++ENTRIES); + return new CTStoreSequence(this.store, lowerBound, upperBound); + } + + *get(key: Uint8Array): Type.API.Task { + console.log('!get'); + let result = yield* Task.wait(this.store.get(padKey(key))); + return result ?? null; + } + + *delete(_key: Uint8Array): Type.API.Task<{}, Error> { + console.log('!delete'); + throw new Error("delete() not implemented"); + } + + *set(key: Uint8Array, value: Uint8Array): Type.API.Task<{}, Error> { + console.log('!set'); + yield* Task.wait(this.store.set(padKey(key), value)); + return {}; + } + + *integrate(changes: Type.Change[]): Type.API.Task { + console.log('!integrate'); + for (const [key, value] of changes) { + if (value) { + yield* this.set(key, value) + } else { + yield* this.delete(key) + } + } + + return yield* this.getRoot() + } + + *read(read: (reader: Type.StoreReader) => Type.API.Task): Type.API.Task { + const result = yield* read(this); + this.commit(); + console.log('!entries', ++READ); + return result; + } + + *write(write: (editor: Type.StoreEditor) => Type.API.Task): Type.API.Task { + const result = yield* write(this); + console.log('!write'); + this.commit(); + return result; + } + + commit() { + } + + *clear(): Type.API.Task<{}, Error> { + // todo! + throw new Error("clear() not implemented"); + return {}; + } + + *close(): Type.API.Task<{}, Error> { + // todo! + this.store.free(); + return {}; + } +} + +function padKey(key: Uint8Array): Uint8Array { + let len = key.length; + if (len < 96) { + let buffer = new Uint8Array(96); + buffer.set(key); + return buffer; + } else if (len > 96) { + throw new Error("key larger than 96"); + } else { + return key; + } +} \ No newline at end of file diff --git a/typescript/packages/common-system/src/db.ts b/typescript/packages/common-system/src/db.ts index c9a1271dc..9d64eac02 100644 --- a/typescript/packages/common-system/src/db.ts +++ b/typescript/packages/common-system/src/db.ts @@ -21,6 +21,8 @@ import { Constant } from "datalogia"; import { logQuery } from "./debug.js"; import * as Store from "./idb.js"; import { Reference } from "merkle-reference"; +import { open as openCTSynopsisStore } from "./ctstore.js"; + export * from "synopsys"; export type DB = @@ -42,6 +44,7 @@ export interface Options { local?: IDB.Open; } + /** * Represents a connection to a local and a remote databases. It takes care * of synchronizing two by publishing local changes to remote and integrating @@ -49,7 +52,9 @@ export interface Options { */ class Connection { static *open(options: Options = {}) { - const durable = yield* IDB.open(options.local); + const USE_CT_STORE = true; + const durable = yield* (USE_CT_STORE ? openCTSynopsisStore("dbname", "tablename") : IDB.open(options.local)); + //const durable = yield* IDB.open(options.local); // const durable = yield* Memory.open(); const ephemeral = yield* Memory.open(); @@ -71,7 +76,7 @@ class Connection { constructor( public local: DB, public remote: Remote, - ) {} + ) { } *dispatch([entity, attribute, event]: [Reference, string, Event]) { yield* this.local.transact([ @@ -304,7 +309,7 @@ class PullSource implements UnderlyingDefaultSource { public url: URL, public store: Store.Store, public db: DB, - ) {} + ) { } async start(controller: ReadableStreamDefaultController) { while (!this.cancelled) { @@ -419,7 +424,7 @@ class PushTarget implements UnderlyingSink, API.Transactor { constructor( public url: URL, public store: Store.Store, - ) {} + ) { } start() { return Task.perform(this.flush()); } @@ -643,7 +648,7 @@ class Subscription, public effect: Effect