/** * @file An OCapN client for the admin socket, from Node: it registers its * own gateway with the router there and reaches every other peer through * it. Run under SES (see test/lockdown.js). */ import { makeClient, swissnumFromBytes } from "@endo/ocapn"; import { newWebSocketRpcSession } from "capnweb"; import WebSocket from "ws"; import { locationOf, makeRpcNetLayer } from "./netlayer.js"; /** * An OCapN client on the admin socket: registers its own gateway with the * router there, and reaches every other peer through it. * * @param {string} adminSock * @param {string} designator * @param {{ verbose?: boolean }} [opts] OCapN logging */ export const connectClient = async (adminSock, designator, { verbose = false } = {}) => { const ws = new WebSocket(`ws+unix:${adminSock}:/`); await new Promise((resolve, reject) => (ws.once("open", resolve), ws.once("error", reject))); const session = newWebSocketRpcSession(ws); const ocapn = makeClient({ debugLabel: designator, verbose }); const netlayer = await ocapn.registerNetlayer( makeRpcNetLayer({ designator, openGateway: (d) => session.gateway(d) }), ); await session.register(designator, netlayer.gateway); const vatAdmin = await ocapn.enlivenSturdyRef( ocapn.makeSturdyRef(locationOf("vatAdmin"), swissnumFromBytes(new TextEncoder().encode("vatAdmin"))), ); return { vatAdmin, close: () => (ocapn.shutdown(), ws.close()) }; };