Skip to content

Commit 74790e7

Browse files
committed
feat: Add message sequencing and acknowledgment to remote messaging
Implements message acknowledgment and retransmission: - Update RemoteCommand type to include seq (sequence number) and ack (piggybacked ACK) fields - Add per-peer sequence tracking that persists across reconnections - Implement data structures with cumulative ACK support - Implement transmission timeout with limited retries - Reject pending promises when giving up on reconnection
1 parent ebdd368 commit 74790e7

18 files changed

Lines changed: 1785 additions & 2158 deletions

packages/kernel-test/src/remote-comms.test.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type {
1111
PlatformServices,
1212
RemoteMessageHandler,
1313
RemoteCommsOptions,
14+
RemoteMessageBase,
1415
} from '@metamask/ocap-kernel';
1516
import { NodejsPlatformServices } from '@ocap/nodejs';
1617
import { describe, it, expect, beforeEach } from 'vitest';
@@ -77,11 +78,13 @@ class DirectNetworkService {
7778
return Promise.resolve();
7879
},
7980

80-
async sendRemoteMessage(to: string, message: string) {
81+
async sendRemoteMessage(to: string, messageBase: RemoteMessageBase) {
8182
const fromPeer = actualPeerId ?? tempPeerId;
8283
// Route message directly to the target peer's handler
8384
const targetHandler = self.peerRegistry.get(to);
8485
if (targetHandler) {
86+
// Stringify the message object for transmission
87+
const message = JSON.stringify(messageBase);
8588
const response = await targetHandler(fromPeer, message);
8689
// If there's a response, send it back
8790
if (response) {
@@ -95,6 +98,15 @@ class DirectNetworkService {
9598
}
9699
},
97100

101+
async handleAck(_peerId: string, _ackSeq: number) {
102+
// Mock implementation - direct network doesn't need ACK handling
103+
return Promise.resolve();
104+
},
105+
106+
updateReceivedSeq(_peerId: string, _seq: number) {
107+
// Mock implementation - direct network doesn't need sequence tracking
108+
},
109+
98110
async initializeRemoteComms(
99111
keySeed: string,
100112
_options: RemoteCommsOptions,

packages/ocap-kernel/src/Kernel.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,10 +1017,11 @@ describe('Kernel', () => {
10171017
mockKernelDatabase,
10181018
);
10191019
const remoteManagerInstance = mocks.RemoteManager.lastInstance;
1020-
await kernel.sendRemoteMessage('peer-123', 'hello');
1020+
const messageBase = { method: 'deliver' as const, params: ['hello'] };
1021+
await kernel.sendRemoteMessage('peer-123', messageBase);
10211022
expect(remoteManagerInstance.sendRemoteMessage).toHaveBeenCalledWith(
10221023
'peer-123',
1023-
'hello',
1024+
messageBase,
10241025
);
10251026
});
10261027
});

packages/ocap-kernel/src/Kernel.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { KernelRouter } from './KernelRouter.ts';
1313
import { KernelServiceManager } from './KernelServiceManager.ts';
1414
import type { KernelService } from './KernelServiceManager.ts';
1515
import { OcapURLManager } from './remotes/OcapURLManager.ts';
16+
import type { RemoteMessageBase } from './remotes/RemoteHandle.ts';
1617
import { RemoteManager } from './remotes/RemoteManager.ts';
1718
import type { RemoteCommsOptions } from './remotes/types.ts';
1819
import { kernelHandlers } from './rpc/index.ts';
@@ -261,11 +262,14 @@ export class Kernel {
261262
* Send a message to a remote kernel.
262263
*
263264
* @param to - The peer ID of the remote kernel.
264-
* @param message - The message to send.
265+
* @param messageBase - The message to send (without seq/ack).
265266
* @returns a promise for the result of the message send.
266267
*/
267-
async sendRemoteMessage(to: string, message: string): Promise<void> {
268-
await this.#remoteManager.sendRemoteMessage(to, message);
268+
async sendRemoteMessage(
269+
to: string,
270+
messageBase: RemoteMessageBase,
271+
): Promise<void> {
272+
await this.#remoteManager.sendRemoteMessage(to, messageBase);
269273
}
270274

271275
/**

packages/ocap-kernel/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export type {
1919
StopRemoteComms,
2020
RemoteCommsOptions,
2121
} from './remotes/types.ts';
22+
export type { RemoteMessageBase } from './remotes/RemoteHandle.ts';
2223
export {
2324
isVatId,
2425
VatIdStruct,

0 commit comments

Comments
 (0)