@factoidal/core 0.7.1 → 0.11.0
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/CHANGELOG.md +616 -1
- package/NOTICE +2 -21
- package/README.md +123 -993
- package/api.d.ts +53 -0
- package/api.js +5 -0
- package/api.mjs +56 -0
- package/bin/engine.mjs +38 -19
- package/bin/ext.mjs +16 -20
- package/bin/factoidal.mjs +667 -118
- package/bin/pack.mjs +37 -0
- package/bin/serve-worker.mjs +32 -0
- package/bin/serve.mjs +423 -0
- package/bin/store-worker-host.mjs +1 -1
- package/bin/store.mjs +1 -1
- package/browser.d.ts +114 -507
- package/browser.js +155 -2257
- package/docs/fuseki-replacement.md +108 -0
- package/fn.d.ts +25 -96
- package/fn.js +131 -240
- package/index.d.ts +620 -260
- package/index.js +4 -234
- package/index.mjs +180 -84
- package/l4-assets/l4factoidal.js +47 -7
- package/l4-assets/l4factoidal.mjs +1 -1
- package/l4-assets/l4factoidal.wasm +0 -0
- package/l4-assets/version.json +11 -7
- package/lib/api.mjs +2337 -0
- package/lib/browser-engine.mjs +69 -0
- package/lib/dataset.mjs +471 -0
- package/lib/delta-log-hosts.mjs +191 -0
- package/lib/lean-entry.mjs +213 -0
- package/lib/pure.mjs +98 -0
- package/lib/store.mjs +115 -0
- package/lib/version.mjs +5 -0
- package/lws/README.md +137 -0
- package/lws/persist.mjs +78 -0
- package/lws/server.mjs +416 -0
- package/package.json +59 -61
- package/rdfjs.js +5 -536
- package/rdfjs.mjs +517 -0
- package/sample-store.d.ts +8 -16
- package/sample-store.mjs +39 -29
- package/solid/client/README.md +100 -0
- package/solid/client/index.mjs +293 -0
- package/solid/server/README.md +96 -0
- package/solid/server/index.mjs +395 -0
- package/store-host/deno.mjs +8 -0
- package/store-host/index.mjs +12 -0
- package/store-host/node.mjs +8 -0
- package/xmpp/README.md +107 -0
- package/xmpp/index.mjs +229 -0
- package/browser-wasm.js +0 -872
- package/factoidal-npm-entry.js +0 -15477
- package/factoidal-npm-entry.wasm.assets/code-5a7fc68f2ab1323718b8.wasm +0 -0
- package/factoidal-npm-entry.wasm.js +0 -455
- package/factoidal.js +0 -13118
- package/factoidal.wasm.assets/code-bbe6099bfb5b10c4c3ab.wasm +0 -0
- package/factoidal.wasm.js +0 -457
- package/hacl-init.js +0 -92
- package/hacl-wasm/FStar.wasm +0 -0
- package/hacl-wasm/Hacl_Bignum.wasm +0 -0
- package/hacl-wasm/Hacl_Bignum25519_51.wasm +0 -0
- package/hacl-wasm/Hacl_Bignum_Base.wasm +0 -0
- package/hacl-wasm/Hacl_Curve25519_51.wasm +0 -0
- package/hacl-wasm/Hacl_Ed25519.wasm +0 -0
- package/hacl-wasm/Hacl_Ed25519_PrecompTable.wasm +0 -0
- package/hacl-wasm/Hacl_Hash_Base.wasm +0 -0
- package/hacl-wasm/Hacl_Hash_SHA2.wasm +0 -0
- package/hacl-wasm/Hacl_IntTypes_Intrinsics.wasm +0 -0
- package/hacl-wasm/LowStar_Endianness.wasm +0 -0
- package/hacl-wasm/WasmSupport.wasm +0 -0
- package/hacl-wasm/api.js +0 -775
- package/hacl-wasm/api.json +0 -3787
- package/hacl-wasm/layouts.json +0 -1
- package/hacl-wasm/loader.js +0 -568
- package/hacl-wasm/shell.js +0 -12
- package/l4-core.d.ts +0 -159
- package/l4-core.js +0 -188
- package/l4.d.ts +0 -50
- package/l4.js +0 -104
- package/lib/api.js +0 -2300
- package/lib/engine-js.js +0 -165
- package/lib/engine-wasm.js +0 -300
- package/sample-store/CURRENT +0 -1
- package/sample-store/gen-1/manifest.sbm2 +0 -0
- package/sample-store/gen-1/manifest.tsv +0 -14
- package/sample-store/gen-1/predicate-0.ibk3 +0 -0
- package/sample-store/gen-1/predicate-0.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-0.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-0.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-0.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-0.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-0.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-0.ibk3.tli1.merkle +0 -0
- package/sample-store/gen-1/predicate-1.ibk3 +0 -0
- package/sample-store/gen-1/predicate-1.ibk3.merkle +0 -0
- package/sample-store/gen-1/predicate-1.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-1.ibk3.oli2.merkle +0 -0
- package/sample-store/gen-1/predicate-1.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-1.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-1.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-1.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-10.ibk3 +0 -0
- package/sample-store/gen-1/predicate-10.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-10.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-10.ibk3.oli2.merkle +0 -0
- package/sample-store/gen-1/predicate-10.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-10.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-10.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-10.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-11.ibk3 +0 -0
- package/sample-store/gen-1/predicate-11.ibk3.merkle +0 -0
- package/sample-store/gen-1/predicate-11.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-11.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-11.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-11.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-11.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-11.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-12.ibk3 +0 -0
- package/sample-store/gen-1/predicate-12.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-12.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-12.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-12.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-12.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-12.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-12.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-2.ibk3 +0 -0
- package/sample-store/gen-1/predicate-2.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-2.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-2.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-2.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-2.ibk3.sri2.merkle +0 -0
- package/sample-store/gen-1/predicate-2.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-2.ibk3.tli1.merkle +0 -0
- package/sample-store/gen-1/predicate-3.ibk3 +0 -0
- package/sample-store/gen-1/predicate-3.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-3.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-3.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-3.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-3.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-3.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-3.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-4.ibk3 +0 -0
- package/sample-store/gen-1/predicate-4.ibk3.merkle +0 -0
- package/sample-store/gen-1/predicate-4.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-4.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-4.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-4.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-4.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-4.ibk3.tli1.merkle +0 -2
- package/sample-store/gen-1/predicate-5.ibk3 +0 -0
- package/sample-store/gen-1/predicate-5.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-5.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-5.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-5.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-5.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-5.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-5.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-6.ibk3 +0 -0
- package/sample-store/gen-1/predicate-6.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-6.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-6.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-6.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-6.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-6.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-6.ibk3.tli1.merkle +0 -0
- package/sample-store/gen-1/predicate-7.ibk3 +0 -0
- package/sample-store/gen-1/predicate-7.ibk3.merkle +0 -0
- package/sample-store/gen-1/predicate-7.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-7.ibk3.oli2.merkle +0 -2
- package/sample-store/gen-1/predicate-7.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-7.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-7.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-7.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-8.ibk3 +0 -0
- package/sample-store/gen-1/predicate-8.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-8.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-8.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-8.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-8.ibk3.sri2.merkle +0 -1
- package/sample-store/gen-1/predicate-8.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-8.ibk3.tli1.merkle +0 -1
- package/sample-store/gen-1/predicate-9.ibk3 +0 -0
- package/sample-store/gen-1/predicate-9.ibk3.merkle +0 -1
- package/sample-store/gen-1/predicate-9.ibk3.oli2 +0 -0
- package/sample-store/gen-1/predicate-9.ibk3.oli2.merkle +0 -1
- package/sample-store/gen-1/predicate-9.ibk3.sri2 +0 -0
- package/sample-store/gen-1/predicate-9.ibk3.sri2.merkle +0 -3
- package/sample-store/gen-1/predicate-9.ibk3.tli1 +0 -0
- package/sample-store/gen-1/predicate-9.ibk3.tli1.merkle +0 -2
- package/select.d.ts +0 -116
- package/select.js +0 -492
- package/version.json +0 -102
- package/wasm.d.ts +0 -130
- package/wasm.js +0 -158
package/api.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// TypeScript declarations for '@factoidal/core/api': the typed API over a
|
|
2
|
+
// Lean engine the caller loaded (api.mjs).
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A loaded Lean engine handle (the value `loadL4()` of
|
|
6
|
+
* `@factoidal/core/l4-assets/l4factoidal.js` resolves to: an object with
|
|
7
|
+
* `call(op, args)`), a Promise of one, or a zero-argument function
|
|
8
|
+
* answering either.
|
|
9
|
+
*/
|
|
10
|
+
export type EngineSource =
|
|
11
|
+
| object
|
|
12
|
+
| Promise<object>
|
|
13
|
+
| (() => object | Promise<object>);
|
|
14
|
+
|
|
15
|
+
export interface CreateApiOptions {
|
|
16
|
+
/** Reported as the returned API's `engine` field. Default 'lean4-wasm'. */
|
|
17
|
+
engineName?: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The typed API (the functions `@factoidal/core` exports) over `engine`.
|
|
22
|
+
* Throws a TypeError when `engine` is a plain object with no `call`
|
|
23
|
+
* method. `openStore()` on the result takes a reader function only.
|
|
24
|
+
*/
|
|
25
|
+
export function createApi(
|
|
26
|
+
engine: EngineSource,
|
|
27
|
+
options?: CreateApiOptions
|
|
28
|
+
): typeof import('./index').default;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The constructor createApi() is built on: a typed API over an ENTRY
|
|
32
|
+
* object (one method per dispatch op, string arguments, a JSON envelope
|
|
33
|
+
* string back), as entryFromEngine() builds it.
|
|
34
|
+
*/
|
|
35
|
+
export function buildApi(driver: {
|
|
36
|
+
engineName: string;
|
|
37
|
+
loadEntry: () => object | Promise<object>;
|
|
38
|
+
storeReaderFor?: (root: string) => import('./index').StoreReader;
|
|
39
|
+
}): typeof import('./index').default;
|
|
40
|
+
|
|
41
|
+
/** The entry object over a loaded engine handle (lib/lean-entry.mjs). */
|
|
42
|
+
export function entryFromEngine(engine: object): Record<string, unknown>;
|
|
43
|
+
|
|
44
|
+
export const Dataset: typeof import('./index').Dataset;
|
|
45
|
+
export const DatasetHandle: typeof import('./index').DatasetHandle;
|
|
46
|
+
export const Store: typeof import('./index').Store;
|
|
47
|
+
export const dataFactory: import('./index').DataFactory;
|
|
48
|
+
/** Position-carrying parse failure; see index.d.ts's ParseError. */
|
|
49
|
+
export const ParseError: typeof import('./index').ParseError;
|
|
50
|
+
/** Package version string, e.g. '0.9.0'. */
|
|
51
|
+
export const version: string;
|
|
52
|
+
|
|
53
|
+
export default createApi;
|
package/api.js
ADDED
package/api.mjs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// @factoidal/core/api — the typed API over a Lean engine the caller loads.
|
|
2
|
+
//
|
|
3
|
+
// index.mjs and browser.js find and load the engine themselves. A bundler
|
|
4
|
+
// build, or a page with its own asset layout, may want to load it another
|
|
5
|
+
// way: import the loader, instantiate the module however the page needs,
|
|
6
|
+
// and hand the result here.
|
|
7
|
+
//
|
|
8
|
+
// import { createApi } from '@factoidal/core/api';
|
|
9
|
+
// import { loadL4 } from '@factoidal/core/l4-assets/l4factoidal.js';
|
|
10
|
+
// const factoidal = createApi(() => loadL4());
|
|
11
|
+
// const ds = await factoidal.parse('<a> <b> "c" .', { format: 'ntriples' });
|
|
12
|
+
//
|
|
13
|
+
// `engine` is the handle loadL4() resolves to (an object with
|
|
14
|
+
// call(op, args)), a Promise of one, or a zero-argument function answering
|
|
15
|
+
// either. Nothing here fetches or evaluates code; WebAssembly compilation
|
|
16
|
+
// happens in the loader, which a Content-Security-Policy page allows with
|
|
17
|
+
// 'wasm-unsafe-eval'.
|
|
18
|
+
//
|
|
19
|
+
// openStore() here takes a reader function only: there is no file system.
|
|
20
|
+
|
|
21
|
+
import { buildApi, ParseError, DatasetHandle, Store } from './lib/api.mjs';
|
|
22
|
+
import { entryFromEngine } from './lib/lean-entry.mjs';
|
|
23
|
+
import { dataFactory } from './rdfjs.mjs';
|
|
24
|
+
import { Dataset } from './lib/dataset.mjs';
|
|
25
|
+
import { version } from './lib/version.mjs';
|
|
26
|
+
|
|
27
|
+
function isThenable(x) {
|
|
28
|
+
return !!x && (typeof x === 'object' || typeof x === 'function') &&
|
|
29
|
+
typeof x.then === 'function';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The typed API (the functions index.mjs exports) over a Lean engine.
|
|
34
|
+
* @param {object|Promise<object>|(() => object|Promise<object>)} engine
|
|
35
|
+
* @param {{engineName?: string}} [options]
|
|
36
|
+
*/
|
|
37
|
+
export function createApi(engine, options) {
|
|
38
|
+
const opts = options || {};
|
|
39
|
+
// A plain handle is checked now, so a wrong argument fails here and not
|
|
40
|
+
// at the first query.
|
|
41
|
+
let entry = (typeof engine !== 'function' && !isThenable(engine))
|
|
42
|
+
? entryFromEngine(engine)
|
|
43
|
+
: undefined;
|
|
44
|
+
return buildApi({
|
|
45
|
+
engineName: opts.engineName || 'lean4-wasm',
|
|
46
|
+
loadEntry: async () => {
|
|
47
|
+
if (entry !== undefined) return entry;
|
|
48
|
+
const produced = typeof engine === 'function' ? engine() : engine;
|
|
49
|
+
entry = entryFromEngine(await produced);
|
|
50
|
+
return entry;
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { buildApi, entryFromEngine, ParseError, DatasetHandle, Store, Dataset, dataFactory, version };
|
|
56
|
+
export default createApi;
|
package/bin/engine.mjs
CHANGED
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
//
|
|
5
5
|
// This file resolves three files that must stay together and keep their
|
|
6
6
|
// names -- l4factoidal.js, l4factoidal.mjs and l4factoidal.wasm -- and
|
|
7
|
-
// imports the loader. The
|
|
7
|
+
// imports the loader. The core engine (`@factoidal/core/core`, issue 713
|
|
8
|
+
// stage 4) is the same three files under the name l4factoidal-core; every
|
|
9
|
+
// function here takes the name, 'l4factoidal' (the full engine) by default. The Emscripten glue resolves the .wasm sidecar from
|
|
8
10
|
// its own basename, so a rename breaks the load on every runtime
|
|
9
11
|
// (skills/lean4-wasm-export, "the naming trap").
|
|
10
12
|
//
|
|
11
|
-
// `
|
|
12
|
-
//
|
|
13
|
-
//
|
|
13
|
+
// The library entries (`index.mjs`, `browser.js`) load the engine their
|
|
14
|
+
// own way; this file stays free of require() so the command loads under
|
|
15
|
+
// Deno without the CommonJS compatibility path.
|
|
14
16
|
//
|
|
15
17
|
// WHAT THIS FILE IS ALLOWED TO DO
|
|
16
18
|
// Find the engine, load it, and turn bytes into the hexadecimal string
|
|
@@ -52,6 +54,16 @@ export function packageDirectory () {
|
|
|
52
54
|
return fileUrlToPath(new URL('..', import.meta.url).href).replace(/\/$/, '')
|
|
53
55
|
}
|
|
54
56
|
|
|
57
|
+
/** The two engines: the full module and the core module (issue 713 stage 4). */
|
|
58
|
+
export const ENGINE_NAMES = Object.freeze(['l4factoidal', 'l4factoidal-core'])
|
|
59
|
+
|
|
60
|
+
function checkName (name) {
|
|
61
|
+
if (!ENGINE_NAMES.includes(name)) {
|
|
62
|
+
throw new TypeError(`unknown engine '${name}' (expected one of ${ENGINE_NAMES.join(', ')})`)
|
|
63
|
+
}
|
|
64
|
+
return name
|
|
65
|
+
}
|
|
66
|
+
|
|
55
67
|
/**
|
|
56
68
|
* The loader file of the first engine source that exists, or null.
|
|
57
69
|
*
|
|
@@ -59,38 +71,44 @@ export function packageDirectory () {
|
|
|
59
71
|
* 1. this package's own l4-assets/ (what `npm install` gives);
|
|
60
72
|
* 2. $FACTOIDAL_L4_ASSETS (a custom deployment);
|
|
61
73
|
* 3. the repository checkout layout, docs/web/hub/assets/l4/.
|
|
74
|
+
*
|
|
75
|
+
* @param {string} [name] 'l4factoidal' (the full engine) or 'l4factoidal-core'
|
|
62
76
|
*/
|
|
63
|
-
export function resolveEngine () {
|
|
64
|
-
|
|
77
|
+
export function resolveEngine (name = 'l4factoidal') {
|
|
78
|
+
checkName(name)
|
|
79
|
+
const inPackage = joinPath(packageDirectory(), `l4-assets/${name}.js`)
|
|
65
80
|
if (readable(inPackage)) return inPackage
|
|
66
81
|
const override = environment('FACTOIDAL_L4_ASSETS')
|
|
67
82
|
if (override !== null) {
|
|
68
|
-
const path = joinPath(override,
|
|
83
|
+
const path = joinPath(override, `${name}.js`)
|
|
69
84
|
if (readable(path)) return path
|
|
70
|
-
throw new Error(`FACTOIDAL_L4_ASSETS=${override} holds no
|
|
85
|
+
throw new Error(`FACTOIDAL_L4_ASSETS=${override} holds no ${name}.js`)
|
|
71
86
|
}
|
|
72
87
|
const inCheckout = joinPath(packageDirectory(),
|
|
73
|
-
|
|
88
|
+
`../../docs/web/hub/assets/l4/${name}.js`)
|
|
74
89
|
if (readable(inCheckout)) return inCheckout
|
|
75
90
|
return null
|
|
76
91
|
}
|
|
77
92
|
|
|
78
|
-
|
|
93
|
+
const enginePromises = new Map()
|
|
79
94
|
|
|
80
95
|
/**
|
|
81
|
-
* Load
|
|
82
|
-
* `callBlob(op, args, bytes)`.
|
|
96
|
+
* Load an engine once per process and return its handle: `call(op, args)`,
|
|
97
|
+
* `callBlob(op, args, bytes)`, `callBlobIO(op, args, bytes)`.
|
|
98
|
+
*
|
|
99
|
+
* @param {string} [name] 'l4factoidal' (the full engine) or 'l4factoidal-core'
|
|
83
100
|
*/
|
|
84
|
-
export function loadEngine () {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
101
|
+
export function loadEngine (name = 'l4factoidal') {
|
|
102
|
+
checkName(name)
|
|
103
|
+
if (enginePromises.has(name)) return enginePromises.get(name)
|
|
104
|
+
const promise = (async () => {
|
|
105
|
+
const loaderPath = resolveEngine(name)
|
|
88
106
|
if (loaderPath === null) {
|
|
89
107
|
throw new Error(
|
|
90
|
-
|
|
108
|
+
`the Lean engine assets are missing (${name}). They normally ship in this ` +
|
|
91
109
|
"package's own l4-assets/ directory; if it is absent this install " +
|
|
92
110
|
'is incomplete. Otherwise set FACTOIDAL_L4_ASSETS to a directory ' +
|
|
93
|
-
|
|
111
|
+
`holding ${name}.js, ${name}.mjs and ${name}.wasm.`)
|
|
94
112
|
}
|
|
95
113
|
const url = loaderPath.startsWith('file://')
|
|
96
114
|
? loaderPath
|
|
@@ -98,7 +116,8 @@ export function loadEngine () {
|
|
|
98
116
|
const module = await import(url)
|
|
99
117
|
return module.loadL4()
|
|
100
118
|
})()
|
|
101
|
-
|
|
119
|
+
enginePromises.set(name, promise)
|
|
120
|
+
return promise
|
|
102
121
|
}
|
|
103
122
|
|
|
104
123
|
const HEX = (() => {
|
package/bin/ext.mjs
CHANGED
|
@@ -33,11 +33,12 @@
|
|
|
33
33
|
// times the physical plan evaluates the expression, and across
|
|
34
34
|
// re-evaluation rounds.
|
|
35
35
|
|
|
36
|
-
const XSD = 'http://www.w3.org/2001/XMLSchema#'
|
|
37
36
|
|
|
38
37
|
/** How many evaluation rounds an async resolution may take. */
|
|
39
38
|
export const EXT_MAX_ROUNDS = 25
|
|
40
39
|
|
|
40
|
+
import { appTermToJson } from '../rdfjs.mjs'
|
|
41
|
+
|
|
41
42
|
const extFunctions = new Map()
|
|
42
43
|
const extRegistered = new Set()
|
|
43
44
|
let extCache = new Map()
|
|
@@ -45,29 +46,24 @@ let extPending = []
|
|
|
45
46
|
let bridgeInstalled = false
|
|
46
47
|
|
|
47
48
|
/**
|
|
48
|
-
* Encode one JavaScript answer
|
|
49
|
-
*
|
|
49
|
+
* Encode one JavaScript answer for Wasm/Ops/ExtFns.lean, as a JSON string:
|
|
50
|
+
* the value tagged with its JavaScript type ({js, v}; a number as its
|
|
51
|
+
* Number::toString text), or a term object. The engine chooses the datatype
|
|
52
|
+
* and the lexical form (L4Factoidal.XSD.JsValue.jsLiteral,
|
|
53
|
+
* https://github.com/danbri/factoidal/issues/894 item 3). `''` means
|
|
54
|
+
* "no value", the section 17.6 error.
|
|
50
55
|
*/
|
|
51
56
|
function encodeAnswer (out) {
|
|
52
57
|
if (out === null || out === undefined) return ''
|
|
53
|
-
|
|
54
|
-
return JSON.stringify({
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
if (typeof out === 'string') {
|
|
63
|
-
return JSON.stringify({ type: 'literal', value: out })
|
|
64
|
-
}
|
|
65
|
-
if (typeof out === 'object' && typeof out.type === 'string') {
|
|
66
|
-
// Already an SRJ binding-value object (or an RDF/JS-shaped term the
|
|
67
|
-
// caller built): pass it through and let the Lean decoder judge it.
|
|
68
|
-
return JSON.stringify(out)
|
|
58
|
+
switch (typeof out) {
|
|
59
|
+
case 'boolean': return JSON.stringify({ js: 'boolean', v: out })
|
|
60
|
+
case 'number': return JSON.stringify({ js: 'number', v: Object.is(out, -0) ? '-0' : String(out) })
|
|
61
|
+
case 'bigint': return JSON.stringify({ js: 'bigint', v: out.toString() })
|
|
62
|
+
case 'string': return JSON.stringify({ js: 'string', v: out })
|
|
63
|
+
case 'object':
|
|
64
|
+
try { return JSON.stringify(appTermToJson(out)) } catch (_error) { return '' }
|
|
65
|
+
default: return ''
|
|
69
66
|
}
|
|
70
|
-
return ''
|
|
71
67
|
}
|
|
72
68
|
|
|
73
69
|
/** The synchronous bridge the wasm module calls. */
|