Skip to content

Commit 6f11b4e

Browse files
committed
fix: fixes #7
* Removes graceTimer and related jests
1 parent cda7b02 commit 6f11b4e

File tree

2 files changed

+3
-124
lines changed

2 files changed

+3
-124
lines changed

src/RPCServer.ts

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class RPCServer extends EventTarget {
8585
middlewareFactory = rpcUtilsMiddleware.defaultServerMiddlewareWrapper(),
8686
sensitive = false,
8787
handlerTimeoutTime = 60_000, // 1 minute
88-
handlerTimeoutGraceTime = 2_000, // 2 seconds
8988
logger = new Logger(this.name),
9089
}: {
9190
manifest: ServerManifest;
@@ -97,7 +96,6 @@ class RPCServer extends EventTarget {
9796
>;
9897
sensitive?: boolean;
9998
handlerTimeoutTime?: number;
100-
handlerTimeoutGraceTime?: number;
10199
logger?: Logger;
102100
}): Promise<RPCServer> {
103101
logger.info(`Creating ${this.name}`);
@@ -106,7 +104,6 @@ class RPCServer extends EventTarget {
106104
middlewareFactory,
107105
sensitive,
108106
handlerTimeoutTime,
109-
handlerTimeoutGraceTime,
110107
logger,
111108
});
112109
logger.info(`Created ${this.name}`);
@@ -116,7 +113,6 @@ class RPCServer extends EventTarget {
116113
protected handlerMap: Map<string, RawHandlerImplementation> = new Map();
117114
protected defaultTimeoutMap: Map<string, number | undefined> = new Map();
118115
protected handlerTimeoutTime: number;
119-
protected handlerTimeoutGraceTime: number;
120116
protected activeStreams: Set<PromiseCancellable<void>> = new Set();
121117
protected sensitive: boolean;
122118
protected middlewareFactory: MiddlewareFactory<
@@ -131,7 +127,6 @@ class RPCServer extends EventTarget {
131127
middlewareFactory,
132128
sensitive,
133129
handlerTimeoutTime = 60_000, // 1 minuet
134-
handlerTimeoutGraceTime = 2_000, // 2 seconds
135130
logger,
136131
}: {
137132
manifest: ServerManifest;
@@ -143,7 +138,6 @@ class RPCServer extends EventTarget {
143138
JSONRPCResponseResult
144139
>;
145140
handlerTimeoutTime?: number;
146-
handlerTimeoutGraceTime?: number;
147141
sensitive: boolean;
148142
logger: Logger;
149143
}) {
@@ -202,7 +196,6 @@ class RPCServer extends EventTarget {
202196
this.middlewareFactory = middlewareFactory;
203197
this.sensitive = sensitive;
204198
this.handlerTimeoutTime = handlerTimeoutTime;
205-
this.handlerTimeoutGraceTime = handlerTimeoutGraceTime;
206199
this.logger = logger;
207200
}
208201

@@ -450,18 +443,15 @@ class RPCServer extends EventTarget {
450443
},
451444
});
452445

