Skip to content

Commit 5ae8163

Browse files
authored
Merge pull request #894 from MatrixAI/feature-generic-NCM-manifest
parameterized `NodeConnectionManager` client manifest.
2 parents 98e9547 + d9c096e commit 5ae8163

31 files changed

+290
-149
lines changed

src/PolykeyAgent.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type {
99
import type { PolykeyWorkerManager } from './workers/types.js';
1010
import type { TLSConfig } from './network/types.js';
1111
import type { NodeAddress, NodeId, SeedNodes } from './nodes/types.js';
12+
import type { AgentClientManifest } from './nodes/agent/callers/index.js';
1213
import path from 'node:path';
1314
import process from 'process';
1415
import Logger from '@matrixai/logger';
@@ -45,6 +46,7 @@ import * as workersUtils from './workers/utils.js';
4546
import * as clientMiddleware from './client/middleware.js';
4647
import clientServerManifest from './client/handlers/index.js';
4748
import agentServerManifest from './nodes/agent/handlers/index.js';
49+
import manifestClient from './nodes/agent/callers/index.js';
4850

4951
interface PolykeyAgent extends createDestroyStartStop.CreateDestroyStartStop {}
5052
@createDestroyStartStop.CreateDestroyStartStop(
@@ -177,7 +179,9 @@ class PolykeyAgent {
177179
let gestaltGraph: GestaltGraph | undefined;
178180
let identitiesManager: IdentitiesManager | undefined;
179181
let nodeGraph: NodeGraph | undefined;
180-
let nodeConnectionManager: NodeConnectionManager | undefined;
182+
let nodeConnectionManager:
183+
| NodeConnectionManager<AgentClientManifest>
184+
| undefined;
181185
let nodeManager: NodeManager | undefined;
182186
let discovery: Discovery | undefined;
183187
let notificationsManager: NotificationsManager | undefined;
@@ -286,6 +290,7 @@ class PolykeyAgent {
286290
nodeConnectionManager = new NodeConnectionManager({
287291
keyRing,
288292
tlsConfig,
293+
rpcClientManifest: manifestClient,
289294
connectionFindConcurrencyLimit:
290295
optionsDefaulted.nodes.connectionFindConcurrencyLimit,
291296
connectionFindLocalTimeoutTime:
@@ -469,7 +474,7 @@ class PolykeyAgent {
469474
public readonly gestaltGraph: GestaltGraph;
470475
public readonly nodeGraph: NodeGraph;
471476
public readonly taskManager: TaskManager;
472-
public readonly nodeConnectionManager: NodeConnectionManager;
477+
public readonly nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
473478
public readonly nodeManager: NodeManager;
474479
public readonly discovery: Discovery;
475480
public readonly vaultManager: VaultManager;
@@ -540,7 +545,7 @@ class PolykeyAgent {
540545
gestaltGraph: GestaltGraph;
541546
nodeGraph: NodeGraph;
542547
taskManager: TaskManager;
543-
nodeConnectionManager: NodeConnectionManager;
548+
nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
544549
nodeManager: NodeManager;
545550
discovery: Discovery;
546551
vaultManager: VaultManager;

src/audit/Audit.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type { AuditEventId } from '../ids/types.js';
1212
import type NodeConnectionManager from '../nodes/NodeConnectionManager.js';
1313
import type Discovery from '../discovery/Discovery.js';
1414
import type { AbstractEvent } from '@matrixai/events';
15+
import type { AgentClientManifest } from '../nodes/agent/callers/index.js';
1516
import Logger from '@matrixai/logger';
1617
import { IdInternal } from '@matrixai/id';
1718
import { createDestroyStartStop } from '@matrixai/async-init';
@@ -45,7 +46,7 @@ class Audit {
4546
fresh = false,
4647
}: {
4748
db: DB;
48-
nodeConnectionManager: NodeConnectionManager;
49+
nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
4950
discovery: Discovery;
5051
logger?: Logger;
5152
fresh?: boolean;
@@ -59,7 +60,7 @@ class Audit {
5960

6061
protected logger: Logger;
6162
protected db: DB;
62-
protected nodeConnectionManager: NodeConnectionManager;
63+
protected nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
6364
protected discovery: Discovery;
6465

6566
protected eventHandlerMap: Map<
@@ -86,7 +87,7 @@ class Audit {
8687
logger,
8788
}: {
8889
db: DB;
89-
nodeConnectionManager: NodeConnectionManager;
90+
nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
9091
discovery: Discovery;
9192
logger: Logger;
9293
}) {

src/client/handlers/NodesListConnections.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ import type {
66
import type NodeConnectionManager from '../../nodes/NodeConnectionManager.js';
77
import type { ContextTimed } from '@matrixai/contexts';
88
import type { JSONValue } from '@matrixai/rpc';
9+
import type { AgentClientManifest } from '../../nodes/agent/callers/index.js';
910
import { ServerHandler } from '@matrixai/rpc';
1011
import * as nodesUtils from '../../nodes/utils.js';
1112

1213
class NodesListConnections extends ServerHandler<
1314
{
14-
nodeConnectionManager: NodeConnectionManager;
15+
nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
1516
},
1617
ClientRPCRequestParams,
1718
ClientRPCResponseResult<NodeConnectionMessage>
@@ -25,7 +26,7 @@ class NodesListConnections extends ServerHandler<
2526
const {
2627
nodeConnectionManager,
2728
}: {
28-
nodeConnectionManager: NodeConnectionManager;
29+
nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
2930
} = this.container;
3031
const connections = nodeConnectionManager.listConnections();
3132
for (const connection of connections) {

src/client/handlers/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type NodeGraph from '../../nodes/NodeGraph.js';
1515
import type VaultManager from '../../vaults/VaultManager.js';
1616
import type PolykeyAgent from '../../PolykeyAgent.js';
1717
import type { FileSystem } from '../../types.js';
18+
import type { AgentClientManifest } from '../../nodes/agent/callers/index.js';
1819
import AgentLockAll from './AgentLockAll.js';
1920
import AgentStatus from './AgentStatus.js';
2021
import AgentStop from './AgentStop.js';
@@ -108,7 +109,7 @@ const serverManifest = (container: {
108109
audit: Audit;
109110
notificationsManager: NotificationsManager;
110111
nodeManager: NodeManager;
111-
nodeConnectionManager: NodeConnectionManager;
112+
nodeConnectionManager: NodeConnectionManager<AgentClientManifest>;
112113
nodeGraph: NodeGraph;
113114
vaultManager: VaultManager;
114115
fs: FileSystem;

src/nodes/NodeConnection.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { X509Certificate } from '@peculiar/x509';
22
import type { ContextTimed, ContextTimedInput } from '@matrixai/contexts';
33
import type { PromiseCancellable } from '@matrixai/async-cancellable';
44
import type { QUICSocket, QUICConnection } from '@matrixai/quic';
5+
import type { ClientManifest } from '@matrixai/rpc';
56
import type { Host, Hostname, Port, TLSConfig } from '../network/types.js';
67
import type { Certificate } from '../keys/types.js';
78
import type { NodeId } from './types.js';
@@ -31,12 +32,14 @@ type AgentClientManifest = typeof agentClientManifest;
3132
/**
3233
* Encapsulates the unidirectional client-side connection of one node to another.
3334
*/
34-
interface NodeConnection extends createDestroy.CreateDestroy {}
35+
// eslint-disable-next-line
36+
interface NodeConnection<Manifest extends ClientManifest>
37+
extends createDestroy.CreateDestroy {}
3538
@createDestroy.CreateDestroy({
3639
eventDestroy: nodesEvents.EventNodeConnectionDestroy,
3740
eventDestroyed: nodesEvents.EventNodeConnectionDestroyed,
3841
})
39-
class NodeConnection {
42+
class NodeConnection<Manifest extends ClientManifest> {
4043
/**
4144
* Hostname is defined if the target's host was resolved from this hostname
4245
* Undefined if a Host was directly provided
@@ -60,7 +63,7 @@ class NodeConnection {
6063
public readonly quicClient: QUICClient | undefined;
6164
public readonly quicConnection: QUICConnection;
6265
public readonly connectionId: string;
63-
public readonly rpcClient: RPCClient<AgentClientManifest>;
66+
public readonly rpcClient: RPCClient<Manifest>;
6467

6568
/**
6669
* Dispatches a `EventNodeConnectionClose` in response to any `NodeConnection`
@@ -161,7 +164,7 @@ class NodeConnection {
161164
}
162165
};
163166

164-
static createNodeConnection(
167+
static createNodeConnection<Manifest extends ClientManifest>(
165168
{
166169
targetNodeIds,
167170
targetHost,
@@ -186,16 +189,18 @@ class NodeConnection {
186189
connectionInitialMaxStreamsBidi?: number;
187190
connectionInitialMaxStreamsUni?: number;
188191
quicSocket?: QUICSocket;
189-
manifest: AgentClientManifest;
192+
manifest: Manifest;
190193
logger?: Logger;
191194
},
192195
ctx?: Partial<ContextTimedInput>,
193-
): PromiseCancellable<NodeConnection>;
196+
): PromiseCancellable<NodeConnection<Manifest>>;
194197
@decorators.timedCancellable(
195198
true,
196199
config.defaultsSystem.nodesConnectionConnectTimeoutTime,
197200
)
198-
static async createNodeConnection(
201+
static async createNodeConnection<
202+
Manifest extends ClientManifest = AgentClientManifest,
203+
>(
199204
{
200205
targetNodeIds,
201206
targetHost,
@@ -218,7 +223,7 @@ class NodeConnection {
218223
targetPort: Port;
219224
targetHostname?: Hostname;
220225
tlsConfig: TLSConfig;
221-
manifest: AgentClientManifest;
226+
manifest: Manifest;
222227
connectionKeepAliveIntervalTime?: number;
223228
connectionKeepAliveTimeoutTime?: number;
224229
connectionInitialMaxStreamsBidi?: number;
@@ -227,7 +232,7 @@ class NodeConnection {
227232
logger?: Logger;
228233
},
229234
@decorators.context ctx: ContextTimed,
230-
): Promise<NodeConnection> {
235+
): Promise<NodeConnection<Manifest>> {
231236
logger.info(`Creating forward ${this.name}`);
232237
// Checking if attempting to connect to a wildcard IP
233238
if (networkUtils.isHostWildcard(targetHost)) {
@@ -295,7 +300,7 @@ class NodeConnection {
295300
quicEvents.EventQUICConnectionStream.name,
296301
throwFunction,
297302
);
298-
const rpcClient = new RPCClient<AgentClientManifest>({
303+
const rpcClient = new RPCClient<Manifest>({
299304
manifest,
300305
middlewareFactory: rpcUtilsMiddleware.defaultClientMiddlewareWrapper(),
301306
streamFactory: async () => quicConnection.newStream(),
@@ -318,7 +323,7 @@ class NodeConnection {
318323
quicConnection.remoteHost
319324
}:${quicConnection.remotePort}]`,
320325
);
321-
const nodeConnection = new this({
326+
const nodeConnection = new this<Manifest>({
322327
validatedNodeId,
323328
nodeId,
324329
host: targetHost,
@@ -368,7 +373,7 @@ class NodeConnection {
368373
return nodeConnection;
369374
}
370375

371-
static createNodeConnectionReverse({
376+
static createNodeConnectionReverse<Manifest extends ClientManifest>({
372377
certChain,
373378
nodeId,
374379
quicConnection,
@@ -378,12 +383,12 @@ class NodeConnection {
378383
certChain: Array<Certificate>;
379384
nodeId: NodeId;
380385
quicConnection: QUICConnection;
381-
manifest: AgentClientManifest;
386+
manifest: Manifest;
382387
logger?: Logger;
383-
}): NodeConnection {
388+
}): NodeConnection<Manifest> {
384389
logger.info(`Creating reverse ${this.name}`);
385390
// Creating RPCClient
386-
const rpcClient = new RPCClient<AgentClientManifest>({
391+
const rpcClient = new RPCClient<Manifest>({
387392
manifest,
388393
middlewareFactory: rpcUtilsMiddleware.defaultClientMiddlewareWrapper(),
389394
streamFactory: async (_ctx) => {
@@ -393,7 +398,7 @@ class NodeConnection {
393398
logger: logger.getChild(RPCClient.name),
394399
});
395400
// Creating NodeConnection
396-
const nodeConnection = new this({
401+
const nodeConnection = new this<Manifest>({
397402
validatedNodeId: nodeId,
398403
nodeId: nodeId,
399404
localHost: quicConnection.localHost as unknown as Host,
@@ -467,7 +472,7 @@ class NodeConnection {
467472
quicClient?: QUICClient;
468473
quicConnection: QUICConnection;
469474
connectionId: string;
470-
rpcClient: RPCClient<AgentClientManifest>;
475+
rpcClient: RPCClient<Manifest>;
471476
logger: Logger;
472477
}) {
473478
this.validatedNodeId = validatedNodeId;
@@ -544,7 +549,7 @@ class NodeConnection {
544549
/**
545550
* Gets RPCClient for this node connection
546551
*/
547-
public getClient(): RPCClient<AgentClientManifest> {
552+
public getClient(): RPCClient<Manifest> {
548553
return this.rpcClient;
549554
}
550555
}

0 commit comments

Comments
 (0)