From 21436600a59227c7f123f32fdb1e0ec17066f926 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Wed, 11 Dec 2024 18:31:51 -0600 Subject: [PATCH 01/37] replace sqlite-wasm with better-sqlite3 --- package.json | 6 +- packages/nodejs/package.json | 10 +- packages/nodejs/scripts/build-sqlite3.sh | 33 + packages/nodejs/src/db/store.db | Bin 0 -> 12288 bytes .../nodejs/src/kernel/kernel-worker.test.ts | 1 + packages/nodejs/src/kernel/kernel-worker.ts | 5 +- packages/nodejs/src/kernel/sqlite-kv-store.ts | 66 +- packages/nodejs/vitest.config.ts | 1 + yarn.lock | 568 ++++++++++++++++-- 9 files changed, 613 insertions(+), 77 deletions(-) create mode 100755 packages/nodejs/scripts/build-sqlite3.sh create mode 100644 packages/nodejs/src/db/store.db diff --git a/package.json b/package.json index 44d76ac66..6cfe0c413 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", "@typescript-eslint/utils": "^8.8.1", + "@vitest/browser": "2.1.4", "@vitest/coverage-istanbul": "2.1.3", "@vitest/eslint-plugin": "^1.1.7", "@yarnpkg/types": "^4.0.0", @@ -91,7 +92,7 @@ "typescript-eslint": "^8.8.1", "vite": "^5.3.5", "vite-tsconfig-paths": "^4.3.2", - "vitest": "^2.1.2", + "vitest": "2.1.4", "vitest-fetch-mock": "^0.4.2" }, "packageManager": "yarn@4.2.2", @@ -106,7 +107,8 @@ "simple-git-hooks": false, "vitest>@vitest/browser>webdriverio>@wdio/utils>edgedriver": false, "vitest>@vitest/browser>webdriverio>@wdio/utils>geckodriver": false, - "vitest>@vitest/mocker>msw": false + "vitest>@vitest/mocker>msw": false, + "@vitest/browser>msw": false } }, "resolutions": { diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 9d8dfad22..336dac664 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -12,7 +12,8 @@ "dist/" ], "scripts": { - "build": "ts-bridge --project tsconfig.build.json --clean", + "build": "ts-bridge --project tsconfig.build.json --clean && yarn build:sqlite3", + "build:sqlite3": "scripts/build-sqlite3.sh", "changelog:validate": "../../scripts/validate-changelog.sh @ocap/nodejs", "clean": "rimraf --glob ./dist './*.tsbuildinfo'", "lint": "yarn lint:ts && yarn lint:eslint && yarn lint:misc --check && yarn constraints && yarn lint:dependencies", @@ -23,7 +24,7 @@ "lint:ts": "tsc --project tsconfig.lint.json", "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", - "test": "yarn build && vitest", + "test": "vitest run --config vitest.config.ts", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", "test:verbose": "yarn test --reporter verbose" @@ -40,7 +41,7 @@ "@ocap/shims": "workspace:^", "@ocap/streams": "workspace:^", "@ocap/utils": "workspace:^", - "@sqlite.org/sqlite-wasm": "3.47.0-build1", + "better-sqlite3": "^11.7.0", "ses": "^1.9.0" }, "devDependencies": { @@ -52,10 +53,12 @@ "@ocap/cli": "workspace:^", "@ocap/test-utils": "workspace:^", "@ts-bridge/cli": "^0.5.1", + "@types/better-sqlite3": "^7.6.12", "@types/chrome": "^0.0.268", "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", "@typescript-eslint/utils": "^8.8.1", + "@vitest/browser": "2.1.3", "depcheck": "^1.4.7", "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", @@ -65,6 +68,7 @@ "eslint-plugin-n": "^17.11.1", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-promise": "^7.1.0", + "node-gyp": "^11.0.0", "prettier": "^3.3.3", "rimraf": "^6.0.1", "typedoc": "^0.26.8", diff --git a/packages/nodejs/scripts/build-sqlite3.sh b/packages/nodejs/scripts/build-sqlite3.sh new file mode 100755 index 000000000..a113a4401 --- /dev/null +++ b/packages/nodejs/scripts/build-sqlite3.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +# set -x +set -e +set -o pipefail + +dir=$(pwd) + +package_root="$(dirname "$0")/.." +cd $package_root +package_root=$(pwd) +monorepo_root="$package_root/../.." + +if [ -f "node_modules/better-sqlite3/build/better_sqlite3.node" ]; then + echo "Found better-sqlite3 bindings." + exit 0 +fi + +echo "Building better-sqlite3 bindings." + +# build better-sqlite at the monorepo root +cd $monorepo_root +cd node_modules/better-sqlite3 +yarn build-release + +# move back to the source folder +cd $package_root + +# copy the build to this package +mkdir -p node_modules/better-sqlite3/build/ +cp -r ../../node_modules/better-sqlite3/build/Release/ node_modules/better-sqlite3/build/ + +cd $dir diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db new file mode 100644 index 0000000000000000000000000000000000000000..21de76dd5928ca67e431ae49fd6d84074d3b439d GIT binary patch literal 12288 zcmeI$ziZn-6bJA-oui}y_gP*%`k;hFkQ&qyLbkX?gNaKL$CM_EQR*voCI6O0x)hQ> zA)EhzO!))4^dIQZsY{^$Ldl#lrz0YG${Nh~;LyFNcS85s?j0RAd$E#VhLe5}%eSn= zIA^<3GRCTU3O)0|^`ejm`kBQ~jVi1CI4RN{vuMOa4@`Rh11jZ~P1srA0)*W12q*WWdL8K!b$Rhkj1@3QTGYHvQoX%Ho9 zE_2Xoe5kjM<(_}Mp{rd}=)SV-%C^H|Vc;c^2t6 zv+07-f4ZRy`bk%Gxd_fU0|X!d0SG_<0uX=z1Rwwb2teR@3A_}d>I~Fb{4t0d-8Wl~ zE!HWE4<^HYZ>kzyue2oAOltr1oBFJ)yi(yI(^CCmoYm+ { it('should handle the lifecycle of multiple vats', async () => { + console.log('started test'); const kernelChannel = new NodeMessageChannel(); const { port1: kernelPort } = kernelChannel; console.log('Creating kernel...'); diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index ee87a5ddb..516e3e04f 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -1,4 +1,4 @@ -import './env.js'; +import '@ocap/shims/endoify'; import type { NonEmptyArray } from '@metamask/utils'; import type { KernelCommand, KernelCommandReply, VatId } from '@ocap/kernel'; import { Kernel, VatCommandMethod } from '@ocap/kernel'; @@ -43,6 +43,7 @@ export async function runVatLifecycle( vats: NonEmptyArray, ): Promise { console.time(`Created vats: ${vats.join(', ')}`); + /* await Promise.all( vats.map(async () => kernel.launchVat({ @@ -52,7 +53,7 @@ export async function runVatLifecycle( ), ); console.timeEnd(`Created vats: ${vats.join(', ')}`); - + */ console.log('Kernel vats:', kernel.getVatIds().join(', ')); // Restart a randomly selected vat from the array. diff --git a/packages/nodejs/src/kernel/sqlite-kv-store.ts b/packages/nodejs/src/kernel/sqlite-kv-store.ts index 8b4062316..c2f365840 100644 --- a/packages/nodejs/src/kernel/sqlite-kv-store.ts +++ b/packages/nodejs/src/kernel/sqlite-kv-store.ts @@ -1,7 +1,11 @@ +import { hasProperty, isObject } from '@metamask/utils'; import type { KVStore } from '@ocap/kernel'; import { makeLogger } from '@ocap/utils'; -import type { Database } from '@sqlite.org/sqlite-wasm'; -import sqlite3InitModule from '@sqlite.org/sqlite-wasm'; +// eslint-disable-next-line @typescript-eslint/naming-convention +import Sqlite from 'better-sqlite3'; +import { resolve } from 'path'; + +const dbPath = resolve(new URL('../db/store.db', import.meta.url).pathname); // No changes made to this file, besides this comment. // If used, this file should be deduped with its copy @@ -12,15 +16,16 @@ import sqlite3InitModule from '@sqlite.org/sqlite-wasm'; /** * Ensure that SQLite is initialized. * + * @param logger - An optional logger to pass to the Sqlite constructor. * @returns The SQLite database object. */ -async function initDB(): Promise { - const sqlite3 = await sqlite3InitModule(); - if (sqlite3.oo1.OpfsDb) { - return new sqlite3.oo1.OpfsDb('/testdb.sqlite', 'cwt'); - } - console.warn(`OPFS not enabled, database will be ephemeral`); - return new sqlite3.oo1.DB('/testdb.sqlite', 'cwt'); +async function initDB( + logger?: ReturnType, +): Promise { + console.log('dbPath:', dbPath); + return new Sqlite(dbPath, { + verbose: (logger ?? console).info, + }); } /** @@ -33,9 +38,9 @@ export async function makeSQLKVStore( label: string = '[sqlite]', ): Promise { const logger = makeLogger(label); - const db = await initDB(); + const db = await initDB(logger); - db.exec(` + const sqlKVInit = db.prepare(` CREATE TABLE IF NOT EXISTS kv ( key TEXT, value TEXT, @@ -43,6 +48,8 @@ export async function makeSQLKVStore( ) `); + sqlKVInit.run(); + const sqlKVGet = db.prepare(` SELECT value FROM kv @@ -57,22 +64,17 @@ export async function makeSQLKVStore( * @returns The value at that key. */ function kvGet(key: string, required: boolean): string { - sqlKVGet.bind([key]); - if (sqlKVGet.step()) { - const result = sqlKVGet.getString(0); - if (result) { - sqlKVGet.reset(); - logger.debug(`kernel get '${key}' as '${result}'`); - return result; - } + const result = sqlKVGet.get(key); + if (isObject(result) && hasProperty(result, 'value')) { + const value = result.value as string; + logger.debug(`kernel get '${key}' as '${value}'`); + return value; } - sqlKVGet.reset(); if (required) { throw Error(`no record matching key '${key}'`); - } else { - // Sometimes, we really lean on TypeScript's unsoundness - return undefined as unknown as string; } + // Sometimes, we really lean on TypeScript's unsoundness + return undefined as unknown as string; } const sqlKVSet = db.prepare(` @@ -89,9 +91,7 @@ export async function makeSQLKVStore( */ function kvSet(key: string, value: string): void { logger.debug(`kernel set '${key}' to '${value}'`); - sqlKVSet.bind([key, value]); - sqlKVSet.step(); - sqlKVSet.reset(); + sqlKVSet.run(key, value); } const sqlKVDelete = db.prepare(` @@ -106,13 +106,11 @@ export async function makeSQLKVStore( */ function kvDelete(key: string): void { logger.debug(`kernel delete '${key}'`); - sqlKVDelete.bind([key]); - sqlKVDelete.step(); - sqlKVDelete.reset(); + sqlKVDelete.run(key); } - const sqlKVTruncate = db.prepare(` - TRUNCATE TABLE kv + const sqlKVDrop = db.prepare(` + DROP TABLE kv `); /** @@ -120,8 +118,8 @@ export async function makeSQLKVStore( */ function kvTruncate(): void { logger.debug(`kernel truncate`); - sqlKVTruncate.step(); - sqlKVTruncate.reset(); + sqlKVDrop.run(); + sqlKVInit.run(); } return { @@ -129,6 +127,6 @@ export async function makeSQLKVStore( getRequired: (key) => kvGet(key, true), set: kvSet, delete: kvDelete, - truncate: kvTruncate, + truncate: db.transaction(kvTruncate), }; } diff --git a/packages/nodejs/vitest.config.ts b/packages/nodejs/vitest.config.ts index f07bdee16..091e47950 100644 --- a/packages/nodejs/vitest.config.ts +++ b/packages/nodejs/vitest.config.ts @@ -9,6 +9,7 @@ import defaultConfig from '../../vitest.config.js'; const config = mergeConfig( defaultConfig, defineConfig({ + optimizeDeps: { include: ['better-sqlite3'] }, test: { // pool: 'vmThreads', environment: 'node', diff --git a/yarn.lock b/yarn.lock index 255bfd087..69b3d860e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -242,12 +242,12 @@ __metadata: languageName: node linkType: hard -"@bundled-es-modules/cookie@npm:^2.0.0": - version: 2.0.0 - resolution: "@bundled-es-modules/cookie@npm:2.0.0" +"@bundled-es-modules/cookie@npm:^2.0.1": + version: 2.0.1 + resolution: "@bundled-es-modules/cookie@npm:2.0.1" dependencies: - cookie: "npm:^0.5.0" - checksum: 10/c8ef02aa5d3f6c786cfa407e1c93b4af29c600eb09990973f47a7a49e4771c1bec37c8f8e567638bb9cbc41f4e38d065ff1d8eaf9bf91f0c3613a6d60bc82c8c + cookie: "npm:^0.7.2" + checksum: 10/0038a5e82c41bfcd722afedabeb6961a5f15747b3681d7f4b61e35eb1e33130039e10ee9250dc9c9e4d3915ce1aeee717c0fb92225111574f0a030411abc0987 languageName: node linkType: hard @@ -939,6 +939,15 @@ __metadata: languageName: node linkType: hard +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" + dependencies: + minipass: "npm:^7.0.4" + checksum: 10/4412e9e6713c89c1e66d80bb0bb5a2a93192f10477623a27d08f228ba0316bb880affabc5bfe7f838f58a34d26c2c190da726e576cdfc18c49a72e89adabdcf5 + languageName: node + linkType: hard + "@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" @@ -1428,9 +1437,9 @@ __metadata: languageName: node linkType: hard -"@mswjs/interceptors@npm:^0.36.5": - version: 0.36.7 - resolution: "@mswjs/interceptors@npm:0.36.7" +"@mswjs/interceptors@npm:^0.37.0": + version: 0.37.3 + resolution: "@mswjs/interceptors@npm:0.37.3" dependencies: "@open-draft/deferred-promise": "npm:^2.2.0" "@open-draft/logger": "npm:^0.3.0" @@ -1438,7 +1447,7 @@ __metadata: is-node-process: "npm:^1.2.0" outvariant: "npm:^1.4.3" strict-event-emitter: "npm:^0.5.1" - checksum: 10/c2579a89f0cd4b9d7026499dffb9fc8ae0e1dea685cbee2028f1bc8ff55a13babe5b1631b10220d15acb4c8198636070913818d415026b850bdd086d384bdc27 + checksum: 10/3d3e2e073feead8702c18dc97e5201785865292b32bd882c4d80461adc3380483b33517c55d7c6c1e53723f5e2ecf50cca0412e6ecd2eb771f4eaabfa2138932 languageName: node linkType: hard @@ -1528,6 +1537,19 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/agent@npm:3.0.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10/775c9a7eb1f88c195dfb3bce70c31d0fe2a12b28b754e25c08a3edb4bc4816bfedb7ac64ef1e730579d078ca19dacf11630e99f8f3c3e0fd7b23caa5fd6d30a6 + languageName: node + linkType: hard + "@npmcli/fs@npm:^3.1.0": version: 3.1.1 resolution: "@npmcli/fs@npm:3.1.1" @@ -1537,6 +1559,15 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/fs@npm:4.0.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/405c4490e1ff11cf299775449a3c254a366a4b1ffc79d87159b0ee7d5558ac9f6a2f8c0735fd6ff3873cef014cb1a44a5f9127cb6a1b2dbc408718cca9365b5a + languageName: node + linkType: hard + "@npmcli/git@npm:^5.0.0": version: 5.0.8 resolution: "@npmcli/git@npm:5.0.8" @@ -1811,6 +1842,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.8.1" "@typescript-eslint/parser": "npm:^8.8.1" "@typescript-eslint/utils": "npm:^8.8.1" + "@vitest/browser": "npm:2.1.4" "@vitest/coverage-istanbul": "npm:2.1.3" "@vitest/eslint-plugin": "npm:^1.1.7" "@yarnpkg/types": "npm:^4.0.0" @@ -1837,7 +1869,7 @@ __metadata: typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" vite-tsconfig-paths: "npm:^4.3.2" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" vitest-fetch-mock: "npm:^0.4.2" webextension-polyfill: "npm:^0.12.0" languageName: unknown @@ -1865,12 +1897,14 @@ __metadata: "@ocap/streams": "workspace:^" "@ocap/test-utils": "workspace:^" "@ocap/utils": "workspace:^" - "@sqlite.org/sqlite-wasm": "npm:3.47.0-build1" "@ts-bridge/cli": "npm:^0.5.1" + "@types/better-sqlite3": "npm:^7.6.12" "@types/chrome": "npm:^0.0.268" "@typescript-eslint/eslint-plugin": "npm:^8.8.1" "@typescript-eslint/parser": "npm:^8.8.1" "@typescript-eslint/utils": "npm:^8.8.1" + "@vitest/browser": "npm:2.1.3" + better-sqlite3: "npm:^11.7.0" depcheck: "npm:^1.4.7" eslint: "npm:^9.12.0" eslint-config-prettier: "npm:^9.1.0" @@ -1880,6 +1914,7 @@ __metadata: eslint-plugin-n: "npm:^17.11.1" eslint-plugin-prettier: "npm:^5.2.1" eslint-plugin-promise: "npm:^7.1.0" + node-gyp: "npm:^11.0.0" prettier: "npm:^3.3.3" rimraf: "npm:^6.0.1" ses: "npm:^1.9.0" @@ -2433,15 +2468,6 @@ __metadata: languageName: node linkType: hard -"@sqlite.org/sqlite-wasm@npm:3.47.0-build1": - version: 3.47.0-build1 - resolution: "@sqlite.org/sqlite-wasm@npm:3.47.0-build1" - bin: - sqlite-wasm: bin/index.js - checksum: 10/2953f9220b5553b2adedb308ae064e742d5fa062da58bba5402ad7ceec01472e972c7ab25d3559fea508361c8564741161a8e97e88395701de9eb6c2218b8982 - languageName: node - linkType: hard - "@testing-library/dom@npm:^10.4.0": version: 10.4.0 resolution: "@testing-library/dom@npm:10.4.0" @@ -2505,6 +2531,15 @@ __metadata: languageName: node linkType: hard +"@types/better-sqlite3@npm:^7.6.12": + version: 7.6.12 + resolution: "@types/better-sqlite3@npm:7.6.12" + dependencies: + "@types/node": "npm:*" + checksum: 10/a442231518f1a3e28e0ee6efe2581807e5cfaa88a8af4513da34e6ae303ce82f5666e8a0048a1d2738fa248b1b369ee28e59a75189ae0b43e28e44a243a2f24b + languageName: node + linkType: hard + "@types/bn.js@npm:^5.1.5": version: 5.1.6 resolution: "@types/bn.js@npm:5.1.6" @@ -2881,6 +2916,34 @@ __metadata: languageName: node linkType: hard +"@vitest/browser@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/browser@npm:2.1.4" + dependencies: + "@testing-library/dom": "npm:^10.4.0" + "@testing-library/user-event": "npm:^14.5.2" + "@vitest/mocker": "npm:2.1.4" + "@vitest/utils": "npm:2.1.4" + magic-string: "npm:^0.30.12" + msw: "npm:^2.5.0" + sirv: "npm:^3.0.0" + tinyrainbow: "npm:^1.2.0" + ws: "npm:^8.18.0" + peerDependencies: + playwright: "*" + vitest: 2.1.4 + webdriverio: "*" + peerDependenciesMeta: + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + checksum: 10/315746aecebd2aaea5e4b4094157d53b7c6c3f08670f116ba4036e948aeb19a6b6f0c4052f3e0341b36897540f1093820cde0103208af1549258a138c8047d82 + languageName: node + linkType: hard + "@vitest/coverage-istanbul@npm:2.1.3": version: 2.1.3 resolution: "@vitest/coverage-istanbul@npm:2.1.3" @@ -3473,6 +3536,17 @@ __metadata: languageName: node linkType: hard +"better-sqlite3@npm:^11.7.0": + version: 11.7.0 + resolution: "better-sqlite3@npm:11.7.0" + dependencies: + bindings: "npm:^1.5.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.1" + checksum: 10/a09bb28c0292bb7c037896ee99197815841275bca2d14f63b58994188239f292642c8c7ea3e0206d8ea6c7530d7b03d7343138ebeb9a4cc855c0b3663e00c812 + languageName: node + linkType: hard + "bin-links@npm:4.0.4": version: 4.0.4 resolution: "bin-links@npm:4.0.4" @@ -3492,7 +3566,7 @@ __metadata: languageName: node linkType: hard -"bindings@npm:^1.4.0": +"bindings@npm:^1.4.0, bindings@npm:^1.5.0": version: 1.5.0 resolution: "bindings@npm:1.5.0" dependencies: @@ -3501,6 +3575,17 @@ __metadata: languageName: node linkType: hard +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10/b7904e66ed0bdfc813c06ea6c3e35eafecb104369dbf5356d0f416af90c1546de3b74e5b63506f0629acf5e16a6f87c3798f16233dcff086e9129383aa02ab55 + languageName: node + linkType: hard + "blueimp-md5@npm:^2.10.0": version: 2.19.0 resolution: "blueimp-md5@npm:2.19.0" @@ -3564,6 +3649,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10/997434d3c6e3b39e0be479a80288875f71cd1c07d75a3855e6f08ef848a3c966023f79534e22e415ff3a5112708ce06127277ab20e527146d55c84566405c7c6 + languageName: node + linkType: hard + "buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" @@ -3615,6 +3710,26 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^19.0.1": + version: 19.0.1 + resolution: "cacache@npm:19.0.1" + dependencies: + "@npmcli/fs": "npm:^4.0.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^7.0.2" + ssri: "npm:^12.0.0" + tar: "npm:^7.4.3" + unique-filename: "npm:^4.0.0" + checksum: 10/ea026b27b13656330c2bbaa462a88181dcaa0435c1c2e705db89b31d9bdf7126049d6d0445ba746dca21454a0cfdf1d6f47fd39d34c8c8435296b30bc5738a13 + languageName: node + linkType: hard + "callsite@npm:^1.0.0": version: 1.0.0 resolution: "callsite@npm:1.0.0" @@ -3785,6 +3900,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10/115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -3792,6 +3914,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10/b63cb1f73d171d140a2ed8154ee6566c8ab775d3196b0e03a2a94b5f6a0ce7777ee5685ca56849403c8d17bd457a6540672f9a60696a6137c7a409097495b82c + languageName: node + linkType: hard + "chunkd@npm:^2.0.1": version: 2.0.1 resolution: "chunkd@npm:2.0.1" @@ -4195,6 +4324,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10/d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 + languageName: node + linkType: hard + "deep-eql@npm:^5.0.1": version: 5.0.2 resolution: "deep-eql@npm:5.0.2" @@ -4202,6 +4340,13 @@ __metadata: languageName: node linkType: hard +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10/7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + "deep-freeze-strict@npm:^1.1.1": version: 1.1.1 resolution: "deep-freeze-strict@npm:1.1.1" @@ -4466,6 +4611,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 10/530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.15.0, enhanced-resolve@npm:^5.17.0": version: 5.17.1 resolution: "enhanced-resolve@npm:5.17.1" @@ -5026,6 +5180,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10/588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 + languageName: node + linkType: hard + "expand-tilde@npm:^2.0.0, expand-tilde@npm:^2.0.2": version: 2.0.2 resolution: "expand-tilde@npm:2.0.2" @@ -5245,6 +5406,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10/18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d + languageName: node + linkType: hard + "fs-extra@npm:^11.1.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -5401,6 +5569,13 @@ __metadata: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10/2a091ba07fbce22205642543b4ea8aaf068397e1433c00ae0f9de36a3607baf5bcc14da97fbb798cfca6393b3c402031fca06d8b491a44206d6efef391c58537 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -5419,7 +5594,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7, glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -5752,7 +5927,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.2.1": +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 10/d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 @@ -5821,14 +5996,14 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.3": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 languageName: node linkType: hard -"ini@npm:^1.3.4": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10/314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 @@ -6542,6 +6717,25 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^14.0.3": + version: 14.0.3 + resolution: "make-fetch-happen@npm:14.0.3" + dependencies: + "@npmcli/agent": "npm:^3.0.0" + cacache: "npm:^19.0.1" + http-cache-semantics: "npm:^4.1.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^4.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^1.0.0" + proc-log: "npm:^5.0.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^12.0.0" + checksum: 10/fce0385840b6d86b735053dfe941edc2dd6468fda80fe74da1eeff10cbd82a75760f406194f2bc2fa85b99545b2bc1f84c08ddf994b21830775ba2d1a87e8bdf + languageName: node + linkType: hard + "markdown-it@npm:^14.1.0": version: 14.1.0 resolution: "markdown-it@npm:14.1.0" @@ -6769,6 +6963,13 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10/7e719047612411fe071332a7498cf0448bbe43c485c0d780046c76633a771b223ff49bd00267be122cedebb897037fdb527df72335d0d0f74724604ca70b37ad + languageName: node + linkType: hard + "minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -6805,6 +7006,13 @@ __metadata: languageName: node linkType: hard +"minimist@npm:^1.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f + languageName: node + linkType: hard + "minipass-collect@npm:^2.0.1": version: 2.0.1 resolution: "minipass-collect@npm:2.0.1" @@ -6829,6 +7037,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^4.0.0": + version: 4.0.0 + resolution: "minipass-fetch@npm:4.0.0" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^3.0.1" + dependenciesMeta: + encoding: + optional: true + checksum: 10/4b0772dbee77727b469dc5bfc371541d9aba1e243fbb46ddc1b9ff7efa4de4a4cf5ff3a359d6a3b3a460ca26df9ae67a9c93be26ab6417c225e49d63b52b2801 + languageName: node + linkType: hard + "minipass-flush@npm:^1.0.5": version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" @@ -6872,7 +7095,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 @@ -6889,6 +7112,23 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^3.0.1": + version: 3.0.1 + resolution: "minizlib@npm:3.0.1" + dependencies: + minipass: "npm:^7.0.4" + rimraf: "npm:^5.0.5" + checksum: 10/622cb85f51e5c206a080a62d20db0d7b4066f308cb6ce82a9644da112367c3416ae7062017e631eb7ac8588191cfa4a9a279b8651c399265202b298e98c4acef + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10/3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -6898,6 +7138,15 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": version: 2.0.0 resolution: "mrmime@npm:2.0.0" @@ -6912,15 +7161,15 @@ __metadata: languageName: node linkType: hard -"msw@npm:^2.3.5": - version: 2.6.0 - resolution: "msw@npm:2.6.0" +"msw@npm:^2.3.5, msw@npm:^2.5.0": + version: 2.6.8 + resolution: "msw@npm:2.6.8" dependencies: - "@bundled-es-modules/cookie": "npm:^2.0.0" + "@bundled-es-modules/cookie": "npm:^2.0.1" "@bundled-es-modules/statuses": "npm:^1.0.1" "@bundled-es-modules/tough-cookie": "npm:^0.1.6" "@inquirer/confirm": "npm:^5.0.0" - "@mswjs/interceptors": "npm:^0.36.5" + "@mswjs/interceptors": "npm:^0.37.0" "@open-draft/deferred-promise": "npm:^2.2.0" "@open-draft/until": "npm:^2.1.0" "@types/cookie": "npm:^0.6.0" @@ -6941,7 +7190,7 @@ __metadata: optional: true bin: msw: cli/index.js - checksum: 10/7fec823b9350c8c2e635f6acbb0549d10b11b5622f16b9f90ee147d993458083054eaffe5ade6fcd435dd5dc66e4d5db7a4ee1f266944afeb617d2abe5afc89a + checksum: 10/35d551c0fffe8b12cf174ae70ea8560bcc2e67f8887f20b43c7a3903ad4dc4272dc1c92f9ae68d30ad56435b391bcc5379495b1f9f0badcd4f2fdb614fbf7244 languageName: node linkType: hard @@ -6985,6 +7234,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 10/276feb8e30189fe18718e85b6f82e4f952822baa2e7696f771cc42571a235b789dc5907a14d9ffb6838c3e4ff4c25717c2575e5ce1cf6e02e496e204c11e57f6 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -6999,6 +7255,22 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10/b5734e87295324fabf868e36fb97c84b7d7f3156ec5f4ee5bf6e488079c11054f818290fc33804cef7b1ee21f55eeb14caea83e7dafae6492a409b3e573153e5 + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.71.0 + resolution: "node-abi@npm:3.71.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10/0a1cef5106c43d67f9f8a911b0c9d5ee08971eda002ba466606c8e6164964456f5211f37966717efc3d5d49bae32f0cf9290254b1286bf71f0ba158a4f8a9846 + languageName: node + linkType: hard + "node-emoji@npm:^2.1.3": version: 2.1.3 resolution: "node-emoji@npm:2.1.3" @@ -7056,6 +7328,26 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:^11.0.0": + version: 11.0.0 + resolution: "node-gyp@npm:11.0.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^14.0.3" + nopt: "npm:^8.0.0" + proc-log: "npm:^5.0.0" + semver: "npm:^7.3.5" + tar: "npm:^7.4.3" + which: "npm:^5.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10/5d07430e887a906f85c7c6ed87e8facb7ecd4ce42d948a2438c471df2e24ae6af70f4def114ec1a03127988d164648dda8d75fe666f3c4b431e53856379fdf13 + languageName: node + linkType: hard + "node-releases@npm:^2.0.18": version: 2.0.18 resolution: "node-releases@npm:2.0.18" @@ -7092,6 +7384,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^8.0.0": + version: 8.0.0 + resolution: "nopt@npm:8.0.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10/2d137f64b6f9331ec97047dd1cbbe4dcd9a61ceef4fd0f2252c0bbac1d69ba15671e6fd83a441328824b3ca78afe6ebe1694f12ebcd162b73a221582a06179ff + languageName: node + linkType: hard + "normalize-package-data@npm:^6.0.0": version: 6.0.2 resolution: "normalize-package-data@npm:6.0.2" @@ -7203,7 +7506,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.4.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -7610,6 +7913,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.1": + version: 7.1.2 + resolution: "prebuild-install@npm:7.1.2" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10/32d5c026cc978dd02762b9ad3c765178aee8383aeac4303fed3cd226eff53100db038d4791b03ae1ebc7d213a7af392d26e32095579cedb8dba1d00ad08ecd46 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -7686,6 +8011,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^5.0.0": + version: 5.0.0 + resolution: "proc-log@npm:5.0.0" + checksum: 10/35610bdb0177d3ab5d35f8827a429fb1dc2518d9e639f2151ac9007f01a061c30e0c635a970c9b00c39102216160f6ec54b62377c92fac3b7bfc2ad4b98d195c + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -7724,6 +8056,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.2 + resolution: "pump@npm:3.0.2" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10/e0c4216874b96bd25ddf31a0b61a5613e26cc7afa32379217cf39d3915b0509def3565f5f6968fafdad2894c8bbdbd67d340e84f3634b2a29b950cffb6442d9f + languageName: node + linkType: hard + "punycode.js@npm:^2.3.1": version: 2.3.1 resolution: "punycode.js@npm:2.3.1" @@ -7773,6 +8115,20 @@ __metadata: languageName: node linkType: hard +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10/5c4d72ae7eec44357171585938c85ce066da8ca79146b5635baf3d55d74584c92575fa4e2c9eac03efbed3b46a0b2e7c30634c012b4b4fa40d654353d3c163eb + languageName: node + linkType: hard + "react-is@npm:^17.0.1": version: 17.0.2 resolution: "react-is@npm:17.0.2" @@ -7787,7 +8143,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -7970,6 +8326,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.5": + version: 5.0.10 + resolution: "rimraf@npm:5.0.10" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10/f3b8ce81eecbde4628b07bdf9e2fa8b684e0caea4999acb1e3b0402c695cd41f28cd075609a808e61ce2672f528ca079f675ab1d8e8d5f86d56643a03e0b8d2e + languageName: node + linkType: hard + "rimraf@npm:^6.0.1": version: 6.0.1 resolution: "rimraf@npm:6.0.1" @@ -8084,7 +8451,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.2.0": +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 @@ -8223,6 +8590,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10/4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10/93f1b32319782f78f2f2234e9ce34891b7ab6b990d19d8afefaa44423f5235ce2676aae42d6743fecac6c8dfff4b808d4c24fe5265be813d04769917a9a44f36 + languageName: node + linkType: hard + "simple-git-hooks@npm:^2.11.1": version: 2.11.1 resolution: "simple-git-hooks@npm:2.11.1" @@ -8243,6 +8628,17 @@ __metadata: languageName: node linkType: hard +"sirv@npm:^3.0.0": + version: 3.0.0 + resolution: "sirv@npm:3.0.0" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10/94dbd5df7cf4965f7c5941767117cbf9709e1d25de1d619a114c3f77fc63c124b5a5255717af2a0de637bb83d0b0defd0822d01420764b56432b53281b1d675d + languageName: node + linkType: hard + "skin-tone@npm:^2.0.0": version: 2.0.0 resolution: "skin-tone@npm:2.0.0" @@ -8441,6 +8837,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^12.0.0": + version: 12.0.0 + resolution: "ssri@npm:12.0.0" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10/7024c1a6e39b3f18aa8f1c8290e884fe91b0f9ca5a6c6d410544daad54de0ba664db879afe16412e187c6c292fd60b937f047ee44292e5c2af2dcc6d8e1a9b48 + languageName: node + linkType: hard + "stable-hash@npm:^0.0.4": version: 0.0.4 resolution: "stable-hash@npm:0.0.4" @@ -8592,6 +8997,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10/1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + languageName: node + linkType: hard + "strnum@npm:^1.0.5": version: 1.0.5 resolution: "strnum@npm:1.0.5" @@ -8661,6 +9073,31 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10/526deae025453e825f87650808969662fbb12eb0461d033e9b447de60ec951c6c4607d0afe7ce057defe9d4e45cf80399dd74bc15f9d9e0773d5e990a78ce4ac + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10/1a52a51d240c118cbcd30f7368ea5e5baef1eac3e6b793fb1a41e6cd7319296c79c0264ccc5859f5294aa80f8f00b9239d519e627b9aade80038de6f966fec6a + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -8675,6 +9112,20 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.4.3": + version: 7.4.3 + resolution: "tar@npm:7.4.3" + dependencies: + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.0.1" + mkdirp: "npm:^3.0.1" + yallist: "npm:^5.0.0" + checksum: 10/12a2a4fc6dee23e07cc47f1aeb3a14a1afd3f16397e1350036a8f4cdfee8dcac7ef5978337a4e7b2ac2c27a9a6d46388fc2088ea7c80cb6878c814b1425f8ecf + languageName: node + linkType: hard + "temp-dir@npm:^3.0.0": version: 3.0.0 resolution: "temp-dir@npm:3.0.0" @@ -8857,6 +9308,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10/7f0d9ed5c22404072b2ae8edc45c071772affd2ed14a74f03b4e71b4dd1a14c3714d85aed64abcaaee5fec2efc79002ba81155c708f4df65821b444abb0cfade + languageName: node + linkType: hard + "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0" @@ -9022,6 +9482,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-filename@npm:4.0.0" + dependencies: + unique-slug: "npm:^5.0.0" + checksum: 10/6a62094fcac286b9ec39edbd1f8f64ff92383baa430af303dfed1ffda5e47a08a6b316408554abfddd9730c78b6106bef4ca4d02c1231a735ddd56ced77573df + languageName: node + linkType: hard + "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0" @@ -9031,6 +9500,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-slug@npm:5.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10/beafdf3d6f44990e0a5ce560f8f881b4ee811be70b6ba0db25298c31c8cf525ed963572b48cd03be1c1349084f9e339be4241666d7cf1ebdad20598d3c652b27 + languageName: node + linkType: hard + "unist-util-is@npm:^6.0.0": version: 6.0.0 resolution: "unist-util-is@npm:6.0.0" @@ -9334,7 +9812,7 @@ __metadata: languageName: node linkType: hard -"vitest@npm:^2.1.2": +"vitest@npm:2.1.4, vitest@npm:^2.1.2": version: 2.1.4 resolution: "vitest@npm:2.1.4" dependencies: @@ -9550,6 +10028,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^5.0.0": + version: 5.0.0 + resolution: "which@npm:5.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10/6ec99e89ba32c7e748b8a3144e64bfc74aa63e2b2eacbb61a0060ad0b961eb1a632b08fb1de067ed59b002cec3e21de18299216ebf2325ef0f78e0f121e14e90 + languageName: node + linkType: hard + "why-is-node-running@npm:^2.3.0": version: 2.3.0 resolution: "why-is-node-running@npm:2.3.0" @@ -9706,6 +10195,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10/1884d272d485845ad04759a255c71775db0fac56308764b4c77ea56a20d56679fad340213054c8c9c9c26fcfd4c4b2a90df993b7e0aaf3cdb73c618d1d1a802a + languageName: node + linkType: hard + "yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" From 0b49574be3a83a1d94739ec91c4e0681b6ec5ca0 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:32:48 -0600 Subject: [PATCH 02/37] vitest endoified node worker with node duplex stream (wip) --- packages/nodejs/package.json | 3 +- packages/nodejs/scripts/build-constants.mjs | 11 +++ packages/nodejs/src/db/store.db | Bin 12288 -> 12288 bytes packages/nodejs/src/env/endoify.ts | 1 + .../src/env/kernel-worker-trusted-prelude.js | 2 + .../nodejs/src/kernel/VatWorkerService.ts | 19 +++-- .../nodejs/src/kernel/kernel-worker.test.ts | 14 +++- packages/nodejs/src/kernel/kernel-worker.ts | 28 ++++---- packages/nodejs/src/node/comms.ts | 43 ++++++++++++ packages/nodejs/src/node/node-worker.test.ts | 55 +++++++++++++++ packages/nodejs/src/node/node-worker.ts | 59 ++++++++++++++++ packages/nodejs/src/vat/inside.ts | 25 +++++-- packages/nodejs/tsconfig.json | 2 +- packages/nodejs/vite.config.ts | 66 ++++++++++++++++++ packages/nodejs/vitest.config.ts | 4 +- yarn.lock | 25 ++++++- 16 files changed, 326 insertions(+), 31 deletions(-) create mode 100644 packages/nodejs/scripts/build-constants.mjs create mode 100644 packages/nodejs/src/env/endoify.ts create mode 100644 packages/nodejs/src/env/kernel-worker-trusted-prelude.js create mode 100644 packages/nodejs/src/node/comms.ts create mode 100644 packages/nodejs/src/node/node-worker.test.ts create mode 100644 packages/nodejs/src/node/node-worker.ts create mode 100644 packages/nodejs/vite.config.ts diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 336dac664..ddb767908 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -58,7 +58,8 @@ "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", "@typescript-eslint/utils": "^8.8.1", - "@vitest/browser": "2.1.3", + "@vitest/browser": "2.1.4", + "@vitest/coverage-istanbul": "2.1.4", "depcheck": "^1.4.7", "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", diff --git a/packages/nodejs/scripts/build-constants.mjs b/packages/nodejs/scripts/build-constants.mjs new file mode 100644 index 000000000..fefb3620f --- /dev/null +++ b/packages/nodejs/scripts/build-constants.mjs @@ -0,0 +1,11 @@ +import path from 'path'; + +export const sourceDir = './src'; +export const buildDir = path.resolve(sourceDir, '../dist'); + +export const trustedPreludes = { + 'kernel-worker': path.resolve( + sourceDir, + 'env/kernel-worker-trusted-prelude.js', + ), +}; diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db index 21de76dd5928ca67e431ae49fd6d84074d3b439d..2f6be2d9945909a19a2704096b30d62aab914fd8 100644 GIT binary patch delta 56 zcmZojXh@hK#l*-yQN{^KZcJFl&(X-h|Azktf8%C8fnt6^er9HQ;k?v}lCZ=Q&lDq5 K^Uagw^8^6A-4F2q delta 56 zcmZojXh@hK#l#>#QN{^KZcJFl&(Xxd|Azktf750@fnt6^20mtHdBMEYijuIz63-MP K)6J9Q^8^6DY!BxE diff --git a/packages/nodejs/src/env/endoify.ts b/packages/nodejs/src/env/endoify.ts new file mode 100644 index 000000000..58ad152ae --- /dev/null +++ b/packages/nodejs/src/env/endoify.ts @@ -0,0 +1 @@ +import '@ocap/shims/endoify'; diff --git a/packages/nodejs/src/env/kernel-worker-trusted-prelude.js b/packages/nodejs/src/env/kernel-worker-trusted-prelude.js new file mode 100644 index 000000000..dad2cb379 --- /dev/null +++ b/packages/nodejs/src/env/kernel-worker-trusted-prelude.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line import-x/no-unresolved +import './endoify.js'; diff --git a/packages/nodejs/src/kernel/VatWorkerService.ts b/packages/nodejs/src/kernel/VatWorkerService.ts index 16634fa43..0f3f72cd3 100644 --- a/packages/nodejs/src/kernel/VatWorkerService.ts +++ b/packages/nodejs/src/kernel/VatWorkerService.ts @@ -1,6 +1,7 @@ +import { makePromiseKit } from '@endo/promise-kit'; import type { VatWorkerService, VatId } from '@ocap/kernel'; import { NodeWorkerMultiplexer } from '@ocap/streams'; -import type { StreamMultiplexer } from '@ocap/streams'; +import { StreamMultiplexer } from '@ocap/streams'; import { makeLogger } from '@ocap/utils'; import type { Logger } from '@ocap/utils'; import { Worker as NodeWorker } from 'node:worker_threads'; @@ -30,10 +31,18 @@ export class NodejsVatWorkerService implements VatWorkerService { } async launch(vatId: VatId): Promise { - const worker = new NodeWorker(workerFileURL); - const multiplexer = new NodeWorkerMultiplexer(worker); - this.workers.set(vatId, { worker, multiplexer }); - return multiplexer; + const { promise, resolve } = makePromiseKit(); + this.#logger.debug('launching', vatId); + const worker = new NodeWorker(workerFileURL, { + execArgv: process.env.VITEST ? ['--loader', 'tsx'] : undefined, + }); + worker.once('online', () => { + const multiplexer = new NodeWorkerMultiplexer(worker, 'vat'); + this.workers.set(vatId, { worker, multiplexer }); + resolve(multiplexer); + this.#logger.debug('launched', vatId); + }); + return promise; } async terminate(vatId: VatId): Promise { diff --git a/packages/nodejs/src/kernel/kernel-worker.test.ts b/packages/nodejs/src/kernel/kernel-worker.test.ts index c23a7f676..b844b2481 100644 --- a/packages/nodejs/src/kernel/kernel-worker.test.ts +++ b/packages/nodejs/src/kernel/kernel-worker.test.ts @@ -1,7 +1,17 @@ +import '@ocap/shims/endoify'; + import { MessageChannel as NodeMessageChannel } from 'node:worker_threads'; -import { describe, it, expect } from 'vitest'; +import { describe, it, expect, vi } from 'vitest'; import { makeKernel, runVatLifecycle } from './kernel-worker.js'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; + +vi.mock('node:process', () => ({ + exit: vi.fn((reason) => { + throw new Error(`process.exit: ${reason}`); + }), +})); describe('Kernel Worker', () => { it('should handle the lifecycle of multiple vats', async () => { @@ -13,7 +23,7 @@ describe('Kernel Worker', () => { console.log('Kernel created.'); console.log('Handling the lifecycle of multiple vats...'); - await runVatLifecycle(kernel, ['v1', 'v2', 'v3']); + await runVatLifecycle(kernel, ['v1']);//, 'v2', 'v3']); console.log('Lifecycle of multiple vats handled.'); // console.log('Adding default vat...'); diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 516e3e04f..171d0c1e1 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -1,4 +1,13 @@ -import '@ocap/shims/endoify'; +import 'ses'; +import '@endo/eventual-send/shim.js'; + +try { + lockdown(); + console.debug('LOCKDOWN COMPLETED'); +} catch (problem: unknown) { + console.error('LOCKDOWN PROBLEM', problem); +} + import type { NonEmptyArray } from '@metamask/utils'; import type { KernelCommand, KernelCommandReply, VatId } from '@ocap/kernel'; import { Kernel, VatCommandMethod } from '@ocap/kernel'; @@ -42,18 +51,13 @@ export async function runVatLifecycle( kernel: Kernel, vats: NonEmptyArray, ): Promise { + console.log('runVatLifecycle Start...'); console.time(`Created vats: ${vats.join(', ')}`); - /* - await Promise.all( - vats.map(async () => - kernel.launchVat({ - bundleName: 'sample-vat', - parameters: { name: 'Nodeen' }, - }), - ), - ); - console.timeEnd(`Created vats: ${vats.join(', ')}`); - */ + const vat = await kernel.launchVat({ + bundleSpec: 'sample-vat', + parameters: { name: 'Nodeen' }, + }); + console.timeEnd(`Created vat: ${vat.vatId}`); console.log('Kernel vats:', kernel.getVatIds().join(', ')); // Restart a randomly selected vat from the array. diff --git a/packages/nodejs/src/node/comms.ts b/packages/nodejs/src/node/comms.ts new file mode 100644 index 000000000..8f69652eb --- /dev/null +++ b/packages/nodejs/src/node/comms.ts @@ -0,0 +1,43 @@ +import { NodeWorkerMultiplexer } from "@ocap/streams"; +import { NodeWorkerDuplexStream } from "@ocap/streams"; +import type { MessagePort } from "worker_threads"; + +const modes = ['direct', 'strum', 'plexed'] as const; + +export type Mode = typeof modes[number]; +export type Comms = (port: MessagePort) => Promise; + +export async function direct(port: MessagePort): Promise { + console.debug('direct communication init'); + port.on('message', (message) => { + if (message === 'ping') { + port.postMessage('pong'); + } + }); + console.debug('direct communication started'); +} + +export async function strum(port: MessagePort): Promise { + console.log('streamed communication init'); + const stream = new NodeWorkerDuplexStream(port); + await stream.synchronize(); + for await (const message of stream) { + if (message === 'ping') { + await stream.write('pong'); + } + } + console.log('streamed communication started'); +} + +export async function plexed(port: MessagePort): Promise { + console.log('plexed communication init'); + const multiplexer = new NodeWorkerMultiplexer(port); + const testChannel = multiplexer.createChannel('test'); + testChannel.drain(async (message) => { + if (message === 'ping') { + await testChannel.write('pong'); + } + }).catch(console.error); + await multiplexer.start(); + console.log('multiplexer started'); +} diff --git a/packages/nodejs/src/node/node-worker.test.ts b/packages/nodejs/src/node/node-worker.test.ts new file mode 100644 index 000000000..ed339e977 --- /dev/null +++ b/packages/nodejs/src/node/node-worker.test.ts @@ -0,0 +1,55 @@ +import '@ocap/shims/endoify'; +import { describe, it, expect } from 'vitest'; + +import { Worker as NodeWorker } from 'node:worker_threads'; +import { makePromiseKit } from '@endo/promise-kit'; +import { NodeWorkerDuplexStream } from '@ocap/streams'; +import { existsSync } from 'node:fs'; +import type { Comms, Mode } from './comms.js'; + +const workerFileURL = new URL('../../dist/node/node-worker.mjs', import.meta.url) +.pathname; + +describe('Node Worker', () => { + const makeWorker = (mode: Mode) => new NodeWorker(workerFileURL, { + env: { + COMMS: mode, + }, + execArgv: process.env.VITEST ? ['--loader', 'tsx'] : undefined, + }); + + it('communicates directly via worker.postMessage', async () => { + const { resolve, promise } = makePromiseKit(); + + expect(existsSync(workerFileURL), 'No workerFile found').toBe(true); + + const worker = makeWorker('direct'); + + worker.once('online', () => worker.postMessage('ping')); + worker.on('message', (message: string) => resolve(message)); + + expect(await promise).toBe('pong'); + }); + + it('communicates via NodeWorkerStream', async () => { + const { resolve, promise } = makePromiseKit(); + + const worker = makeWorker('strum'); + const stream = new NodeWorkerDuplexStream(worker); + worker.once('online', async () => { + console.debug('synchronizing node worker stream'); + await stream.synchronize(); + console.debug('sending ping to strum node worker'); + await stream.write('ping'); + }); + + for await (const value of stream) { + if (typeof value === 'string') { + resolve(value); + break; + } + } + + expect(await promise).toBe('pong'); + }); +}); diff --git a/packages/nodejs/src/node/node-worker.ts b/packages/nodejs/src/node/node-worker.ts new file mode 100644 index 000000000..9d83039e7 --- /dev/null +++ b/packages/nodejs/src/node/node-worker.ts @@ -0,0 +1,59 @@ +import 'ses'; +import '@endo/eventual-send/shim.js'; + +try { + lockdown(); + console.debug('LOCKDOWN COMPLETED'); +} catch (problem: unknown) { + console.error('LOCKDOWN PROBLEM', problem); +} + +import { parentPort, isMainThread } from "worker_threads"; +import type { MessagePort as WorkerPort } from "worker_threads"; +import { env } from "node:process"; +import { write } from 'fs'; +import { exit } from 'process'; +import type { Mode } from './comms'; + +// import { NodeWorkerDuplexStream } from '@ocap/streams'; + +console.debug('hello,', process.env.COMMS); + +/* +try { + await import('../env/endoify.js'); +} catch (problem: unknown) { + console.debug('IMPORT PROBLEM:', problem); +} +*/ +/* +try { + //await import('@ocap/shims'); + const { NodeWorkerDuplexStream } = await import('@ocap/streams'); +} catch (problem: unknown) { + console.debug('IMPORT PROBLEM:', problem); +} +*/ +const mode = env.COMMS as Mode; + +console.log('MODE:', mode); + +console.log(isMainThread + ? `I'M THE MAIN THREAD!` + : 'Just a child thread', +); + +if (!parentPort) { + process.exit(1); +} + +main(env.COMMS as Mode, parentPort).catch(console.error); + +async function main(mode: Mode, port: WorkerPort) { + try { + const comms = (await import('./comms.js'))[mode]; + await comms(port); + } catch (problem: unknown) { + console.error('import problem:', problem); + } +} diff --git a/packages/nodejs/src/vat/inside.ts b/packages/nodejs/src/vat/inside.ts index 418c20be3..0f75aedf5 100644 --- a/packages/nodejs/src/vat/inside.ts +++ b/packages/nodejs/src/vat/inside.ts @@ -1,4 +1,15 @@ -import '@ocap/shims/endoify'; +//import 'ses'; +//import '@endo/eventual-send/shim.js'; + +/* +try { + lockdown(); + console.debug('LOCKDOWN COMPLETED'); +} catch (problem: unknown) { + console.error('LOCKDOWN PROBLEM', problem); +} +*/ + import { makeExo } from '@endo/exo'; import { M } from '@endo/patterns'; import type { Json } from '@metamask/utils'; @@ -13,15 +24,17 @@ main().catch(console.error); * The main function for the iframe. */ async function main(): Promise { - assert( - parentPort !== null, - 'Expected to run in Node Worker with parentPort.', - ); - const multiplexer = new NodeWorkerMultiplexer(parentPort); + console.debug('vat INSIDE started MAIN'); + if (!parentPort) { + console.error('Expected to run in Node Worker with parentPort.'); + process.exit(-31); + } + const multiplexer = new NodeWorkerMultiplexer(parentPort, 'vat'); const commandStream = multiplexer.createChannel( 'command', ); const capTpStream = multiplexer.createChannel('capTp'); + await multiplexer.start(); const bootstrap = makeExo( 'TheGreatFrangooly', M.interface('TheGreatFrangooly', {}, { defaultGuards: 'passable' }), diff --git a/packages/nodejs/tsconfig.json b/packages/nodejs/tsconfig.json index 94bb7b47d..3a8005e3b 100644 --- a/packages/nodejs/tsconfig.json +++ b/packages/nodejs/tsconfig.json @@ -18,6 +18,7 @@ ], "include": [ "../../vitest.config.packages.ts", + "../../vitest.workspace.ts", "./scripts/build-constants.mjs", "./src/**/*.ts", "./src/**/*-trusted-prelude.js", @@ -26,6 +27,5 @@ "./vite-plugins/*.ts", "./vite.config.ts", "./vitest.config.ts", - "../kernel/src/vat-worker-service.ts" ] } diff --git a/packages/nodejs/vite.config.ts b/packages/nodejs/vite.config.ts new file mode 100644 index 000000000..0d9e6c8bb --- /dev/null +++ b/packages/nodejs/vite.config.ts @@ -0,0 +1,66 @@ +// eslint-disable-next-line spaced-comment +/// + +import path from 'path'; +import { defineConfig } from 'vite'; +import { checker as viteChecker } from 'vite-plugin-checker'; +import { viteStaticCopy } from 'vite-plugin-static-copy'; + +import { + sourceDir, + buildDir, + trustedPreludes, +} from './scripts/build-constants.mjs'; + +/** + * Files that need to be statically copied to the destination directory. + * Paths are relative from the project root directory. + */ +const staticCopyTargets: readonly string[] = [ + // External modules + '../shims/dist/endoify.js', + // Trusted preludes + ...new Set(Object.values(trustedPreludes)), +]; + +// https://vitejs.dev/config/ +export default defineConfig(({ mode }) => ({ + root: sourceDir, + + build: { + emptyOutDir: true, + outDir: buildDir, + rollupOptions: { + input: { + 'kernel-worker': path.resolve( + sourceDir, + 'kernel/kernel-worker.ts', + ), + 'node-worker': path.resolve( + sourceDir, + 'node/node-worker.ts', + ), + }, + output: { + entryFileNames: '[name].js', + chunkFileNames: '[name].js', + assetFileNames: '[name].[ext]', + }, + }, + ...(mode === 'development' + ? { + minify: false, + sourcemap: 'inline', + } + : {}), + }, + + plugins: [ + viteStaticCopy({ + targets: staticCopyTargets.map((src) => ({ src, dest: './' })), + watch: { reloadPageOnChange: true }, + silent: mode === 'development', + }), + viteChecker({ typescript: { tsconfigPath: 'tsconfig.build.json' } }), + ], +})); diff --git a/packages/nodejs/vitest.config.ts b/packages/nodejs/vitest.config.ts index 091e47950..44ae53d1e 100644 --- a/packages/nodejs/vitest.config.ts +++ b/packages/nodejs/vitest.config.ts @@ -5,14 +5,14 @@ import path from 'path'; import { defineConfig, mergeConfig } from 'vite'; import defaultConfig from '../../vitest.config.js'; +import { sourceDir } from './scripts/build-constants.mjs'; const config = mergeConfig( defaultConfig, defineConfig({ optimizeDeps: { include: ['better-sqlite3'] }, test: { - // pool: 'vmThreads', - environment: 'node', + pool: 'forks', alias: [ { find: '@ocap/shims/endoify', diff --git a/yarn.lock b/yarn.lock index 69b3d860e..0dbb94cdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1903,7 +1903,8 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.8.1" "@typescript-eslint/parser": "npm:^8.8.1" "@typescript-eslint/utils": "npm:^8.8.1" - "@vitest/browser": "npm:2.1.3" + "@vitest/browser": "npm:2.1.4" + "@vitest/coverage-istanbul": "npm:2.1.4" better-sqlite3: "npm:^11.7.0" depcheck: "npm:^1.4.7" eslint: "npm:^9.12.0" @@ -2964,6 +2965,26 @@ __metadata: languageName: node linkType: hard +"@vitest/coverage-istanbul@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/coverage-istanbul@npm:2.1.4" + dependencies: + "@istanbuljs/schema": "npm:^0.1.3" + debug: "npm:^4.3.7" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-instrument: "npm:^6.0.3" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.6" + istanbul-reports: "npm:^3.1.7" + magicast: "npm:^0.3.5" + test-exclude: "npm:^7.0.1" + tinyrainbow: "npm:^1.2.0" + peerDependencies: + vitest: 2.1.4 + checksum: 10/4ceacb4c6617c2cda85941827c2469b2b2d993ffb0851f90957ef5c172918625cdbe92721280d7812ddd80669065bf611b88fe9d006458107a162e91e7d7ac0c + languageName: node + linkType: hard + "@vitest/eslint-plugin@npm:^1.1.7": version: 1.1.7 resolution: "@vitest/eslint-plugin@npm:1.1.7" @@ -6668,7 +6689,7 @@ __metadata: languageName: node linkType: hard -"magicast@npm:^0.3.4": +"magicast@npm:^0.3.4, magicast@npm:^0.3.5": version: 0.3.5 resolution: "magicast@npm:0.3.5" dependencies: From 1cc265c26b7f485297387c943cecc855c60bb802 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:40:12 -0600 Subject: [PATCH 03/37] lint --- packages/nodejs/src/db/store.db | Bin 12288 -> 12288 bytes .../nodejs/src/kernel/VatWorkerService.ts | 10 ++--- .../nodejs/src/kernel/kernel-worker.test.ts | 4 +- packages/nodejs/src/kernel/kernel-worker.ts | 14 +++--- packages/nodejs/src/node/comms.ts | 42 +++++++++++------- packages/nodejs/src/node/node-worker.test.ts | 26 ++++++----- packages/nodejs/src/node/node-worker.ts | 32 +++++++------ packages/nodejs/src/vat/inside.ts | 4 +- packages/nodejs/vite.config.ts | 10 +---- packages/nodejs/vitest.config.ts | 1 - 10 files changed, 72 insertions(+), 71 deletions(-) diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db index 2f6be2d9945909a19a2704096b30d62aab914fd8..a0abe0878a899450739421689e3f9fd06494723e 100644 GIT binary patch delta 25 gcmZojXh@hK&B!%T#+i|8V}gM^lbONhN%DCD0AU9Q8~^|S delta 25 gcmZojXh@hK&B#7c#+i|QV}gM^ld1XUN%DCD0AS4r8~^|S diff --git a/packages/nodejs/src/kernel/VatWorkerService.ts b/packages/nodejs/src/kernel/VatWorkerService.ts index 0f3f72cd3..81e450c23 100644 --- a/packages/nodejs/src/kernel/VatWorkerService.ts +++ b/packages/nodejs/src/kernel/VatWorkerService.ts @@ -1,7 +1,6 @@ import { makePromiseKit } from '@endo/promise-kit'; import type { VatWorkerService, VatId } from '@ocap/kernel'; -import { NodeWorkerMultiplexer } from '@ocap/streams'; -import { StreamMultiplexer } from '@ocap/streams'; +import { NodeWorkerMultiplexer, StreamMultiplexer } from '@ocap/streams'; import { makeLogger } from '@ocap/utils'; import type { Logger } from '@ocap/utils'; import { Worker as NodeWorker } from 'node:worker_threads'; @@ -12,7 +11,6 @@ const workerFileURL = new URL('../../dist/vat/inside.mjs', import.meta.url) .pathname; export class NodejsVatWorkerService implements VatWorkerService { - // eslint-disable-next-line no-unused-private-class-members readonly #logger: Logger; workers = new Map< @@ -26,16 +24,14 @@ export class NodejsVatWorkerService implements VatWorkerService { * * @param logger - An optional {@link Logger}. Defaults to a new logger labeled '[vat worker client]'. */ - constructor(logger?: Logger) { + constructor(logger?: Logger, isTest: boolean = false) { this.#logger = logger ?? makeLogger('[vat worker service]'); } async launch(vatId: VatId): Promise { const { promise, resolve } = makePromiseKit(); this.#logger.debug('launching', vatId); - const worker = new NodeWorker(workerFileURL, { - execArgv: process.env.VITEST ? ['--loader', 'tsx'] : undefined, - }); + const worker = new NodeWorker(workerFileURL); worker.once('online', () => { const multiplexer = new NodeWorkerMultiplexer(worker, 'vat'); this.workers.set(vatId, { worker, multiplexer }); diff --git a/packages/nodejs/src/kernel/kernel-worker.test.ts b/packages/nodejs/src/kernel/kernel-worker.test.ts index b844b2481..b711f3f2b 100644 --- a/packages/nodejs/src/kernel/kernel-worker.test.ts +++ b/packages/nodejs/src/kernel/kernel-worker.test.ts @@ -4,8 +4,6 @@ import { MessageChannel as NodeMessageChannel } from 'node:worker_threads'; import { describe, it, expect, vi } from 'vitest'; import { makeKernel, runVatLifecycle } from './kernel-worker.js'; -import { tmpdir } from 'node:os'; -import { join } from 'node:path'; vi.mock('node:process', () => ({ exit: vi.fn((reason) => { @@ -23,7 +21,7 @@ describe('Kernel Worker', () => { console.log('Kernel created.'); console.log('Handling the lifecycle of multiple vats...'); - await runVatLifecycle(kernel, ['v1']);//, 'v2', 'v3']); + await runVatLifecycle(kernel, ['v1']); //, 'v2', 'v3']); console.log('Lifecycle of multiple vats handled.'); // console.log('Adding default vat...'); diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 171d0c1e1..4b3e9a059 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -1,13 +1,6 @@ import 'ses'; import '@endo/eventual-send/shim.js'; -try { - lockdown(); - console.debug('LOCKDOWN COMPLETED'); -} catch (problem: unknown) { - console.error('LOCKDOWN PROBLEM', problem); -} - import type { NonEmptyArray } from '@metamask/utils'; import type { KernelCommand, KernelCommandReply, VatId } from '@ocap/kernel'; import { Kernel, VatCommandMethod } from '@ocap/kernel'; @@ -17,6 +10,13 @@ import { MessagePort as NodeMessagePort } from 'worker_threads'; import { makeSQLKVStore } from './sqlite-kv-store.js'; import { NodejsVatWorkerService } from './VatWorkerService.js'; +try { + lockdown(); + console.debug('LOCKDOWN COMPLETED'); +} catch (problem: unknown) { + console.error('LOCKDOWN PROBLEM', problem); +} + /** * The main function for the kernel worker. * diff --git a/packages/nodejs/src/node/comms.ts b/packages/nodejs/src/node/comms.ts index 8f69652eb..a29a1324f 100644 --- a/packages/nodejs/src/node/comms.ts +++ b/packages/nodejs/src/node/comms.ts @@ -1,13 +1,15 @@ -import { NodeWorkerMultiplexer } from "@ocap/streams"; -import { NodeWorkerDuplexStream } from "@ocap/streams"; -import type { MessagePort } from "worker_threads"; +import { NodeWorkerMultiplexer, NodeWorkerDuplexStream } from '@ocap/streams'; +import type { MessagePort as WorkerPort } from 'worker_threads'; -const modes = ['direct', 'strum', 'plexed'] as const; +export const modes = ['direct', 'strum', 'plexed'] as const; +export type Mode = (typeof modes)[number]; +export type Comms = (port: WorkerPort) => Promise; -export type Mode = typeof modes[number]; -export type Comms = (port: MessagePort) => Promise; - -export async function direct(port: MessagePort): Promise { +/** + * + * @param port + */ +export async function direct(port: WorkerPort): Promise { console.debug('direct communication init'); port.on('message', (message) => { if (message === 'ping') { @@ -17,7 +19,11 @@ export async function direct(port: MessagePort): Promise { console.debug('direct communication started'); } -export async function strum(port: MessagePort): Promise { +/** + * + * @param port + */ +export async function strum(port: WorkerPort): Promise { console.log('streamed communication init'); const stream = new NodeWorkerDuplexStream(port); await stream.synchronize(); @@ -29,15 +35,21 @@ export async function strum(port: MessagePort): Promise { console.log('streamed communication started'); } -export async function plexed(port: MessagePort): Promise { +/** + * + * @param port + */ +export async function plexed(port: WorkerPort): Promise { console.log('plexed communication init'); const multiplexer = new NodeWorkerMultiplexer(port); const testChannel = multiplexer.createChannel('test'); - testChannel.drain(async (message) => { - if (message === 'ping') { - await testChannel.write('pong'); - } - }).catch(console.error); + testChannel + .drain(async (message) => { + if (message === 'ping') { + await testChannel.write('pong'); + } + }) + .catch(console.error); await multiplexer.start(); console.log('multiplexer started'); } diff --git a/packages/nodejs/src/node/node-worker.test.ts b/packages/nodejs/src/node/node-worker.test.ts index ed339e977..7045daf0c 100644 --- a/packages/nodejs/src/node/node-worker.test.ts +++ b/packages/nodejs/src/node/node-worker.test.ts @@ -1,22 +1,26 @@ import '@ocap/shims/endoify'; -import { describe, it, expect } from 'vitest'; -import { Worker as NodeWorker } from 'node:worker_threads'; import { makePromiseKit } from '@endo/promise-kit'; import { NodeWorkerDuplexStream } from '@ocap/streams'; import { existsSync } from 'node:fs'; +import { Worker as NodeWorker } from 'node:worker_threads'; +import { describe, it, expect } from 'vitest'; + import type { Comms, Mode } from './comms.js'; -const workerFileURL = new URL('../../dist/node/node-worker.mjs', import.meta.url) -.pathname; +const workerFileURL = new URL( + '../../dist/node/node-worker.mjs', + import.meta.url, +).pathname; describe('Node Worker', () => { - const makeWorker = (mode: Mode) => new NodeWorker(workerFileURL, { - env: { - COMMS: mode, - }, - execArgv: process.env.VITEST ? ['--loader', 'tsx'] : undefined, - }); + const makeWorker = (mode: Mode) => + new NodeWorker(workerFileURL, { + env: { + COMMS: mode, + }, + execArgv: process.env.VITEST ? ['--loader', 'tsx'] : undefined, + }); it('communicates directly via worker.postMessage', async () => { const { resolve, promise } = makePromiseKit(); @@ -49,7 +53,7 @@ describe('Node Worker', () => { break; } } - + expect(await promise).toBe('pong'); }); }); diff --git a/packages/nodejs/src/node/node-worker.ts b/packages/nodejs/src/node/node-worker.ts index 9d83039e7..1057f3496 100644 --- a/packages/nodejs/src/node/node-worker.ts +++ b/packages/nodejs/src/node/node-worker.ts @@ -1,6 +1,12 @@ import 'ses'; import '@endo/eventual-send/shim.js'; +import { write } from 'fs'; +import { parentPort, isMainThread } from 'worker_threads'; +import type { MessagePort as WorkerPort } from 'worker_threads'; + +import type { Mode } from './comms'; + try { lockdown(); console.debug('LOCKDOWN COMPLETED'); @@ -8,16 +14,9 @@ try { console.error('LOCKDOWN PROBLEM', problem); } -import { parentPort, isMainThread } from "worker_threads"; -import type { MessagePort as WorkerPort } from "worker_threads"; -import { env } from "node:process"; -import { write } from 'fs'; -import { exit } from 'process'; -import type { Mode } from './comms'; - // import { NodeWorkerDuplexStream } from '@ocap/streams'; - -console.debug('hello,', process.env.COMMS); +const mode = process.env.COMMS as Mode; +console.debug('hello,', mode); /* try { @@ -34,21 +33,20 @@ try { console.debug('IMPORT PROBLEM:', problem); } */ -const mode = env.COMMS as Mode; - -console.log('MODE:', mode); -console.log(isMainThread - ? `I'M THE MAIN THREAD!` - : 'Just a child thread', -); +console.log(isMainThread ? `I'M THE MAIN THREAD!` : 'Just a child thread'); if (!parentPort) { process.exit(1); } -main(env.COMMS as Mode, parentPort).catch(console.error); +main(process.env.COMMS as Mode, parentPort).catch(console.error); +/** + * + * @param mode + * @param port + */ async function main(mode: Mode, port: WorkerPort) { try { const comms = (await import('./comms.js'))[mode]; diff --git a/packages/nodejs/src/vat/inside.ts b/packages/nodejs/src/vat/inside.ts index 0f75aedf5..f1c3b4f84 100644 --- a/packages/nodejs/src/vat/inside.ts +++ b/packages/nodejs/src/vat/inside.ts @@ -1,5 +1,5 @@ -//import 'ses'; -//import '@endo/eventual-send/shim.js'; +// import 'ses'; +// import '@endo/eventual-send/shim.js'; /* try { diff --git a/packages/nodejs/vite.config.ts b/packages/nodejs/vite.config.ts index 0d9e6c8bb..033c040bd 100644 --- a/packages/nodejs/vite.config.ts +++ b/packages/nodejs/vite.config.ts @@ -32,14 +32,8 @@ export default defineConfig(({ mode }) => ({ outDir: buildDir, rollupOptions: { input: { - 'kernel-worker': path.resolve( - sourceDir, - 'kernel/kernel-worker.ts', - ), - 'node-worker': path.resolve( - sourceDir, - 'node/node-worker.ts', - ), + 'kernel-worker': path.resolve(sourceDir, 'kernel/kernel-worker.ts'), + 'node-worker': path.resolve(sourceDir, 'node/node-worker.ts'), }, output: { entryFileNames: '[name].js', diff --git a/packages/nodejs/vitest.config.ts b/packages/nodejs/vitest.config.ts index 44ae53d1e..967a9021c 100644 --- a/packages/nodejs/vitest.config.ts +++ b/packages/nodejs/vitest.config.ts @@ -5,7 +5,6 @@ import path from 'path'; import { defineConfig, mergeConfig } from 'vite'; import defaultConfig from '../../vitest.config.js'; -import { sourceDir } from './scripts/build-constants.mjs'; const config = mergeConfig( defaultConfig, From 479a3ad75d1bad99aba1a6d5697f9ff4d6be4d31 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:40:29 -0600 Subject: [PATCH 04/37] node kernel worker (somehow) --- packages/nodejs/package.json | 2 +- packages/nodejs/src/db/store.db | Bin 12288 -> 12288 bytes packages/nodejs/src/kernel/kernel-worker.ts | 15 ++++----------- packages/nodejs/src/vat/inside.ts | 19 ++++++------------- packages/nodejs/tsconfig.build.json | 1 - packages/nodejs/tsconfig.json | 3 +-- 6 files changed, 12 insertions(+), 28 deletions(-) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index ddb767908..2c2ecc6ff 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -79,6 +79,6 @@ "vitest": "^2.1.2" }, "engines": { - "node": "^18.18 || >=20" + "node": "^20 || >=22" } } diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db index a0abe0878a899450739421689e3f9fd06494723e..ac712fe6bbe2f7f37c93f3a56a4522eab6f16946 100644 GIT binary patch delta 26 hcmZojXh@hK&1f-E#+lJ#V}iasv$28M=1KB-0sw7U2de-8 delta 26 hcmZojXh@hK&B!%T#+i|8V}iasvyqv>=1KB-0sv=e2TlM0 diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 4b3e9a059..0fad50a84 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -1,6 +1,4 @@ -import 'ses'; -import '@endo/eventual-send/shim.js'; - +import '@ocap/shims/endoify'; import type { NonEmptyArray } from '@metamask/utils'; import type { KernelCommand, KernelCommandReply, VatId } from '@ocap/kernel'; import { Kernel, VatCommandMethod } from '@ocap/kernel'; @@ -10,20 +8,15 @@ import { MessagePort as NodeMessagePort } from 'worker_threads'; import { makeSQLKVStore } from './sqlite-kv-store.js'; import { NodejsVatWorkerService } from './VatWorkerService.js'; -try { - lockdown(); - console.debug('LOCKDOWN COMPLETED'); -} catch (problem: unknown) { - console.error('LOCKDOWN PROBLEM', problem); -} - /** * The main function for the kernel worker. * * @param port - The kernel's end of a node:worker_threads MessageChannel * @returns The kernel, initialized. */ -export async function makeKernel(port: NodeMessagePort): Promise { +export async function makeKernel( + port: NodeMessagePort, +): Promise { const nodeStream = new NodeWorkerDuplexStream< KernelCommand, KernelCommandReply diff --git a/packages/nodejs/src/vat/inside.ts b/packages/nodejs/src/vat/inside.ts index f1c3b4f84..2b4ba3e8c 100644 --- a/packages/nodejs/src/vat/inside.ts +++ b/packages/nodejs/src/vat/inside.ts @@ -1,14 +1,4 @@ -// import 'ses'; -// import '@endo/eventual-send/shim.js'; - -/* -try { - lockdown(); - console.debug('LOCKDOWN COMPLETED'); -} catch (problem: unknown) { - console.error('LOCKDOWN PROBLEM', problem); -} -*/ +import '@ocap/shims/endoify'; import { makeExo } from '@endo/exo'; import { M } from '@endo/patterns'; @@ -18,6 +8,8 @@ import type { VatCommand, VatCommandReply } from '@ocap/kernel'; import { NodeWorkerMultiplexer } from '@ocap/streams'; import { parentPort } from 'node:worker_threads'; +console.debug('vat INSIDE calling MAIN'); + main().catch(console.error); /** @@ -26,8 +18,9 @@ main().catch(console.error); async function main(): Promise { console.debug('vat INSIDE started MAIN'); if (!parentPort) { - console.error('Expected to run in Node Worker with parentPort.'); - process.exit(-31); + const errMsg = 'Expected to run in Node Worker with parentPort.'; + console.error(errMsg); + throw new Error(errMsg); } const multiplexer = new NodeWorkerMultiplexer(parentPort, 'vat'); const commandStream = multiplexer.createChannel( diff --git a/packages/nodejs/tsconfig.build.json b/packages/nodejs/tsconfig.build.json index dc6f5028d..7799c75f6 100644 --- a/packages/nodejs/tsconfig.build.json +++ b/packages/nodejs/tsconfig.build.json @@ -10,7 +10,6 @@ "types": ["chrome", "ses"] }, "references": [ - { "path": "../shims/tsconfig.build.json" }, { "path": "../streams/tsconfig.build.json" }, { "path": "../kernel/tsconfig.build.json" }, { "path": "../utils/tsconfig.build.json" } diff --git a/packages/nodejs/tsconfig.json b/packages/nodejs/tsconfig.json index 3a8005e3b..94d916d34 100644 --- a/packages/nodejs/tsconfig.json +++ b/packages/nodejs/tsconfig.json @@ -10,7 +10,6 @@ "types": ["chrome", "ses", "vitest", "vitest/jsdom"] }, "references": [ - { "path": "../shims" }, { "path": "../streams" }, { "path": "../test-utils" }, { "path": "../utils" }, @@ -26,6 +25,6 @@ "./test/**/*.ts", "./vite-plugins/*.ts", "./vite.config.ts", - "./vitest.config.ts", + "./vitest.config.ts" ] } From 768a18beb1c15e1320393f9b14af8da46ad12623 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:16:48 -0600 Subject: [PATCH 05/37] simplify example node worker --- packages/nodejs/src/db/store.db | Bin 12288 -> 12288 bytes .../nodejs/src/kernel/VatWorkerService.ts | 2 +- packages/nodejs/src/kernel/kernel-worker.ts | 4 +- packages/nodejs/src/node/node-worker.ts | 61 +++--------------- 4 files changed, 11 insertions(+), 56 deletions(-) diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db index ac712fe6bbe2f7f37c93f3a56a4522eab6f16946..6c57394d43200c6f48c3c8ad9f02ce5328766520 100644 GIT binary patch delta 25 gcmZojXh@hK&1gGO#+lJ}V}gM^lcC|}N%DCD0B08megFUf delta 25 gcmZojXh@hK&1f-E#+lJ#V}gM^lY!ahN%DCD0A`a1cmMzZ diff --git a/packages/nodejs/src/kernel/VatWorkerService.ts b/packages/nodejs/src/kernel/VatWorkerService.ts index 81e450c23..a15bf0536 100644 --- a/packages/nodejs/src/kernel/VatWorkerService.ts +++ b/packages/nodejs/src/kernel/VatWorkerService.ts @@ -24,7 +24,7 @@ export class NodejsVatWorkerService implements VatWorkerService { * * @param logger - An optional {@link Logger}. Defaults to a new logger labeled '[vat worker client]'. */ - constructor(logger?: Logger, isTest: boolean = false) { + constructor(logger?: Logger) { this.#logger = logger ?? makeLogger('[vat worker service]'); } diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 0fad50a84..24d06cc8c 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -14,9 +14,7 @@ import { NodejsVatWorkerService } from './VatWorkerService.js'; * @param port - The kernel's end of a node:worker_threads MessageChannel * @returns The kernel, initialized. */ -export async function makeKernel( - port: NodeMessagePort, -): Promise { +export async function makeKernel(port: NodeMessagePort): Promise { const nodeStream = new NodeWorkerDuplexStream< KernelCommand, KernelCommandReply diff --git a/packages/nodejs/src/node/node-worker.ts b/packages/nodejs/src/node/node-worker.ts index 1057f3496..c0a043707 100644 --- a/packages/nodejs/src/node/node-worker.ts +++ b/packages/nodejs/src/node/node-worker.ts @@ -1,57 +1,14 @@ -import 'ses'; -import '@endo/eventual-send/shim.js'; +import '@ocap/shims/endoify'; +import { parentPort } from 'worker_threads'; -import { write } from 'fs'; -import { parentPort, isMainThread } from 'worker_threads'; -import type { MessagePort as WorkerPort } from 'worker_threads'; - -import type { Mode } from './comms'; - -try { - lockdown(); - console.debug('LOCKDOWN COMPLETED'); -} catch (problem: unknown) { - console.error('LOCKDOWN PROBLEM', problem); -} - -// import { NodeWorkerDuplexStream } from '@ocap/streams'; -const mode = process.env.COMMS as Mode; -console.debug('hello,', mode); - -/* -try { - await import('../env/endoify.js'); -} catch (problem: unknown) { - console.debug('IMPORT PROBLEM:', problem); -} -*/ -/* -try { - //await import('@ocap/shims'); - const { NodeWorkerDuplexStream } = await import('@ocap/streams'); -} catch (problem: unknown) { - console.debug('IMPORT PROBLEM:', problem); -} -*/ - -console.log(isMainThread ? `I'M THE MAIN THREAD!` : 'Just a child thread'); +import type { Mode } from './comms.js'; if (!parentPort) { - process.exit(1); + throw new Error( + 'expected to be run in a node worker with parentPort defined', + ); } -main(process.env.COMMS as Mode, parentPort).catch(console.error); - -/** - * - * @param mode - * @param port - */ -async function main(mode: Mode, port: WorkerPort) { - try { - const comms = (await import('./comms.js'))[mode]; - await comms(port); - } catch (problem: unknown) { - console.error('import problem:', problem); - } -} +const comms = await import('./comms.js'); +// eslint-disable-next-line n/no-process-env +comms[process.env.COMMS as Mode](parentPort).catch(console.error); From 8137927696a6e3d8bee5429c73dcaafde0d1438e Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 10:11:54 -0600 Subject: [PATCH 06/37] add multiplex node test --- packages/nodejs/src/node/comms.ts | 14 +++--- packages/nodejs/src/node/node-worker.test.ts | 46 ++++++++++++++------ 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/packages/nodejs/src/node/comms.ts b/packages/nodejs/src/node/comms.ts index a29a1324f..886f497c0 100644 --- a/packages/nodejs/src/node/comms.ts +++ b/packages/nodejs/src/node/comms.ts @@ -6,8 +6,9 @@ export type Mode = (typeof modes)[number]; export type Comms = (port: WorkerPort) => Promise; /** + * Run the pong end of ping-pong via on + postMessage. * - * @param port + * @param port - The port to communicate over. */ export async function direct(port: WorkerPort): Promise { console.debug('direct communication init'); @@ -20,8 +21,9 @@ export async function direct(port: WorkerPort): Promise { } /** - * - * @param port + * Run the pong end of ping-pong on a duplex stream. + + * @param port - The port to communicate over. */ export async function strum(port: WorkerPort): Promise { console.log('streamed communication init'); @@ -36,20 +38,22 @@ export async function strum(port: WorkerPort): Promise { } /** + * Run the pong end of ping-pong on a multiplexer. * - * @param port + * @param port - The port to communicate over. */ export async function plexed(port: WorkerPort): Promise { console.log('plexed communication init'); const multiplexer = new NodeWorkerMultiplexer(port); const testChannel = multiplexer.createChannel('test'); + multiplexer.start().catch(console.error); testChannel .drain(async (message) => { + console.debug('testChannel drain:', message); if (message === 'ping') { await testChannel.write('pong'); } }) .catch(console.error); - await multiplexer.start(); console.log('multiplexer started'); } diff --git a/packages/nodejs/src/node/node-worker.test.ts b/packages/nodejs/src/node/node-worker.test.ts index 7045daf0c..88acf3804 100644 --- a/packages/nodejs/src/node/node-worker.test.ts +++ b/packages/nodejs/src/node/node-worker.test.ts @@ -1,12 +1,11 @@ import '@ocap/shims/endoify'; import { makePromiseKit } from '@endo/promise-kit'; -import { NodeWorkerDuplexStream } from '@ocap/streams'; -import { existsSync } from 'node:fs'; +import { NodeWorkerDuplexStream, NodeWorkerMultiplexer } from '@ocap/streams'; import { Worker as NodeWorker } from 'node:worker_threads'; import { describe, it, expect } from 'vitest'; -import type { Comms, Mode } from './comms.js'; +import type { Mode } from './comms.js'; const workerFileURL = new URL( '../../dist/node/node-worker.mjs', @@ -14,19 +13,17 @@ const workerFileURL = new URL( ).pathname; describe('Node Worker', () => { - const makeWorker = (mode: Mode) => + const makeWorker = (mode: Mode): NodeWorker => new NodeWorker(workerFileURL, { env: { COMMS: mode, }, - execArgv: process.env.VITEST ? ['--loader', 'tsx'] : undefined, + execArgv: ['--loader', 'tsx'], }); it('communicates directly via worker.postMessage', async () => { const { resolve, promise } = makePromiseKit(); - expect(existsSync(workerFileURL), 'No workerFile found').toBe(true); - const worker = makeWorker('direct'); worker.once('online', () => worker.postMessage('ping')); @@ -36,15 +33,15 @@ describe('Node Worker', () => { }); it('communicates via NodeWorkerStream', async () => { - const { resolve, promise } = makePromiseKit(); + const { resolve, promise, reject } = makePromiseKit(); const worker = makeWorker('strum'); const stream = new NodeWorkerDuplexStream(worker); - worker.once('online', async () => { - console.debug('synchronizing node worker stream'); - await stream.synchronize(); - console.debug('sending ping to strum node worker'); - await stream.write('ping'); + worker.once('online', () => { + stream + .synchronize() + .then(async () => stream.write('ping')) + .catch(reject); }); for await (const value of stream) { @@ -56,4 +53,27 @@ describe('Node Worker', () => { expect(await promise).toBe('pong'); }); + + it('communicates over NodeWorkerMultiplexer', async () => { + const { resolve, promise, reject } = makePromiseKit(); + + const worker = makeWorker('plexed'); + const multiplexer = new NodeWorkerMultiplexer(worker); + const testChannel = multiplexer.createChannel('test'); + multiplexer.start().catch(reject); + worker.once('online', () => { + testChannel.write('ping').catch(reject); + }); + + testChannel + .drain(async (value: unknown) => { + console.debug('rebounded:', value); + if (typeof value === 'string') { + resolve(value); + } + }) + .catch(reject); + + expect(await promise).toBe('pong'); + }); }); From e8aa67dfb34974957b4bd3d1f30ace5ef418938b Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 10:57:50 -0600 Subject: [PATCH 07/37] getting closer --- packages/nodejs/src/db/store.db | Bin 12288 -> 12288 bytes .../nodejs/src/kernel/VatWorkerService.ts | 6 +++++- .../nodejs/src/kernel/kernel-worker.test.ts | 2 +- packages/nodejs/src/kernel/kernel-worker.ts | 18 ++++++++++++------ packages/nodejs/src/vat/inside.ts | 15 +++++++++------ 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db index 6c57394d43200c6f48c3c8ad9f02ce5328766520..09638577715ada74b73a95d8fd3cbdfb5bc4fe71 100644 GIT binary patch delta 56 zcmZojXh@hK#l#RWQN{^KZcJFl&(Xxd|Azktf750@fnt6^20mtHdBMEYijuIz63-NK Klg*Rl^8^6U!w^jX delta 56 zcmZojXh@hK#l&bkQN{^KZcJFl&(X-h|Azktf8%C8fnt6^er9HQ;k?v}lCZ=Q&lF=r K!_AZA^8^6Tp%7F6 diff --git a/packages/nodejs/src/kernel/VatWorkerService.ts b/packages/nodejs/src/kernel/VatWorkerService.ts index a15bf0536..faf13e815 100644 --- a/packages/nodejs/src/kernel/VatWorkerService.ts +++ b/packages/nodejs/src/kernel/VatWorkerService.ts @@ -31,7 +31,11 @@ export class NodejsVatWorkerService implements VatWorkerService { async launch(vatId: VatId): Promise { const { promise, resolve } = makePromiseKit(); this.#logger.debug('launching', vatId); - const worker = new NodeWorker(workerFileURL); + const worker = new NodeWorker(workerFileURL, { + env: { + NODE_VAT_ID: vatId, + }, + }); worker.once('online', () => { const multiplexer = new NodeWorkerMultiplexer(worker, 'vat'); this.workers.set(vatId, { worker, multiplexer }); diff --git a/packages/nodejs/src/kernel/kernel-worker.test.ts b/packages/nodejs/src/kernel/kernel-worker.test.ts index b711f3f2b..0a8f4e1f2 100644 --- a/packages/nodejs/src/kernel/kernel-worker.test.ts +++ b/packages/nodejs/src/kernel/kernel-worker.test.ts @@ -21,7 +21,7 @@ describe('Kernel Worker', () => { console.log('Kernel created.'); console.log('Handling the lifecycle of multiple vats...'); - await runVatLifecycle(kernel, ['v1']); //, 'v2', 'v3']); + await runVatLifecycle(kernel, ['v1', 'v2', 'v3']); console.log('Lifecycle of multiple vats handled.'); // console.log('Adding default vat...'); diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 24d06cc8c..4a53f22a3 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -43,12 +43,18 @@ export async function runVatLifecycle( vats: NonEmptyArray, ): Promise { console.log('runVatLifecycle Start...'); - console.time(`Created vats: ${vats.join(', ')}`); - const vat = await kernel.launchVat({ - bundleSpec: 'sample-vat', - parameters: { name: 'Nodeen' }, - }); - console.timeEnd(`Created vat: ${vat.vatId}`); + const vatLabel = vats.join(', '); + console.time(`Created vats: ${vatLabel}`); + await Promise.all( + vats.map( + async () => + await kernel.launchVat({ + bundleSpec: 'sample-vat', + parameters: { name: 'Nodeen' }, + }), + ), + ); + console.timeEnd(`Created vats: ${vatLabel}`); console.log('Kernel vats:', kernel.getVatIds().join(', ')); // Restart a randomly selected vat from the array. diff --git a/packages/nodejs/src/vat/inside.ts b/packages/nodejs/src/vat/inside.ts index 2b4ba3e8c..9511e0faa 100644 --- a/packages/nodejs/src/vat/inside.ts +++ b/packages/nodejs/src/vat/inside.ts @@ -6,28 +6,31 @@ import type { Json } from '@metamask/utils'; import { VatSupervisor } from '@ocap/kernel'; import type { VatCommand, VatCommandReply } from '@ocap/kernel'; import { NodeWorkerMultiplexer } from '@ocap/streams'; +import { makeLogger } from '@ocap/utils'; import { parentPort } from 'node:worker_threads'; -console.debug('vat INSIDE calling MAIN'); +// eslint-disable-next-line n/no-process-env +const logger = makeLogger(`[${process.env.NODE_VAT_ID} (inside)]`); -main().catch(console.error); +main().catch(logger.error); /** * The main function for the iframe. */ async function main(): Promise { - console.debug('vat INSIDE started MAIN'); + logger.debug('started main'); + if (!parentPort) { const errMsg = 'Expected to run in Node Worker with parentPort.'; - console.error(errMsg); + logger.error(errMsg); throw new Error(errMsg); } const multiplexer = new NodeWorkerMultiplexer(parentPort, 'vat'); + multiplexer.start().catch(logger.error); const commandStream = multiplexer.createChannel( 'command', ); const capTpStream = multiplexer.createChannel('capTp'); - await multiplexer.start(); const bootstrap = makeExo( 'TheGreatFrangooly', M.interface('TheGreatFrangooly', {}, { defaultGuards: 'passable' }), @@ -41,5 +44,5 @@ async function main(): Promise { bootstrap, }); - console.log(supervisor.evaluate('["Hello", "world!"].join(" ");')); + logger.log(supervisor.evaluate('["Hello", "world!"].join(" ");')); } From 5b344ce5fbed83e8cff5b0d9c86f30b336155819 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 11:13:10 -0600 Subject: [PATCH 08/37] something works --- packages/nodejs/src/db/store.db | Bin 12288 -> 12288 bytes packages/nodejs/src/kernel/kernel-worker.ts | 11 ++++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db index 09638577715ada74b73a95d8fd3cbdfb5bc4fe71..46b4058c5744c6d033a922c19171c5080b423771 100644 GIT binary patch delta 54 zcmZojXh@hK%~(EB#+k8vW5P0ijz$LlH~csF8#nU_6!Q!6Gc(Hz=cQJZge8`ErWhI; KZ=NKdCjbE5We~;y delta 54 zcmZojXh@hK%@{CI#+fl-W5P0ijwS~FH~csFn>O8 diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 4a53f22a3..11f72bfaa 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -31,6 +31,9 @@ export async function makeKernel(port: NodeMessagePort): Promise { return kernel; } +const sampleOne = (from: Ele[]): Ele => + from[Math.floor(Math.random() * from.length)]; + /** * Runs the full lifecycle of an array of vats, including their creation, * restart, message passing, and termination. @@ -49,7 +52,7 @@ export async function runVatLifecycle( vats.map( async () => await kernel.launchVat({ - bundleSpec: 'sample-vat', + bundleSpec: 'http://localhost:3000/sample-vat.bundle', parameters: { name: 'Nodeen' }, }), ), @@ -57,14 +60,16 @@ export async function runVatLifecycle( console.timeEnd(`Created vats: ${vatLabel}`); console.log('Kernel vats:', kernel.getVatIds().join(', ')); + const knownVats = kernel.getVatIds(); + // Restart a randomly selected vat from the array. - const vatToRestart = vats[Math.floor(Math.random() * vats.length)] as VatId; + const vatToRestart = sampleOne(knownVats); console.time(`Vat "${vatToRestart}" restart`); await kernel.restartVat(vatToRestart); console.timeEnd(`Vat "${vatToRestart}" restart`); // Send a "Ping" message to a randomly selected vat. - const vatToPing = vats[Math.floor(Math.random() * vats.length)] as VatId; + const vatToPing = sampleOne(knownVats); console.time(`Ping Vat "${vatToPing}"`); await kernel.sendMessage(vatToPing, { method: VatCommandMethod.ping, From 263475a4e9cdc2b8295bcf6dcf1f396716b263eb Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 11:21:25 -0600 Subject: [PATCH 09/37] update build things --- package.json | 2 +- packages/nodejs/package.json | 2 +- packages/streams/package.json | 2 +- yarn.lock | 120 ++-------------------------------- 4 files changed, 9 insertions(+), 117 deletions(-) diff --git a/package.json b/package.json index 6cfe0c413..5b76ca8a3 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "@typescript-eslint/parser": "^8.8.1", "@typescript-eslint/utils": "^8.8.1", "@vitest/browser": "2.1.4", - "@vitest/coverage-istanbul": "2.1.3", + "@vitest/coverage-istanbul": "2.1.4", "@vitest/eslint-plugin": "^1.1.7", "@yarnpkg/types": "^4.0.0", "depcheck": "^1.4.7", diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 2c2ecc6ff..827b157b9 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -24,7 +24,7 @@ "lint:ts": "tsc --project tsconfig.lint.json", "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", - "test": "vitest run --config vitest.config.ts", + "test": "yarn build:sqlite3 && vitest run --config vitest.config.ts", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", "test:verbose": "yarn test --reporter verbose" diff --git a/packages/streams/package.json b/packages/streams/package.json index 6641c3b29..1401c92fa 100644 --- a/packages/streams/package.json +++ b/packages/streams/package.json @@ -69,7 +69,7 @@ "@typescript-eslint/eslint-plugin": "^8.8.1", "@typescript-eslint/parser": "^8.8.1", "@typescript-eslint/utils": "^8.8.1", - "@vitest/browser": "2.1.3", + "@vitest/browser": "2.1.4", "@vitest/eslint-plugin": "^1.1.7", "cookie": "^0.7.0", "depcheck": "^1.4.7", diff --git a/yarn.lock b/yarn.lock index 0dbb94cdd..7513433f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1843,7 +1843,7 @@ __metadata: "@typescript-eslint/parser": "npm:^8.8.1" "@typescript-eslint/utils": "npm:^8.8.1" "@vitest/browser": "npm:2.1.4" - "@vitest/coverage-istanbul": "npm:2.1.3" + "@vitest/coverage-istanbul": "npm:2.1.4" "@vitest/eslint-plugin": "npm:^1.1.7" "@yarnpkg/types": "npm:^4.0.0" ava: "npm:^6.2.0" @@ -1985,7 +1985,7 @@ __metadata: "@typescript-eslint/eslint-plugin": "npm:^8.8.1" "@typescript-eslint/parser": "npm:^8.8.1" "@typescript-eslint/utils": "npm:^8.8.1" - "@vitest/browser": "npm:2.1.3" + "@vitest/browser": "npm:2.1.4" "@vitest/eslint-plugin": "npm:^1.1.7" cookie: "npm:^0.7.0" depcheck: "npm:^1.4.7" @@ -2889,34 +2889,6 @@ __metadata: languageName: node linkType: hard -"@vitest/browser@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/browser@npm:2.1.3" - dependencies: - "@testing-library/dom": "npm:^10.4.0" - "@testing-library/user-event": "npm:^14.5.2" - "@vitest/mocker": "npm:2.1.3" - "@vitest/utils": "npm:2.1.3" - magic-string: "npm:^0.30.11" - msw: "npm:^2.3.5" - sirv: "npm:^2.0.4" - tinyrainbow: "npm:^1.2.0" - ws: "npm:^8.18.0" - peerDependencies: - playwright: "*" - vitest: 2.1.3 - webdriverio: "*" - peerDependenciesMeta: - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - checksum: 10/e639496fa529140fb9e7dce97890c5b75fffbfb41881bee5ef25b194832d3cadcb77490d9b54777bfa968b993f6878649fe4961d6ef312ca1222b9a2fc8d4f12 - languageName: node - linkType: hard - "@vitest/browser@npm:2.1.4": version: 2.1.4 resolution: "@vitest/browser@npm:2.1.4" @@ -2945,26 +2917,6 @@ __metadata: languageName: node linkType: hard -"@vitest/coverage-istanbul@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/coverage-istanbul@npm:2.1.3" - dependencies: - "@istanbuljs/schema": "npm:^0.1.3" - debug: "npm:^4.3.6" - istanbul-lib-coverage: "npm:^3.2.2" - istanbul-lib-instrument: "npm:^6.0.3" - istanbul-lib-report: "npm:^3.0.1" - istanbul-lib-source-maps: "npm:^5.0.6" - istanbul-reports: "npm:^3.1.7" - magicast: "npm:^0.3.4" - test-exclude: "npm:^7.0.1" - tinyrainbow: "npm:^1.2.0" - peerDependencies: - vitest: 2.1.3 - checksum: 10/d1bad4a71ec55481ca14901da4871088c29432330f3b373ca110d6b5dac3ee2e1f67db1ed9d9e9255186e8eab206a0d717371e447deb9a160d1f813facfb24e5 - languageName: node - linkType: hard - "@vitest/coverage-istanbul@npm:2.1.4": version: 2.1.4 resolution: "@vitest/coverage-istanbul@npm:2.1.4" @@ -3014,26 +2966,6 @@ __metadata: languageName: node linkType: hard -"@vitest/mocker@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/mocker@npm:2.1.3" - dependencies: - "@vitest/spy": "npm:2.1.3" - estree-walker: "npm:^3.0.3" - magic-string: "npm:^0.30.11" - peerDependencies: - "@vitest/spy": 2.1.3 - msw: ^2.3.5 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - checksum: 10/84be8830d6e965109730257d7a84b3d7594db0998ae55decdbfc304857c1c7d29b49f1f5b23f2addcbce1bd7e8bb33832407737a9bb3f95cb3bf7bb312db4d9d - languageName: node - linkType: hard - "@vitest/mocker@npm:2.1.4": version: 2.1.4 resolution: "@vitest/mocker@npm:2.1.4" @@ -3053,15 +2985,6 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/pretty-format@npm:2.1.3" - dependencies: - tinyrainbow: "npm:^1.2.0" - checksum: 10/d9382ee93f0f32e2ef8fe03bda818e5277f052a50ddb05b6a6cf0864b2ccb228484f12f130c05faf62dc2140292ffafc213f2941b0fa24058b3ee2943daa286c - languageName: node - linkType: hard - "@vitest/pretty-format@npm:2.1.4, @vitest/pretty-format@npm:^2.1.4": version: 2.1.4 resolution: "@vitest/pretty-format@npm:2.1.4" @@ -3092,15 +3015,6 @@ __metadata: languageName: node linkType: hard -"@vitest/spy@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/spy@npm:2.1.3" - dependencies: - tinyspy: "npm:^3.0.0" - checksum: 10/94d6f1bc34da5d0c973d9382c133b938e555fcf2d238edf0aaad3de1a98dd57ebf7c104ba229c6beec48122d2e6f55386d8d2cf96a5804dc95ac683a54754cc7 - languageName: node - linkType: hard - "@vitest/spy@npm:2.1.4": version: 2.1.4 resolution: "@vitest/spy@npm:2.1.4" @@ -3110,17 +3024,6 @@ __metadata: languageName: node linkType: hard -"@vitest/utils@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/utils@npm:2.1.3" - dependencies: - "@vitest/pretty-format": "npm:2.1.3" - loupe: "npm:^3.1.1" - tinyrainbow: "npm:^1.2.0" - checksum: 10/f064e6634cb84c925a17d8937df7441d150c3e24fa5bbd6304151d11dab6cdeb0cb3d5a95a9aacb8b416c87fb0d9aa8c6b9cc5e174191784231e8345948d6d18 - languageName: node - linkType: hard - "@vitest/utils@npm:2.1.4": version: 2.1.4 resolution: "@vitest/utils@npm:2.1.4" @@ -6618,7 +6521,7 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0, loupe@npm:^3.1.1, loupe@npm:^3.1.2": +"loupe@npm:^3.1.0, loupe@npm:^3.1.2": version: 3.1.2 resolution: "loupe@npm:3.1.2" checksum: 10/8f5734e53fb64cd914aa7d986e01b6d4c2e3c6c56dcbd5428d71c2703f0ab46b5ab9f9eeaaf2b485e8a1c43f865bdd16ec08ae1a661c8f55acdbd9f4d59c607a @@ -6689,7 +6592,7 @@ __metadata: languageName: node linkType: hard -"magicast@npm:^0.3.4, magicast@npm:^0.3.5": +"magicast@npm:^0.3.5": version: 0.3.5 resolution: "magicast@npm:0.3.5" dependencies: @@ -7182,7 +7085,7 @@ __metadata: languageName: node linkType: hard -"msw@npm:^2.3.5, msw@npm:^2.5.0": +"msw@npm:^2.5.0": version: 2.6.8 resolution: "msw@npm:2.6.8" dependencies: @@ -8638,17 +8541,6 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^2.0.4": - version: 2.0.4 - resolution: "sirv@npm:2.0.4" - dependencies: - "@polka/url": "npm:^1.0.0-next.24" - mrmime: "npm:^2.0.0" - totalist: "npm:^3.0.0" - checksum: 10/24f42cf06895017e589c9d16fc3f1c6c07fe8b0dbafce8a8b46322cfba67b7f2498610183954cb0e9d089c8cb60002a7ee7e8bca6a91a0d7042bfbc3473c95c3 - languageName: node - linkType: hard - "sirv@npm:^3.0.0": version: 3.0.0 resolution: "sirv@npm:3.0.0" @@ -9232,7 +9124,7 @@ __metadata: languageName: node linkType: hard -"tinyspy@npm:^3.0.0, tinyspy@npm:^3.0.2": +"tinyspy@npm:^3.0.2": version: 3.0.2 resolution: "tinyspy@npm:3.0.2" checksum: 10/5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 From d44780a084c1a10f615fd141f86146257d72dd63 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 11:34:30 -0600 Subject: [PATCH 10/37] change vitest version to 2.1.4 --- packages/cli/package.json | 2 +- packages/errors/package.json | 2 +- packages/extension/package.json | 2 +- packages/kernel/package.json | 2 +- packages/nodejs/package.json | 11 +++++-- packages/shims/package.json | 2 +- packages/streams/package.json | 2 +- packages/test-utils/package.json | 2 +- packages/utils/package.json | 2 +- yarn.lock | 49 +++++++++++++++++++------------- 10 files changed, 45 insertions(+), 31 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 2682855d5..313b46057 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -78,7 +78,7 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/packages/errors/package.json b/packages/errors/package.json index 9efd6be55..027e5eafa 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -77,7 +77,7 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/packages/extension/package.json b/packages/extension/package.json index d5272e928..68b8edbc7 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -91,7 +91,7 @@ "vite": "^5.3.5", "vite-plugin-checker": "^0.8.0", "vite-plugin-static-copy": "^1.0.6", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/packages/kernel/package.json b/packages/kernel/package.json index faa935526..cdceed301 100644 --- a/packages/kernel/package.json +++ b/packages/kernel/package.json @@ -80,7 +80,7 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 827b157b9..029b26c21 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -24,10 +24,12 @@ "lint:ts": "tsc --project tsconfig.lint.json", "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", - "test": "yarn build:sqlite3 && vitest run --config vitest.config.ts", + "test": "vitest run --config vitest.config.ts", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", - "test:verbose": "yarn test --reporter verbose" + "test:verbose": "yarn test --reporter verbose", + "build:docs": "typedoc", + "test:watch": "vitest --config vitest.config.ts" }, "dependencies": { "@endo/eventual-send": "^1.2.6", @@ -76,9 +78,12 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" + }, + "exports": { + "./package.json": "./package.json" } } diff --git a/packages/shims/package.json b/packages/shims/package.json index 6b810468d..aebaad66a 100644 --- a/packages/shims/package.json +++ b/packages/shims/package.json @@ -66,7 +66,7 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/packages/streams/package.json b/packages/streams/package.json index 1401c92fa..07e3b1f51 100644 --- a/packages/streams/package.json +++ b/packages/streams/package.json @@ -89,7 +89,7 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 5e53fdffa..96a2bf29c 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -46,7 +46,7 @@ "rimraf": "^6.0.1", "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", - "vitest": "^2.1.2", + "vitest": "2.1.4", "vitest-fetch-mock": "^0.4.2" }, "engines": { diff --git a/packages/utils/package.json b/packages/utils/package.json index a93480dfc..7251fe90d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -77,7 +77,7 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", - "vitest": "^2.1.2" + "vitest": "2.1.4" }, "engines": { "node": "^20 || >=22" diff --git a/yarn.lock b/yarn.lock index 7513433f1..3f73cbaae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1675,7 +1675,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" yargs: "npm:^17.7.2" bin: ocap: ./dist/app.mjs @@ -1718,7 +1718,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -1773,7 +1773,7 @@ __metadata: vite: "npm:^5.3.5" vite-plugin-checker: "npm:^0.8.0" vite-plugin-static-copy: "npm:^1.0.6" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -1816,7 +1816,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -1923,7 +1923,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -1958,7 +1958,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -2005,7 +2005,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -2034,7 +2034,7 @@ __metadata: rimraf: "npm:^6.0.1" typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" vitest-fetch-mock: "npm:^0.4.2" languageName: unknown linkType: soft @@ -2075,7 +2075,7 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" - vitest: "npm:^2.1.2" + vitest: "npm:2.1.4" languageName: unknown linkType: soft @@ -2985,7 +2985,7 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:2.1.4, @vitest/pretty-format@npm:^2.1.4": +"@vitest/pretty-format@npm:2.1.4": version: 2.1.4 resolution: "@vitest/pretty-format@npm:2.1.4" dependencies: @@ -2994,6 +2994,15 @@ __metadata: languageName: node linkType: hard +"@vitest/pretty-format@npm:^2.1.4": + version: 2.1.8 + resolution: "@vitest/pretty-format@npm:2.1.8" + dependencies: + tinyrainbow: "npm:^1.2.0" + checksum: 10/f0f60c007424194887ad398d202867d58d850154de327993925041e2972357544eea95a22e0bb3a62a470b006ff8de5f691d2078708dcd7f625e24f8a06b26e7 + languageName: node + linkType: hard + "@vitest/runner@npm:2.1.4": version: 2.1.4 resolution: "@vitest/runner@npm:2.1.4" @@ -8790,9 +8799,9 @@ __metadata: linkType: hard "std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 languageName: node linkType: hard @@ -9111,9 +9120,9 @@ __metadata: linkType: hard "tinypool@npm:^1.0.1": - version: 1.0.1 - resolution: "tinypool@npm:1.0.1" - checksum: 10/eaceb93784b8e27e60c0e3e2c7d11c29e1e79b2a025b2c232215db73b90fe22bd4753ad53fc8e801c2b5a63b94a823af549555d8361272bc98271de7dd4a9925 + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10/6109322f14b3763f65c8fa49fddab72cd3edd96b82dd50e05e63de74867329ff5353bff4377281ec963213d9314f37f4a353e9ee34bbac85fd4c1e4a568d6076 languageName: node linkType: hard @@ -9674,8 +9683,8 @@ __metadata: linkType: hard "vite@npm:^5.0.0, vite@npm:^5.3.5": - version: 5.4.9 - resolution: "vite@npm:5.4.9" + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" @@ -9712,7 +9721,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/60dfb3912ba6367d2d128e798d899caae3f4ec58990657b9f679c4d9de21ddec7eba5f6ad3d4fa0e8ea31771d477521b8e757a622ecc54829d73cb7f7c146bc4 + checksum: 10/719c4dea896e9547958643354003c8c9ea98e5367196d98f5f46cffb3ec963fead3ea5853f5af941c79bbfb73583dec19bbb0d28d2f644b95d7f59c55e22919d languageName: node linkType: hard @@ -9725,7 +9734,7 @@ __metadata: languageName: node linkType: hard -"vitest@npm:2.1.4, vitest@npm:^2.1.2": +"vitest@npm:2.1.4": version: 2.1.4 resolution: "vitest@npm:2.1.4" dependencies: From 75cfa11893ac46929eab48b8a5977019cff169bb Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 11:46:48 -0600 Subject: [PATCH 11/37] thresholds --- vitest.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 057aa36c6..4fa6679b5 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -57,10 +57,10 @@ export default defineConfig({ lines: 57.43, }, 'packages/kernel/**': { - statements: 79.26, - functions: 89.69, + statements: 79.79, + functions: 90.72, branches: 64.86, - lines: 79.47, + lines: 80, }, 'packages/shims/**': { statements: 0, From 0a3280d0bb38d36e3f03adcd3c6916dfa6454c39 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:04:17 -0600 Subject: [PATCH 12/37] type fixes --- packages/nodejs/src/kernel/kernel-worker.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts index 11f72bfaa..e34930995 100644 --- a/packages/nodejs/src/kernel/kernel-worker.ts +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -31,8 +31,8 @@ export async function makeKernel(port: NodeMessagePort): Promise { return kernel; } -const sampleOne = (from: Ele[]): Ele => - from[Math.floor(Math.random() * from.length)]; +const sampleOne = (from: NonEmptyArray): Ele => + from[Math.floor(Math.random() * from.length)] as Ele; /** * Runs the full lifecycle of an array of vats, including their creation, @@ -60,7 +60,7 @@ export async function runVatLifecycle( console.timeEnd(`Created vats: ${vatLabel}`); console.log('Kernel vats:', kernel.getVatIds().join(', ')); - const knownVats = kernel.getVatIds(); + const knownVats = kernel.getVatIds() as NonEmptyArray; // Restart a randomly selected vat from the array. const vatToRestart = sampleOne(knownVats); From 26029c091e1eec1298babc2cbaeb4aa635a45bb0 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:04:37 -0600 Subject: [PATCH 13/37] add -f force option to build-sqlite3 --- packages/nodejs/scripts/build-sqlite3.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/nodejs/scripts/build-sqlite3.sh b/packages/nodejs/scripts/build-sqlite3.sh index a113a4401..b65f18bbc 100755 --- a/packages/nodejs/scripts/build-sqlite3.sh +++ b/packages/nodejs/scripts/build-sqlite3.sh @@ -11,7 +11,14 @@ cd $package_root package_root=$(pwd) monorepo_root="$package_root/../.." -if [ -f "node_modules/better-sqlite3/build/better_sqlite3.node" ]; then +while getopts ":ab:" opt; do + case $opt in + f) force="true";; + \?) echo "Invalid option: -$OPTARG"; exit 1;; + esac +done + +if ! [ "$force" -eq "true" ] && [ -f "node_modules/better-sqlite3/build/better_sqlite3.node" ]; then echo "Found better-sqlite3 bindings." exit 0 fi From 604e53e3aaadab5fdd2577233be6ebb5270f08fb Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:27:30 -0600 Subject: [PATCH 14/37] dedupe prop names in endoify shim --- packages/shims/src/endoify.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/shims/src/endoify.js b/packages/shims/src/endoify.js index bd96927e6..7cb5c0eb5 100644 --- a/packages/shims/src/endoify.js +++ b/packages/shims/src/endoify.js @@ -7,5 +7,4 @@ lockdown({ stackFiltering: 'verbose', domainTaming: 'unsafe', overrideTaming: 'severe', - stackFiltering: 'verbose', }); From 83e59bf4a88d9efed164d75c050a5de3927f28d4 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:37:08 -0600 Subject: [PATCH 15/37] add vite plugin deps --- packages/nodejs/package.json | 2 ++ yarn.lock | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 029b26c21..6c19835e4 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -78,6 +78,8 @@ "typescript": "~5.5.4", "typescript-eslint": "^8.8.1", "vite": "^5.3.5", + "vite-plugin-checker": "^0.8.0", + "vite-plugin-static-copy": "^1.0.6", "vitest": "2.1.4" }, "engines": { diff --git a/yarn.lock b/yarn.lock index 3f73cbaae..93fff6f4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1923,6 +1923,8 @@ __metadata: typescript: "npm:~5.5.4" typescript-eslint: "npm:^8.8.1" vite: "npm:^5.3.5" + vite-plugin-checker: "npm:^0.8.0" + vite-plugin-static-copy: "npm:^1.0.6" vitest: "npm:2.1.4" languageName: unknown linkType: soft From 2bc6c0be31386e99e506e87b29f4c6b7c7f5360d Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 13:58:57 -0600 Subject: [PATCH 16/37] add nodejs build:sqlite3 to top level build:special --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5b76ca8a3..449c7e684 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "build:clean": "yarn clean && yarn build", "build:docs": "yarn workspaces foreach --all --exclude @ocap/monorepo --exclude @ocap/extension --parallel --interlaced --verbose run build:docs", "build:source": "ts-bridge --project tsconfig.build.json --verbose && yarn build:special", - "build:special": "yarn workspace @ocap/shims run build && yarn workspace @ocap/extension run build", + "build:special": "yarn workspace @ocap/shims run build && yarn workspace @ocap/extension run build && yarn workspace @ocap/nodejs run build:sqlite3", "bundle": "node ./scripts/bundle-vat.js", "changelog:update": "yarn workspaces foreach --all --no-private --parallel --interlaced --verbose run changelog:update", "changelog:validate": "yarn workspaces foreach --all --no-private --parallel --interlaced --verbose run changelog:validate", From 629e55688eaa9f190773102c02aa807fb0949765 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 14:07:32 -0600 Subject: [PATCH 17/37] prepend nodejs build sqlite3 to CI test --- .github/workflows/lint-build-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lint-build-test.yml b/.github/workflows/lint-build-test.yml index 755587aed..849b0b200 100644 --- a/.github/workflows/lint-build-test.yml +++ b/.github/workflows/lint-build-test.yml @@ -143,6 +143,7 @@ jobs: node-version: ${{ matrix.node-version }} cache: yarn - run: yarn --immutable + - run: yarn workspace @ocap/nodejs build:sqlite3 - run: yarn run test - name: Require clean working directory shell: bash From 68658d4867d3f6c28fe9c216e8bf2be9d4df4f53 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Thu, 19 Dec 2024 14:46:34 -0600 Subject: [PATCH 18/37] remove db file --- packages/nodejs/src/db/store.db | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/nodejs/src/db/store.db diff --git a/packages/nodejs/src/db/store.db b/packages/nodejs/src/db/store.db deleted file mode 100644 index 46b4058c5744c6d033a922c19171c5080b423771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI$zfRjg90%|_UvL2_`o-zM$Vmt#mP#axp<*K-4~SF*6QR;2GUTeJ&L0T2fu&Mj zp&Jjt!~=Bc3v^&&LE;sv&WxN-v8qg2QS?3OWZ&1nvwWY;zoWxOH&*iNaMTZDxyee5 zbG9udW9&*#p=Un0zA5Ajea+Uh#ucmm_)?@7X3;sLb9$V$0nZ@-0SG_<0uX=z1Rwwb z2tWV=^B@rNcPoy=#~X2Y+EY;)rPglX*IT}9)pr`cj8a)$mS#liMz;LVtq+rR8uk)3 zl{ACBPxatL?)xWIUG17ecg?a_K02Ir2OV{NdC}AV_w6u=hi2W5(zX|+*?;|F=2@ga z%%(A;zw|_7`bBs2a~_;=1_(d^0uX=z1Rwwb2tWV=5P-m&5+ET~-w)Jvd>qDm9nafz zY*C>sXpV;c?xoUUX+f-;=-~9bI?KvRg-H^q{xHsJ^r6VqnD=azE#cBdq7qdbC4*WV zc6(l#Pi5a!*zuP2KAUbC-P0}orU&{*&u_{H9|HjhKmY;|fB*y_009U<00I!0X8}i4 r_*56bE{S!M Date: Mon, 6 Jan 2025 12:16:41 -0600 Subject: [PATCH 19/37] use ocap cli for serving bundles --- packages/nodejs/package.json | 1 + packages/nodejs/scripts/test-ci.sh | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100755 packages/nodejs/scripts/test-ci.sh diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 6c19835e4..83d629d3d 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -25,6 +25,7 @@ "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", "test": "vitest run --config vitest.config.ts", + "test:ci": "./scripts/test-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", "test:verbose": "yarn test --reporter verbose", diff --git a/packages/nodejs/scripts/test-ci.sh b/packages/nodejs/scripts/test-ci.sh new file mode 100755 index 000000000..ce5923aca --- /dev/null +++ b/packages/nodejs/scripts/test-ci.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +set -x +set -e +set -o pipefail + +# We borrow the vat definition from extension for now +yarn ocap bundle "../extension/src/vats" + +# Start the server in background and capture its PID +yarn ocap serve "../extension/src/vats" & +SERVER_PID=$! + +function cleanup() { + # Kill the server if it's still running + if kill -0 $SERVER_PID 2>/dev/null; then + kill $SERVER_PID + fi +} +# Ensure we always close the server +trap cleanup EXIT + +yarn test From 8f6c7a9b8d91912ff7dacbc4ba9b62df629275e1 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 10:43:02 -0600 Subject: [PATCH 20/37] test(nodejs): delineate e2e tests --- packages/nodejs/package.json | 3 ++- .../nodejs/scripts/{test-ci.sh => test-e2e-ci.sh} | 0 packages/nodejs/src/kernel/sqlite-kv-store.ts | 14 ++++++++++++-- .../{src/kernel => test/e2e}/kernel-worker.test.ts | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) rename packages/nodejs/scripts/{test-ci.sh => test-e2e-ci.sh} (100%) rename packages/nodejs/{src/kernel => test/e2e}/kernel-worker.test.ts (93%) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 83d629d3d..485f6b48e 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -25,7 +25,8 @@ "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", "test": "vitest run --config vitest.config.ts", - "test:ci": "./scripts/test-ci.sh", + "test:e2e": "vitest run --config vitest.config.ts ./test/e2e", + "test:e2e:ci": "./scripts/test-e2e-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", "test:verbose": "yarn test --reporter verbose", diff --git a/packages/nodejs/scripts/test-ci.sh b/packages/nodejs/scripts/test-e2e-ci.sh similarity index 100% rename from packages/nodejs/scripts/test-ci.sh rename to packages/nodejs/scripts/test-e2e-ci.sh diff --git a/packages/nodejs/src/kernel/sqlite-kv-store.ts b/packages/nodejs/src/kernel/sqlite-kv-store.ts index c2f365840..9e4930c4c 100644 --- a/packages/nodejs/src/kernel/sqlite-kv-store.ts +++ b/packages/nodejs/src/kernel/sqlite-kv-store.ts @@ -3,9 +3,18 @@ import type { KVStore } from '@ocap/kernel'; import { makeLogger } from '@ocap/utils'; // eslint-disable-next-line @typescript-eslint/naming-convention import Sqlite from 'better-sqlite3'; -import { resolve } from 'path'; +import { mkdir } from 'fs/promises'; +import { tmpdir } from 'os'; +import { join, resolve } from 'path'; -const dbPath = resolve(new URL('../db/store.db', import.meta.url).pathname); +const USE_TMPDIR = true; + +const dbRoot = join( + USE_TMPDIR ? tmpdir() : resolve(new URL('..', import.meta.url).pathname), + './db', +); + +const dbPath = join(dbRoot, 'store.db'); // No changes made to this file, besides this comment. // If used, this file should be deduped with its copy @@ -23,6 +32,7 @@ async function initDB( logger?: ReturnType, ): Promise { console.log('dbPath:', dbPath); + await mkdir(dbRoot, { recursive: true }); return new Sqlite(dbPath, { verbose: (logger ?? console).info, }); diff --git a/packages/nodejs/src/kernel/kernel-worker.test.ts b/packages/nodejs/test/e2e/kernel-worker.test.ts similarity index 93% rename from packages/nodejs/src/kernel/kernel-worker.test.ts rename to packages/nodejs/test/e2e/kernel-worker.test.ts index 0a8f4e1f2..292607663 100644 --- a/packages/nodejs/src/kernel/kernel-worker.test.ts +++ b/packages/nodejs/test/e2e/kernel-worker.test.ts @@ -3,7 +3,7 @@ import '@ocap/shims/endoify'; import { MessageChannel as NodeMessageChannel } from 'node:worker_threads'; import { describe, it, expect, vi } from 'vitest'; -import { makeKernel, runVatLifecycle } from './kernel-worker.js'; +import { makeKernel, runVatLifecycle } from '../../src/kernel/kernel-worker.js'; vi.mock('node:process', () => ({ exit: vi.fn((reason) => { From 81d5a8d8753d9f4f33d5dd0cf79211c012d3691e Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 10:57:11 -0600 Subject: [PATCH 21/37] chore(nodejs): Clean up dependencies --- .depcheckrc.yml | 3 +++ packages/nodejs/package.json | 4 ---- yarn.lock | 4 ---- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.depcheckrc.yml b/.depcheckrc.yml index 5485f3391..a4f46bc4d 100644 --- a/.depcheckrc.yml +++ b/.depcheckrc.yml @@ -38,6 +38,9 @@ ignores: - 'typedoc' - 'typescript' + # Used by @ocap/nodejs to build the sqlite3 bindings + - 'node-gyp' + # These are peer dependencies of various modules we actually do # depend on, which have been elevated to full dependencies (even # though we don't actually depend on them) in order to work around a diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 485f6b48e..e98cd8cbc 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -34,13 +34,10 @@ "test:watch": "vitest --config vitest.config.ts" }, "dependencies": { - "@endo/eventual-send": "^1.2.6", "@endo/exo": "^1.5.4", "@endo/patterns": "^1.4.4", "@endo/promise-kit": "^1.1.6", - "@metamask/snaps-utils": "^8.3.0", "@metamask/utils": "^9.3.0", - "@ocap/errors": "workspace:^", "@ocap/kernel": "workspace:^", "@ocap/shims": "workspace:^", "@ocap/streams": "workspace:^", @@ -55,7 +52,6 @@ "@metamask/eslint-config-nodejs": "^14.0.0", "@metamask/eslint-config-typescript": "^14.0.0", "@ocap/cli": "workspace:^", - "@ocap/test-utils": "workspace:^", "@ts-bridge/cli": "^0.5.1", "@types/better-sqlite3": "^7.6.12", "@types/chrome": "^0.0.268", diff --git a/yarn.lock b/yarn.lock index 93fff6f4d..0164853fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1880,7 +1880,6 @@ __metadata: resolution: "@ocap/nodejs@workspace:packages/nodejs" dependencies: "@arethetypeswrong/cli": "npm:^0.16.4" - "@endo/eventual-send": "npm:^1.2.6" "@endo/exo": "npm:^1.5.4" "@endo/patterns": "npm:^1.4.4" "@endo/promise-kit": "npm:^1.1.6" @@ -1888,14 +1887,11 @@ __metadata: "@metamask/eslint-config": "npm:^14.0.0" "@metamask/eslint-config-nodejs": "npm:^14.0.0" "@metamask/eslint-config-typescript": "npm:^14.0.0" - "@metamask/snaps-utils": "npm:^8.3.0" "@metamask/utils": "npm:^9.3.0" "@ocap/cli": "workspace:^" - "@ocap/errors": "workspace:^" "@ocap/kernel": "workspace:^" "@ocap/shims": "workspace:^" "@ocap/streams": "workspace:^" - "@ocap/test-utils": "workspace:^" "@ocap/utils": "workspace:^" "@ts-bridge/cli": "npm:^0.5.1" "@types/better-sqlite3": "npm:^7.6.12" From 0550c42165580b1886757291cc76b9d9d3bd7bee Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:01:00 -0600 Subject: [PATCH 22/37] fix(nodejs): run test:e2e from test-e2e-ci --- packages/nodejs/scripts/test-e2e-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodejs/scripts/test-e2e-ci.sh b/packages/nodejs/scripts/test-e2e-ci.sh index ce5923aca..e857cf5dd 100755 --- a/packages/nodejs/scripts/test-e2e-ci.sh +++ b/packages/nodejs/scripts/test-e2e-ci.sh @@ -20,4 +20,4 @@ function cleanup() { # Ensure we always close the server trap cleanup EXIT -yarn test +yarn test:e2e From 54198c70f6da1976a216849d66086fa00601b51e Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:06:24 -0600 Subject: [PATCH 23/37] test(nodejs): Add separate vitest config for e2e tests --- packages/nodejs/package.json | 2 +- packages/nodejs/tsconfig.json | 3 ++- packages/nodejs/vitest.config.e2e.ts | 29 ++++++++++++++++++++++++++++ packages/nodejs/vitest.config.ts | 2 ++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 packages/nodejs/vitest.config.e2e.ts diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index e98cd8cbc..42383117e 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -25,7 +25,7 @@ "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", "test": "vitest run --config vitest.config.ts", - "test:e2e": "vitest run --config vitest.config.ts ./test/e2e", + "test:e2e": "vitest run --config vitest.config.e2e.ts", "test:e2e:ci": "./scripts/test-e2e-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", diff --git a/packages/nodejs/tsconfig.json b/packages/nodejs/tsconfig.json index 94d916d34..f957e64b3 100644 --- a/packages/nodejs/tsconfig.json +++ b/packages/nodejs/tsconfig.json @@ -25,6 +25,7 @@ "./test/**/*.ts", "./vite-plugins/*.ts", "./vite.config.ts", - "./vitest.config.ts" + "./vitest.config.ts", + "./vitest.config.e2e.ts" ] } diff --git a/packages/nodejs/vitest.config.e2e.ts b/packages/nodejs/vitest.config.e2e.ts new file mode 100644 index 000000000..1ea6de651 --- /dev/null +++ b/packages/nodejs/vitest.config.e2e.ts @@ -0,0 +1,29 @@ +// eslint-disable-next-line spaced-comment +/// + +import path from 'path'; +import { defineConfig, mergeConfig } from 'vite'; + +import defaultConfig from '../../vitest.config.js'; + +const config = mergeConfig( + defaultConfig, + defineConfig({ + optimizeDeps: { include: ['better-sqlite3'] }, + test: { + pool: 'forks', + alias: [ + { + find: '@ocap/shims/endoify', + replacement: path.resolve('../shims/src/endoify.js'), + customResolver: (id) => ({ external: true, id }), + }, + ], + include: ['./test/e2e'], + exclude: ['./src'], + }, + }), +); + +delete config.test.coverage.thresholds; +export default config; diff --git a/packages/nodejs/vitest.config.ts b/packages/nodejs/vitest.config.ts index 967a9021c..7f44f9b8c 100644 --- a/packages/nodejs/vitest.config.ts +++ b/packages/nodejs/vitest.config.ts @@ -19,6 +19,8 @@ const config = mergeConfig( customResolver: (id) => ({ external: true, id }), }, ], + include: ['./src/**/*.test.ts'], + exclude: ['./test/e2e'], }, }), ); From a12c1c4bf98deda997481c0fe2b789fa99da80c8 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:24:22 -0600 Subject: [PATCH 24/37] add top level test:e2e:ci command --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 449c7e684..39d57249b 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "test": "vitest run", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", + "test:e2e:ci": "yarn workspaces foreach -A run test:e2e:ci", "test:verbose": "yarn test --reporter verbose", "test:watch": "vitest", "why:batch": "./scripts/why-batch.sh" From 383c8154f22246385f936cc9969431a4b04fd308 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:19:17 -0600 Subject: [PATCH 25/37] more explicit include/exclude paths --- packages/nodejs/vitest.config.e2e.ts | 4 ++-- packages/nodejs/vitest.config.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/nodejs/vitest.config.e2e.ts b/packages/nodejs/vitest.config.e2e.ts index 1ea6de651..b131aba3a 100644 --- a/packages/nodejs/vitest.config.e2e.ts +++ b/packages/nodejs/vitest.config.e2e.ts @@ -19,8 +19,8 @@ const config = mergeConfig( customResolver: (id) => ({ external: true, id }), }, ], - include: ['./test/e2e'], - exclude: ['./src'], + include: ['./test/e2e/**/*.test.ts'], + exclude: ['./src/**/*'], }, }), ); diff --git a/packages/nodejs/vitest.config.ts b/packages/nodejs/vitest.config.ts index 7f44f9b8c..5bff3e3ac 100644 --- a/packages/nodejs/vitest.config.ts +++ b/packages/nodejs/vitest.config.ts @@ -20,7 +20,7 @@ const config = mergeConfig( }, ], include: ['./src/**/*.test.ts'], - exclude: ['./test/e2e'], + exclude: ['./test/e2e/**/*'], }, }), ); From fb084ac53759a9497d692f6351c654e953e85111 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 13:46:34 -0600 Subject: [PATCH 26/37] force build sqlite3 before e2e test --- .github/workflows/lint-build-test.yml | 2 +- packages/nodejs/scripts/build-sqlite3.sh | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint-build-test.yml b/.github/workflows/lint-build-test.yml index 849b0b200..f20c17090 100644 --- a/.github/workflows/lint-build-test.yml +++ b/.github/workflows/lint-build-test.yml @@ -174,7 +174,7 @@ jobs: node-version: ${{ matrix.node-version }} cache: yarn - run: yarn --immutable - - run: yarn build + - run: yarn build -f - run: yarn test:e2e:ci - name: Require clean working directory shell: bash diff --git a/packages/nodejs/scripts/build-sqlite3.sh b/packages/nodejs/scripts/build-sqlite3.sh index b65f18bbc..ebd2e23a2 100755 --- a/packages/nodejs/scripts/build-sqlite3.sh +++ b/packages/nodejs/scripts/build-sqlite3.sh @@ -12,13 +12,13 @@ package_root=$(pwd) monorepo_root="$package_root/../.." while getopts ":ab:" opt; do - case $opt in - f) force="true";; + case $OPTARG in + f) force=1;; \?) echo "Invalid option: -$OPTARG"; exit 1;; esac done -if ! [ "$force" -eq "true" ] && [ -f "node_modules/better-sqlite3/build/better_sqlite3.node" ]; then +if ! [ "$force" = "1" ] && [ -f "node_modules/better-sqlite3/build/better_sqlite3.node" ]; then echo "Found better-sqlite3 bindings." exit 0 fi From 68872dedfdbe1639c91764b587701608d8ebe969 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:03:36 -0600 Subject: [PATCH 27/37] use --no-silent flag for e2e test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 39d57249b..80787a494 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "test": "vitest run", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", - "test:e2e:ci": "yarn workspaces foreach -A run test:e2e:ci", + "test:e2e:ci": "yarn workspaces foreach -A run test:e2e:ci --no-silent", "test:verbose": "yarn test --reporter verbose", "test:watch": "vitest", "why:batch": "./scripts/why-batch.sh" From 98e3c18c51ab02d68b50c423317083b0d2c4e574 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:25:42 -0600 Subject: [PATCH 28/37] thresholds --- vitest.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vitest.config.ts b/vitest.config.ts index 4fa6679b5..057aa36c6 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -57,10 +57,10 @@ export default defineConfig({ lines: 57.43, }, 'packages/kernel/**': { - statements: 79.79, - functions: 90.72, + statements: 79.26, + functions: 89.69, branches: 64.86, - lines: 80, + lines: 79.47, }, 'packages/shims/**': { statements: 0, From a586f84d8f0eee84501746daeccecf4d3420aee9 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:42:33 -0600 Subject: [PATCH 29/37] force build sqlite3 in e2e --- packages/nodejs/scripts/test-e2e-ci.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/nodejs/scripts/test-e2e-ci.sh b/packages/nodejs/scripts/test-e2e-ci.sh index e857cf5dd..d2db72ddd 100755 --- a/packages/nodejs/scripts/test-e2e-ci.sh +++ b/packages/nodejs/scripts/test-e2e-ci.sh @@ -4,6 +4,9 @@ set -x set -e set -o pipefail +# force build sqlite3 so it aligns with node version +yarn build:sqlite3 -f + # We borrow the vat definition from extension for now yarn ocap bundle "../extension/src/vats" From 2c21c0cc14a39b737b6ba06967d43479f9682c94 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:48:15 -0600 Subject: [PATCH 30/37] no-silent --- packages/nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index 42383117e..ecbb039e3 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -25,7 +25,7 @@ "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", "test": "vitest run --config vitest.config.ts", - "test:e2e": "vitest run --config vitest.config.e2e.ts", + "test:e2e": "vitest run --config vitest.config.e2e.ts --no-silent", "test:e2e:ci": "./scripts/test-e2e-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", "test:dev": "yarn test --coverage false", From b9fcb2555a8d7cd7894b938bc49902cec10f6318 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:22:02 -0600 Subject: [PATCH 31/37] debug: VWS --- packages/nodejs/src/kernel/VatWorkerService.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/nodejs/src/kernel/VatWorkerService.ts b/packages/nodejs/src/kernel/VatWorkerService.ts index faf13e815..8fcb0d46c 100644 --- a/packages/nodejs/src/kernel/VatWorkerService.ts +++ b/packages/nodejs/src/kernel/VatWorkerService.ts @@ -3,6 +3,7 @@ import type { VatWorkerService, VatId } from '@ocap/kernel'; import { NodeWorkerMultiplexer, StreamMultiplexer } from '@ocap/streams'; import { makeLogger } from '@ocap/utils'; import type { Logger } from '@ocap/utils'; +import { readFile } from 'node:fs/promises'; import { Worker as NodeWorker } from 'node:worker_threads'; // Worker file loads from the built dist directory, requires rebuild after change @@ -31,11 +32,16 @@ export class NodejsVatWorkerService implements VatWorkerService { async launch(vatId: VatId): Promise { const { promise, resolve } = makePromiseKit(); this.#logger.debug('launching', vatId); + this.#logger.debug('fileUrl', workerFileURL); + this.#logger.debug( + `fileContent\n===\n${(await readFile(workerFileURL)).toString()}\n===\n`, + ); const worker = new NodeWorker(workerFileURL, { env: { NODE_VAT_ID: vatId, }, }); + this.#logger.debug('launched', vatId); worker.once('online', () => { const multiplexer = new NodeWorkerMultiplexer(worker, 'vat'); this.workers.set(vatId, { worker, multiplexer }); From e4126868d096004d872c7ec5fb182c0cf5d4134f Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:38:54 -0600 Subject: [PATCH 32/37] test(nodejs): build immediately before e2e --- packages/nodejs/package.json | 1 + packages/nodejs/scripts/test-e2e-ci.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index ecbb039e3..e77733eed 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -13,6 +13,7 @@ ], "scripts": { "build": "ts-bridge --project tsconfig.build.json --clean && yarn build:sqlite3", + "build:e2e": "ts-bridge --project tsconfig.build.json --clean && yarn build:sqlite3 -f", "build:sqlite3": "scripts/build-sqlite3.sh", "changelog:validate": "../../scripts/validate-changelog.sh @ocap/nodejs", "clean": "rimraf --glob ./dist './*.tsbuildinfo'", diff --git a/packages/nodejs/scripts/test-e2e-ci.sh b/packages/nodejs/scripts/test-e2e-ci.sh index d2db72ddd..56920fb1e 100755 --- a/packages/nodejs/scripts/test-e2e-ci.sh +++ b/packages/nodejs/scripts/test-e2e-ci.sh @@ -5,7 +5,7 @@ set -e set -o pipefail # force build sqlite3 so it aligns with node version -yarn build:sqlite3 -f +yarn build:e2e # We borrow the vat definition from extension for now yarn ocap bundle "../extension/src/vats" From abd3734c442c152c27da68c51bc0fbcbea4597c8 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:45:43 -0600 Subject: [PATCH 33/37] build b4 test --- packages/nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index e77733eed..bb82ebb43 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -25,7 +25,7 @@ "lint:ts": "tsc --project tsconfig.lint.json", "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", - "test": "vitest run --config vitest.config.ts", + "test": "yarn build && vitest run --config vitest.config.ts", "test:e2e": "vitest run --config vitest.config.e2e.ts --no-silent", "test:e2e:ci": "./scripts/test-e2e-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", From 46d2d62c7f295e0beebc50141952793d75ed0292 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 18:49:38 -0600 Subject: [PATCH 34/37] remove build b4 test --- packages/nodejs/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json index bb82ebb43..e77733eed 100644 --- a/packages/nodejs/package.json +++ b/packages/nodejs/package.json @@ -25,7 +25,7 @@ "lint:ts": "tsc --project tsconfig.lint.json", "publish:preview": "yarn npm publish --tag preview", "start": "yarn build:vite:dev --watch", - "test": "yarn build && vitest run --config vitest.config.ts", + "test": "vitest run --config vitest.config.ts", "test:e2e": "vitest run --config vitest.config.e2e.ts --no-silent", "test:e2e:ci": "./scripts/test-e2e-ci.sh", "test:clean": "yarn test --no-cache --coverage.clean", From 30144974d6d9dc8c533e8773c08f40857c87c144 Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 19:01:35 -0600 Subject: [PATCH 35/37] trivialize node unit tests --- packages/nodejs/src/node/node-worker.test.ts | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/nodejs/src/node/node-worker.test.ts b/packages/nodejs/src/node/node-worker.test.ts index 88acf3804..652944b5b 100644 --- a/packages/nodejs/src/node/node-worker.test.ts +++ b/packages/nodejs/src/node/node-worker.test.ts @@ -6,6 +6,7 @@ import { Worker as NodeWorker } from 'node:worker_threads'; import { describe, it, expect } from 'vitest'; import type { Mode } from './comms.js'; +import { readFile } from 'node:fs/promises'; const workerFileURL = new URL( '../../dist/node/node-worker.mjs', @@ -13,6 +14,15 @@ const workerFileURL = new URL( ).pathname; describe('Node Worker', () => { + console.debug('describing test'); + + it('trivial', () => { + expect(true).toBe(true); + // huzzah! + }); + + /* + const makeWorker = (mode: Mode): NodeWorker => new NodeWorker(workerFileURL, { env: { @@ -22,17 +32,25 @@ describe('Node Worker', () => { }); it('communicates directly via worker.postMessage', async () => { + console.debug('starting 1'); const { resolve, promise } = makePromiseKit(); + console.debug('making worker 1'); + console.debug('worker file:', workerFileURL); + console.debug('worker file content:\n', '\n' + (await readFile(workerFileURL)).toString(), '\n'); + const worker = makeWorker('direct'); + console.debug('made worker 1'); worker.once('online', () => worker.postMessage('ping')); worker.on('message', (message: string) => resolve(message)); + console.debug('awaiting 1'); expect(await promise).toBe('pong'); }); it('communicates via NodeWorkerStream', async () => { + console.debug('starting 2'); const { resolve, promise, reject } = makePromiseKit(); const worker = makeWorker('strum'); @@ -55,6 +73,7 @@ describe('Node Worker', () => { }); it('communicates over NodeWorkerMultiplexer', async () => { + console.debug('starting 3'); const { resolve, promise, reject } = makePromiseKit(); const worker = makeWorker('plexed'); @@ -76,4 +95,6 @@ describe('Node Worker', () => { expect(await promise).toBe('pong'); }); + + */ }); From 39c46e8a18d477193fdda776228738b512e5b29a Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 19:06:25 -0600 Subject: [PATCH 36/37] remove sqlite3 build from test stage --- .github/workflows/lint-build-test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/lint-build-test.yml b/.github/workflows/lint-build-test.yml index f20c17090..dc0206b60 100644 --- a/.github/workflows/lint-build-test.yml +++ b/.github/workflows/lint-build-test.yml @@ -143,7 +143,6 @@ jobs: node-version: ${{ matrix.node-version }} cache: yarn - run: yarn --immutable - - run: yarn workspace @ocap/nodejs build:sqlite3 - run: yarn run test - name: Require clean working directory shell: bash From c518393a6c17e081e0cd99a5e05c862ccb75e45b Mon Sep 17 00:00:00 2001 From: grypez <143971198+grypez@users.noreply.github.com> Date: Tue, 7 Jan 2025 19:27:37 -0600 Subject: [PATCH 37/37] remove unused node dir --- packages/nodejs/src/node/comms.ts | 59 ----------- packages/nodejs/src/node/node-worker.test.ts | 100 ------------------- packages/nodejs/src/node/node-worker.ts | 14 --- 3 files changed, 173 deletions(-) delete mode 100644 packages/nodejs/src/node/comms.ts delete mode 100644 packages/nodejs/src/node/node-worker.test.ts delete mode 100644 packages/nodejs/src/node/node-worker.ts diff --git a/packages/nodejs/src/node/comms.ts b/packages/nodejs/src/node/comms.ts deleted file mode 100644 index 886f497c0..000000000 --- a/packages/nodejs/src/node/comms.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { NodeWorkerMultiplexer, NodeWorkerDuplexStream } from '@ocap/streams'; -import type { MessagePort as WorkerPort } from 'worker_threads'; - -export const modes = ['direct', 'strum', 'plexed'] as const; -export type Mode = (typeof modes)[number]; -export type Comms = (port: WorkerPort) => Promise; - -/** - * Run the pong end of ping-pong via on + postMessage. - * - * @param port - The port to communicate over. - */ -export async function direct(port: WorkerPort): Promise { - console.debug('direct communication init'); - port.on('message', (message) => { - if (message === 'ping') { - port.postMessage('pong'); - } - }); - console.debug('direct communication started'); -} - -/** - * Run the pong end of ping-pong on a duplex stream. - - * @param port - The port to communicate over. - */ -export async function strum(port: WorkerPort): Promise { - console.log('streamed communication init'); - const stream = new NodeWorkerDuplexStream(port); - await stream.synchronize(); - for await (const message of stream) { - if (message === 'ping') { - await stream.write('pong'); - } - } - console.log('streamed communication started'); -} - -/** - * Run the pong end of ping-pong on a multiplexer. - * - * @param port - The port to communicate over. - */ -export async function plexed(port: WorkerPort): Promise { - console.log('plexed communication init'); - const multiplexer = new NodeWorkerMultiplexer(port); - const testChannel = multiplexer.createChannel('test'); - multiplexer.start().catch(console.error); - testChannel - .drain(async (message) => { - console.debug('testChannel drain:', message); - if (message === 'ping') { - await testChannel.write('pong'); - } - }) - .catch(console.error); - console.log('multiplexer started'); -} diff --git a/packages/nodejs/src/node/node-worker.test.ts b/packages/nodejs/src/node/node-worker.test.ts deleted file mode 100644 index 652944b5b..000000000 --- a/packages/nodejs/src/node/node-worker.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import '@ocap/shims/endoify'; - -import { makePromiseKit } from '@endo/promise-kit'; -import { NodeWorkerDuplexStream, NodeWorkerMultiplexer } from '@ocap/streams'; -import { Worker as NodeWorker } from 'node:worker_threads'; -import { describe, it, expect } from 'vitest'; - -import type { Mode } from './comms.js'; -import { readFile } from 'node:fs/promises'; - -const workerFileURL = new URL( - '../../dist/node/node-worker.mjs', - import.meta.url, -).pathname; - -describe('Node Worker', () => { - console.debug('describing test'); - - it('trivial', () => { - expect(true).toBe(true); - // huzzah! - }); - - /* - - const makeWorker = (mode: Mode): NodeWorker => - new NodeWorker(workerFileURL, { - env: { - COMMS: mode, - }, - execArgv: ['--loader', 'tsx'], - }); - - it('communicates directly via worker.postMessage', async () => { - console.debug('starting 1'); - const { resolve, promise } = makePromiseKit(); - - console.debug('making worker 1'); - console.debug('worker file:', workerFileURL); - console.debug('worker file content:\n', '\n' + (await readFile(workerFileURL)).toString(), '\n'); - - const worker = makeWorker('direct'); - console.debug('made worker 1'); - - worker.once('online', () => worker.postMessage('ping')); - worker.on('message', (message: string) => resolve(message)); - - console.debug('awaiting 1'); - expect(await promise).toBe('pong'); - }); - - it('communicates via NodeWorkerStream', async () => { - console.debug('starting 2'); - const { resolve, promise, reject } = makePromiseKit(); - - const worker = makeWorker('strum'); - const stream = new NodeWorkerDuplexStream(worker); - worker.once('online', () => { - stream - .synchronize() - .then(async () => stream.write('ping')) - .catch(reject); - }); - - for await (const value of stream) { - if (typeof value === 'string') { - resolve(value); - break; - } - } - - expect(await promise).toBe('pong'); - }); - - it('communicates over NodeWorkerMultiplexer', async () => { - console.debug('starting 3'); - const { resolve, promise, reject } = makePromiseKit(); - - const worker = makeWorker('plexed'); - const multiplexer = new NodeWorkerMultiplexer(worker); - const testChannel = multiplexer.createChannel('test'); - multiplexer.start().catch(reject); - worker.once('online', () => { - testChannel.write('ping').catch(reject); - }); - - testChannel - .drain(async (value: unknown) => { - console.debug('rebounded:', value); - if (typeof value === 'string') { - resolve(value); - } - }) - .catch(reject); - - expect(await promise).toBe('pong'); - }); - - */ -}); diff --git a/packages/nodejs/src/node/node-worker.ts b/packages/nodejs/src/node/node-worker.ts deleted file mode 100644 index c0a043707..000000000 --- a/packages/nodejs/src/node/node-worker.ts +++ /dev/null @@ -1,14 +0,0 @@ -import '@ocap/shims/endoify'; -import { parentPort } from 'worker_threads'; - -import type { Mode } from './comms.js'; - -if (!parentPort) { - throw new Error( - 'expected to be run in a node worker with parentPort defined', - ); -} - -const comms = await import('./comms.js'); -// eslint-disable-next-line n/no-process-env -comms[process.env.COMMS as Mode](parentPort).catch(console.error);