453-
// Grace timer is triggered with any abort signal.
454-
// If grace timer completes then it will cause the RPCStream to end with
455446
// `RPCStream.cancel(reason)`.
456-
let graceTimer: Timer<void> | undefined;
457447
const handleAbort = () => {
458-
const graceTimer = new Timer({
459-
delay: this.handlerTimeoutGraceTime,
448+
const timer = new Timer({
449+
delay: this.handlerTimeoutTime,
460450
handler: () => {
461451
rpcStream.cancel(abortController.signal.reason);
462452
},
463453
});
464-
void graceTimer
454+
void timer
465455
.catch(() => {}) // Ignore cancellation error
466456
.finally(() => {
467457
abortController.signal.removeEventListener('abort', handleAbort);
@@ -496,9 +486,7 @@ class RPCServer extends EventTarget {
496486
await rpcStream.writable.abort(reason);
497487
await inputStreamEndProm;
498488
timer.cancel(cleanupReason);
499-
graceTimer?.cancel(cleanupReason);
500489
await timer.catch(() => {});
501-
await graceTimer?.catch(() => {});
502490
};
503491
// Read a single empty value to consume the first message
504492
const reader = headTransformStream.readable.getReader();
@@ -522,9 +510,7 @@ class RPCServer extends EventTarget {
522510
);
523511
await inputStreamEndProm;
524512
timer.cancel(cleanupReason);
525-
graceTimer?.cancel(cleanupReason);
526513
await timer.catch(() => {});
527-
await graceTimer?.catch(() => {});
528514
this.dispatchEvent(
529515
new rpcEvents.RPCErrorEvent({
530516
detail: new rpcErrors.ErrorRPCOutputStreamError(
@@ -616,8 +602,6 @@ class RPCServer extends EventTarget {
616602
// Clean up and return
617603
timer.cancel(cleanupReason);
618604
abortController.signal.removeEventListener('abort', handleAbort);
619-
graceTimer?.cancel(cleanupReason);
620-
abortController.abort(new rpcErrors.ErrorRPCStreamEnded());
621605
rpcStream.cancel(Error('TMP header message was an error'));
622606
return;
623607
}
@@ -641,7 +625,6 @@ class RPCServer extends EventTarget {
641625
// Cleaning up abort and timer
642626
timer.cancel(cleanupReason);
643627
abortController.signal.removeEventListener('abort', handleAbort);
644-
graceTimer?.cancel(cleanupReason);
645628
abortController.abort(new rpcErrors.ErrorRPCStreamEnded());
646629
})();
647630
const handlerProm = PromiseCancellable.from(prom, abortController).finally(

tests/RPCServer.test.ts

Lines changed: 0 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,58 +1084,6 @@ describe(`${RPCServer.name}`, () => {
10841084
await expect(ctx.timer).toReject();
10851085
await rpcServer.destroy();
10861086
});
1087-
test('Timeout has a grace period before forcing the streams closed', async () => {
1088-
const ctxProm = promise<ContextTimed>();
1089-
class TestHandler extends RawHandler<ContainerType> {
1090-
public handle = async (
1091-
input: [JSONRPCRequest<JSONValue>, ReadableStream<Uint8Array>],
1092-
cancel: (reason?: any) => void,
1093-
meta: Record<string, JSONValue> | undefined,
1094-
ctx: ContextTimed,
1095-
): Promise<[JSONValue, ReadableStream<Uint8Array>]> => {
1096-
ctxProm.resolveP(ctx);
1097-
1098-
return Promise.resolve([null, new ReadableStream<Uint8Array>()]);
1099-
};
1100-
}
1101-
const rpcServer = await RPCServer.createRPCServer({
1102-
manifest: {
1103-
testMethod: new TestHandler({}),
1104-
},
1105-
handlerTimeoutTime: 50,
1106-
handlerTimeoutGraceTime: 100,
1107-
logger,
1108-
});
1109-
const [, outputStream] = rpcTestUtils.streamToArray();
1110-
const stream = rpcTestUtils.messagesToReadableStream([
1111-
{
1112-
jsonrpc: '2.0',
1113-
method: 'testMethod',
1114-
params: null,
1115-
},
1116-
{
1117-
jsonrpc: '2.0',
1118-
method: 'testMethod',
1119-
params: null,
1120-
},
1121-
]);
1122-
const cancelProm = promise<any>();
1123-
const readWriteStream: RPCStream<Uint8Array, Uint8Array> = {
1124-
cancel: (reason) => cancelProm.resolveP(reason),
1125-
readable: stream,
1126-
writable: outputStream,
1127-
};
1128-
rpcServer.handleStream(readWriteStream);
1129-
const ctx = await ctxProm.p;
1130-
await ctx.timer;
1131-
const then = Date.now();
1132-
expect(ctx.signal.reason).toBeInstanceOf(rpcErrors.ErrorRPCTimedOut);
1133-
// Should end after grace period
1134-
await expect(cancelProm.p).resolves.toBeInstanceOf(
1135-
rpcErrors.ErrorRPCTimedOut,
1136-
);
1137-
expect(Date.now() - then).toBeGreaterThanOrEqual(90);
1138-
});
11391087
testProp(
11401088
'middleware can update timeout timer',
11411089
[specificMessageArb],
@@ -1180,56 +1128,4 @@ describe(`${RPCServer.name}`, () => {
11801128
expect(ctx.timer.delay).toBe(12345);
11811129
},
11821130
);
1183-
test('destroying the `RPCServer` sends an abort signal and closes connection', async () => {
1184-
const ctxProm = promise<ContextTimed>();
1185-
class TestHandler extends RawHandler<ContainerType> {
1186-
public handle = async (
1187-
input: [JSONRPCRequest<JSONValue>, ReadableStream<Uint8Array>],
1188-
_cancel: (reason?: any) => void,
1189-
_meta: Record<string, JSONValue> | undefined,
1190-
ctx_: ContextTimed,
1191-
): Promise<[JSONValue, ReadableStream<Uint8Array>]> => {
1192-
return new Promise((resolve) => {
1193-
ctxProm.resolveP(ctx_);
1194-
// Echo messages
1195-
return [null, input[1]];
1196-
});
1197-
};
1198-
}
1199-
const rpcServer = await RPCServer.createRPCServer({
1200-
manifest: {
1201-
testMethod: new TestHandler({}),
1202-
},
1203-
handlerTimeoutGraceTime: 0,
1204-
logger,
1205-
});
1206-
const [, outputStream] = rpcTestUtils.streamToArray();
1207-
const message = Buffer.from(
1208-
JSON.stringify({
1209-
jsonrpc: '2.0',
1210-
method: 'testMethod',
1211-
params: null,
1212-
}),
1213-
);
1214-
const forwardStream = new TransformStream<Uint8Array, Uint8Array>();
1215-
const cancelProm = promise<any>();
1216-
const readWriteStream: RPCStream<Uint8Array, Uint8Array> = {
1217-
cancel: (reason) => cancelProm.resolveP(reason),
1218-
readable: forwardStream.readable,
1219-
writable: outputStream,
1220-
};
1221-
rpcServer.handleStream(readWriteStream);
1222-
const writer = forwardStream.writable.getWriter();
1223-
await writer.write(message);
1224-
const ctx = await ctxProm.p;
1225-
void rpcServer.destroy(true).then(
1226-
() => {},
1227-
() => {},
1228-
);
1229-
await expect(cancelProm.p).resolves.toBeInstanceOf(
1230-
rpcErrors.ErrorRPCStopping,
1231-
);
1232-
expect(ctx.signal.reason).toBeInstanceOf(rpcErrors.ErrorRPCStopping);
1233-
await writer.close();
1234-
});
12351131
});

0 commit comments

Comments
 (0)