Skip to content

Commit

Permalink
Restore cancellation token behavior (#11693)
Browse files Browse the repository at this point in the history
Ensure that cancelling an RPC call does not result in an automatic rejection
on the calling side. Instead the token is passed to the receiving side and
handled there. This restores the cancellation strategy that was used with the
old json-rpc architecture (prior to 1.28).

Contributed on behalf of STMicroelectronics.
  • Loading branch information
tortmayr authored and martin-fleck-at committed Sep 29, 2022
1 parent 680941c commit 915af2e
Showing 1 changed file with 8 additions and 14 deletions.
22 changes: 8 additions & 14 deletions packages/core/src/common/message-rpc/rpc-protocol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,23 +132,23 @@ export class RpcProtocol {
// The last element of the request args might be a cancellation token. As these tokens are not serializable we have to remove it from the
// args array and the `CANCELLATION_TOKEN_KEY` string instead.
const cancellationToken: CancellationToken | undefined = args.length && CancellationToken.is(args[args.length - 1]) ? args.pop() : undefined;
if (cancellationToken && cancellationToken.isCancellationRequested) {
return Promise.reject(this.cancelError());
}

if (cancellationToken) {
args.push(RpcProtocol.CANCELLATION_TOKEN_KEY);
cancellationToken.onCancellationRequested(() => {
this.sendCancel(id);
this.pendingRequests.get(id)?.reject(this.cancelError());
}
);
}

this.pendingRequests.set(id, reply);

const output = this.channel.getWriteBuffer();
this.encoder.request(output, id, method, args);
output.commit();

if (cancellationToken?.isCancellationRequested) {
this.sendCancel(id);
} else {
cancellationToken?.onCancellationRequested(() => this.sendCancel(id));
}

return reply.promise;
}

Expand All @@ -164,12 +164,6 @@ export class RpcProtocol {
output.commit();
}

cancelError(): Error {
const error = new Error('"Request has already been canceled by the sender"');
error.name = 'Cancel';
return error;
}

protected handleCancel(id: number): void {
const cancellationTokenSource = this.cancellationTokenSources.get(id);
if (cancellationTokenSource) {
Expand Down

0 comments on commit 915af2e

Please sign in to comment.