@factoidal/core 0.7.1 → 0.10.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.
Files changed (193) hide show
  1. package/CHANGELOG.md +503 -1
  2. package/NOTICE +2 -21
  3. package/README.md +117 -993
  4. package/api.d.ts +53 -0
  5. package/api.js +5 -0
  6. package/api.mjs +56 -0
  7. package/bin/engine.mjs +38 -19
  8. package/bin/factoidal.mjs +512 -66
  9. package/bin/pack.mjs +37 -0
  10. package/bin/serve-worker.mjs +32 -0
  11. package/bin/serve.mjs +423 -0
  12. package/bin/store-worker-host.mjs +1 -1
  13. package/bin/store.mjs +1 -1
  14. package/browser.d.ts +110 -507
  15. package/browser.js +151 -2257
  16. package/docs/fuseki-replacement.md +108 -0
  17. package/fn.d.ts +24 -95
  18. package/fn.js +104 -150
  19. package/index.d.ts +598 -259
  20. package/index.js +4 -234
  21. package/index.mjs +176 -84
  22. package/l4-assets/l4factoidal.js +47 -7
  23. package/l4-assets/l4factoidal.mjs +1 -1
  24. package/l4-assets/l4factoidal.wasm +0 -0
  25. package/l4-assets/version.json +11 -7
  26. package/lib/api.mjs +2300 -0
  27. package/lib/browser-engine.mjs +69 -0
  28. package/lib/dataset.mjs +377 -0
  29. package/lib/delta-log-hosts.mjs +191 -0
  30. package/lib/lean-entry.mjs +204 -0
  31. package/lib/pure.mjs +98 -0
  32. package/lib/store.mjs +115 -0
  33. package/lib/version.mjs +5 -0
  34. package/lws/README.md +97 -0
  35. package/lws/server.mjs +331 -0
  36. package/package.json +59 -61
  37. package/rdfjs.js +5 -536
  38. package/rdfjs.mjs +594 -0
  39. package/sample-store.d.ts +8 -16
  40. package/sample-store.mjs +39 -29
  41. package/solid/client/README.md +100 -0
  42. package/solid/client/index.mjs +277 -0
  43. package/solid/server/README.md +96 -0
  44. package/solid/server/index.mjs +317 -0
  45. package/store-host/deno.mjs +8 -0
  46. package/store-host/index.mjs +12 -0
  47. package/store-host/node.mjs +8 -0
  48. package/xmpp/README.md +107 -0
  49. package/xmpp/index.mjs +229 -0
  50. package/browser-wasm.js +0 -872
  51. package/factoidal-npm-entry.js +0 -15477
  52. package/factoidal-npm-entry.wasm.assets/code-5a7fc68f2ab1323718b8.wasm +0 -0
  53. package/factoidal-npm-entry.wasm.js +0 -455
  54. package/factoidal.js +0 -13118
  55. package/factoidal.wasm.assets/code-bbe6099bfb5b10c4c3ab.wasm +0 -0
  56. package/factoidal.wasm.js +0 -457
  57. package/hacl-init.js +0 -92
  58. package/hacl-wasm/FStar.wasm +0 -0
  59. package/hacl-wasm/Hacl_Bignum.wasm +0 -0
  60. package/hacl-wasm/Hacl_Bignum25519_51.wasm +0 -0
  61. package/hacl-wasm/Hacl_Bignum_Base.wasm +0 -0
  62. package/hacl-wasm/Hacl_Curve25519_51.wasm +0 -0
  63. package/hacl-wasm/Hacl_Ed25519.wasm +0 -0
  64. package/hacl-wasm/Hacl_Ed25519_PrecompTable.wasm +0 -0
  65. package/hacl-wasm/Hacl_Hash_Base.wasm +0 -0
  66. package/hacl-wasm/Hacl_Hash_SHA2.wasm +0 -0
  67. package/hacl-wasm/Hacl_IntTypes_Intrinsics.wasm +0 -0
  68. package/hacl-wasm/LowStar_Endianness.wasm +0 -0
  69. package/hacl-wasm/WasmSupport.wasm +0 -0
  70. package/hacl-wasm/api.js +0 -775
  71. package/hacl-wasm/api.json +0 -3787
  72. package/hacl-wasm/layouts.json +0 -1
  73. package/hacl-wasm/loader.js +0 -568
  74. package/hacl-wasm/shell.js +0 -12
  75. package/l4-core.d.ts +0 -159
  76. package/l4-core.js +0 -188
  77. package/l4.d.ts +0 -50
  78. package/l4.js +0 -104
  79. package/lib/api.js +0 -2300
  80. package/lib/engine-js.js +0 -165
  81. package/lib/engine-wasm.js +0 -300
  82. package/sample-store/CURRENT +0 -1
  83. package/sample-store/gen-1/manifest.sbm2 +0 -0
  84. package/sample-store/gen-1/manifest.tsv +0 -14
  85. package/sample-store/gen-1/predicate-0.ibk3 +0 -0
  86. package/sample-store/gen-1/predicate-0.ibk3.merkle +0 -1
  87. package/sample-store/gen-1/predicate-0.ibk3.oli2 +0 -0
  88. package/sample-store/gen-1/predicate-0.ibk3.oli2.merkle +0 -1
  89. package/sample-store/gen-1/predicate-0.ibk3.sri2 +0 -0
  90. package/sample-store/gen-1/predicate-0.ibk3.sri2.merkle +0 -1
  91. package/sample-store/gen-1/predicate-0.ibk3.tli1 +0 -0
  92. package/sample-store/gen-1/predicate-0.ibk3.tli1.merkle +0 -0
  93. package/sample-store/gen-1/predicate-1.ibk3 +0 -0
  94. package/sample-store/gen-1/predicate-1.ibk3.merkle +0 -0
  95. package/sample-store/gen-1/predicate-1.ibk3.oli2 +0 -0
  96. package/sample-store/gen-1/predicate-1.ibk3.oli2.merkle +0 -0
  97. package/sample-store/gen-1/predicate-1.ibk3.sri2 +0 -0
  98. package/sample-store/gen-1/predicate-1.ibk3.sri2.merkle +0 -1
  99. package/sample-store/gen-1/predicate-1.ibk3.tli1 +0 -0
  100. package/sample-store/gen-1/predicate-1.ibk3.tli1.merkle +0 -1
  101. package/sample-store/gen-1/predicate-10.ibk3 +0 -0
  102. package/sample-store/gen-1/predicate-10.ibk3.merkle +0 -1
  103. package/sample-store/gen-1/predicate-10.ibk3.oli2 +0 -0
  104. package/sample-store/gen-1/predicate-10.ibk3.oli2.merkle +0 -0
  105. package/sample-store/gen-1/predicate-10.ibk3.sri2 +0 -0
  106. package/sample-store/gen-1/predicate-10.ibk3.sri2.merkle +0 -1
  107. package/sample-store/gen-1/predicate-10.ibk3.tli1 +0 -0
  108. package/sample-store/gen-1/predicate-10.ibk3.tli1.merkle +0 -1
  109. package/sample-store/gen-1/predicate-11.ibk3 +0 -0
  110. package/sample-store/gen-1/predicate-11.ibk3.merkle +0 -0
  111. package/sample-store/gen-1/predicate-11.ibk3.oli2 +0 -0
  112. package/sample-store/gen-1/predicate-11.ibk3.oli2.merkle +0 -1
  113. package/sample-store/gen-1/predicate-11.ibk3.sri2 +0 -0
  114. package/sample-store/gen-1/predicate-11.ibk3.sri2.merkle +0 -1
  115. package/sample-store/gen-1/predicate-11.ibk3.tli1 +0 -0
  116. package/sample-store/gen-1/predicate-11.ibk3.tli1.merkle +0 -1
  117. package/sample-store/gen-1/predicate-12.ibk3 +0 -0
  118. package/sample-store/gen-1/predicate-12.ibk3.merkle +0 -1
  119. package/sample-store/gen-1/predicate-12.ibk3.oli2 +0 -0
  120. package/sample-store/gen-1/predicate-12.ibk3.oli2.merkle +0 -1
  121. package/sample-store/gen-1/predicate-12.ibk3.sri2 +0 -0
  122. package/sample-store/gen-1/predicate-12.ibk3.sri2.merkle +0 -1
  123. package/sample-store/gen-1/predicate-12.ibk3.tli1 +0 -0
  124. package/sample-store/gen-1/predicate-12.ibk3.tli1.merkle +0 -1
  125. package/sample-store/gen-1/predicate-2.ibk3 +0 -0
  126. package/sample-store/gen-1/predicate-2.ibk3.merkle +0 -1
  127. package/sample-store/gen-1/predicate-2.ibk3.oli2 +0 -0
  128. package/sample-store/gen-1/predicate-2.ibk3.oli2.merkle +0 -1
  129. package/sample-store/gen-1/predicate-2.ibk3.sri2 +0 -0
  130. package/sample-store/gen-1/predicate-2.ibk3.sri2.merkle +0 -0
  131. package/sample-store/gen-1/predicate-2.ibk3.tli1 +0 -0
  132. package/sample-store/gen-1/predicate-2.ibk3.tli1.merkle +0 -0
  133. package/sample-store/gen-1/predicate-3.ibk3 +0 -0
  134. package/sample-store/gen-1/predicate-3.ibk3.merkle +0 -1
  135. package/sample-store/gen-1/predicate-3.ibk3.oli2 +0 -0
  136. package/sample-store/gen-1/predicate-3.ibk3.oli2.merkle +0 -1
  137. package/sample-store/gen-1/predicate-3.ibk3.sri2 +0 -0
  138. package/sample-store/gen-1/predicate-3.ibk3.sri2.merkle +0 -1
  139. package/sample-store/gen-1/predicate-3.ibk3.tli1 +0 -0
  140. package/sample-store/gen-1/predicate-3.ibk3.tli1.merkle +0 -1
  141. package/sample-store/gen-1/predicate-4.ibk3 +0 -0
  142. package/sample-store/gen-1/predicate-4.ibk3.merkle +0 -0
  143. package/sample-store/gen-1/predicate-4.ibk3.oli2 +0 -0
  144. package/sample-store/gen-1/predicate-4.ibk3.oli2.merkle +0 -1
  145. package/sample-store/gen-1/predicate-4.ibk3.sri2 +0 -0
  146. package/sample-store/gen-1/predicate-4.ibk3.sri2.merkle +0 -1
  147. package/sample-store/gen-1/predicate-4.ibk3.tli1 +0 -0
  148. package/sample-store/gen-1/predicate-4.ibk3.tli1.merkle +0 -2
  149. package/sample-store/gen-1/predicate-5.ibk3 +0 -0
  150. package/sample-store/gen-1/predicate-5.ibk3.merkle +0 -1
  151. package/sample-store/gen-1/predicate-5.ibk3.oli2 +0 -0
  152. package/sample-store/gen-1/predicate-5.ibk3.oli2.merkle +0 -1
  153. package/sample-store/gen-1/predicate-5.ibk3.sri2 +0 -0
  154. package/sample-store/gen-1/predicate-5.ibk3.sri2.merkle +0 -1
  155. package/sample-store/gen-1/predicate-5.ibk3.tli1 +0 -0
  156. package/sample-store/gen-1/predicate-5.ibk3.tli1.merkle +0 -1
  157. package/sample-store/gen-1/predicate-6.ibk3 +0 -0
  158. package/sample-store/gen-1/predicate-6.ibk3.merkle +0 -1
  159. package/sample-store/gen-1/predicate-6.ibk3.oli2 +0 -0
  160. package/sample-store/gen-1/predicate-6.ibk3.oli2.merkle +0 -1
  161. package/sample-store/gen-1/predicate-6.ibk3.sri2 +0 -0
  162. package/sample-store/gen-1/predicate-6.ibk3.sri2.merkle +0 -1
  163. package/sample-store/gen-1/predicate-6.ibk3.tli1 +0 -0
  164. package/sample-store/gen-1/predicate-6.ibk3.tli1.merkle +0 -0
  165. package/sample-store/gen-1/predicate-7.ibk3 +0 -0
  166. package/sample-store/gen-1/predicate-7.ibk3.merkle +0 -0
  167. package/sample-store/gen-1/predicate-7.ibk3.oli2 +0 -0
  168. package/sample-store/gen-1/predicate-7.ibk3.oli2.merkle +0 -2
  169. package/sample-store/gen-1/predicate-7.ibk3.sri2 +0 -0
  170. package/sample-store/gen-1/predicate-7.ibk3.sri2.merkle +0 -1
  171. package/sample-store/gen-1/predicate-7.ibk3.tli1 +0 -0
  172. package/sample-store/gen-1/predicate-7.ibk3.tli1.merkle +0 -1
  173. package/sample-store/gen-1/predicate-8.ibk3 +0 -0
  174. package/sample-store/gen-1/predicate-8.ibk3.merkle +0 -1
  175. package/sample-store/gen-1/predicate-8.ibk3.oli2 +0 -0
  176. package/sample-store/gen-1/predicate-8.ibk3.oli2.merkle +0 -1
  177. package/sample-store/gen-1/predicate-8.ibk3.sri2 +0 -0
  178. package/sample-store/gen-1/predicate-8.ibk3.sri2.merkle +0 -1
  179. package/sample-store/gen-1/predicate-8.ibk3.tli1 +0 -0
  180. package/sample-store/gen-1/predicate-8.ibk3.tli1.merkle +0 -1
  181. package/sample-store/gen-1/predicate-9.ibk3 +0 -0
  182. package/sample-store/gen-1/predicate-9.ibk3.merkle +0 -1
  183. package/sample-store/gen-1/predicate-9.ibk3.oli2 +0 -0
  184. package/sample-store/gen-1/predicate-9.ibk3.oli2.merkle +0 -1
  185. package/sample-store/gen-1/predicate-9.ibk3.sri2 +0 -0
  186. package/sample-store/gen-1/predicate-9.ibk3.sri2.merkle +0 -3
  187. package/sample-store/gen-1/predicate-9.ibk3.tli1 +0 -0
  188. package/sample-store/gen-1/predicate-9.ibk3.tli1.merkle +0 -2
  189. package/select.d.ts +0 -116
  190. package/select.js +0 -492
  191. package/version.json +0 -102
  192. package/wasm.d.ts +0 -130
  193. 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
