refactor!: renamed MaybeAsync -> MaybePromise

This commit is contained in:
alina 🌸 2024-02-03 20:14:03 +03:00
parent 20a46c54a8
commit ac3b5df9a0
Signed by: teidesu
SSH key fingerprint: SHA256:uNeCpw6aTSU4aIObXLvHfLkDa82HWH9EiOj9AXOIRpI
30 changed files with 127 additions and 125 deletions

View file

@ -1,7 +1,7 @@
// eslint-disable-next-line no-restricted-imports // eslint-disable-next-line no-restricted-imports
import { join } from 'path' import { join } from 'path'
import { MaybeAsync, MemoryStorage } from '@mtcute/core' import { MaybePromise, MemoryStorage } from '@mtcute/core'
import { LogManager, sleep } from '@mtcute/core/utils.js' import { LogManager, sleep } from '@mtcute/core/utils.js'
import { SqliteStorage } from '@mtcute/sqlite' import { SqliteStorage } from '@mtcute/sqlite'
@ -19,7 +19,7 @@ export const getApiParams = (storage?: string) => {
} }
} }
export async function waitFor(condition: () => MaybeAsync<void>, timeout = 5000): Promise<void> { export async function waitFor(condition: () => MaybePromise<void>, timeout = 5000): Promise<void> {
const start = Date.now() const start = Date.now()
let lastError let lastError

View file

@ -8,7 +8,7 @@ import { tdFileId } from '@mtcute/file-id'
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
import { MemoryStorage } from '../storage/providers/memory/index.js' import { MemoryStorage } from '../storage/providers/memory/index.js'
import { MaybeArray, MaybeAsync, PartialExcept, PartialOnly } from '../types/index.js' import { MaybeArray, MaybePromise, PartialExcept, PartialOnly } from '../types/index.js'
import { StringSessionData } from '../utils/string-session.js' import { StringSessionData } from '../utils/string-session.js'
import { BaseTelegramClient, BaseTelegramClientOptions } from './base.js' import { BaseTelegramClient, BaseTelegramClientOptions } from './base.js'
import { ITelegramClient } from './client.types.js' import { ITelegramClient } from './client.types.js'
@ -672,7 +672,7 @@ export interface TelegramClient extends ITelegramClient {
* This method handles both login and sign up, and also handles 2FV * This method handles both login and sign up, and also handles 2FV
* *
* All parameters are `MaybeDynamic<T>`, meaning you * All parameters are `MaybeDynamic<T>`, meaning you
* can either supply `T`, or a function that returns `MaybeAsync<T>` * can either supply `T`, or a function that returns `MaybePromise<T>`
* *
* This method is intended for simple and fast use in automated * This method is intended for simple and fast use in automated
* scripts and bots. If you are developing a custom client, * scripts and bots. If you are developing a custom client,
@ -725,7 +725,7 @@ export interface TelegramClient extends ITelegramClient {
* If provided `code`/`password` is a constant string, providing an * If provided `code`/`password` is a constant string, providing an
* invalid one will interrupt authorization flow. * invalid one will interrupt authorization flow.
*/ */
invalidCodeCallback?: (type: 'code' | 'password') => MaybeAsync<void> invalidCodeCallback?: (type: 'code' | 'password') => MaybePromise<void>
/** /**
* Whether to force code delivery through SMS * Whether to force code delivery through SMS
@ -741,7 +741,7 @@ export interface TelegramClient extends ITelegramClient {
* @param code * @param code
* @default `console.log`. * @default `console.log`.
*/ */
codeSentCallback?: (code: SentCode) => MaybeAsync<void> codeSentCallback?: (code: SentCode) => MaybePromise<void>
}): Promise<User> }): Promise<User>
/** /**
* Check if the given peer/input peer is referring to the current user * Check if the given peer/input peer is referring to the current user

View file

@ -6,7 +6,7 @@ import { tdFileId } from '@mtcute/file-id'
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
// @copy // @copy
import { MaybeArray, MaybeAsync, PartialExcept, PartialOnly } from '../../types/index.js' import { MaybeArray, MaybePromise, PartialExcept, PartialOnly } from '../../types/index.js'
// @copy // @copy
import { StringSessionData } from '../../utils/string-session.js' import { StringSessionData } from '../../utils/string-session.js'
// @copy // @copy

View file

@ -2,7 +2,7 @@
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
import { MtArgumentError } from '../../../types/errors.js' import { MtArgumentError } from '../../../types/errors.js'
import { MaybeAsync } from '../../../types/utils.js' import { MaybePromise } from '../../../types/utils.js'
import { StringSessionData } from '../../../utils/string-session.js' import { StringSessionData } from '../../../utils/string-session.js'
import { ITelegramClient } from '../../client.types.js' import { ITelegramClient } from '../../client.types.js'
import { SentCode } from '../../types/auth/sent-code.js' import { SentCode } from '../../types/auth/sent-code.js'
@ -24,7 +24,7 @@ import { signInBot } from './sign-in-bot.js'
* This method handles both login and sign up, and also handles 2FV * This method handles both login and sign up, and also handles 2FV
* *
* All parameters are `MaybeDynamic<T>`, meaning you * All parameters are `MaybeDynamic<T>`, meaning you
* can either supply `T`, or a function that returns `MaybeAsync<T>` * can either supply `T`, or a function that returns `MaybePromise<T>`
* *
* This method is intended for simple and fast use in automated * This method is intended for simple and fast use in automated
* scripts and bots. If you are developing a custom client, * scripts and bots. If you are developing a custom client,
@ -77,7 +77,7 @@ export async function start(
* If provided `code`/`password` is a constant string, providing an * If provided `code`/`password` is a constant string, providing an
* invalid one will interrupt authorization flow. * invalid one will interrupt authorization flow.
*/ */
invalidCodeCallback?: (type: 'code' | 'password') => MaybeAsync<void> invalidCodeCallback?: (type: 'code' | 'password') => MaybePromise<void>
/** /**
* Whether to force code delivery through SMS * Whether to force code delivery through SMS
@ -93,7 +93,7 @@ export async function start(
* @param code * @param code
* @default `console.log`. * @default `console.log`.
*/ */
codeSentCallback?: (code: SentCode) => MaybeAsync<void> codeSentCallback?: (code: SentCode) => MaybePromise<void>
}, },
): Promise<User> { ): Promise<User> {
if (params.session) { if (params.session) {

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '../../../types/utils.js' import { MaybePromise } from '../../../types/utils.js'
// eslint-disable-next-line @typescript-eslint/no-namespace // eslint-disable-next-line @typescript-eslint/no-namespace
export namespace IPeersRepository { export namespace IPeersRepository {
@ -25,13 +25,13 @@ export namespace IPeersRepository {
export interface IPeersRepository { export interface IPeersRepository {
/** Store the given peer*/ /** Store the given peer*/
store(peer: IPeersRepository.PeerInfo): MaybeAsync<void> store(peer: IPeersRepository.PeerInfo): MaybePromise<void>
/** Find a peer by their `id` */ /** Find a peer by their `id` */
getById(id: number): MaybeAsync<IPeersRepository.PeerInfo | null> getById(id: number): MaybePromise<IPeersRepository.PeerInfo | null>
/** Find a peer by their username (where `usernames` includes `username`) */ /** Find a peer by their username (where `usernames` includes `username`) */
getByUsername(username: string): MaybeAsync<IPeersRepository.PeerInfo | null> getByUsername(username: string): MaybePromise<IPeersRepository.PeerInfo | null>
/** Find a peer by their `phone` */ /** Find a peer by their `phone` */
getByPhone(phone: string): MaybeAsync<IPeersRepository.PeerInfo | null> getByPhone(phone: string): MaybePromise<IPeersRepository.PeerInfo | null>
deleteAll(): MaybeAsync<void> deleteAll(): MaybePromise<void>
} }

View file

@ -1,8 +1,8 @@
import { MaybeAsync } from '../../../types/utils.js' import { MaybePromise } from '../../../types/utils.js'
export interface IReferenceMessagesRepository { export interface IReferenceMessagesRepository {
/** Store a reference message */ /** Store a reference message */
store(peerId: number, chatId: number, msgId: number): MaybeAsync<void> store(peerId: number, chatId: number, msgId: number): MaybePromise<void>
/** /**
* Get the reference message for the given `peerId`. * Get the reference message for the given `peerId`.
* *
@ -10,13 +10,13 @@ export interface IReferenceMessagesRepository {
* the one with the highest `msgId` should be returned, but this is not * the one with the highest `msgId` should be returned, but this is not
* really important. * really important.
*/ */
getByPeer(peerId: number): MaybeAsync<[number, number] | null> getByPeer(peerId: number): MaybePromise<[number, number] | null>
/** /**
* Delete reference messages given the `chatId` * Delete reference messages given the `chatId`
* where `msgId` is one of `msgIds` * where `msgId` is one of `msgIds`
*/ */
delete(chatId: number, msgIds: number[]): MaybeAsync<void> delete(chatId: number, msgIds: number[]): MaybePromise<void>
deleteByPeer(peerId: number): MaybeAsync<void> deleteByPeer(peerId: number): MaybePromise<void>
deleteAll(): MaybeAsync<void> deleteAll(): MaybePromise<void>
} }

View file

@ -1,7 +1,7 @@
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
import { MtArgumentError, MtTimeoutError } from '../../types/errors.js' import { MtArgumentError, MtTimeoutError } from '../../types/errors.js'
import { MaybeAsync } from '../../types/utils.js' import { MaybePromise } from '../../types/utils.js'
import { AsyncLock } from '../../utils/async-lock.js' import { AsyncLock } from '../../utils/async-lock.js'
import { ControllablePromise, createControllablePromise } from '../../utils/controllable-promise.js' import { ControllablePromise, createControllablePromise } from '../../utils/controllable-promise.js'
import { Deque } from '../../utils/deque.js' import { Deque } from '../../utils/deque.js'
@ -20,7 +20,7 @@ import { ParametersSkip2 } from './utils.js'
interface QueuedHandler<T> { interface QueuedHandler<T> {
promise: ControllablePromise<T> promise: ControllablePromise<T>
check?: (update: T) => MaybeAsync<boolean> check?: (update: T) => MaybePromise<boolean>
timeout?: NodeJS.Timeout timeout?: NodeJS.Timeout
} }
@ -304,7 +304,7 @@ export class Conversation {
* *
* @param handler * @param handler
*/ */
async with<T>(handler: () => MaybeAsync<T>): Promise<T> { async with<T>(handler: () => MaybePromise<T>): Promise<T> {
await this.start() await this.start()
let err: unknown let err: unknown
@ -332,7 +332,7 @@ export class Conversation {
* When the timeout is reached, `MtTimeoutError` is thrown. * When the timeout is reached, `MtTimeoutError` is thrown.
*/ */
waitForNewMessage( waitForNewMessage(
filter?: (msg: Message) => MaybeAsync<boolean>, filter?: (msg: Message) => MaybePromise<boolean>,
timeout: number | null = 15000, timeout: number | null = 15000,
): Promise<Message> { ): Promise<Message> {
if (!this._started) { if (!this._started) {
@ -372,7 +372,7 @@ export class Conversation {
* @param params * @param params
*/ */
waitForResponse( waitForResponse(
filter?: (msg: Message) => MaybeAsync<boolean>, filter?: (msg: Message) => MaybePromise<boolean>,
params?: { params?: {
/** /**
* Message for which to wait for response for. * Message for which to wait for response for.
@ -408,7 +408,7 @@ export class Conversation {
* @param params * @param params
*/ */
waitForReply( waitForReply(
filter?: (msg: Message) => MaybeAsync<boolean>, filter?: (msg: Message) => MaybePromise<boolean>,
params?: { params?: {
/** /**
* Message for which to wait for reply for. * Message for which to wait for reply for.
@ -451,7 +451,7 @@ export class Conversation {
* @param params * @param params
*/ */
async waitForEdit( async waitForEdit(
filter?: (msg: Message) => MaybeAsync<boolean>, filter?: (msg: Message) => MaybePromise<boolean>,
params?: { params?: {
/** /**
* Message for which to wait for reply for. * Message for which to wait for reply for.

View file

@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { MaybeAsync } from '../../types/utils.js' import { MaybePromise } from '../../types/utils.js'
export type MaybeDynamic<T> = MaybeAsync<T> | (() => MaybeAsync<T>) export type MaybeDynamic<T> = MaybePromise<T> | (() => MaybePromise<T>)
export type ArrayWithTotal<T> = T[] & { total: number } export type ArrayWithTotal<T> = T[] & { total: number }
export type ArrayPaginated<T, Offset> = T[] & { total: number; next?: Offset } export type ArrayPaginated<T, Offset> = T[] & { total: number; next?: Offset }

View file

@ -2,7 +2,7 @@
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
import { MtArgumentError } from '../../types/errors.js' import { MtArgumentError } from '../../types/errors.js'
import { assertNever, MaybeAsync } from '../../types/utils.js' import { assertNever, MaybePromise } from '../../types/utils.js'
import { import {
AsyncLock, AsyncLock,
ConditionVariable, ConditionVariable,
@ -680,7 +680,7 @@ export class UpdatesManager {
const channelId = toggleChannelIdMark(peerId.channelId) const channelId = toggleChannelIdMark(peerId.channelId)
const promises: MaybeAsync<void>[] = [] const promises: MaybePromise<void>[] = []
function store(peer?: tl.TypePeer | number | number[]): void { function store(peer?: tl.TypePeer | number | number[]): void {
if (!peer) return if (!peer) return

View file

@ -2,7 +2,7 @@ import EventEmitter from 'events'
import { tl } from '@mtcute/tl' import { tl } from '@mtcute/tl'
import { MaybeAsync } from '../../types/index.js' import { MaybePromise } from '../../types/index.js'
import { BasicDcOption, ICryptoProvider, Logger } from '../../utils/index.js' import { BasicDcOption, ICryptoProvider, Logger } from '../../utils/index.js'
/** Current state of the transport */ /** Current state of the transport */
@ -73,10 +73,10 @@ export type TransportFactory = () => ITelegramTransport
*/ */
export interface IPacketCodec { export interface IPacketCodec {
/** Initial tag of the codec. Will be sent immediately once connected. */ /** Initial tag of the codec. Will be sent immediately once connected. */
tag(): MaybeAsync<Uint8Array> tag(): MaybePromise<Uint8Array>
/** Encodes and frames a single packet */ /** Encodes and frames a single packet */
encode(packet: Uint8Array): MaybeAsync<Uint8Array> encode(packet: Uint8Array): MaybePromise<Uint8Array>
/** Feed packet to the codec. Once packet is processed, codec is supposed to emit `packet` or `error` */ /** Feed packet to the codec. Once packet is processed, codec is supposed to emit `packet` or `error` */
feed(data: Uint8Array): void feed(data: Uint8Array): void

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '../types/utils.js' import { MaybePromise } from '../types/utils.js'
import { Logger } from '../utils/logger.js' import { Logger } from '../utils/logger.js'
/** /**
@ -14,7 +14,7 @@ export interface IStorageDriver {
* May be called more than once, handle this with care * May be called more than once, handle this with care
* (or use {@link BaseStorageDriver} that handles this for you) * (or use {@link BaseStorageDriver} that handles this for you)
*/ */
load?(): MaybeAsync<void> load?(): MaybePromise<void>
/** /**
* Save session to some external storage. * Save session to some external storage.
* Should be used to commit pending changes in the session. * Should be used to commit pending changes in the session.
@ -24,14 +24,14 @@ export interface IStorageDriver {
* It is safe to batch all changes and only commit them here, * It is safe to batch all changes and only commit them here,
* unless stated otherwise in the method description * unless stated otherwise in the method description
*/ */
save?(): MaybeAsync<void> save?(): MaybePromise<void>
/** /**
* Cleanup session and release all used resources. * Cleanup session and release all used resources.
* *
* May be called more than once, handle this with care * May be called more than once, handle this with care
* (or use {@link BaseStorageDriver} that handles this for you) * (or use {@link BaseStorageDriver} that handles this for you)
*/ */
destroy?(): MaybeAsync<void> destroy?(): MaybePromise<void>
/** /**
* Setup the driver, passing the logger instance, * Setup the driver, passing the logger instance,
@ -45,9 +45,9 @@ export interface IStorageDriver {
* and handling the lifecycle for you * and handling the lifecycle for you
*/ */
export abstract class BaseStorageDriver implements IStorageDriver { export abstract class BaseStorageDriver implements IStorageDriver {
abstract _load(): MaybeAsync<void> abstract _load(): MaybePromise<void>
abstract _destroy(): MaybeAsync<void> abstract _destroy(): MaybePromise<void>
abstract _save?(): MaybeAsync<void> abstract _save?(): MaybePromise<void>
private _loadedTimes = 0 private _loadedTimes = 0
private _destroyed = false private _destroyed = false
@ -84,7 +84,7 @@ export abstract class BaseStorageDriver implements IStorageDriver {
} }
} }
save(): MaybeAsync<void> { save(): MaybePromise<void> {
return this._save?.() return this._save?.()
} }
} }

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '../../types/utils.js' import { MaybePromise } from '../../types/utils.js'
export interface IAuthKeysRepository { export interface IAuthKeysRepository {
/** /**
@ -8,9 +8,9 @@ export interface IAuthKeysRepository {
* *
* **MUST** be applied immediately, without batching * **MUST** be applied immediately, without batching
*/ */
set(dc: number, key: Uint8Array | null): MaybeAsync<void> set(dc: number, key: Uint8Array | null): MaybePromise<void>
/** Get auth_key for the given DC */ /** Get auth_key for the given DC */
get(dc: number): MaybeAsync<Uint8Array | null> get(dc: number): MaybePromise<Uint8Array | null>
/** /**
* Store temp_auth_key for the given DC and idx, * Store temp_auth_key for the given DC and idx,
@ -20,13 +20,13 @@ export interface IAuthKeysRepository {
* *
* **MUST** be applied immediately, without batching * **MUST** be applied immediately, without batching
*/ */
setTemp(dc: number, idx: number, key: Uint8Array | null, expires: number): MaybeAsync<void> setTemp(dc: number, idx: number, key: Uint8Array | null, expires: number): MaybePromise<void>
/** /**
* Given the DC id, idx and point in time (in seconds), * Given the DC id, idx and point in time (in seconds),
* return the temp_auth_key that should be used for the next request * return the temp_auth_key that should be used for the next request
* (such that `now < key.expires`), or `null` if no such key exists * (such that `now < key.expires`), or `null` if no such key exists
*/ */
getTemp(dc: number, idx: number, now: number): MaybeAsync<Uint8Array | null> getTemp(dc: number, idx: number, now: number): MaybePromise<Uint8Array | null>
/** /**
* Delete all stored auth keys for the given DC, including * Delete all stored auth keys for the given DC, including
@ -34,12 +34,12 @@ export interface IAuthKeysRepository {
* *
* **MUST** be applied immediately, without batching * **MUST** be applied immediately, without batching
*/ */
deleteByDc(dc: number): MaybeAsync<void> deleteByDc(dc: number): MaybePromise<void>
/** /**
* Delete all stored auth keys, including both permanent and temp keys * Delete all stored auth keys, including both permanent and temp keys
* *
* **MUST** be applied immediately, without batching * **MUST** be applied immediately, without batching
*/ */
deleteAll(): MaybeAsync<void> deleteAll(): MaybePromise<void>
} }

View file

@ -1,12 +1,12 @@
import { MaybeAsync } from '../../types/utils.js' import { MaybePromise } from '../../types/utils.js'
export interface IKeyValueRepository { export interface IKeyValueRepository {
/** Set a key-value pair */ /** Set a key-value pair */
set(key: string, value: Uint8Array): MaybeAsync<void> set(key: string, value: Uint8Array): MaybePromise<void>
/** Get a key-value pair */ /** Get a key-value pair */
get(key: string): MaybeAsync<Uint8Array | null> get(key: string): MaybePromise<Uint8Array | null>
/** Delete a key-value pair */ /** Delete a key-value pair */
delete(key: string): MaybeAsync<void> delete(key: string): MaybePromise<void>
deleteAll(): MaybeAsync<void> deleteAll(): MaybePromise<void>
} }

View file

@ -1,4 +1,4 @@
export type MaybeAsync<T> = T | Promise<T> export type MaybePromise<T> = T | Promise<T>
export type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> & Pick<T, K> export type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> & Pick<T, K>
export type PartialOnly<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K> export type PartialOnly<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '../../types/index.js' import { MaybePromise } from '../../types/index.js'
import { factorizePQSync } from './factorization.js' import { factorizePQSync } from './factorization.js'
export interface IEncryptionScheme { export interface IEncryptionScheme {
@ -12,7 +12,7 @@ export interface IAesCtr {
} }
export interface ICryptoProvider { export interface ICryptoProvider {
initialize?(): MaybeAsync<void> initialize?(): MaybePromise<void>
sha1(data: Uint8Array): Uint8Array sha1(data: Uint8Array): Uint8Array
@ -24,15 +24,15 @@ export interface ICryptoProvider {
iterations: number, iterations: number,
keylen?: number, // = 64 keylen?: number, // = 64
algo?: string, // sha1 or sha512 (default sha512) algo?: string, // sha1 or sha512 (default sha512)
): MaybeAsync<Uint8Array> ): MaybePromise<Uint8Array>
hmacSha256(data: Uint8Array, key: Uint8Array): MaybeAsync<Uint8Array> hmacSha256(data: Uint8Array, key: Uint8Array): MaybePromise<Uint8Array>
createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IAesCtr createAesCtr(key: Uint8Array, iv: Uint8Array, encrypt: boolean): IAesCtr
createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme createAesIge(key: Uint8Array, iv: Uint8Array): IEncryptionScheme
factorizePQ(pq: Uint8Array): MaybeAsync<[Uint8Array, Uint8Array]> factorizePQ(pq: Uint8Array): MaybePromise<[Uint8Array, Uint8Array]>
gzip(data: Uint8Array, maxSize: number): Uint8Array | null gzip(data: Uint8Array, maxSize: number): Uint8Array | null
gunzip(data: Uint8Array): Uint8Array gunzip(data: Uint8Array): Uint8Array

View file

@ -4,7 +4,7 @@ import { deflateSync, gunzipSync } from 'zlib'
import { ige256Decrypt, ige256Encrypt, initAsync, InitInput } from '@mtcute/wasm' import { ige256Decrypt, ige256Encrypt, initAsync, InitInput } from '@mtcute/wasm'
import { MaybeAsync } from '../../types/index.js' import { MaybePromise } from '../../types/index.js'
import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js' import { BaseCryptoProvider, IAesCtr, ICryptoProvider, IEncryptionScheme } from './abstract.js'
export abstract class BaseNodeCryptoProvider extends BaseCryptoProvider { export abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {
@ -24,7 +24,7 @@ export abstract class BaseNodeCryptoProvider extends BaseCryptoProvider {
iterations: number, iterations: number,
keylen = 64, keylen = 64,
algo = 'sha512', algo = 'sha512',
): MaybeAsync<Uint8Array> { ): MaybePromise<Uint8Array> {
return new Promise((resolve, reject) => return new Promise((resolve, reject) =>
pbkdf2(password, salt, iterations, keylen, algo, (err: Error | null, buf: Uint8Array) => pbkdf2(password, salt, iterations, keylen, algo, (err: Error | null, buf: Uint8Array) =>
err !== null ? reject(err) : resolve(buf), err !== null ? reject(err) : resolve(buf),

View file

@ -1,4 +1,4 @@
import { CallbackQuery, InlineCallbackQuery, MaybeAsync, Message, TelegramClient } from '@mtcute/core' import { CallbackQuery, InlineCallbackQuery, MaybePromise, Message, TelegramClient } from '@mtcute/core'
import { UpdateContext } from './base.js' import { UpdateContext } from './base.js'
@ -46,7 +46,7 @@ export class CallbackQueryContext extends CallbackQuery implements UpdateContext
/** /**
* Shortcut for getting the message and editing it. * Shortcut for getting the message and editing it.
*/ */
async editMessageWith(handler: (msg: Message) => MaybeAsync<Parameters<CallbackQueryContext['editMessage']>[0]>) { async editMessageWith(handler: (msg: Message) => MaybePromise<Parameters<CallbackQueryContext['editMessage']>[0]>) {
const msg = await this.getMessage() const msg = await this.getMessage()
if (!msg) return if (!msg) return

View file

@ -12,7 +12,7 @@ import {
DeleteMessageUpdate, DeleteMessageUpdate,
DeleteStoryUpdate, DeleteStoryUpdate,
HistoryReadUpdate, HistoryReadUpdate,
MaybeAsync, MaybePromise,
MtArgumentError, MtArgumentError,
ParsedUpdate, ParsedUpdate,
PeersIndex, PeersIndex,
@ -66,12 +66,7 @@ import {
} from './handler.js' } from './handler.js'
// end-codegen-imports // end-codegen-imports
import { PropagationAction } from './propagation.js' import { PropagationAction } from './propagation.js'
import { import { defaultStateKeyDelegate, IStateStorageProvider, StateKeyDelegate, UpdateState } from './state/index.js'
defaultStateKeyDelegate,
IStateStorageProvider,
StateKeyDelegate,
UpdateState,
} from './state/index.js'
import { StateService } from './state/service.js' import { StateService } from './state/service.js'
export interface DispatcherParams { export interface DispatcherParams {
@ -121,18 +116,18 @@ export class Dispatcher<State extends object = never> {
err: Error, err: Error,
update: ParsedUpdate & T, update: ParsedUpdate & T,
state?: UpdateState<State>, state?: UpdateState<State>,
) => MaybeAsync<boolean> ) => MaybePromise<boolean>
private _preUpdateHandler?: <T = {}>( private _preUpdateHandler?: <T = {}>(
update: ParsedUpdate & T, update: ParsedUpdate & T,
state?: UpdateState<State>, state?: UpdateState<State>,
) => MaybeAsync<PropagationAction | void> ) => MaybePromise<PropagationAction | void>
private _postUpdateHandler?: <T = {}>( private _postUpdateHandler?: <T = {}>(
handled: boolean, handled: boolean,
update: ParsedUpdate & T, update: ParsedUpdate & T,
state?: UpdateState<State>, state?: UpdateState<State>,
) => MaybeAsync<void> ) => MaybePromise<void>
protected constructor(client?: TelegramClient, params?: DispatcherParams) { protected constructor(client?: TelegramClient, params?: DispatcherParams) {
this.dispatchRawUpdate = this.dispatchRawUpdate.bind(this) this.dispatchRawUpdate = this.dispatchRawUpdate.bind(this)
@ -146,7 +141,7 @@ export class Dispatcher<State extends object = never> {
if (storage) { if (storage) {
this._storage = new StateService(storage) this._storage = new StateService(storage)
this._stateKeyDelegate = (key ?? defaultStateKeyDelegate) this._stateKeyDelegate = key ?? defaultStateKeyDelegate
} }
} else { } else {
// child dispatcher without client // child dispatcher without client
@ -597,7 +592,7 @@ export class Dispatcher<State extends object = never> {
* @param handler Error handler * @param handler Error handler
*/ */
onError<T = {}>( onError<T = {}>(
handler: ((err: Error, update: ParsedUpdate & T, state?: UpdateState<State>) => MaybeAsync<boolean>) | null, handler: ((err: Error, update: ParsedUpdate & T, state?: UpdateState<State>) => MaybePromise<boolean>) | null,
): void { ): void {
if (handler) this._errorHandler = handler if (handler) this._errorHandler = handler
else this._errorHandler = undefined else this._errorHandler = undefined
@ -617,7 +612,7 @@ export class Dispatcher<State extends object = never> {
*/ */
onPreUpdate<T = {}>( onPreUpdate<T = {}>(
handler: handler:
| ((update: ParsedUpdate & T, state?: UpdateState<State>) => MaybeAsync<PropagationAction | void>) | ((update: ParsedUpdate & T, state?: UpdateState<State>) => MaybePromise<PropagationAction | void>)
| null, | null,
): void { ): void {
if (handler) this._preUpdateHandler = handler if (handler) this._preUpdateHandler = handler
@ -637,7 +632,9 @@ export class Dispatcher<State extends object = never> {
* @param handler Pre-update middleware * @param handler Pre-update middleware
*/ */
onPostUpdate<T = {}>( onPostUpdate<T = {}>(
handler: ((handled: boolean, update: ParsedUpdate & T, state?: UpdateState<State>) => MaybeAsync<void>) | null, handler:
| ((handled: boolean, update: ParsedUpdate & T, state?: UpdateState<State>) => MaybePromise<void>)
| null,
): void { ): void {
if (handler) this._postUpdateHandler = handler if (handler) this._postUpdateHandler = handler
else this._postUpdateHandler = undefined else this._postUpdateHandler = undefined
@ -647,7 +644,7 @@ export class Dispatcher<State extends object = never> {
* Set error handler that will propagate * Set error handler that will propagate
* the error to the parent dispatcher * the error to the parent dispatcher
*/ */
propagateErrorToParent(err: Error, update: ParsedUpdate, state?: UpdateState<State>): MaybeAsync<boolean> { propagateErrorToParent(err: Error, update: ParsedUpdate, state?: UpdateState<State>): MaybePromise<boolean> {
if (!this.parent) { if (!this.parent) {
throw new MtArgumentError('This dispatcher is not a child') throw new MtArgumentError('This dispatcher is not a child')
} }
@ -912,7 +909,7 @@ export class Dispatcher<State extends object = never> {
* @template S State type, defaults to dispatcher's state type. Only checked at compile-time * @template S State type, defaults to dispatcher's state type. Only checked at compile-time
*/ */
getState<S extends object = State>(object: Parameters<StateKeyDelegate>[0]): Promise<UpdateState<S>> getState<S extends object = State>(object: Parameters<StateKeyDelegate>[0]): Promise<UpdateState<S>>
getState<S extends object = State>(object: string | Parameters<StateKeyDelegate>[0]): MaybeAsync<UpdateState<S>> { getState<S extends object = State>(object: string | Parameters<StateKeyDelegate>[0]): MaybePromise<UpdateState<S>> {
if (!this._storage) { if (!this._storage) {
throw new MtArgumentError('Cannot use getUpdateState() filter without state storage') throw new MtArgumentError('Cannot use getUpdateState() filter without state storage')
} }

View file

@ -1,4 +1,4 @@
import { MaybeArray, MaybeAsync, Message } from '@mtcute/core' import { MaybeArray, MaybePromise, Message } from '@mtcute/core'
import { MessageContext } from '../context/message.js' import { MessageContext } from '../context/message.js'
import { chat } from './chat.js' import { chat } from './chat.js'
@ -51,7 +51,7 @@ export const command = (
const _prefixes = prefixes const _prefixes = prefixes
const check = (msg: MessageContext): MaybeAsync<boolean> => { const check = (msg: MessageContext): MaybePromise<boolean> => {
if (msg.isMessageGroup) return check(msg.messages[0]) if (msg.isMessageGroup) return check(msg.messages[0])
for (const pref of _prefixes) { for (const pref of _prefixes) {

View file

@ -1,4 +1,4 @@
import { MaybeAsync, Message } from '@mtcute/core' import { MaybePromise, Message } from '@mtcute/core'
import { MessageContext } from '../context/message.js' import { MessageContext } from '../context/message.js'
import { Modify, UpdateFilter } from './types.js' import { Modify, UpdateFilter } from './types.js'
@ -26,7 +26,7 @@ export function every<Mod, State extends object>(
const upds = ctx.messages const upds = ctx.messages
const max = upds.length const max = upds.length
const next = (): MaybeAsync<boolean> => { const next = (): MaybePromise<boolean> => {
if (i === max) return true if (i === max) return true
const res = filter(upds[i++], state) const res = filter(upds[i++], state)
@ -67,7 +67,7 @@ export function some<State extends object>(
const upds = ctx.messages const upds = ctx.messages
const max = upds.length const max = upds.length
const next = (): MaybeAsync<boolean> => { const next = (): MaybePromise<boolean> => {
if (i === max) return false if (i === max) return false
const res = filter(upds[i++], state) const res = filter(upds[i++], state)

View file

@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
// ^^ will be looked into in MTQ-29 // ^^ will be looked into in MTQ-29
import { MaybeAsync } from '@mtcute/core' import { MaybePromise } from '@mtcute/core'
import { ExtractBaseMany, ExtractMod, Invert, UnionToIntersection, UpdateFilter } from './types.js' import { ExtractBaseMany, ExtractMod, Invert, UnionToIntersection, UpdateFilter } from './types.js'
@ -160,7 +160,7 @@ export function and(...fns: UpdateFilter<any, any, any>[]): UpdateFilter<any, an
let i = 0 let i = 0
const max = fns.length const max = fns.length
const next = (): MaybeAsync<boolean> => { const next = (): MaybePromise<boolean> => {
if (i === max) return true if (i === max) return true
const res = fns[i++](upd, state) const res = fns[i++](upd, state)
@ -306,7 +306,7 @@ export function or(...fns: UpdateFilter<any, any, any>[]): UpdateFilter<any, any
let i = 0 let i = 0
const max = fns.length const max = fns.length
const next = (): MaybeAsync<boolean> => { const next = (): MaybePromise<boolean> => {
if (i === max) return false if (i === max) return false
const res = fns[i++](upd, state) const res = fns[i++](upd, state)

View file

@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { MaybeAsync } from '@mtcute/core' import { MaybePromise } from '@mtcute/core'
import { UpdateFilter } from './types.js' import { UpdateFilter } from './types.js'
@ -21,7 +21,7 @@ export const stateEmpty: UpdateFilter<any> = async (upd, state) => {
* @param predicate State predicate * @param predicate State predicate
*/ */
export const state = <T extends object>( export const state = <T extends object>(
predicate: (state: T) => MaybeAsync<boolean>, predicate: (state: T) => MaybePromise<boolean>,
// eslint-disable-next-line @typescript-eslint/ban-types // eslint-disable-next-line @typescript-eslint/ban-types
): UpdateFilter<any, {}, T> => { ): UpdateFilter<any, {}, T> => {
return async (upd, state) => { return async (upd, state) => {

View file

@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
// ^^ will be looked into in MTQ-29 // ^^ will be looked into in MTQ-29
import { MaybeAsync } from '@mtcute/core' import { MaybePromise } from '@mtcute/core'
import { UpdateState } from '../state/update-state.js' import { UpdateState } from '../state/update-state.js'
/** /**
@ -78,7 +78,7 @@ import { UpdateState } from '../state/update-state.js'
export type UpdateFilter<Base, Mod = {}, State extends object = never> = ( export type UpdateFilter<Base, Mod = {}, State extends object = never> = (
update: Base, update: Base,
state?: UpdateState<State>, state?: UpdateState<State>,
) => MaybeAsync<boolean> ) => MaybePromise<boolean>
export type Modify<Base, Mod> = Omit<Base, keyof Mod> & Mod export type Modify<Base, Mod> = Omit<Base, keyof Mod> & Mod
export type Invert<Base, Mod> = { export type Invert<Base, Mod> = {

View file

@ -7,7 +7,7 @@ import {
DeleteMessageUpdate, DeleteMessageUpdate,
DeleteStoryUpdate, DeleteStoryUpdate,
HistoryReadUpdate, HistoryReadUpdate,
MaybeAsync, MaybePromise,
PeersIndex, PeersIndex,
PollUpdate, PollUpdate,
PollVoteUpdate, PollVoteUpdate,
@ -39,8 +39,8 @@ export interface BaseUpdateHandler<Name, Handler, Checker> {
export type ParsedUpdateHandler<Name, Update, State = never> = BaseUpdateHandler< export type ParsedUpdateHandler<Name, Update, State = never> = BaseUpdateHandler<
Name, Name,
(update: Update, state: State) => MaybeAsync<void | PropagationAction>, (update: Update, state: State) => MaybePromise<void | PropagationAction>,
(update: Update, state: State) => MaybeAsync<boolean> (update: Update, state: State) => MaybePromise<boolean>
> >
export type RawUpdateHandler = BaseUpdateHandler< export type RawUpdateHandler = BaseUpdateHandler<
@ -49,8 +49,8 @@ export type RawUpdateHandler = BaseUpdateHandler<
client: TelegramClient, client: TelegramClient,
update: tl.TypeUpdate | tl.TypeMessage, update: tl.TypeUpdate | tl.TypeMessage,
peers: PeersIndex, peers: PeersIndex,
) => MaybeAsync<void | PropagationAction>, ) => MaybePromise<void | PropagationAction>,
(client: TelegramClient, update: tl.TypeUpdate | tl.TypeMessage, peers: PeersIndex) => MaybeAsync<boolean> (client: TelegramClient, update: tl.TypeUpdate | tl.TypeMessage, peers: PeersIndex) => MaybePromise<boolean>
> >
// begin-codegen // begin-codegen

View file

@ -1,4 +1,4 @@
import { assertNever, MaybeAsync, Peer } from '@mtcute/core' import { assertNever, MaybePromise, Peer } from '@mtcute/core'
import { CallbackQueryContext, MessageContext } from '../context/index.js' import { CallbackQueryContext, MessageContext } from '../context/index.js'
@ -10,7 +10,7 @@ import { CallbackQueryContext, MessageContext } from '../context/index.js'
* @param msg Message or callback from which to derive the key * @param msg Message or callback from which to derive the key
* @param scene Current scene UID, or `null` if none * @param scene Current scene UID, or `null` if none
*/ */
export type StateKeyDelegate = (upd: MessageContext | CallbackQueryContext | Peer) => MaybeAsync<string | null> export type StateKeyDelegate = (upd: MessageContext | CallbackQueryContext | Peer) => MaybePromise<string | null>
/** /**
* Default state key delegate. * Default state key delegate.

View file

@ -1,4 +1,4 @@
import { MaybeAsync, MemoryStorageDriver } from '@mtcute/core' import { MaybePromise, MemoryStorageDriver } from '@mtcute/core'
import { IStateStorageProvider } from '../provider.js' import { IStateStorageProvider } from '../provider.js'
import { IStateRepository } from '../repository.js' import { IStateRepository } from '../repository.js'
@ -91,15 +91,13 @@ class MemoryStateRepository implements IStateRepository {
return [item.remaining, item.reset] return [item.remaining, item.reset]
} }
resetRateLimit(key: string): MaybeAsync<void> { resetRateLimit(key: string): MaybePromise<void> {
this.rl.delete(key) this.rl.delete(key)
} }
} }
export class MemoryStateStorage implements IStateStorageProvider { export class MemoryStateStorage implements IStateStorageProvider {
constructor( constructor(readonly driver: MemoryStorageDriver = new MemoryStorageDriver()) {}
readonly driver: MemoryStorageDriver = new MemoryStorageDriver(),
) {}
readonly state = new MemoryStateRepository(this.driver) readonly state = new MemoryStateRepository(this.driver)
} }

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '@mtcute/core' import { MaybePromise } from '@mtcute/core'
import type { SqliteStorage, SqliteStorageDriver, Statement } from '@mtcute/sqlite' import type { SqliteStorage, SqliteStorageDriver, Statement } from '@mtcute/sqlite'
import { IStateStorageProvider } from '../provider.js' import { IStateStorageProvider } from '../provider.js'
@ -46,12 +46,12 @@ class SqliteStateRepository implements IStateRepository {
} }
private _setState!: Statement private _setState!: Statement
setState(key: string, state: string, ttl?: number | undefined): MaybeAsync<void> { setState(key: string, state: string, ttl?: number | undefined): MaybePromise<void> {
this._setState.run(key, state, ttl ? Date.now() + ttl * 1000 : undefined) this._setState.run(key, state, ttl ? Date.now() + ttl * 1000 : undefined)
} }
private _getState!: Statement private _getState!: Statement
getState(key: string, now: number): MaybeAsync<string | null> { getState(key: string, now: number): MaybePromise<string | null> {
const res_ = this._getState.get(key) const res_ = this._getState.get(key)
if (!res_) return null if (!res_) return null
const res = res_ as StateDto const res = res_ as StateDto
@ -66,13 +66,13 @@ class SqliteStateRepository implements IStateRepository {
} }
private _deleteState!: Statement private _deleteState!: Statement
deleteState(key: string): MaybeAsync<void> { deleteState(key: string): MaybePromise<void> {
this._deleteState.run(key) this._deleteState.run(key)
} }
private _deleteOldState!: Statement private _deleteOldState!: Statement
private _deleteOldRl!: Statement private _deleteOldRl!: Statement
vacuum(now: number): MaybeAsync<void> { vacuum(now: number): MaybePromise<void> {
this._deleteOldState.run(now) this._deleteOldState.run(now)
this._deleteOldRl.run(now) this._deleteOldRl.run(now)
} }
@ -107,7 +107,7 @@ class SqliteStateRepository implements IStateRepository {
return [val.remaining, val.reset] return [val.remaining, val.reset]
} }
resetRateLimit(key: string): MaybeAsync<void> { resetRateLimit(key: string): MaybePromise<void> {
this._deleteRl.run(key) this._deleteRl.run(key)
} }
} }

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '@mtcute/core' import { MaybePromise } from '@mtcute/core'
/** /**
* Interface for FSM storage for the dispatcher. * Interface for FSM storage for the dispatcher.
@ -19,7 +19,7 @@ export interface IStateRepository {
* *
* @param key Key of the state, as defined by {@link StateKeyDelegate} * @param key Key of the state, as defined by {@link StateKeyDelegate}
*/ */
getState(key: string, now: number): MaybeAsync<string | null> getState(key: string, now: number): MaybePromise<string | null>
/** /**
* Save state to the storage * Save state to the storage
@ -28,21 +28,21 @@ export interface IStateRepository {
* @param state String representing the state * @param state String representing the state
* @param ttl TTL for the state, in seconds * @param ttl TTL for the state, in seconds
*/ */
setState(key: string, state: string, ttl?: number): MaybeAsync<void> setState(key: string, state: string, ttl?: number): MaybePromise<void>
/** /**
* Delete state from the storage * Delete state from the storage
* *
* @param key Key of the state, as defined by {@link StateKeyDelegate} * @param key Key of the state, as defined by {@link StateKeyDelegate}
*/ */
deleteState(key: string): MaybeAsync<void> deleteState(key: string): MaybePromise<void>
/** /**
* Clean up expired states and rate limits. * Clean up expired states and rate limits.
* *
* @param now Current unix time in ms * @param now Current unix time in ms
*/ */
vacuum(now: number): MaybeAsync<void> vacuum(now: number): MaybePromise<void>
/** /**
* Get information about a rate limit. * Get information about a rate limit.
@ -57,12 +57,12 @@ export interface IStateRepository {
* @returns Tuple containing the number of remaining and * @returns Tuple containing the number of remaining and
* unix time in ms when the user can try again * unix time in ms when the user can try again
*/ */
getRateLimit(key: string, now: number, limit: number, window: number): MaybeAsync<[number, number]> getRateLimit(key: string, now: number, limit: number, window: number): MaybePromise<[number, number]>
/** /**
* Reset a rate limit. * Reset a rate limit.
* *
* @param key Key of the rate limit * @param key Key of the rate limit
*/ */
resetRateLimit(key: string): MaybeAsync<void> resetRateLimit(key: string): MaybePromise<void>
} }

View file

@ -1,4 +1,4 @@
import { MaybeAsync } from '@mtcute/core' import { MaybePromise } from '@mtcute/core'
import { MessageContext } from './context/message.js' import { MessageContext } from './context/message.js'
import { Dispatcher } from './dispatcher.js' import { Dispatcher } from './dispatcher.js'
@ -94,7 +94,7 @@ export class WizardScene<State extends object> extends Dispatcher<State & Wizard
handler: ( handler: (
msg: MessageContext, msg: MessageContext,
state: UpdateState<State & WizardInternalState>, state: UpdateState<State & WizardInternalState>,
) => MaybeAsync<WizardSceneAction | number>, ) => MaybePromise<WizardSceneAction | number>,
): void { ): void {
const step = this._steps++ const step = this._steps++

View file

@ -1,4 +1,11 @@
import { BaseTelegramClient, BaseTelegramClientOptions, MaybeAsync, MustEqual, RpcCallOptions, tl } from '@mtcute/core' import {
BaseTelegramClient,
BaseTelegramClientOptions,
MaybePromise,
MustEqual,
RpcCallOptions,
tl,
} from '@mtcute/core'
import { StubMemoryTelegramStorage } from './storage.js' import { StubMemoryTelegramStorage } from './storage.js'
import { StubTelegramTransport } from './transport.js' import { StubTelegramTransport } from './transport.js'
@ -174,7 +181,7 @@ export class StubTelegramClient extends BaseTelegramClient {
respondWith< respondWith<
T extends tl.RpcMethod['_'], T extends tl.RpcMethod['_'],
Fn extends(data: tl.FindByName<tl.RpcMethod, T>) => MaybeAsync<tl.RpcCallReturn[T]>, Fn extends(data: tl.FindByName<tl.RpcMethod, T>) => MaybePromise<tl.RpcCallReturn[T]>,
>(method: T, response: Fn): Fn { >(method: T, response: Fn): Fn {
// eslint-disable-next-line // eslint-disable-next-line
this._responders.set(method, response as any) this._responders.set(method, response as any)
@ -280,7 +287,7 @@ export class StubTelegramClient extends BaseTelegramClient {
// helpers // // helpers //
async with(fn: () => MaybeAsync<void>): Promise<void> { async with(fn: () => MaybePromise<void>): Promise<void> {
await this.connect() await this.connect()
let error: unknown let error: unknown