From 38358622e7ad35bd353e120163975feda196d0ff Mon Sep 17 00:00:00 2001 From: Alina Sireneva Date: Wed, 13 Dec 2023 18:30:28 +0300 Subject: [PATCH] feat(core): allow passing rpc call options by proxy --- packages/core/src/base-client.ts | 38 +++++++++++++++++++ packages/core/src/network/network-manager.ts | 6 +++ .../core/src/network/session-connection.ts | 4 +- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/core/src/base-client.ts b/packages/core/src/base-client.ts index 68e9f237..baaa75d6 100644 --- a/packages/core/src/base-client.ts +++ b/packages/core/src/base-client.ts @@ -455,6 +455,44 @@ export class BaseTelegramClient extends EventEmitter { return res } + /** + * Create a Proxy that will call all methods with given call parameters + * (see {@link RpcCallOptions}}) + * + * This is useful when you don't call `call()` directly, but rather + * use high-level API provided by `@mtcute/client`, for example: + * + * ```ts + * const client = new TelegramClient(...) + * + * const someone = await client + * .withCallParams({ timeout: 500 }) + * .getUsers(...) + * ``` + */ + withCallParams(params: RpcCallOptions): this { + return new Proxy(this, { + get(target, prop, receiver) { + if (prop === 'call') { + return (message: tl.RpcMethod, paramsCustom?: RpcCallOptions) => + target.call(message, { + ...params, + ...paramsCustom, + }) + } + + return Reflect.get(target, prop, receiver) + }, + }) + } + + /** + * Shorthand for `withCallParams({ abortSignal })` + */ + withAbortSignal(signal: AbortSignal): this { + return this.withCallParams({ abortSignal: signal }) + } + /** * Change transport for the client. * diff --git a/packages/core/src/network/network-manager.ts b/packages/core/src/network/network-manager.ts index 05871836..2d5e879b 100644 --- a/packages/core/src/network/network-manager.ts +++ b/packages/core/src/network/network-manager.ts @@ -127,6 +127,8 @@ export interface RpcCallOptions { timeout?: number /** + * **ADVANCED** + * * Kind of connection to use for this call. * * @default 'main' @@ -134,11 +136,15 @@ export interface RpcCallOptions { kind?: ConnectionKind /** + * **ADVANCED** + * * ID of the DC to use for this call */ dcId?: number /** + * **ADVANCED** + * * DC connection manager to use for this call. * Overrides `dcId` if set. */ diff --git a/packages/core/src/network/session-connection.ts b/packages/core/src/network/session-connection.ts index 178cde7c..f8cccf2c 100644 --- a/packages/core/src/network/session-connection.ts +++ b/packages/core/src/network/session-connection.ts @@ -713,7 +713,7 @@ export class SessionConnection extends PersistentConnection { return } - this.log.debug('received %s for cancelled request %l: %j', result._, reqMsgId) + this.log.debug('received %s for cancelled request %l: %j', result._, reqMsgId, result) this._onMessageAcked(reqMsgId) return @@ -928,6 +928,7 @@ export class SessionConnection extends PersistentConnection { break } case 'bind': + case 'cancel': break // do nothing, wait for the result default: @@ -1460,6 +1461,7 @@ export class SessionConnection extends PersistentConnection { if (rpc.msgId) { this._session.queuedCancelReq.push(rpc.msgId) + this._session.getStateSchedule.remove(rpc) this._flushTimer.emitWhenIdle() } else { // in case rpc wasn't sent yet (or had some error),