Skip to content

Commit f0332c9

Browse files
committed
feat: server is now start/stop from create/destroy
1 parent 3163db6 commit f0332c9

File tree

4 files changed

+102
-98
lines changed

4 files changed

+102
-98
lines changed

src/RPCServer.ts

+19-24
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ import type { JSONValue } from './types';
1818
import type { IdGen } from './types';
1919
import type { ErrorRPC, ErrorRPCRemote } from './errors';
2020
import { ReadableStream, TransformStream } from 'stream/web';
21-
import { CreateDestroy, ready } from '@matrixai/async-init/dist/CreateDestroy';
21+
import { ready } from '@matrixai/async-init/dist/CreateDestroy';
2222
import Logger from '@matrixai/logger';
2323
import { PromiseCancellable } from '@matrixai/async-cancellable';
2424
import { Timer } from '@matrixai/timer';
25-
import { createDestroy } from '@matrixai/async-init';
25+
import { startStop } from '@matrixai/async-init';
2626
import { RawHandler } from './handlers';
2727
import { DuplexHandler } from './handlers';
2828
import { ServerHandler } from './handlers';
@@ -44,28 +44,23 @@ const cleanupReason = Symbol('CleanupReason');
4444
* Events:
4545
* - error
4646
*/
47-
interface RPCServer extends createDestroy.CreateDestroy {}
48-
/**
49-
* You must provide an error handler `addEventListener('error')`.
50-
* Otherwise, errors will just be ignored.
51-
*
52-
* Events:
53-
* - {@link events.EventRPCServerDestroy}
54-
* - {@link events.EventRPCServerDestroyed}
55-
*/
56-
@createDestroy.CreateDestroy({
57-
eventDestroy: events.EventRPCServerDestroy,
58-
eventDestroyed: events.EventRPCServerDestroyed,
47+
interface RPCServer extends startStop.StartStop {}
48+
49+
@startStop.StartStop({
50+
eventStart: events.EventRPCServerStart,
51+
eventStarted: events.EventRPCServerStarted,
52+
eventStop: events.EventRPCServerStopping,
53+
eventStopped: events.EventRPCServerStopped,
5954
})
6055
class RPCServer extends EventTarget {
6156
/**
62-
* Creates RPC server.
57+
* Starts RPC server.
6358
6459
* @param obj
6560
* @param obj.manifest - Server manifest used to define the rpc method
6661
* handlers.
6762
* @param obj.middlewareFactory - Middleware used to process the rpc messages.
68-
* The middlewareFactory needs to be a function that creates a pair of
63+
* The middlewareFactory needs to be a function that starts a pair of
6964
* transform streams that convert `Uint8Array` to `JSONRPCRequest` on the forward
7065
* path and `JSONRPCResponse` to `Uint8Array` on the reverse path.
7166
* @param obj.streamKeepAliveTimeoutTime - Time before a connection is cleaned up due to no activity. This is the
@@ -77,7 +72,7 @@ class RPCServer extends EventTarget {
7772
* the handler to handle timeout before it is forced to end. Defaults to 2,000 milliseconds.
7873
* @param obj.logger
7974
*/
80-
public static async createRPCServer({
75+
public static async startRPCServer({
8176
manifest,
8277
middlewareFactory = rpcUtilsMiddleware.defaultServerMiddlewareWrapper(),
8378
handlerTimeoutTime = Infinity, // 1 minute
@@ -99,7 +94,7 @@ class RPCServer extends EventTarget {
9994
fromError?: (error: ErrorRPC<any>) => JSONValue;
10095
filterSensitive?: (key: string, value: any) => any;
10196
}): Promise<RPCServer> {
102-
logger.info(`Creating ${this.name}`);
97+
logger.info(`Starting ${this.name}`);
10398
const rpcServer = new this({
10499
manifest,
105100
middlewareFactory,
@@ -109,7 +104,7 @@ class RPCServer extends EventTarget {
109104
fromError,
110105
filterSensitive,
111106
});
112-
logger.info(`Created ${this.name}`);
107+
logger.info(`Started ${this.name}`);
113108
return rpcServer;
114109
}
115110
protected onTimeoutCallback?: () => void;
@@ -214,10 +209,10 @@ class RPCServer extends EventTarget {
214209
this.filterSensitive = filterSensitive || rpcUtils.filterSensitive;
215210
}
216211

217-
public async destroy(force: boolean = true): Promise<void> {
212+
public async stop(force: boolean = true): Promise<void> {
218213
// Log and dispatch an event before starting the destruction
219-
this.logger.info(`Destroying ${this.constructor.name}`);
220-
this.dispatchEvent(new events.EventRPCServerDestroy());
214+
this.logger.info(`Stopping ${this.constructor.name}`);
215+
this.dispatchEvent(new events.EventRPCServerStopping());
221216

222217
// Your existing logic for stopping active streams and other cleanup
223218
if (force) {
@@ -231,8 +226,8 @@ class RPCServer extends EventTarget {
231226
}
232227

233228
// Log and dispatch an event after the destruction has been completed
234-
this.dispatchEvent(new events.EventRPCServerDestroyed());
235-
this.logger.info(`Destroyed ${this.constructor.name}`);
229+
this.dispatchEvent(new events.EventRPCServerStopped());
230+
this.logger.info(`Stopped ${this.constructor.name}`);
236231
}
237232

238233
/**

src/events.ts

+9
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ class EventRPCServerCreated extends EventRPCServer {}
4141
class EventRPCServerDestroy extends EventRPCServer {}
4242

4343
class EventRPCServerDestroyed extends EventRPCServer {}
44+
class EventRPCServerStart extends EventRPCServer {}
45+
class EventRPCServerStarted extends EventRPCServer {}
46+
class EventRPCServerStopping extends EventRPCServer {}
47+
48+
class EventRPCServerStopped extends EventRPCServer {}
4449

4550
class EventRPCServerError extends EventRPCServer<Error> {}
4651

@@ -82,4 +87,8 @@ export {
8287
EventRPCServerDestroyed,
8388
EventRPCServerError,
8489
EventRPCConnectionError,
90+
EventRPCServerStopping,
91+
EventRPCServerStopped,
92+
EventRPCServerStart,
93+
EventRPCServerStarted,
8594
};

tests/RPC.test.ts

+30-30
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ describe('RPC', () => {
6262
});
6363
};
6464
}
65-
const rpcServer = await RPCServer.createRPCServer({
65+
const rpcServer = await RPCServer.startRPCServer({
6666
manifest: {
6767
testMethod: new TestMethod({}),
6868
},
@@ -107,7 +107,7 @@ describe('RPC', () => {
107107
expect(callerInterface.meta?.result).toBe('some leading data');
108108
expect(await outputResult).toStrictEqual(values);
109109
await pipeProm;
110-
await rpcServer.destroy();
110+
await rpcServer.stop();
111111
await rpcClient.destroy();
112112
},
113113
);
@@ -163,7 +163,7 @@ describe('RPC', () => {
163163
};
164164
}
165165

166-
const rpcServer = await RPCServer.createRPCServer({
166+
const rpcServer = await RPCServer.startRPCServer({
167167
manifest: {
168168
testMethod: new TestMethod({}),
169169
},
@@ -195,7 +195,7 @@ describe('RPC', () => {
195195
}),
196196
).rejects.toThrow(rpcErrors.ErrorRPCRemote);
197197

198-
await rpcServer.destroy();
198+
await rpcServer.stop();
199199
await rpcClient.destroy();
200200
});
201201
testProp(
@@ -216,7 +216,7 @@ describe('RPC', () => {
216216
yield* input;
217217
};
218218
}
219-
const rpcServer = await RPCServer.createRPCServer({
219+
const rpcServer = await RPCServer.startRPCServer({
220220
manifest: {
221221
testMethod: new TestMethod({}),
222222
},
@@ -253,7 +253,7 @@ describe('RPC', () => {
253253
const result = await reader.read();
254254
expect(result.value).toBeUndefined();
255255
expect(result.done).toBeTrue();
256-
await rpcServer.destroy();
256+
await rpcServer.stop();
257257
await rpcClient.destroy();
258258
},
259259
);
@@ -276,7 +276,7 @@ describe('RPC', () => {
276276
};
277277
}
278278

279-
const rpcServer = await RPCServer.createRPCServer({
279+
const rpcServer = await RPCServer.startRPCServer({
280280
manifest: {
281281
testMethod: new TestMethod({}),
282282
},
@@ -309,7 +309,7 @@ describe('RPC', () => {
309309
outputs.push(num);
310310
}
311311
expect(outputs.length).toEqual(value);
312-
await rpcServer.destroy();
312+
await rpcServer.stop();
313313
await rpcClient.destroy();
314314
},
315315
);
@@ -334,7 +334,7 @@ describe('RPC', () => {
334334
};
335335
}
336336

337-
const rpcServer = await RPCServer.createRPCServer({
337+
const rpcServer = await RPCServer.startRPCServer({
338338
manifest: {
339339
testMethod: new TestMethod({}),
340340
},
@@ -368,7 +368,7 @@ describe('RPC', () => {
368368
await writer.close();
369369
const expectedResult = values.reduce((p, c) => p + c);
370370
await expect(output).resolves.toEqual(expectedResult);
371-
await rpcServer.destroy();
371+
await rpcServer.stop();
372372
await rpcClient.destroy();
373373
},
374374
);
@@ -386,7 +386,7 @@ describe('RPC', () => {
386386
return input;
387387
};
388388
}
389-
const rpcServer = await RPCServer.createRPCServer({
389+
const rpcServer = await RPCServer.startRPCServer({
390390
manifest: {
391391
testMethod: new TestMethod({}),
392392
},
@@ -414,7 +414,7 @@ describe('RPC', () => {
414414

415415
const result = await rpcClient.methods.testMethod(value);
416416
expect(result).toStrictEqual(value);
417-
await rpcServer.destroy();
417+
await rpcServer.stop();
418418
await rpcClient.destroy();
419419
},
420420
);
@@ -441,7 +441,7 @@ describe('RPC', () => {
441441
};
442442
}
443443

444-
const rpcServer = await RPCServer.createRPCServer({
444+
const rpcServer = await RPCServer.startRPCServer({
445445
manifest: {
446446
testMethod: new TestMethod({}),
447447
},
@@ -472,7 +472,7 @@ describe('RPC', () => {
472472
expect(rejection).toMatchObject({ code: -32006 });
473473

474474
// Cleanup
475-
await rpcServer.destroy();
475+
await rpcServer.stop();
476476
await rpcClient.destroy();
477477
},
478478
);
@@ -500,7 +500,7 @@ describe('RPC', () => {
500500
};
501501
}
502502

503-
const rpcServer = await RPCServer.createRPCServer({
503+
const rpcServer = await RPCServer.startRPCServer({
504504
manifest: {
505505
testMethod: new TestMethod({}),
506506
},
@@ -526,7 +526,7 @@ describe('RPC', () => {
526526
await expect(callProm).rejects.toBeInstanceOf(rpcErrors.ErrorRPCRemote);
527527
await expect(callProm).rejects.not.toHaveProperty('cause.stack');
528528

529-
await rpcServer.destroy();
529+
await rpcServer.stop();
530530
await rpcClient.destroy();
531531
},
532532
);
@@ -562,7 +562,7 @@ describe('RPC', () => {
562562
}),
563563
};
564564
});
565-
const rpcServer = await RPCServer.createRPCServer({
565+
const rpcServer = await RPCServer.startRPCServer({
566566
manifest: {
567567
testMethod: new TestMethod({}),
568568
},
@@ -599,7 +599,7 @@ describe('RPC', () => {
599599
await expect(reader.read()).toReject();
600600
await expect(writer.closed).toReject();
601601
await expect(reader.closed).toReject();
602-
await expect(rpcServer.destroy(false)).toResolve();
602+
await expect(rpcServer.stop(false)).toResolve();
603603
await rpcClient.destroy();
604604
});
605605
testProp(
@@ -634,7 +634,7 @@ describe('RPC', () => {
634634
}
635635
const testMethodInstance = new TestMethod({});
636636
// Set up a client and server with matching timeout settings
637-
const rpcServer = await RPCServer.createRPCServer({
637+
const rpcServer = await RPCServer.startRPCServer({
638638
manifest: {
639639
testMethod: testMethodInstance,
640640
},
@@ -690,7 +690,7 @@ describe('RPC', () => {
690690
'Timed out waiting for header',
691691
);
692692

693-
await rpcServer.destroy();
693+
await rpcServer.stop();
694694
await rpcClient.destroy();
695695
},
696696
);
@@ -725,7 +725,7 @@ describe('RPC', () => {
725725
}
726726

727727
// Create an instance of the RPC server with a shorter timeout
728-
const rpcServer = await RPCServer.createRPCServer({
728+
const rpcServer = await RPCServer.startRPCServer({
729729
manifest: { testMethod: new TestMethod({}) },
730730
logger,
731731
idGen,
@@ -769,7 +769,7 @@ describe('RPC', () => {
769769
);
770770

771771
// Cleanup
772-
await rpcServer.destroy();
772+
await rpcServer.stop();
773773
await rpcClient.destroy();
774774
},
775775
{ numRuns: 1 },
@@ -799,7 +799,7 @@ describe('RPC', () => {
799799
};
800800
}
801801
// Set up a client and server with matching timeout settings
802-
const rpcServer = await RPCServer.createRPCServer({
802+
const rpcServer = await RPCServer.startRPCServer({
803803
manifest: {
804804
testMethod: new TestMethod({}),
805805
},
@@ -835,7 +835,7 @@ describe('RPC', () => {
835835
await expect(writer.write(value)).toResolve();
836836
await expect(reader.read()).toReject();
837837

838-
await rpcServer.destroy();
838+
await rpcServer.stop();
839839
await rpcClient.destroy();
840840
},
841841
{ numRuns: 1 },
@@ -867,7 +867,7 @@ describe('RPC', () => {
867867
};
868868
}
869869

870-
const rpcServer = await RPCServer.createRPCServer({
870+
const rpcServer = await RPCServer.startRPCServer({
871871
manifest: { testMethod: new TestMethod({}) },
872872
logger,
873873
idGen,
@@ -921,7 +921,7 @@ describe('RPC', () => {
921921
callerTimer.cancel();
922922

923923
// Expect neither to time out and verify that they can still handle other operations #TODO
924-
await rpcServer.destroy(true);
924+
await rpcServer.stop(true);
925925
await rpcClient.destroy();
926926
},
927927
{ numRuns: 1 },
@@ -949,7 +949,7 @@ describe('RPC', () => {
949949
throw error;
950950
};
951951
}
952-
const rpcServer = await RPCServer.createRPCServer({
952+
const rpcServer = await RPCServer.startRPCServer({
953953
manifest: {
954954
testMethod: new TestMethod({}),
955955
},
@@ -987,7 +987,7 @@ describe('RPC', () => {
987987
const { code, message, data } = deserializedError as ErrorRPCRemote<any>;
988988
expect(code).toBe(-32006);
989989

990-
await rpcServer.destroy();
990+
await rpcServer.stop();
991991
await rpcClient.destroy();
992992
},
993993
);
@@ -1013,7 +1013,7 @@ describe('RPC', () => {
10131013
throw error;
10141014
};
10151015
}
1016-
const rpcServer = await RPCServer.createRPCServer({
1016+
const rpcServer = await RPCServer.startRPCServer({
10171017
manifest: {
10181018
testMethod: new TestMethod({}),
10191019
},
@@ -1054,7 +1054,7 @@ describe('RPC', () => {
10541054
expect(code).toBe(-32006);
10551055
expect(data).toBe(undefined);
10561056

1057-
await rpcServer.destroy();
1057+
await rpcServer.stop();
10581058
await rpcClient.destroy();
10591059
},
10601060
);

0 commit comments

Comments
 (0)