From e59c1c4b45a5667d5e184ef32743617e5cfc2082 Mon Sep 17 00:00:00 2001 From: Thomas Stokes Date: Mon, 22 Sep 2025 23:29:37 +0800 Subject: [PATCH] scripts/test: switch to capnweb --- pnpm-lock.yaml | 19 +++++++---------- scripts/test/browser-runtime.ts | 4 ++-- scripts/test/devalue.ts | 14 ------------- scripts/test/main.ts | 17 +++++---------- scripts/test/package.json | 3 +-- scripts/test/runtime.ts | 37 +++++++++++++-------------------- 6 files changed, 31 insertions(+), 63 deletions(-) delete mode 100644 scripts/test/devalue.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6fd7a317..82c7a831 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,12 +153,9 @@ importers: ast-v8-to-istanbul: specifier: ^0.3.11 version: 0.3.11 - birpc: - specifier: ^4.0.0 - version: 4.0.0 - devalue: - specifier: ^5.6.2 - version: 5.6.2 + capnweb: + specifier: ^0.1.0 + version: 0.1.0 hono: specifier: ^4.11.7 version: 4.11.7 @@ -910,6 +907,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + capnweb@0.1.0: + resolution: {integrity: sha512-+pygKx1JFTZTRdd1hHgaBRg5BwULEDZq8ZoHXkYP2GXNV3lrjXLj5qzlGz+SgBCJjWUmNBtlh7JPWdr0wIbY8w==} + chromium-bidi@13.0.1: resolution: {integrity: sha512-c+RLxH0Vg2x2syS9wPw378oJgiJNXtYXUvnVAldUlt5uaHekn0CCU7gPksNgHjrH1qFhmjVXQj4esvuthuC7OQ==} peerDependencies: @@ -958,9 +958,6 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} - devalue@5.6.2: - resolution: {integrity: sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==} - devtools-protocol@0.0.1551306: resolution: {integrity: sha512-CFx8QdSim8iIv+2ZcEOclBKTQY6BI1IEDa7Tm9YkwAXzEWFndTEzpTo5jAUhSnq24IC7xaDw0wvGcm96+Y3PEg==} @@ -1948,6 +1945,8 @@ snapshots: callsites@3.1.0: {} + capnweb@0.1.0: {} + chromium-bidi@13.0.1(devtools-protocol@0.0.1551306): dependencies: devtools-protocol: 0.0.1551306 @@ -2001,8 +2000,6 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 - devalue@5.6.2: {} - devtools-protocol@0.0.1551306: {} dhtml@file:dist: diff --git a/scripts/test/browser-runtime.ts b/scripts/test/browser-runtime.ts index e0d224d6..935e6947 100644 --- a/scripts/test/browser-runtime.ts +++ b/scripts/test/browser-runtime.ts @@ -27,7 +27,7 @@ export async function create_browser_runtime(): Promise { 'dhtml/client': '/dist/client.js', 'dhtml/server': '/dist/server.js', birpc: pkg('birpc'), - devalue: pkg('devalue'), + capnweb: pkg('capnweb'), mitata: pkg('mitata'), }, })} @@ -86,7 +86,7 @@ export async function create_browser_runtime(): Promise { } }) const { port1, port2 } = new MessageChannel() - await page.exposeFunction('__postMessage', (data: any) => port1.postMessage(data)) + await page.exposeFunction('__postMessage', (data: string) => port1.postMessage(data)) await page.coverage.startJSCoverage({ includeRawScriptCoverage: true }) await page.goto(`http://${addr}/@runner`) diff --git a/scripts/test/devalue.ts b/scripts/test/devalue.ts deleted file mode 100644 index f922e64a..00000000 --- a/scripts/test/devalue.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as devalue from 'devalue' - -export function stringify(value: unknown): string { - return devalue.stringify(value, { - Error: value => - value instanceof Error && { name: value.name, message: value.message, stack: value.stack, cause: value.cause }, - }) -} - -export function parse(value: string): unknown { - return devalue.parse(value, { - Error: ({ message, ...rest }) => Object.assign(new Error(message), rest), - }) -} diff --git a/scripts/test/main.ts b/scripts/test/main.ts index e6805461..e915fe06 100644 --- a/scripts/test/main.ts +++ b/scripts/test/main.ts @@ -1,11 +1,10 @@ -import { createBirpc } from 'birpc' +import { newMessagePortRpcSession } from 'capnweb' import * as fs from 'node:fs/promises' import * as path from 'node:path' import { fileURLToPath } from 'node:url' import { parseArgs, styleText } from 'node:util' import { create_browser_runtime } from './browser-runtime.ts' import { handle_coverage, type Coverage } from './coverage.ts' -import * as devalue from './devalue.ts' import { create_node_runtime } from './node-runtime.ts' import type { ClientFunctions, TestResult } from './runtime.ts' @@ -45,7 +44,8 @@ for (const [runtime, files] of Object.entries(all_files)) { const rt = runtime === 'node' ? await create_node_runtime() : await create_browser_runtime() await using _ = rt // workaround for https://issues.chromium.org/issues/409478039 - const client = createBirpc( + using client = newMessagePortRpcSession( + rt.port, { report_result(run) { if (run.result === 'pass') { @@ -58,15 +58,8 @@ for (const [runtime, files] of Object.entries(all_files)) { results.push(run) }, - }, - { - post: data => rt.port.postMessage(data), - on: fn => { - rt.port.onmessage = e => fn(e.data) - }, - serialize: devalue.stringify, - deserialize: devalue.parse, - }, + } satisfies ServerFunctions, + { onSendError: e => e }, ) await client.define('__DEV__', !args.values.prod) diff --git a/scripts/test/package.json b/scripts/test/package.json index 976b9fb8..1a77a2bf 100644 --- a/scripts/test/package.json +++ b/scripts/test/package.json @@ -8,8 +8,7 @@ "@types/istanbul-reports": "^3.0.4", "amaro": "^1.1.6", "ast-v8-to-istanbul": "^0.3.11", - "birpc": "^4.0.0", - "devalue": "^5.6.2", + "capnweb": "^0.1.0", "hono": "^4.11.7", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", diff --git a/scripts/test/runtime.ts b/scripts/test/runtime.ts index fd48a74b..d247abff 100644 --- a/scripts/test/runtime.ts +++ b/scripts/test/runtime.ts @@ -1,6 +1,5 @@ -import { createBirpc } from 'birpc' +import { newMessagePortRpcSession, RpcStub } from 'capnweb' import * as mitata from 'mitata' -import * as devalue from './devalue.ts' import type { ServerFunctions } from './main.ts' export type TestResult = { name: string } & ({ result: 'pass'; duration: number } | { result: 'fail'; reason: unknown }) @@ -17,8 +16,8 @@ const client: ClientFunctions = { define(name, value) { globalThis[name] = value }, - import(path) { - return import(path) + async import(path) { + return new RpcStub((await import(path)) as object) }, async run_tests(options) { for (const test of tests) { @@ -47,25 +46,19 @@ const client: ClientFunctions = { } declare global { - var __onmessage: (fn: (data: any) => void) => void - var __postMessage: (data: any) => void + var __onmessage: (fn: (data: string) => void) => void + var __postMessage: (data: string) => void } -const server = createBirpc( - client, - typeof process === 'undefined' - ? { - post: window.__postMessage, - on: fn => (window.__onmessage = fn), - serialize: devalue.stringify, - deserialize: devalue.parse, - } - : { - post: data => process.send!(data), - on: fn => process.on('message', fn), - serialize: devalue.stringify, - deserialize: devalue.parse, - }, -) +const { port1, port2 } = new MessageChannel() +if (typeof process === 'undefined') { + window.__onmessage = data => port1.postMessage(data) + port1.onmessage = event => window.__postMessage(event.data) +} else { + process.on('message', data => port1.postMessage(data)) + port1.onmessage = event => process.send!(event.data) +} + +const server = newMessagePortRpcSession(port2, client, { onSendError: e => e }) export const tests: Array<{ name: string; fn: () => void | Promise }> = []