From 59e069f0915a8d647db9b0d32c6686ebb87e044d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20P=C3=A1nik?= Date: Thu, 30 Jan 2020 16:48:11 +0100 Subject: [PATCH] Added unsubscribe return function to wsProvider.on() (#1780) * Added unsubscribe return function to wsProvider.on() * Updated mocks, added noop to http provider --- packages/rpc-provider/src/http/index.ts | 5 ++++- packages/rpc-provider/src/mock/index.ts | 5 ++++- packages/rpc-provider/src/types.ts | 2 +- packages/rpc-provider/src/ws/Provider.ts | 6 +++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/packages/rpc-provider/src/http/index.ts b/packages/rpc-provider/src/http/index.ts index 10d54ccfde..02a603c1e5 100644 --- a/packages/rpc-provider/src/http/index.ts +++ b/packages/rpc-provider/src/http/index.ts @@ -84,8 +84,11 @@ export default class HttpProvider implements ProviderInterface { * @description HTTP Provider does not have 'on' emitters. WebSockets should be used instead. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - public on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): void { + public on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): () => void { l.error('HTTP Provider does not have \'on\' emitters, use WebSockets instead'); + return (): void => { + // noop + }; } /** diff --git a/packages/rpc-provider/src/mock/index.ts b/packages/rpc-provider/src/mock/index.ts index 080c6749f4..d80f65d8f3 100644 --- a/packages/rpc-provider/src/mock/index.ts +++ b/packages/rpc-provider/src/mock/index.ts @@ -104,8 +104,11 @@ export default class Mock implements ProviderInterface { return true; } - public on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): void { + public on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): () => void { this.emitter.on(type, sub); + return (): void => { + this.emitter.removeListener(type, sub); + }; } // eslint-disable-next-line @typescript-eslint/require-await diff --git a/packages/rpc-provider/src/types.ts b/packages/rpc-provider/src/types.ts index 96559ce626..aa9dcb499e 100644 --- a/packages/rpc-provider/src/types.ts +++ b/packages/rpc-provider/src/types.ts @@ -47,7 +47,7 @@ export interface ProviderInterface { clone (): ProviderInterface; disconnect (): void; isConnected (): boolean; - on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): void; + on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): () => void; send (method: string, params: any[]): Promise; subscribe (type: string, method: string, params: any[], cb: ProviderInterfaceCallback): Promise; unsubscribe (type: string, method: string, id: number): Promise; diff --git a/packages/rpc-provider/src/ws/Provider.ts b/packages/rpc-provider/src/ws/Provider.ts index 2f5a24312c..1352e941c5 100644 --- a/packages/rpc-provider/src/ws/Provider.ts +++ b/packages/rpc-provider/src/ws/Provider.ts @@ -167,9 +167,13 @@ export default class WsProvider implements WSProviderInterface { * @summary Listens on events after having subscribed using the [[subscribe]] function. * @param {ProviderInterfaceEmitted} type Event * @param {ProviderInterfaceEmitCb} sub Callback + * @return unsubscribe function */ - public on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): void { + public on (type: ProviderInterfaceEmitted, sub: ProviderInterfaceEmitCb): () => void { this._eventemitter.on(type, sub); + return (): void => { + this._eventemitter.removeListener(type, sub); + }; } /**