fix(microservices): cleanup upstream subscription in client-side gRPC stream calls

This commit is contained in:
ssilve1989
2021-07-30 15:05:11 -06:00
parent c22f8a7795
commit 6d6b139250
2 changed files with 18 additions and 6 deletions

View File

@@ -232,11 +232,17 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
callArgs.unshift(maybeMetadata);
}
const call = client[methodName](...callArgs);
upstreamSubjectOrData.subscribe(
(val: unknown) => call.write(val),
(err: unknown) => call.emit('error', err),
() => call.end(),
);
const upstreamSubscription: Subscription =
upstreamSubjectOrData.subscribe(
(val: unknown) => call.write(val),
(err: unknown) => call.emit('error', err),
() => call.end(),
);
return () => {
upstreamSubscription.unsubscribe();
};
});
}
return new Observable(observer => {

View File

@@ -267,11 +267,12 @@ describe('ClientGrpcProxy', () => {
});
});
describe('when stream request', () => {
let clientCallback: (err: Error | null | undefined, response: any) => void;
const writeSpy = sinon.spy();
const methodName = 'm';
const obj = {
[methodName]: callback => {
callback(null, {});
clientCallback = callback;
return {
write: writeSpy,
};
@@ -287,6 +288,11 @@ describe('ClientGrpcProxy', () => {
stream$ = client.createUnaryServiceMethod(obj, methodName)(upstream);
});
afterEach(() => {
// invoke client callback to allow resources to be cleaned up
clientCallback(null, {});
})
it('should subscribe to request upstream', () => {
const upstreamSubscribe = sinon.spy(upstream, 'subscribe');
stream$.subscribe(