@ai-ecoverse/slicc-kernel 1.26.6 → 1.27.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/README.md +26 -3
- package/dist/driver-worker.js +1 -1
- package/dist/driver-worker.js.map +1 -1
- package/dist/index.js +66 -12
- package/dist/index.js.map +4 -4
- package/dist/kernel-worker.js +297 -17
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-driver-worker.js +1 -1
- package/dist/node-driver-worker.js.map +1 -1
- package/dist/node-process-worker.js +82 -19
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +243 -11
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +82 -19
- package/dist/process-worker.js.map +4 -4
- package/dist/testing.js +27 -0
- package/dist/testing.js.map +7 -0
- package/package.json +4 -3
package/dist/testing.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// src/kernel/net/uplink.ts
|
|
2
|
+
function answerOf(result) {
|
|
3
|
+
const answer = Array.isArray(result) ? { addresses: result } : result;
|
|
4
|
+
const addresses = Array.isArray(answer?.addresses) ? answer.addresses.filter((a) => typeof a === "string") : [];
|
|
5
|
+
return {
|
|
6
|
+
addresses,
|
|
7
|
+
...typeof answer?.ttl === "number" && answer.ttl >= 0 ? { ttl: answer.ttl } : {}
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// src/testing.ts
|
|
12
|
+
function fakeUplink(options = {}) {
|
|
13
|
+
const asked = [];
|
|
14
|
+
return {
|
|
15
|
+
traits: { tcp: true, udp: false, ipv6: options.ipv6 === true },
|
|
16
|
+
...options.routes ? { routes: options.routes } : {},
|
|
17
|
+
asked,
|
|
18
|
+
resolve: async (name, family) => {
|
|
19
|
+
asked.push({ name, family });
|
|
20
|
+
return answerOf(options.names?.[name] ?? []);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
fakeUplink
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/kernel/net/uplink.ts", "../src/testing.ts"],
|
|
4
|
+
"sourcesContent": ["import type { RouteTable } from './routes.ts';\n\nexport interface UplinkTraits {\n tcp: true;\n udp: false;\n ipv6: boolean;\n}\n\nexport type ResolveFamily = 0 | 4 | 6;\n\nexport interface ResolveAnswer {\n addresses: string[];\n ttl?: number;\n}\n\nexport interface NetworkUplink {\n readonly traits: UplinkTraits;\n readonly routes?: RouteTable;\n resolve(\n name: string,\n family: ResolveFamily,\n signal?: AbortSignal\n ): Promise<string[] | ResolveAnswer>;\n}\n\nexport type UplinkCall =\n | { uplink: 'resolve'; uid: number; name: string; family: ResolveFamily }\n | { uplink: 'cancel'; uid: number };\n\nexport type UplinkReply =\n | { uplink: 'resolved'; uid: number; addresses: string[]; ttl?: number }\n | { uplink: 'error'; uid: number; message: string; code?: string };\n\nexport interface UplinkPeer {\n postMessage(message: UplinkReply): void;\n}\n\nexport interface UplinkPort {\n postMessage(message: UplinkCall): void;\n}\n\nexport function answerOf(result: string[] | ResolveAnswer): ResolveAnswer {\n const answer = Array.isArray(result) ? { addresses: result } : result;\n const addresses = Array.isArray(answer?.addresses)\n ? answer.addresses.filter((a): a is string => typeof a === 'string')\n : [];\n return {\n addresses,\n ...(typeof answer?.ttl === 'number' && answer.ttl >= 0 ? { ttl: answer.ttl } : {}),\n };\n}\n\nfunction failure(uid: number, e: unknown): UplinkReply {\n const code = (e as { code?: unknown } | null)?.code;\n return {\n uplink: 'error',\n uid,\n message: e instanceof Error ? e.message : String(e),\n ...(typeof code === 'string' ? { code } : {}),\n };\n}\n\nexport interface UplinkServer {\n answer(call: UplinkCall): void;\n close(): void;\n}\n\nexport function serveUplink(peer: UplinkPeer, uplink: NetworkUplink): UplinkServer {\n const pending = new Map<number, AbortController>();\n const answer = (call: UplinkCall) => {\n if (call.uplink === 'cancel') return pending.get(call.uid)?.abort();\n const abort = new AbortController();\n pending.set(call.uid, abort);\n void (async () => {\n try {\n const answer = answerOf(await uplink.resolve(call.name, call.family, abort.signal));\n peer.postMessage({ uplink: 'resolved', uid: call.uid, ...answer });\n } catch (e) {\n peer.postMessage(failure(call.uid, e));\n } finally {\n pending.delete(call.uid);\n }\n })();\n };\n return {\n answer,\n close: () => {\n for (const abort of pending.values()) abort.abort();\n },\n };\n}\n\nexport class RemoteUplink implements NetworkUplink {\n readonly traits: UplinkTraits;\n readonly routes: RouteTable | undefined;\n private readonly port: UplinkPort;\n private readonly waiting = new Map<number, PromiseWithResolvers<ResolveAnswer>>();\n private nextId = 0;\n\n constructor(port: UplinkPort, traits: UplinkTraits, routes?: RouteTable) {\n this.port = port;\n this.traits = traits;\n this.routes = routes;\n }\n\n receive(reply: UplinkReply): void {\n const waiter = this.waiting.get(reply.uid);\n if (!waiter) return;\n this.waiting.delete(reply.uid);\n if (reply.uplink === 'error') {\n waiter.reject(Object.assign(new Error(reply.message), { code: reply.code }));\n } else waiter.resolve(answerOf(reply));\n }\n\n resolve(name: string, family: ResolveFamily, signal?: AbortSignal): Promise<ResolveAnswer> {\n const uid = ++this.nextId;\n const waiter = Promise.withResolvers<ResolveAnswer>();\n this.waiting.set(uid, waiter);\n const abort = () => {\n this.waiting.delete(uid);\n this.port.postMessage({ uplink: 'cancel', uid });\n waiter.reject(signal?.reason);\n };\n signal?.addEventListener('abort', abort, { once: true });\n const settled = () => signal?.removeEventListener('abort', abort);\n waiter.promise.then(settled, settled);\n this.port.postMessage({ uplink: 'resolve', uid, name, family });\n return waiter.promise;\n }\n}\n", "import type { RouteTable } from './kernel/net/routes.ts';\nimport {\n answerOf,\n type NetworkUplink,\n type ResolveAnswer,\n type ResolveFamily,\n} from './kernel/net/uplink.ts';\n\nexport type { NetworkUplink, ResolveAnswer, ResolveFamily, RouteTable };\n\nexport interface FakeUplinkOptions {\n names?: Readonly<Record<string, string[] | ResolveAnswer>>;\n routes?: RouteTable;\n ipv6?: boolean;\n}\n\nexport interface FakeUplink extends NetworkUplink {\n readonly asked: Array<{ name: string; family: ResolveFamily }>;\n}\n\nexport function fakeUplink(options: FakeUplinkOptions = {}): FakeUplink {\n const asked: FakeUplink['asked'] = [];\n return {\n traits: { tcp: true, udp: false, ipv6: options.ipv6 === true },\n ...(options.routes ? { routes: options.routes } : {}),\n asked,\n resolve: async (name, family) => {\n asked.push({ name, family });\n return answerOf(options.names?.[name] ?? []);\n },\n };\n}\n"],
|
|
5
|
+
"mappings": ";AAyCO,SAAS,SAAS,QAAiD;AACxE,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,EAAE,WAAW,OAAO,IAAI;AAC/D,QAAM,YAAY,MAAM,QAAQ,QAAQ,SAAS,IAC7C,OAAO,UAAU,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IACjE,CAAC;AACL,SAAO;AAAA,IACL;AAAA,IACA,GAAI,OAAO,QAAQ,QAAQ,YAAY,OAAO,OAAO,IAAI,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC;AAAA,EAClF;AACF;;;AC9BO,SAAS,WAAW,UAA6B,CAAC,GAAe;AACtE,QAAM,QAA6B,CAAC;AACpC,SAAO;AAAA,IACL,QAAQ,EAAE,KAAK,MAAM,KAAK,OAAO,MAAM,QAAQ,SAAS,KAAK;AAAA,IAC7D,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IACnD;AAAA,IACA,SAAS,OAAO,MAAM,WAAW;AAC/B,YAAM,KAAK,EAAE,MAAM,OAAO,CAAC;AAC3B,aAAO,SAAS,QAAQ,QAAQ,IAAI,KAAK,CAAC,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-ecoverse/slicc-kernel",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.27.0",
|
|
4
4
|
"description": "SLICC's wasm-realm kernel: run Emscripten programs in the browser against OPFS, with fork, spawn, pipes and waitpid",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
"exports": {
|
|
25
25
|
".": "./dist/index.js",
|
|
26
26
|
"./node": "./dist/node.js",
|
|
27
|
-
"./driver": "./dist/driver.js"
|
|
27
|
+
"./driver": "./dist/driver.js",
|
|
28
|
+
"./testing": "./dist/testing.js"
|
|
28
29
|
},
|
|
29
30
|
"files": [
|
|
30
31
|
"dist"
|
|
@@ -39,7 +40,7 @@
|
|
|
39
40
|
"start": "npm run build && node test/integration/chrome.mjs",
|
|
40
41
|
"pretest": "npm run build && playwright-core install --no-shell chromium",
|
|
41
42
|
"test": "node --test --test-timeout=180000 --test-global-setup=node_modules/@ai-ecoverse/slicc-shared-web/harness/global.mjs 'test/integration/*.test.mjs'",
|
|
42
|
-
"test:unit": "NODE_NO_WARNINGS=1 mcr -c node_modules/@ai-ecoverse/slicc-shared-web/mcr.config.mjs node --import fake-indexeddb/auto --test --test-concurrency=4 'test/unit/**/*.test.mjs'",
|
|
43
|
+
"test:unit": "tools/heavy.sh env NODE_NO_WARNINGS=1 mcr -c node_modules/@ai-ecoverse/slicc-shared-web/mcr.config.mjs node --import fake-indexeddb/auto --test --test-concurrency=4 'test/unit/**/*.test.mjs'",
|
|
43
44
|
"typecheck": "tsc && tsc -p tsconfig.node.json",
|
|
44
45
|
"lint": "slicc-lint",
|
|
45
46
|
"format": "biome check --write ."
|