@@ -0,0 +1,5 @@
1
+ // @factoidal/core/api for require(): the ES module api.mjs.
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./api.mjs');
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 Emscripten glue resolves the .wasm sidecar from
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
- // `npm/factoidal/l4.js` does the same resolution for the CommonJS API. It
12
- // is not reused here because it is CommonJS and this command must load
13
- // under Deno without the require() compatibility path.
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
- const inPackage = joinPath(packageDirectory(), 'l4-assets/l4factoidal.js')
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, 'l4factoidal.js')
83
+ const path = joinPath(override, `${name}.js`)
69
84
  if (readable(path)) return path
70
- throw new Error(`FACTOIDAL_L4_ASSETS=${override} holds no l4factoidal.js`)
85
+ throw new Error(`FACTOIDAL_L4_ASSETS=${override} holds no ${name}.js`)
71
86
  }
72
87
  const inCheckout = joinPath(packageDirectory(),
73
- '../../docs/web/hub/assets/l4/l4factoidal.js')
88
+ `../../docs/web/hub/assets/l4/${name}.js`)
74
89
  if (readable(inCheckout)) return inCheckout
75
90
  return null
76
91
  }
77
92
 
78
- let enginePromise = null
93
+ const enginePromises = new Map()
79
94
 
80
95
  /**
81
- * Load the engine once and return its handle: `call(op, args)` and
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
- if (enginePromise !== null) return enginePromise
86
- enginePromise = (async () => {
87
- const loaderPath = resolveEngine()
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
- 'the Lean engine assets are missing. They normally ship in this ' +
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
- 'holding l4factoidal.js, l4factoidal.mjs and l4factoidal.wasm.')
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
- return enginePromise
119
+ enginePromises.set(name, promise)
120
+ return promise
102
121
  }
103
122
 
104
123
  const HEX = (() => {