diff --git a/packages/kernel-browser-runtime/src/PlatformServicesServer.test.ts b/packages/kernel-browser-runtime/src/PlatformServicesServer.test.ts index 43782202c..2df5f9b83 100644 --- a/packages/kernel-browser-runtime/src/PlatformServicesServer.test.ts +++ b/packages/kernel-browser-runtime/src/PlatformServicesServer.test.ts @@ -18,7 +18,7 @@ import type { PlatformServicesStream, } from './PlatformServicesServer.ts'; -// Mock initNetwork from ocap-kernel +// Mock initTransport from ocap-kernel const mockSendRemoteMessage = vi.fn(async () => undefined); const mockStop = vi.fn(async () => undefined); const mockCloseConnection = vi.fn(async () => undefined); @@ -35,7 +35,7 @@ vi.mock('@metamask/ocap-kernel', () => ({ terminate: 'terminate', terminateAll: 'terminateAll', }, - initNetwork: vi.fn( + initTransport: vi.fn( async ( _keySeed: string, _options: unknown, @@ -400,8 +400,8 @@ describe('PlatformServicesServer', () => { ); await delay(10); - const { initNetwork } = await import('@metamask/ocap-kernel'); - expect(initNetwork).toHaveBeenCalledWith( + const { initTransport } = await import('@metamask/ocap-kernel'); + expect(initTransport).toHaveBeenCalledWith( keySeed, { relays }, expect.any(Function), @@ -422,8 +422,8 @@ describe('PlatformServicesServer', () => { ); await delay(10); - const { initNetwork } = await import('@metamask/ocap-kernel'); - expect(initNetwork).toHaveBeenCalledWith( + const { initTransport } = await import('@metamask/ocap-kernel'); + expect(initTransport).toHaveBeenCalledWith( keySeed, options, expect.any(Function), @@ -458,7 +458,7 @@ describe('PlatformServicesServer', () => { }); describe('handleRemoteMessage', () => { - it('captures handler from initNetwork', async () => { + it('captures handler from initTransport', async () => { const keySeed = '0xabcd'; const relays = ['/dns4/relay.example/tcp/443/wss/p2p/relayPeer']; @@ -529,7 +529,7 @@ describe('PlatformServicesServer', () => { }); describe('handleRemoteGiveUp', () => { - it('captures handler from initNetwork', async () => { + it('captures handler from initTransport', async () => { const keySeed = '0xabcd'; const relays = ['/dns4/relay.example/tcp/443/wss/p2p/relayPeer']; @@ -666,8 +666,8 @@ describe('PlatformServicesServer', () => { await stream.receiveInput(makeStopRemoteCommsMessageEvent('m1')); await delay(10); - const { initNetwork } = await import('@metamask/ocap-kernel'); - const firstCallCount = (initNetwork as Mock).mock.calls.length; + const { initTransport } = await import('@metamask/ocap-kernel'); + const firstCallCount = (initTransport as Mock).mock.calls.length; // Re-initialize should work await stream.receiveInput( @@ -675,8 +675,8 @@ describe('PlatformServicesServer', () => { ); await delay(10); - // Should have called initNetwork again - expect((initNetwork as Mock).mock.calls).toHaveLength( + // Should have called initTransport again + expect((initTransport as Mock).mock.calls).toHaveLength( firstCallCount + 1, ); }); diff --git a/packages/kernel-browser-runtime/src/PlatformServicesServer.ts b/packages/kernel-browser-runtime/src/PlatformServicesServer.ts index c43b5ae86..75bb13f93 100644 --- a/packages/kernel-browser-runtime/src/PlatformServicesServer.ts +++ b/packages/kernel-browser-runtime/src/PlatformServicesServer.ts @@ -13,7 +13,7 @@ import type { StopRemoteComms, RemoteCommsOptions, } from '@metamask/ocap-kernel'; -import { initNetwork } from '@metamask/ocap-kernel'; +import { initTransport } from '@metamask/ocap-kernel'; import { kernelRemoteMethodSpecs, platformServicesHandlers, @@ -288,7 +288,7 @@ export class PlatformServicesServer { closeConnection, registerLocationHints, reconnectPeer, - } = await initNetwork( + } = await initTransport( keySeed, options, this.#handleRemoteMessage.bind(this), diff --git a/packages/nodejs/src/kernel/PlatformServices.test.ts b/packages/nodejs/src/kernel/PlatformServices.test.ts index 56bdecf93..0dce6ab9b 100644 --- a/packages/nodejs/src/kernel/PlatformServices.test.ts +++ b/packages/nodejs/src/kernel/PlatformServices.test.ts @@ -79,7 +79,7 @@ vi.mock('@metamask/ocap-kernel', async (importOriginal) => { const actual = await importOriginal(); return { ...actual, - initNetwork: vi.fn(async () => ({ + initTransport: vi.fn(async () => ({ sendRemoteMessage: mockSendRemoteMessage, stop: mockStop, closeConnection: mockCloseConnection, @@ -245,8 +245,8 @@ describe('NodejsPlatformServices', () => { await service.initializeRemoteComms(keySeed, { relays }, remoteHandler); - const { initNetwork } = await import('@metamask/ocap-kernel'); - expect(initNetwork).toHaveBeenCalledWith( + const { initTransport } = await import('@metamask/ocap-kernel'); + expect(initTransport).toHaveBeenCalledWith( keySeed, { relays }, expect.any(Function), @@ -266,8 +266,8 @@ describe('NodejsPlatformServices', () => { await service.initializeRemoteComms(keySeed, options, remoteHandler); - const { initNetwork } = await import('@metamask/ocap-kernel'); - expect(initNetwork).toHaveBeenCalledWith( + const { initTransport } = await import('@metamask/ocap-kernel'); + expect(initTransport).toHaveBeenCalledWith( keySeed, options, expect.any(Function), @@ -289,8 +289,8 @@ describe('NodejsPlatformServices', () => { giveUpHandler, ); - const { initNetwork } = await import('@metamask/ocap-kernel'); - expect(initNetwork).toHaveBeenCalledWith( + const { initTransport } = await import('@metamask/ocap-kernel'); + expect(initTransport).toHaveBeenCalledWith( keySeed, { relays }, expect.any(Function), @@ -384,11 +384,11 @@ describe('NodejsPlatformServices', () => { // Initialize await service.initializeRemoteComms(keySeed, { relays }, remoteHandler); - const { initNetwork } = await import('@metamask/ocap-kernel'); - const initNetworkMock = initNetwork as unknown as ReturnType< + const { initTransport } = await import('@metamask/ocap-kernel'); + const initTransportMock = initTransport as unknown as ReturnType< typeof vi.fn >; - const firstCallCount = initNetworkMock.mock.calls.length; + const firstCallCount = initTransportMock.mock.calls.length; // Stop await service.stopRemoteComms(); @@ -397,8 +397,8 @@ describe('NodejsPlatformServices', () => { // Re-initialize should work await service.initializeRemoteComms(keySeed, { relays }, remoteHandler); - // Should have called initNetwork again - expect(initNetworkMock.mock.calls).toHaveLength(firstCallCount + 1); + // Should have called initTransport again + expect(initTransportMock.mock.calls).toHaveLength(firstCallCount + 1); }); it('clears internal state after stop', async () => { diff --git a/packages/nodejs/src/kernel/PlatformServices.ts b/packages/nodejs/src/kernel/PlatformServices.ts index cb83d9b54..745cc416e 100644 --- a/packages/nodejs/src/kernel/PlatformServices.ts +++ b/packages/nodejs/src/kernel/PlatformServices.ts @@ -10,7 +10,7 @@ import type { StopRemoteComms, RemoteCommsOptions, } from '@metamask/ocap-kernel'; -import { initNetwork } from '@metamask/ocap-kernel'; +import { initTransport } from '@metamask/ocap-kernel'; import { NodeWorkerDuplexStream } from '@metamask/streams'; import type { DuplexStream } from '@metamask/streams'; import { strict as assert } from 'node:assert'; @@ -246,7 +246,7 @@ export class NodejsPlatformServices implements PlatformServices { closeConnection, registerLocationHints, reconnectPeer, - } = await initNetwork( + } = await initTransport( keySeed, options, this.#handleRemoteMessage.bind(this), diff --git a/packages/ocap-kernel/src/Kernel.test.ts b/packages/ocap-kernel/src/Kernel.test.ts index c3588ec9c..a4628d4fc 100644 --- a/packages/ocap-kernel/src/Kernel.test.ts +++ b/packages/ocap-kernel/src/Kernel.test.ts @@ -62,7 +62,7 @@ vi.mock('./KernelQueue.ts', () => { return { KernelQueue: mocks.KernelQueue }; }); -vi.mock('./remotes/RemoteManager.ts', () => { +vi.mock('./remotes/kernel/RemoteManager.ts', () => { return { RemoteManager: mocks.RemoteManager }; }); diff --git a/packages/ocap-kernel/src/Kernel.ts b/packages/ocap-kernel/src/Kernel.ts index 26499e2a8..fac3bbac3 100644 --- a/packages/ocap-kernel/src/Kernel.ts +++ b/packages/ocap-kernel/src/Kernel.ts @@ -6,8 +6,8 @@ import { KernelQueue } from './KernelQueue.ts'; import { KernelRouter } from './KernelRouter.ts'; import { KernelServiceManager } from './KernelServiceManager.ts'; import type { KernelService } from './KernelServiceManager.ts'; -import { OcapURLManager } from './remotes/OcapURLManager.ts'; -import { RemoteManager } from './remotes/RemoteManager.ts'; +import { OcapURLManager } from './remotes/kernel/OcapURLManager.ts'; +import { RemoteManager } from './remotes/kernel/RemoteManager.ts'; import type { RemoteCommsOptions } from './remotes/types.ts'; import type { PingVatResult } from './rpc/index.ts'; import { makeKernelStore } from './store/index.ts'; diff --git a/packages/ocap-kernel/src/index.test.ts b/packages/ocap-kernel/src/index.test.ts index 0d056bbf2..c7d68c1f4 100644 --- a/packages/ocap-kernel/src/index.test.ts +++ b/packages/ocap-kernel/src/index.test.ts @@ -14,7 +14,7 @@ describe('index', () => { 'VatHandle', 'VatIdStruct', 'VatSupervisor', - 'initNetwork', + 'initTransport', 'isVatConfig', 'isVatId', 'krefOf', diff --git a/packages/ocap-kernel/src/index.ts b/packages/ocap-kernel/src/index.ts index ba265c7fd..8ae0b5ae4 100644 --- a/packages/ocap-kernel/src/index.ts +++ b/packages/ocap-kernel/src/index.ts @@ -1,7 +1,7 @@ export { Kernel } from './Kernel.ts'; export { VatHandle } from './vats/VatHandle.ts'; export { VatSupervisor } from './vats/VatSupervisor.ts'; -export { initNetwork } from './remotes/network.ts'; +export { initTransport } from './remotes/platform/transport.ts'; export type { ClusterConfig, KRef, @@ -19,7 +19,7 @@ export type { StopRemoteComms, RemoteCommsOptions, } from './remotes/types.ts'; -export type { RemoteMessageBase } from './remotes/RemoteHandle.ts'; +export type { RemoteMessageBase } from './remotes/kernel/RemoteHandle.ts'; export { isVatId, VatIdStruct, diff --git a/packages/ocap-kernel/src/remotes/OcapURLManager.test.ts b/packages/ocap-kernel/src/remotes/kernel/OcapURLManager.test.ts similarity index 97% rename from packages/ocap-kernel/src/remotes/OcapURLManager.test.ts rename to packages/ocap-kernel/src/remotes/kernel/OcapURLManager.test.ts index cbf3f9034..3d29ec6fc 100644 --- a/packages/ocap-kernel/src/remotes/OcapURLManager.test.ts +++ b/packages/ocap-kernel/src/remotes/kernel/OcapURLManager.test.ts @@ -4,10 +4,10 @@ import type { Mock } from 'vitest'; import { OcapURLManager } from './OcapURLManager.ts'; import type { RemoteHandle } from './RemoteHandle.ts'; import type { RemoteManager } from './RemoteManager.ts'; -import type { RemoteComms } from './types.ts'; -import { createMockRemotesFactory } from '../../test/remotes-mocks.ts'; -import type { SlotValue } from '../liveslots/kernel-marshal.ts'; -import { kslot } from '../liveslots/kernel-marshal.ts'; +import { createMockRemotesFactory } from '../../../test/remotes-mocks.ts'; +import type { SlotValue } from '../../liveslots/kernel-marshal.ts'; +import { kslot } from '../../liveslots/kernel-marshal.ts'; +import type { RemoteComms } from '../types.ts'; type RedeemService = { redeem: (url: string) => Promise; diff --git a/packages/ocap-kernel/src/remotes/OcapURLManager.ts b/packages/ocap-kernel/src/remotes/kernel/OcapURLManager.ts similarity index 95% rename from packages/ocap-kernel/src/remotes/OcapURLManager.ts rename to packages/ocap-kernel/src/remotes/kernel/OcapURLManager.ts index ab55f2813..cd7901989 100644 --- a/packages/ocap-kernel/src/remotes/OcapURLManager.ts +++ b/packages/ocap-kernel/src/remotes/kernel/OcapURLManager.ts @@ -1,10 +1,10 @@ import { Far } from '@endo/marshal'; -import { kslot, krefOf } from '../liveslots/kernel-marshal.ts'; -import type { SlotValue } from '../liveslots/kernel-marshal.ts'; -import type { KRef } from '../types.ts'; import { parseOcapURL } from './remote-comms.ts'; import type { RemoteManager } from './RemoteManager.ts'; +import { kslot, krefOf } from '../../liveslots/kernel-marshal.ts'; +import type { SlotValue } from '../../liveslots/kernel-marshal.ts'; +import type { KRef } from '../../types.ts'; type OcapURLManagerConstructorProps = { remoteManager: RemoteManager; diff --git a/packages/ocap-kernel/src/remotes/RemoteHandle.test.ts b/packages/ocap-kernel/src/remotes/kernel/RemoteHandle.test.ts similarity index 98% rename from packages/ocap-kernel/src/remotes/RemoteHandle.test.ts rename to packages/ocap-kernel/src/remotes/kernel/RemoteHandle.test.ts index ce128bbfa..e4f7d4753 100644 --- a/packages/ocap-kernel/src/remotes/RemoteHandle.test.ts +++ b/packages/ocap-kernel/src/remotes/kernel/RemoteHandle.test.ts @@ -3,13 +3,13 @@ import type { Logger } from '@metamask/logger'; import { makeAbortSignalMock } from '@ocap/repo-tools/test-utils'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import type { KernelQueue } from '../KernelQueue.ts'; import { RemoteHandle } from './RemoteHandle.ts'; -import { createMockRemotesFactory } from '../../test/remotes-mocks.ts'; -import type { KernelStore } from '../store/index.ts'; -import { parseRef } from '../store/utils/parse-ref.ts'; -import type { Message, RRef } from '../types.ts'; -import type { RemoteComms } from './types.ts'; +import { createMockRemotesFactory } from '../../../test/remotes-mocks.ts'; +import type { KernelQueue } from '../../KernelQueue.ts'; +import type { KernelStore } from '../../store/index.ts'; +import { parseRef } from '../../store/utils/parse-ref.ts'; +import type { Message, RRef } from '../../types.ts'; +import type { RemoteComms } from '../types.ts'; let mockKernelStore: KernelStore; let mockRemoteComms: RemoteComms; diff --git a/packages/ocap-kernel/src/remotes/RemoteHandle.ts b/packages/ocap-kernel/src/remotes/kernel/RemoteHandle.ts similarity index 99% rename from packages/ocap-kernel/src/remotes/RemoteHandle.ts rename to packages/ocap-kernel/src/remotes/kernel/RemoteHandle.ts index 338b6ec52..078d97a58 100644 --- a/packages/ocap-kernel/src/remotes/RemoteHandle.ts +++ b/packages/ocap-kernel/src/remotes/kernel/RemoteHandle.ts @@ -7,17 +7,17 @@ import { performDropImports, performRetireImports, performExportCleanup, -} from '../garbage-collection/gc-handlers.ts'; -import type { KernelQueue } from '../KernelQueue.ts'; -import type { KernelStore } from '../store/index.ts'; +} from '../../garbage-collection/gc-handlers.ts'; +import type { KernelQueue } from '../../KernelQueue.ts'; +import type { KernelStore } from '../../store/index.ts'; import type { RemoteId, ERef, EndpointHandle, Message, CrankResults, -} from '../types.ts'; -import type { RemoteComms } from './types.ts'; +} from '../../types.ts'; +import type { RemoteComms } from '../types.ts'; /** How long to wait for ACK before retransmitting (ms). */ const ACK_TIMEOUT_MS = 10_000; diff --git a/packages/ocap-kernel/src/remotes/RemoteManager.test.ts b/packages/ocap-kernel/src/remotes/kernel/RemoteManager.test.ts similarity index 98% rename from packages/ocap-kernel/src/remotes/RemoteManager.test.ts rename to packages/ocap-kernel/src/remotes/kernel/RemoteManager.test.ts index ebc7cbda6..32e1a91e8 100644 --- a/packages/ocap-kernel/src/remotes/RemoteManager.test.ts +++ b/packages/ocap-kernel/src/remotes/kernel/RemoteManager.test.ts @@ -1,14 +1,14 @@ import { Logger } from '@metamask/logger'; import { describe, it, expect, beforeEach, vi } from 'vitest'; -import { makeMapKernelDatabase } from '../../test/storage.ts'; -import type { KernelQueue } from '../KernelQueue.ts'; import * as remoteComms from './remote-comms.ts'; -import type { RemoteComms } from './types.ts'; -import { makeKernelStore } from '../store/index.ts'; -import type { PlatformServices } from '../types.ts'; import { RemoteManager } from './RemoteManager.ts'; -import { createMockRemotesFactory } from '../../test/remotes-mocks.ts'; +import { createMockRemotesFactory } from '../../../test/remotes-mocks.ts'; +import { makeMapKernelDatabase } from '../../../test/storage.ts'; +import type { KernelQueue } from '../../KernelQueue.ts'; +import { makeKernelStore } from '../../store/index.ts'; +import type { PlatformServices } from '../../types.ts'; +import type { RemoteComms } from '../types.ts'; vi.mock('./remote-comms.ts', async () => { const actual = await vi.importActual('./remote-comms.ts'); diff --git a/packages/ocap-kernel/src/remotes/RemoteManager.ts b/packages/ocap-kernel/src/remotes/kernel/RemoteManager.ts similarity index 97% rename from packages/ocap-kernel/src/remotes/RemoteManager.ts rename to packages/ocap-kernel/src/remotes/kernel/RemoteManager.ts index 48ac7f7ed..9182653e8 100644 --- a/packages/ocap-kernel/src/remotes/RemoteManager.ts +++ b/packages/ocap-kernel/src/remotes/kernel/RemoteManager.ts @@ -1,17 +1,17 @@ import type { Logger } from '@metamask/logger'; -import type { KernelQueue } from '../KernelQueue.ts'; -import { kser } from '../liveslots/kernel-marshal.ts'; -import type { PlatformServices, RemoteId } from '../types.ts'; import { initRemoteComms } from './remote-comms.ts'; import { RemoteHandle } from './RemoteHandle.ts'; +import type { KernelQueue } from '../../KernelQueue.ts'; +import { kser } from '../../liveslots/kernel-marshal.ts'; +import type { KernelStore } from '../../store/index.ts'; +import type { PlatformServices, RemoteId } from '../../types.ts'; import type { RemoteComms, RemoteMessageHandler, RemoteInfo, RemoteCommsOptions, -} from './types.ts'; -import type { KernelStore } from '../store/index.ts'; +} from '../types.ts'; type RemoteManagerConstructorProps = { platformServices: PlatformServices; diff --git a/packages/ocap-kernel/src/remotes/remote-comms.test.ts b/packages/ocap-kernel/src/remotes/kernel/remote-comms.test.ts similarity index 98% rename from packages/ocap-kernel/src/remotes/remote-comms.test.ts rename to packages/ocap-kernel/src/remotes/kernel/remote-comms.test.ts index 7b1f523aa..79edf6b78 100644 --- a/packages/ocap-kernel/src/remotes/remote-comms.test.ts +++ b/packages/ocap-kernel/src/remotes/kernel/remote-comms.test.ts @@ -9,10 +9,10 @@ import { parseOcapURL, getKnownRelays, } from './remote-comms.ts'; -import { createMockRemotesFactory } from '../../test/remotes-mocks.ts'; -import type { KernelStore } from '../store/index.ts'; -import type { PlatformServices } from '../types.ts'; -import type { RemoteMessageHandler } from './types.ts'; +import { createMockRemotesFactory } from '../../../test/remotes-mocks.ts'; +import type { KernelStore } from '../../store/index.ts'; +import type { PlatformServices } from '../../types.ts'; +import type { RemoteMessageHandler } from '../types.ts'; describe('remote-comms', () => { let mockKernelStore: KernelStore; diff --git a/packages/ocap-kernel/src/remotes/remote-comms.ts b/packages/ocap-kernel/src/remotes/kernel/remote-comms.ts similarity index 98% rename from packages/ocap-kernel/src/remotes/remote-comms.ts rename to packages/ocap-kernel/src/remotes/kernel/remote-comms.ts index 4a10327d1..380ac4695 100644 --- a/packages/ocap-kernel/src/remotes/remote-comms.ts +++ b/packages/ocap-kernel/src/remotes/kernel/remote-comms.ts @@ -6,14 +6,14 @@ import { toHex, fromHex } from '@metamask/kernel-utils'; import type { Logger } from '@metamask/logger'; import { base58btc } from 'multiformats/bases/base58'; -import type { KernelStore } from '../store/index.ts'; -import type { PlatformServices } from '../types.ts'; +import type { KernelStore } from '../../store/index.ts'; +import type { PlatformServices } from '../../types.ts'; import type { RemoteComms, RemoteMessageHandler, OnRemoteGiveUp, RemoteCommsOptions, -} from './types.ts'; +} from '../types.ts'; export type OcapURLParts = { oid: string; diff --git a/packages/ocap-kernel/src/remotes/ConnectionFactory.test.ts b/packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts similarity index 98% rename from packages/ocap-kernel/src/remotes/ConnectionFactory.test.ts rename to packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts index fe9bb320a..054e0e6a2 100644 --- a/packages/ocap-kernel/src/remotes/ConnectionFactory.test.ts +++ b/packages/ocap-kernel/src/remotes/platform/connection-factory.test.ts @@ -2,7 +2,7 @@ import { MuxerClosedError } from '@libp2p/interface'; import { AbortError } from '@metamask/kernel-errors'; import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'; -import type { Channel } from './types.ts'; +import type { Channel } from '../types.ts'; // Mock heavy/libp2p related deps with minimal shims we can assert against. @@ -133,7 +133,7 @@ vi.mock('libp2p', () => ({ describe('ConnectionFactory', () => { let factory: Awaited< - ReturnType + ReturnType >; const keySeed = '0x1234567890abcdef'; const knownRelays = [ @@ -203,10 +203,12 @@ describe('ConnectionFactory', () => { maxRetryAttempts?: number, ): Promise< Awaited< - ReturnType + ReturnType< + typeof import('./connection-factory.ts').ConnectionFactory.make + > > > { - const { ConnectionFactory } = await import('./ConnectionFactory.ts'); + const { ConnectionFactory } = await import('./connection-factory.ts'); const { Logger } = await import('@metamask/logger'); return ConnectionFactory.make( keySeed, @@ -694,7 +696,7 @@ describe('ConnectionFactory', () => { // Re-import ConnectionFactory to use the new mock vi.resetModules(); - const { ConnectionFactory } = await import('./ConnectionFactory.ts'); + const { ConnectionFactory } = await import('./connection-factory.ts'); const { Logger } = await import('@metamask/logger'); factory = await ConnectionFactory.make( keySeed, @@ -742,7 +744,7 @@ describe('ConnectionFactory', () => { // Re-import ConnectionFactory to use the new mock vi.resetModules(); - const { ConnectionFactory } = await import('./ConnectionFactory.ts'); + const { ConnectionFactory } = await import('./connection-factory.ts'); const { Logger } = await import('@metamask/logger'); factory = await ConnectionFactory.make( keySeed, @@ -793,7 +795,7 @@ describe('ConnectionFactory', () => { // Re-import ConnectionFactory to use the new mock vi.resetModules(); - const { ConnectionFactory } = await import('./ConnectionFactory.ts'); + const { ConnectionFactory } = await import('./connection-factory.ts'); const { Logger } = await import('@metamask/logger'); factory = await ConnectionFactory.make( keySeed, diff --git a/packages/ocap-kernel/src/remotes/ConnectionFactory.ts b/packages/ocap-kernel/src/remotes/platform/connection-factory.ts similarity index 99% rename from packages/ocap-kernel/src/remotes/ConnectionFactory.ts rename to packages/ocap-kernel/src/remotes/platform/connection-factory.ts index f04aa5d22..796196ac7 100644 --- a/packages/ocap-kernel/src/remotes/ConnectionFactory.ts +++ b/packages/ocap-kernel/src/remotes/platform/connection-factory.ts @@ -17,7 +17,7 @@ import { multiaddr } from '@multiformats/multiaddr'; import { byteStream } from 'it-byte-stream'; import { createLibp2p } from 'libp2p'; -import type { Channel, InboundConnectionHandler } from './types.ts'; +import type { Channel, InboundConnectionHandler } from '../types.ts'; /** * Connection factory for libp2p network operations. diff --git a/packages/ocap-kernel/src/remotes/ReconnectionManager.test.ts b/packages/ocap-kernel/src/remotes/platform/reconnection.test.ts similarity index 99% rename from packages/ocap-kernel/src/remotes/ReconnectionManager.test.ts rename to packages/ocap-kernel/src/remotes/platform/reconnection.test.ts index df216eb94..c4469e182 100644 --- a/packages/ocap-kernel/src/remotes/ReconnectionManager.test.ts +++ b/packages/ocap-kernel/src/remotes/platform/reconnection.test.ts @@ -1,7 +1,7 @@ import * as kernelUtils from '@metamask/kernel-utils'; import { describe, it, expect, beforeEach, vi } from 'vitest'; -import { ReconnectionManager } from './ReconnectionManager.ts'; +import { ReconnectionManager } from './reconnection.ts'; // Mock the calculateReconnectionBackoff function vi.mock('@metamask/kernel-utils', async () => { diff --git a/packages/ocap-kernel/src/remotes/ReconnectionManager.ts b/packages/ocap-kernel/src/remotes/platform/reconnection.ts similarity index 100% rename from packages/ocap-kernel/src/remotes/ReconnectionManager.ts rename to packages/ocap-kernel/src/remotes/platform/reconnection.ts diff --git a/packages/ocap-kernel/src/remotes/network.test.ts b/packages/ocap-kernel/src/remotes/platform/transport.test.ts similarity index 92% rename from packages/ocap-kernel/src/remotes/network.test.ts rename to packages/ocap-kernel/src/remotes/platform/transport.test.ts index b940a6f01..8924cfeb9 100644 --- a/packages/ocap-kernel/src/remotes/network.test.ts +++ b/packages/ocap-kernel/src/remotes/platform/transport.test.ts @@ -11,49 +11,7 @@ import { } from 'vitest'; // Import the module we're testing - must be after mocks are set up -let initNetwork: typeof import('./network.ts').initNetwork; - -// Mock MessageQueue - must behave like a real queue for tests to work -const mockMessageQueues = new Map(); - -vi.mock('./MessageQueue.ts', () => { - class MockMessageQueue { - readonly #instanceQueue: unknown[] = []; - - constructor(_maxCapacity?: number) { - // Store instance queue for inspection - mockMessageQueues.set(this, this.#instanceQueue); - } - - enqueue(pending: unknown): boolean { - this.#instanceQueue.push(pending); - return true; - } - - dequeue(): unknown | undefined { - return this.#instanceQueue.shift(); - } - - peekFirst(): unknown | undefined { - return this.#instanceQueue[0]; - } - - clear(): void { - this.#instanceQueue.length = 0; - } - - get length(): number { - return this.#instanceQueue.length; - } - - get messages(): readonly unknown[] { - return this.#instanceQueue; - } - } - return { - MessageQueue: MockMessageQueue, - }; -}); +let initTransport: typeof import('./transport.ts').initTransport; // Mock ReconnectionManager const mockReconnectionManager = { @@ -69,7 +27,7 @@ const mockReconnectionManager = { clearPeer: vi.fn(), }; -vi.mock('./ReconnectionManager.ts', () => { +vi.mock('./reconnection.ts', () => { class MockReconnectionManager { isReconnecting = mockReconnectionManager.isReconnecting; @@ -112,7 +70,7 @@ const mockConnectionFactory = { closeChannel: vi.fn().mockResolvedValue(undefined), }; -vi.mock('./ConnectionFactory.ts', () => { +vi.mock('./connection-factory.ts', () => { return { ConnectionFactory: { make: vi.fn(async () => Promise.resolve(mockConnectionFactory)), @@ -190,11 +148,11 @@ function makeTestMessage(content: string): string { }); } -describe('network.initNetwork', () => { +describe('transport.initTransport', () => { // Import after all mocks are set up beforeAll(async () => { - const networkModule = await import('./network.ts'); - initNetwork = networkModule.initNetwork; + const networkModule = await import('./transport.ts'); + initTransport = networkModule.initTransport; }); beforeEach(() => { @@ -253,14 +211,14 @@ describe('network.initNetwork', () => { describe('initialization', () => { it('passes correct parameters to ConnectionFactory.make', async () => { - const { ConnectionFactory } = await import('./ConnectionFactory.ts'); + const { ConnectionFactory } = await import('./connection-factory.ts'); const keySeed = '0xabcd'; const knownRelays = [ '/dns4/relay1.example/tcp/443/wss/p2p/relay1', '/dns4/relay2.example/tcp/443/wss/p2p/relay2', ]; - await initNetwork(keySeed, { relays: knownRelays }, vi.fn()); + await initTransport(keySeed, { relays: knownRelays }, vi.fn()); expect(ConnectionFactory.make).toHaveBeenCalledWith( keySeed, @@ -272,11 +230,11 @@ describe('network.initNetwork', () => { }); it('passes maxRetryAttempts to ConnectionFactory.make', async () => { - const { ConnectionFactory } = await import('./ConnectionFactory.ts'); + const { ConnectionFactory } = await import('./connection-factory.ts'); const keySeed = '0xabcd'; const maxRetryAttempts = 5; - await initNetwork(keySeed, { relays: [], maxRetryAttempts }, vi.fn()); + await initTransport(keySeed, { relays: [], maxRetryAttempts }, vi.fn()); expect(ConnectionFactory.make).toHaveBeenCalledWith( keySeed, @@ -288,7 +246,7 @@ describe('network.initNetwork', () => { }); it('returns sendRemoteMessage, stop, closeConnection, registerLocationHints, and reconnectPeer', async () => { - const result = await initNetwork('0x1234', {}, vi.fn()); + const result = await initTransport('0x1234', {}, vi.fn()); expect(result).toHaveProperty('sendRemoteMessage'); expect(result).toHaveProperty('stop'); @@ -308,7 +266,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork( + const { sendRemoteMessage } = await initTransport( '0x1234', { relays: ['/dns4/relay.example/tcp/443/wss/p2p/relay1'], @@ -332,7 +290,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Send first message await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -355,7 +313,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel1) .mockResolvedValueOnce(mockChannel2); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); await sendRemoteMessage('peer-1', makeTestMessage('hello')); await sendRemoteMessage('peer-2', makeTestMessage('world')); @@ -368,7 +326,7 @@ describe('network.initNetwork', () => { mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); const hints = ['/dns4/hint.example/tcp/443/wss/p2p/hint']; - const { sendRemoteMessage, registerLocationHints } = await initNetwork( + const { sendRemoteMessage, registerLocationHints } = await initTransport( '0x1234', {}, vi.fn(), @@ -387,7 +345,7 @@ describe('network.initNetwork', () => { describe('inbound connections', () => { it('registers inbound connection handler', async () => { - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); expect(mockConnectionFactory.onInboundConnection).toHaveBeenCalledWith( expect.any(Function), @@ -404,7 +362,7 @@ describe('network.initNetwork', () => { }, ); - await initNetwork('0x1234', {}, remoteHandler); + await initTransport('0x1234', {}, remoteHandler); const mockChannel = createMockChannel('inbound-peer'); const messageBuffer = new TextEncoder().encode('test-message'); @@ -437,7 +395,7 @@ describe('network.initNetwork', () => { }, ); - await initNetwork('0x1234', {}, remoteHandler); + await initTransport('0x1234', {}, remoteHandler); const mockChannel = createMockChannel('inbound-peer'); const messageBuffer = new TextEncoder().encode('test-message'); @@ -472,7 +430,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Send succeeds because dial succeeds await sendRemoteMessage('peer-1', makeTestMessage('msg')); @@ -491,7 +449,7 @@ describe('network.initNetwork', () => { ); // Second write fails mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // First send establishes channel await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -515,7 +473,7 @@ describe('network.initNetwork', () => { }, ); - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); const mockChannel = createMockChannel('peer-1'); mockChannel.msgStream.read.mockRejectedValue(new Error('Read failed')); @@ -537,7 +495,7 @@ describe('network.initNetwork', () => { }, ); - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); const mockChannel = createMockChannel('peer-1'); const gracefulDisconnectError = Object.assign(new Error('SCTP failure'), { @@ -569,7 +527,7 @@ describe('network.initNetwork', () => { }, ); - const { stop } = await initNetwork('0x1234', {}, vi.fn()); + const { stop } = await initTransport('0x1234', {}, vi.fn()); const mockChannel = createMockChannel('peer-1'); // Make read resolve after stop so loop continues and checks signal.aborted @@ -616,7 +574,7 @@ describe('network.initNetwork', () => { ); const remoteHandler = vi.fn().mockResolvedValue('ok'); - await initNetwork('0x1234', {}, remoteHandler); + await initTransport('0x1234', {}, remoteHandler); const mockChannel = createMockChannel('peer-1'); // First read returns undefined, which means stream ended - loop should break @@ -664,7 +622,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel) // Initial connection .mockResolvedValueOnce(mockChannel); // Reconnection succeeds - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // First send establishes channel await sendRemoteMessage('peer-1', makeTestMessage('initial-msg')); @@ -695,7 +653,7 @@ describe('network.initNetwork', () => { mockChannel.msgStream.write.mockResolvedValue(undefined); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Clear any resetBackoff calls from initialization mockReconnectionManager.resetBackoff.mockClear(); @@ -715,13 +673,13 @@ describe('network.initNetwork', () => { describe('stop functionality', () => { it('returns a stop function', async () => { - const { stop } = await initNetwork('0x1234', {}, vi.fn()); + const { stop } = await initTransport('0x1234', {}, vi.fn()); expect(typeof stop).toBe('function'); }); it('cleans up resources on stop', async () => { - const { stop } = await initNetwork('0x1234', {}, vi.fn()); + const { stop } = await initTransport('0x1234', {}, vi.fn()); await stop(); @@ -730,7 +688,7 @@ describe('network.initNetwork', () => { }); it('does not send messages after stop', async () => { - const { sendRemoteMessage, stop } = await initNetwork( + const { sendRemoteMessage, stop } = await initTransport( '0x1234', {}, vi.fn(), @@ -772,7 +730,7 @@ describe('network.initNetwork', () => { ); // Subsequent writes fail mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage, stop } = await initNetwork( + const { sendRemoteMessage, stop } = await initTransport( '0x1234', {}, vi.fn(), @@ -797,7 +755,7 @@ describe('network.initNetwork', () => { }); it('can be called multiple times safely', async () => { - const { stop } = await initNetwork('0x1234', {}, vi.fn()); + const { stop } = await initTransport('0x1234', {}, vi.fn()); // Multiple calls should not throw await stop(); @@ -812,7 +770,7 @@ describe('network.initNetwork', () => { describe('closeConnection', () => { it('returns a closeConnection function', async () => { - const { closeConnection } = await initNetwork('0x1234', {}, vi.fn()); + const { closeConnection } = await initTransport('0x1234', {}, vi.fn()); expect(typeof closeConnection).toBe('function'); }); @@ -821,7 +779,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage, closeConnection } = await initNetwork( + const { sendRemoteMessage, closeConnection } = await initTransport( '0x1234', {}, vi.fn(), @@ -843,7 +801,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage, closeConnection } = await initNetwork( + const { sendRemoteMessage, closeConnection } = await initTransport( '0x1234', {}, vi.fn(), @@ -866,7 +824,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage, closeConnection } = await initNetwork( + const { sendRemoteMessage, closeConnection } = await initTransport( '0x1234', {}, vi.fn(), @@ -891,7 +849,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage, closeConnection } = await initNetwork( + const { sendRemoteMessage, closeConnection } = await initTransport( '0x1234', {}, vi.fn(), @@ -920,7 +878,7 @@ describe('network.initNetwork', () => { }, ); - const { closeConnection } = await initNetwork('0x1234', {}, vi.fn()); + const { closeConnection } = await initTransport('0x1234', {}, vi.fn()); // Close connection first await closeConnection('peer-1'); @@ -942,7 +900,7 @@ describe('network.initNetwork', () => { describe('registerLocationHints', () => { it('returns a registerLocationHints function', async () => { - const { registerLocationHints } = await initNetwork( + const { registerLocationHints } = await initTransport( '0x1234', {}, vi.fn(), @@ -954,7 +912,7 @@ describe('network.initNetwork', () => { describe('reconnectPeer', () => { it('returns a reconnectPeer function', async () => { - const { reconnectPeer } = await initNetwork('0x1234', {}, vi.fn()); + const { reconnectPeer } = await initTransport('0x1234', {}, vi.fn()); expect(typeof reconnectPeer).toBe('function'); }); @@ -964,7 +922,7 @@ describe('network.initNetwork', () => { mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); const { sendRemoteMessage, closeConnection, reconnectPeer } = - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); // Establish and close connection await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1006,7 +964,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { closeConnection, reconnectPeer } = await initNetwork( + const { closeConnection, reconnectPeer } = await initTransport( '0x1234', {}, vi.fn(), @@ -1054,7 +1012,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { closeConnection, reconnectPeer } = await initNetwork( + const { closeConnection, reconnectPeer } = await initTransport( '0x1234', {}, vi.fn(), @@ -1077,7 +1035,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { closeConnection, reconnectPeer } = await initNetwork( + const { closeConnection, reconnectPeer } = await initTransport( '0x1234', {}, vi.fn(), @@ -1099,7 +1057,7 @@ describe('network.initNetwork', () => { mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); const { sendRemoteMessage, closeConnection, reconnectPeer } = - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); // Establish, close, and reconnect await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1132,7 +1090,7 @@ describe('network.initNetwork', () => { }, ); - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); expect(installWakeDetector).toHaveBeenCalled(); @@ -1149,7 +1107,7 @@ describe('network.initNetwork', () => { cleanupFn, ); - const { stop } = await initNetwork('0x1234', {}, vi.fn()); + const { stop } = await initTransport('0x1234', {}, vi.fn()); await stop(); @@ -1171,7 +1129,7 @@ describe('network.initNetwork', () => { return mockChannel; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Send message - it should handle the race condition gracefully // Promise resolves when write completes (no ACK needed in network layer) @@ -1231,7 +1189,7 @@ describe('network.initNetwork', () => { return reconChannel; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Trigger first connection loss (this starts reconnection) // Dial fails and throws, but reconnection is started in background @@ -1272,7 +1230,7 @@ describe('network.initNetwork', () => { new Error('Dial failed'), ); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // sendRemoteMessage throws the error after triggering reconnection await expect( @@ -1303,7 +1261,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel) // initial connection .mockRejectedValueOnce(new Error('Permanent failure')); // non-retryable during reconnection - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Establish channel await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1357,7 +1315,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel) // initial connection .mockResolvedValue(mockChannel); // reconnection attempts (dial succeeds, flush fails) - const { sendRemoteMessage, stop } = await initNetwork( + const { sendRemoteMessage, stop } = await initTransport( '0x1234', {}, vi.fn(), @@ -1411,7 +1369,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel) .mockResolvedValue(mockChannel); - const { sendRemoteMessage, stop } = await initNetwork( + const { sendRemoteMessage, stop } = await initTransport( '0x1234', {}, vi.fn(), @@ -1470,7 +1428,7 @@ describe('network.initNetwork', () => { Object.assign(new Error('Connection failed'), { code: 'ECONNRESET' }), ); - const { sendRemoteMessage, stop } = await initNetwork( + const { sendRemoteMessage, stop } = await initTransport( '0x1234', { maxRetryAttempts }, vi.fn(), @@ -1532,7 +1490,7 @@ describe('network.initNetwork', () => { ) .mockRejectedValueOnce(new Error('Non-retryable error')); - const { sendRemoteMessage } = await initNetwork( + const { sendRemoteMessage } = await initTransport( '0x1234', {}, vi.fn(), @@ -1553,7 +1511,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); await sendRemoteMessage('peer-1', makeTestMessage('msg')); @@ -1570,7 +1528,7 @@ describe('network.initNetwork', () => { }, ); - await initNetwork('0x1234', {}, vi.fn()); + await initTransport('0x1234', {}, vi.fn()); const mockChannel = createMockChannel('inbound-peer'); const messageBuffer = new TextEncoder().encode('inbound-msg'); @@ -1616,7 +1574,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel) // initial connection .mockResolvedValueOnce(mockChannel); // reconnection - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Establish channel await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1669,7 +1627,7 @@ describe('network.initNetwork', () => { mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Establish channel await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1689,7 +1647,7 @@ describe('network.initNetwork', () => { describe('message size limits', () => { it('rejects messages exceeding size limit', async () => { const maxMessageSizeBytes = 1000; // 1KB limit for test - const { sendRemoteMessage } = await initNetwork( + const { sendRemoteMessage } = await initTransport( '0x1234', { maxMessageSizeBytes }, vi.fn(), @@ -1712,7 +1670,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork( + const { sendRemoteMessage } = await initTransport( '0x1234', { maxMessageSizeBytes }, vi.fn(), @@ -1729,7 +1687,7 @@ describe('network.initNetwork', () => { }); it('uses default 1MB limit when not specified', async () => { - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Create a message that exceeds 1MB const hugeContent = 'x'.repeat(1024 * 1024 + 100); // > 1MB @@ -1752,7 +1710,7 @@ describe('network.initNetwork', () => { }, ); - const { sendRemoteMessage } = await initNetwork( + const { sendRemoteMessage } = await initTransport( '0x1234', { maxConcurrentConnections }, vi.fn(), @@ -1786,7 +1744,7 @@ describe('network.initNetwork', () => { }, ); - const { sendRemoteMessage, closeConnection } = await initNetwork( + const { sendRemoteMessage, closeConnection } = await initTransport( '0x1234', { maxConcurrentConnections }, vi.fn(), @@ -1819,7 +1777,7 @@ describe('network.initNetwork', () => { }, ); - const { sendRemoteMessage } = await initNetwork( + const { sendRemoteMessage } = await initTransport( '0x1234', { maxConcurrentConnections }, vi.fn(), @@ -1848,7 +1806,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Should be able to send (well under 100 connections) await sendRemoteMessage('peer-1', makeTestMessage('msg')); @@ -1861,7 +1819,7 @@ describe('network.initNetwork', () => { const setIntervalSpy = vi.spyOn(globalThis, 'setInterval'); const cleanupIntervalMs = 5000; - const { stop } = await initNetwork( + const { stop } = await initTransport( '0x1234', { cleanupIntervalMs }, vi.fn(), @@ -1879,7 +1837,7 @@ describe('network.initNetwork', () => { it('clears cleanup interval on stop', async () => { const clearIntervalSpy = vi.spyOn(globalThis, 'clearInterval'); - const { stop } = await initNetwork( + const { stop } = await initTransport( '0x1234', { cleanupIntervalMs: 5000 }, vi.fn(), @@ -1894,7 +1852,7 @@ describe('network.initNetwork', () => { it('uses default cleanup interval when not specified', async () => { const setIntervalSpy = vi.spyOn(globalThis, 'setInterval'); - const { stop } = await initNetwork('0x1234', {}, vi.fn()); + const { stop } = await initTransport('0x1234', {}, vi.fn()); // Default is 15 minutes (15 * 60 * 1000 = 900000ms) expect(setIntervalSpy).toHaveBeenCalledWith(expect.any(Function), 900000); @@ -1919,7 +1877,7 @@ describe('network.initNetwork', () => { .mockResolvedValueOnce(mockChannel1) .mockResolvedValueOnce(mockChannel2); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Establish first channel via outbound await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1940,7 +1898,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // First send establishes channel await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1971,7 +1929,7 @@ describe('network.initNetwork', () => { return outboundChannel; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); await sendRemoteMessage('peer-1', makeTestMessage('msg1')); @@ -1988,7 +1946,7 @@ describe('network.initNetwork', () => { const mockChannel = createMockChannel('peer-1'); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage, stop } = await initNetwork( + const { sendRemoteMessage, stop } = await initTransport( '0x1234', {}, vi.fn(), @@ -2032,7 +1990,7 @@ describe('network.initNetwork', () => { return mockSignal; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); const sendPromise = sendRemoteMessage( 'peer-1', @@ -2069,7 +2027,7 @@ describe('network.initNetwork', () => { return mockSignal; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // Write resolves immediately, so promise should resolve (not reject) await sendRemoteMessage('peer-1', makeTestMessage('test message')); @@ -2098,7 +2056,7 @@ describe('network.initNetwork', () => { return mockSignal; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); const sendPromise = sendRemoteMessage( 'peer-1', @@ -2130,7 +2088,7 @@ describe('network.initNetwork', () => { mockChannel.msgStream.write.mockRejectedValue(writeError); mockConnectionFactory.dialIdempotent.mockResolvedValue(mockChannel); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); // sendRemoteMessage throws the write error await expect( @@ -2153,7 +2111,7 @@ describe('network.initNetwork', () => { return mockSignal; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); await sendRemoteMessage('peer-1', makeTestMessage('test message')); @@ -2182,7 +2140,7 @@ describe('network.initNetwork', () => { return mockSignal; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); const sendPromise = sendRemoteMessage( 'peer-1', @@ -2226,7 +2184,7 @@ describe('network.initNetwork', () => { return signal; }); - const { sendRemoteMessage } = await initNetwork('0x1234', {}, vi.fn()); + const { sendRemoteMessage } = await initTransport('0x1234', {}, vi.fn()); const sendPromise1 = sendRemoteMessage( 'peer-1', diff --git a/packages/ocap-kernel/src/remotes/network.ts b/packages/ocap-kernel/src/remotes/platform/transport.ts similarity index 99% rename from packages/ocap-kernel/src/remotes/network.ts rename to packages/ocap-kernel/src/remotes/platform/transport.ts index ea627ff42..3a70d7060 100644 --- a/packages/ocap-kernel/src/remotes/network.ts +++ b/packages/ocap-kernel/src/remotes/platform/transport.ts @@ -11,8 +11,8 @@ import { import { Logger } from '@metamask/logger'; import { toString as bufToString, fromString } from 'uint8arrays'; -import { ConnectionFactory } from './ConnectionFactory.ts'; -import { ReconnectionManager } from './ReconnectionManager.ts'; +import { ConnectionFactory } from './connection-factory.ts'; +import { ReconnectionManager } from './reconnection.ts'; import type { RemoteMessageHandler, SendRemoteMessage, @@ -20,7 +20,7 @@ import type { Channel, OnRemoteGiveUp, RemoteCommsOptions, -} from './types.ts'; +} from '../types.ts'; /** Default maximum number of concurrent connections */ const DEFAULT_MAX_CONCURRENT_CONNECTIONS = 100; @@ -51,7 +51,7 @@ const DEFAULT_STALE_PEER_TIMEOUT_MS = 60 * 60 * 1000; * * @returns a function to send messages **and** a `stop()` to cancel/release everything. */ -export async function initNetwork( +export async function initTransport( keySeed: string, options: RemoteCommsOptions, remoteMessageHandler: RemoteMessageHandler, diff --git a/packages/ocap-kernel/test/remotes-mocks.ts b/packages/ocap-kernel/test/remotes-mocks.ts index 23a721471..5f9a067fc 100644 --- a/packages/ocap-kernel/test/remotes-mocks.ts +++ b/packages/ocap-kernel/test/remotes-mocks.ts @@ -3,7 +3,7 @@ import { vi } from 'vitest'; import { makeMapKernelDatabase } from './storage.ts'; import type { KernelQueue } from '../src/KernelQueue.ts'; -import { RemoteHandle } from '../src/remotes/RemoteHandle.ts'; +import { RemoteHandle } from '../src/remotes/kernel/RemoteHandle.ts'; import type { RemoteComms, RemoteMessageHandler,