diff --git a/packages/core/package.json b/packages/core/package.json index eca113cb..d0ddda85 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -8,7 +8,7 @@ "main": "src/index.ts", "type": "module", "scripts": { - "build": "pnpm run -w build-package mtcute", + "build": "pnpm run -w build-package core", "gen-client": "node ./scripts/generate-client.cjs", "gen-updates": "node ./scripts/generate-updates.cjs" }, diff --git a/packages/core/src/highlevel/base.ts b/packages/core/src/highlevel/base.ts index 21636414..6a30db75 100644 --- a/packages/core/src/highlevel/base.ts +++ b/packages/core/src/highlevel/base.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/require-await */ import { tl } from '@mtcute/tl' import { MtClient, MtClientOptions } from '../network/client.js' @@ -5,7 +6,14 @@ import { ConnectionKind, RpcCallOptions } from '../network/network-manager.js' import { StorageManagerExtraOptions } from '../storage/storage.js' import { MtArgumentError } from '../types/errors.js' import { MustEqual } from '../types/utils.js' -import { asyncResettable, computeNewPasswordHash, computeSrpParams, readStringSession, StringSessionData, writeStringSession } from '../utils/index.js' +import { + asyncResettable, + computeNewPasswordHash, + computeSrpParams, + readStringSession, + StringSessionData, + writeStringSession, +} from '../utils/index.js' import { LogManager } from '../utils/logger.js' import { ITelegramClient } from './client.types.js' import { ITelegramStorageProvider } from './storage/provider.js' @@ -29,7 +37,7 @@ export class BaseTelegramClient implements ITelegramClient { this._serverUpdatesHandler = this.updates.handleUpdate.bind(this.updates) } - this.mt.on('update', (update) => { + this.mt.on('update', (update: tl.TypeUpdates) => { this._serverUpdatesHandler(update) }) } @@ -272,16 +280,10 @@ export class BaseTelegramClient implements ITelegramClient { return this.mt.network.getPrimaryDcId() } - computeSrpParams( - request: tl.account.RawPassword, - password: string, - ): Promise { + computeSrpParams(request: tl.account.RawPassword, password: string): Promise { return computeSrpParams(this.crypto, request, password) } - computeNewPasswordHash( - algo: tl.TypePasswordKdfAlgo, - password: string, - ): Promise { + computeNewPasswordHash(algo: tl.TypePasswordKdfAlgo, password: string): Promise { return computeNewPasswordHash(this.crypto, algo, password) } } diff --git a/packages/core/src/highlevel/client.ts b/packages/core/src/highlevel/client.ts index c0534745..38221542 100644 --- a/packages/core/src/highlevel/client.ts +++ b/packages/core/src/highlevel/client.ts @@ -4917,7 +4917,7 @@ export interface TelegramClient extends ITelegramClient { * **Available**: ✅ both users and bots * */ - getMyUsername(): string | null + getMyUsername(): Promise /** * Get a single profile picture of a user by its ID * diff --git a/packages/core/src/highlevel/methods/messages/send-text.test.ts b/packages/core/src/highlevel/methods/messages/send-text.test.ts index 7066817a..bcf44d99 100644 --- a/packages/core/src/highlevel/methods/messages/send-text.test.ts +++ b/packages/core/src/highlevel/methods/messages/send-text.test.ts @@ -103,7 +103,7 @@ describe('sendText', () => { it('should correctly handle updateShortSentMessage with cached peer', async () => { const client = new StubTelegramClient() - client.storage.self.store({ + await client.storage.self.store({ userId: stubUser.id, isBot: false, isPremium: false, @@ -132,7 +132,7 @@ describe('sendText', () => { it('should correctly handle updateShortSentMessage without cached peer', async () => { const client = new StubTelegramClient() - client.storage.self.store({ + await client.storage.self.store({ userId: stubUser.id, isBot: false, isPremium: false, diff --git a/packages/core/src/highlevel/methods/users/get-my-username.ts b/packages/core/src/highlevel/methods/users/get-my-username.ts index c654d1a3..1f78faa9 100644 --- a/packages/core/src/highlevel/methods/users/get-my-username.ts +++ b/packages/core/src/highlevel/methods/users/get-my-username.ts @@ -6,7 +6,6 @@ import { ITelegramClient } from '../../client.types.js' * This method uses locally available information and * does not call any API methods. */ -export function getMyUsername(client: ITelegramClient): string | null { - throw new Error('Not implemented') - // return getAuthState(client).selfUsername +export async function getMyUsername(client: ITelegramClient): Promise { + return client.storage.self.fetch().then((self) => self?.usernames[0] ?? null) } diff --git a/packages/core/src/highlevel/methods/users/set-my-username.ts b/packages/core/src/highlevel/methods/users/set-my-username.ts index 72b8524b..15a2bb2f 100644 --- a/packages/core/src/highlevel/methods/users/set-my-username.ts +++ b/packages/core/src/highlevel/methods/users/set-my-username.ts @@ -17,7 +17,7 @@ export async function setMyUsername(client: ITelegramClient, username: string | username, }) - client.storage.self.update({ username }) + await client.storage.self.update({ username }) return new User(res) } diff --git a/packages/core/src/highlevel/storage/service/current-user.ts b/packages/core/src/highlevel/storage/service/current-user.ts index eb96443f..6b9a9a32 100644 --- a/packages/core/src/highlevel/storage/service/current-user.ts +++ b/packages/core/src/highlevel/storage/service/current-user.ts @@ -63,7 +63,7 @@ function parse(data: Uint8Array): CurrentUserInfo | null { if (flags & 2) { const len = reader.int() - usernames = new Array(len) + usernames = new Array(len) for (let i = 0; i < len; i++) { usernames[i] = reader.string() @@ -143,11 +143,7 @@ export class CurrentUserService extends BaseService { return this._cached } - async update(params: { - username?: string - usernames?: string[] - isPremium?: boolean - }): Promise { + async update(params: { username?: string; usernames?: string[]; isPremium?: boolean }): Promise { const info = await this.fetch() if (!info) return diff --git a/packages/core/src/highlevel/worker/errors.ts b/packages/core/src/highlevel/worker/errors.ts index 7c650c29..288f15d0 100644 --- a/packages/core/src/highlevel/worker/errors.ts +++ b/packages/core/src/highlevel/worker/errors.ts @@ -94,7 +94,7 @@ export function deserializeError(error: SerializedError): Error { for (const key in custom) { if (key === 'code' || key === 'text') continue // @ts-expect-error lol - err2[key] = custom[key] + err2[key] = custom[key] // eslint-disable-line } break } diff --git a/packages/core/src/highlevel/worker/invoker.ts b/packages/core/src/highlevel/worker/invoker.ts index a2b644cf..424a5d89 100644 --- a/packages/core/src/highlevel/worker/invoker.ts +++ b/packages/core/src/highlevel/worker/invoker.ts @@ -8,14 +8,9 @@ export class WorkerInvoker { constructor(private send: SendFn) {} private _nextId = 0 - private _pending = new Map>() + private _pending = new Map() - private _invoke( - target: InvokeTarget, - method: string, - args: unknown[], - isVoid: boolean, - ) { + private _invoke(target: InvokeTarget, method: string, args: unknown[], isVoid: boolean) { const id = this._nextId++ this.send({ @@ -36,15 +31,12 @@ export class WorkerInvoker { } } - invoke( - target: InvokeTarget, - method: string, - args: unknown[], - ): Promise { + invoke(target: InvokeTarget, method: string, args: unknown[]): Promise { return this._invoke(target, method, args, false) as Promise } invokeVoid(target: InvokeTarget, method: string, args: unknown[]): void { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._invoke(target, method, args, true) } diff --git a/packages/core/src/highlevel/worker/platform/connect.web.ts b/packages/core/src/highlevel/worker/platform/connect.web.ts index b77e468a..b22db3b0 100644 --- a/packages/core/src/highlevel/worker/platform/connect.web.ts +++ b/packages/core/src/highlevel/worker/platform/connect.web.ts @@ -6,6 +6,7 @@ export function connectToWorker(worker: SomeWorker, handler: ClientMessageHandle const send: SendFn = worker.postMessage.bind(worker) const messageHandler = (ev: MessageEvent) => { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument handler(ev.data) } @@ -37,6 +38,7 @@ export function connectToWorker(worker: SomeWorker, handler: ClientMessageHandle return } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument handler(ev.data) } diff --git a/packages/core/src/highlevel/worker/platform/register.ts b/packages/core/src/highlevel/worker/platform/register.ts index b64091a3..f680a46e 100644 --- a/packages/core/src/highlevel/worker/platform/register.ts +++ b/packages/core/src/highlevel/worker/platform/register.ts @@ -16,6 +16,7 @@ export function registerWorker(handler: WorkerMessageHandler): RespondFn { const respond: RespondFn = port.postMessage.bind(port) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument parentPort.on('message', (message) => handler(message, respond)) return respond diff --git a/packages/core/src/highlevel/worker/platform/register.web.ts b/packages/core/src/highlevel/worker/platform/register.web.ts index 196f0019..3e55208c 100644 --- a/packages/core/src/highlevel/worker/platform/register.web.ts +++ b/packages/core/src/highlevel/worker/platform/register.web.ts @@ -10,6 +10,7 @@ export function registerWorker(handler: WorkerMessageHandler): RespondFn { if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) { const respond: RespondFn = self.postMessage.bind(self) + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument self.addEventListener('message', (message) => handler(message.data, respond)) return respond @@ -53,7 +54,7 @@ export function registerWorker(handler: WorkerMessageHandler): RespondFn { // so even if the browser has suspended the timers, we should still get a ping within a minute let timeout = setTimeout(onTimeout, 60000) - port.addEventListener('message', async (message) => { + port.addEventListener('message', (message) => { if (message.data.__type__ === 'close') { onClose() @@ -67,6 +68,7 @@ export function registerWorker(handler: WorkerMessageHandler): RespondFn { return } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument handler(message.data, respond) }) } diff --git a/packages/core/src/highlevel/worker/port.ts b/packages/core/src/highlevel/worker/port.ts index 2b0a6db4..f3fbd6cd 100644 --- a/packages/core/src/highlevel/worker/port.ts +++ b/packages/core/src/highlevel/worker/port.ts @@ -72,14 +72,11 @@ export class TelegramWorkerPort implements I this._destroyed = true if (terminate && 'terminate' in this.options.worker) { - this.options.worker.terminate() + Promise.resolve(this.options.worker.terminate()).catch(() => {}) } } - invokeCustom( - method: T, - ...args: Parameters - ): Promise> { + invokeCustom(method: T, ...args: Parameters): Promise> { return this._invoker.invoke('custom', method as string, args) as Promise> } diff --git a/packages/core/src/highlevel/worker/worker.ts b/packages/core/src/highlevel/worker/worker.ts index 06eb89a0..33513946 100644 --- a/packages/core/src/highlevel/worker/worker.ts +++ b/packages/core/src/highlevel/worker/worker.ts @@ -45,6 +45,7 @@ export function makeTelegramWorker(params: Telegr } } + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const method = target[msg.method] if (!method) { @@ -57,6 +58,7 @@ export function makeTelegramWorker(params: Telegr return } + // eslint-disable-next-line @typescript-eslint/no-unsafe-call Promise.resolve(method.apply(target, msg.args)) .then((res) => { if (msg.void) return diff --git a/packages/core/src/storage/providers/idb/idb.test.ts b/packages/core/src/storage/providers/idb/idb.test.ts index bf6b0ded..a05ddde3 100644 --- a/packages/core/src/storage/providers/idb/idb.test.ts +++ b/packages/core/src/storage/providers/idb/idb.test.ts @@ -1,9 +1,12 @@ import { afterAll, beforeAll, describe } from 'vitest' -import { testPeersRepository } from '../../../highlevel/storage/repository/peers.test-utils.js' -import { testRefMessagesRepository } from '../../../highlevel/storage/repository/ref-messages.test-utils.js' -import { testAuthKeysRepository } from '../../repository/auth-keys.test-utils.js' -import { testKeyValueRepository } from '../../repository/key-value.test-utils.js' +import { + testAuthKeysRepository, + testKeyValueRepository, + testPeersRepository, + testRefMessagesRepository, +} from '@mtcute/test' + import { IdbStorage } from './index.js' if (import.meta.env.TEST_ENV === 'browser') { @@ -20,7 +23,7 @@ if (import.meta.env.TEST_ENV === 'browser') { testRefMessagesRepository(storage.refMessages, storage.driver) afterAll(async () => { - storage.driver.destroy() + await storage.driver.destroy() const req = indexedDB.deleteDatabase(idbName) await new Promise((resolve, reject) => { diff --git a/packages/core/src/storage/providers/idb/repository/auth-keys.ts b/packages/core/src/storage/providers/idb/repository/auth-keys.ts index daad181e..a2fb7474 100644 --- a/packages/core/src/storage/providers/idb/repository/auth-keys.ts +++ b/packages/core/src/storage/providers/idb/repository/auth-keys.ts @@ -39,7 +39,7 @@ export class IdbAuthKeysRepository implements IAuthKeysRepository { async get(dc: number): Promise { const os = this.os() - const it = await reqToPromise(os.get(dc)) + const it = await reqToPromise(os.get(dc) as IDBRequest) if (it === undefined) return null return it.key @@ -61,7 +61,7 @@ export class IdbAuthKeysRepository implements IAuthKeysRepository { async getTemp(dc: number, idx: number, now: number): Promise { const os = this.osTemp() - const row = await reqToPromise(os.get([dc, idx])) + const row = await reqToPromise(os.get([dc, idx]) as IDBRequest) if (row === undefined || row.expiresAt! < now) return null diff --git a/packages/core/src/storage/providers/idb/repository/kv.ts b/packages/core/src/storage/providers/idb/repository/kv.ts index 813a05d8..94e58b5f 100644 --- a/packages/core/src/storage/providers/idb/repository/kv.ts +++ b/packages/core/src/storage/providers/idb/repository/kv.ts @@ -25,7 +25,7 @@ export class IdbKvRepository implements IKeyValueRepository { async get(key: string): Promise { const os = this.os() - const res = await reqToPromise(os.get(key)) + const res = await reqToPromise(os.get(key) as IDBRequest) if (res === undefined) return null return res.value diff --git a/packages/core/src/storage/providers/idb/repository/peers.ts b/packages/core/src/storage/providers/idb/repository/peers.ts index 4197a3f7..010a27d1 100644 --- a/packages/core/src/storage/providers/idb/repository/peers.ts +++ b/packages/core/src/storage/providers/idb/repository/peers.ts @@ -22,19 +22,21 @@ export class IdbPeersRepository implements IPeersRepository { } async getById(id: number): Promise { - const it = await reqToPromise(this.os().get(id)) + const it = await reqToPromise(this.os().get(id) as IDBRequest) return it ?? null } async getByUsername(username: string): Promise { - const it = await reqToPromise(this.os().index('by_username').get(username)) + const it = await reqToPromise( + this.os().index('by_username').get(username) as IDBRequest, + ) return it ?? null } async getByPhone(phone: string): Promise { - const it = await reqToPromise(this.os().index('by_phone').get(phone)) + const it = await reqToPromise(this.os().index('by_phone').get(phone) as IDBRequest) return it ?? null } diff --git a/packages/core/src/storage/providers/idb/repository/ref-messages.ts b/packages/core/src/storage/providers/idb/repository/ref-messages.ts index 276ab833..b7c18a17 100644 --- a/packages/core/src/storage/providers/idb/repository/ref-messages.ts +++ b/packages/core/src/storage/providers/idb/repository/ref-messages.ts @@ -33,7 +33,7 @@ export class IdbRefMsgRepository implements IReferenceMessagesRepository { const os = this.os() const index = os.index('by_peer') - const it = await reqToPromise(index.get(peerId)) + const it = await reqToPromise(index.get(peerId) as IDBRequest) if (!it) return null return [it.chatId, it.msgId] diff --git a/packages/core/src/storage/providers/memory/memory.test.ts b/packages/core/src/storage/providers/memory/memory.test.ts index 36c889c8..03b6a2b8 100644 --- a/packages/core/src/storage/providers/memory/memory.test.ts +++ b/packages/core/src/storage/providers/memory/memory.test.ts @@ -1,9 +1,12 @@ import { describe } from 'vitest' -import { testPeersRepository } from '../../../highlevel/storage/repository/peers.test-utils.js' -import { testRefMessagesRepository } from '../../../highlevel/storage/repository/ref-messages.test-utils.js' -import { testAuthKeysRepository } from '../../repository/auth-keys.test-utils.js' -import { testKeyValueRepository } from '../../repository/key-value.test-utils.js' +import { + testAuthKeysRepository, + testKeyValueRepository, + testPeersRepository, + testRefMessagesRepository, +} from '@mtcute/test' + import { MemoryStorage } from './index.js' describe('memory storage', () => { diff --git a/packages/core/src/storage/repository/index.ts b/packages/core/src/storage/repository/index.ts index 613574b8..e21bb0df 100644 --- a/packages/core/src/storage/repository/index.ts +++ b/packages/core/src/storage/repository/index.ts @@ -1,4 +1,2 @@ -export * from '../../highlevel/storage/repository/peers.js' -export * from '../../highlevel/storage/repository/ref-messages.js' export * from './auth-keys.js' export * from './key-value.js' diff --git a/packages/core/src/storage/service/auth-keys.test.ts b/packages/core/src/storage/service/auth-keys.test.ts index 405a1732..f8d8d22d 100644 --- a/packages/core/src/storage/service/auth-keys.test.ts +++ b/packages/core/src/storage/service/auth-keys.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi } from 'vitest' -import { fakeAuthKeysRepository } from '../repository/auth-keys.test-utils.js' -import { fakeKeyValueRepository } from '../repository/key-value.test-utils.js' +import { fakeAuthKeysRepository, fakeKeyValueRepository } from '@mtcute/test' + import { AuthKeysService } from './auth-keys.js' import { FutureSaltsService } from './future-salts.js' import { testServiceOptions } from './utils.test-utils.js' diff --git a/packages/core/src/storage/service/updates.test.ts b/packages/core/src/storage/service/updates.test.ts index 82c3e699..ad8c9bcf 100644 --- a/packages/core/src/storage/service/updates.test.ts +++ b/packages/core/src/storage/service/updates.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it, vi } from 'vitest' -import { fakeKeyValueRepository } from '../repository/key-value.test-utils.js' +import { fakeKeyValueRepository } from '@mtcute/test' + import { UpdatesStateService } from '../../highlevel/storage/service/updates.js' import { testServiceOptions } from './utils.test-utils.js' @@ -73,10 +74,7 @@ describe('updates state service', () => { it('should write to updates_channel:xxx key', async () => { await service.setChannelPts(123, 0x04030201) - expect(kv.set).toHaveBeenCalledWith( - 'updates_channel:123', - new Uint8Array([1, 2, 3, 4]), - ) + expect(kv.set).toHaveBeenCalledWith('updates_channel:123', new Uint8Array([1, 2, 3, 4])) }) }) }) diff --git a/packages/core/src/storage/storage.ts b/packages/core/src/storage/storage.ts index 427c02ac..ad6f96fb 100644 --- a/packages/core/src/storage/storage.ts +++ b/packages/core/src/storage/storage.ts @@ -62,7 +62,9 @@ export class StorageManager { this.driver.setup?.(this.log) if (this.options.cleanup ?? true) { - this._cleanupRestore = beforeExit(() => this._destroy().catch((err) => this.log.error(err))) + this._cleanupRestore = beforeExit(() => { + this._destroy().catch((err) => this.log.error('cleanup error: %s', err)) + }) } await this.driver.load?.() diff --git a/packages/core/src/utils/function-utils.ts b/packages/core/src/utils/function-utils.ts index 32a6a49d..9844ec5d 100644 --- a/packages/core/src/utils/function-utils.ts +++ b/packages/core/src/utils/function-utils.ts @@ -51,8 +51,9 @@ export function asyncResettable Promise>(func: return runningPromise } + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument runningPromise = func(...args) - runningPromise.then(() => { + void runningPromise.then(() => { runningPromise = null finished = true }) diff --git a/packages/core/src/utils/string-session.test.ts b/packages/core/src/utils/string-session.test.ts index 767b9d6e..b2f7faca 100644 --- a/packages/core/src/utils/string-session.test.ts +++ b/packages/core/src/utils/string-session.test.ts @@ -125,7 +125,12 @@ describe('readStringSession', () => { testMode: false, primaryDcs: stubDcs, authKey: stubAuthKey, - self: { userId: 12345, isBot: false }, + self: { + userId: 12345, + isBot: false, + isPremium: false, + usernames: [], + }, }) }) @@ -140,7 +145,12 @@ describe('readStringSession', () => { testMode: true, primaryDcs: stubDcs, authKey: stubAuthKey, - self: { userId: 12345, isBot: false }, + self: { + userId: 12345, + isBot: false, + isPremium: false, + usernames: [], + }, }) }) }) @@ -158,7 +168,12 @@ describe('readStringSession', () => { // v1 didn't have separate media dc primaryDcs: stubDcsSameMedia, authKey: stubAuthKey, - self: { userId: 12345, isBot: false }, + self: { + userId: 12345, + isBot: false, + isPremium: false, + usernames: [], + }, }) }) }) diff --git a/packages/dispatcher/src/callback-data-builder.test.ts b/packages/dispatcher/src/callback-data-builder.test.ts index a3e156f6..5275515e 100644 --- a/packages/dispatcher/src/callback-data-builder.test.ts +++ b/packages/dispatcher/src/callback-data-builder.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' -import { CallbackQuery, MtArgumentError, PeersIndex } from '@mtcute/client' -import { utf8EncodeToBuffer } from '@mtcute/client/utils.js' +import { CallbackQuery, MtArgumentError, PeersIndex } from '@mtcute/core' +import { utf8EncodeToBuffer } from '@mtcute/core/utils.js' import { createStub } from '@mtcute/test' import { CallbackDataBuilder } from './callback-data-builder.js' diff --git a/packages/dispatcher/src/filters/bots.test.ts b/packages/dispatcher/src/filters/bots.test.ts index 5c6e3b09..6982af5a 100644 --- a/packages/dispatcher/src/filters/bots.test.ts +++ b/packages/dispatcher/src/filters/bots.test.ts @@ -20,12 +20,12 @@ describe('filters.command', () => { const ctx = createMessageContext({ message: text, }) - // todo - // ctx.client.getAuthState = () => ({ - // isBot: true, - // userId: 0, - // selfUsername: 'testbot', - // }) + void ctx.client.storage.self.store({ + isBot: true, + isPremium: false, + userId: 0, + usernames: ['testbot'], + }) // eslint-disable-next-line if (command(...params)(ctx)) return (ctx as any).command @@ -39,11 +39,10 @@ describe('filters.command', () => { expect(getParsedCommand('/start', ['start', 'stop'])).toEqual(['start']) }) - // todo - // it('should only parse commands to the current bot', () => { - // expect(getParsedCommand('/start@testbot', 'start')).toEqual(['start']) - // expect(getParsedCommand('/start@otherbot', 'start')).toEqual(null) - // }) + it('should only parse commands to the current bot', () => { + expect(getParsedCommand('/start@testbot', 'start')).toEqual(['start']) + expect(getParsedCommand('/start@otherbot', 'start')).toEqual(null) + }) it('should parse command arguments', () => { expect(getParsedCommand('/start foo bar baz', 'start')).toEqual(['start', 'foo', 'bar', 'baz']) diff --git a/packages/dispatcher/src/state/service.ts b/packages/dispatcher/src/state/service.ts index a49b5a61..da74b227 100644 --- a/packages/dispatcher/src/state/service.ts +++ b/packages/dispatcher/src/state/service.ts @@ -18,15 +18,14 @@ export class StateService { async load() { await this._load.run() this._vacuumTimer = setInterval(() => { - Promise.resolve(this.provider.state.vacuum(Date.now())) - .catch(() => {}) + Promise.resolve(this.provider.state.vacuum(Date.now())).catch(() => {}) }, 300_000) } async destroy() { await this.provider.driver.save?.() await this.provider.driver.destroy?.() - clearInterval(this._vacuumTimer!) + clearInterval(this._vacuumTimer) this._loaded = false } diff --git a/packages/dispatcher/tests/dispatcher.test.ts b/packages/dispatcher/tests/dispatcher.test.ts index 269cf6b0..5299b10e 100644 --- a/packages/dispatcher/tests/dispatcher.test.ts +++ b/packages/dispatcher/tests/dispatcher.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { PeersIndex, TelegramClient } from '@mtcute/client' +import { PeersIndex, TelegramClient } from '@mtcute/core' import { Dispatcher, PropagationAction } from '../src/index.js' diff --git a/packages/html-parser/src/html-parser.test.ts b/packages/html-parser/src/html-parser.test.ts index 6d8e82d8..d159375b 100644 --- a/packages/html-parser/src/html-parser.test.ts +++ b/packages/html-parser/src/html-parser.test.ts @@ -1,7 +1,7 @@ import Long from 'long' import { describe, expect, it } from 'vitest' -import { MessageEntity, TextWithEntities, tl } from '@mtcute/client' +import { MessageEntity, TextWithEntities, tl } from '@mtcute/core' // prettier has "html" special-cased which breaks the formatting // this is not an issue when using normally, since we properly handle newlines/spaces, diff --git a/packages/i18n/tests/i18n.test.ts b/packages/i18n/tests/i18n.test.ts index 97d99b01..35d98278 100644 --- a/packages/i18n/tests/i18n.test.ts +++ b/packages/i18n/tests/i18n.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { Message, PeersIndex } from '@mtcute/client' +import { Message, PeersIndex } from '@mtcute/core' import { MessageContext } from '@mtcute/dispatcher' import { createMtcuteI18n, OtherLanguageWrap } from '../src/index.js' diff --git a/packages/markdown-parser/src/markdown-parser.test.ts b/packages/markdown-parser/src/markdown-parser.test.ts index b12f50b7..45a13c39 100644 --- a/packages/markdown-parser/src/markdown-parser.test.ts +++ b/packages/markdown-parser/src/markdown-parser.test.ts @@ -1,7 +1,7 @@ import Long from 'long' import { describe, expect, it } from 'vitest' -import { MessageEntity, TextWithEntities, tl } from '@mtcute/client' +import { MessageEntity, TextWithEntities, tl } from '@mtcute/core' // md is special cased in prettier, we don't want that here import { md as md_ } from './index.js' diff --git a/packages/sqlite/src/repository/peers.ts b/packages/sqlite/src/repository/peers.ts index 0cfb65dc..cab6e23e 100644 --- a/packages/sqlite/src/repository/peers.ts +++ b/packages/sqlite/src/repository/peers.ts @@ -18,7 +18,7 @@ function mapPeerDto(dto: PeerDto): IPeersRepository.PeerInfo { return { id: dto.id, accessHash: dto.hash, - usernames: JSON.parse(dto.usernames), + usernames: JSON.parse(dto.usernames) as string[], updated: dto.updated, phone: dto.phone || undefined, complete: dto.complete, @@ -47,7 +47,9 @@ export class SqlitePeersRepository implements IPeersRepository { ) this._getById = db.prepare('select * from peers where id = ?') - this._getByUsername = db.prepare('select * from peers where exists (select 1 from json_each(usernames) where value = ?)') + this._getByUsername = db.prepare( + 'select * from peers where exists (select 1 from json_each(usernames) where value = ?)', + ) this._getByPhone = db.prepare('select * from peers where phone = ?') this._delAll = db.prepare('delete from peers') diff --git a/packages/sqlite/test/sqlite.test.ts b/packages/sqlite/test/sqlite.test.ts index bfa6c060..c3709f8e 100644 --- a/packages/sqlite/test/sqlite.test.ts +++ b/packages/sqlite/test/sqlite.test.ts @@ -1,10 +1,12 @@ import { afterAll, beforeAll, describe } from 'vitest' -import { testAuthKeysRepository } from '@mtcute/core/src/storage/repository/auth-keys.test-utils.js' -import { testKeyValueRepository } from '@mtcute/core/src/storage/repository/key-value.test-utils.js' -import { testPeersRepository } from '@mtcute/core/src/storage/repository/peers.test-utils.js' -import { testRefMessagesRepository } from '@mtcute/core/src/storage/repository/ref-messages.test-utils.js' import { LogManager } from '@mtcute/core/utils.js' +import { + testAuthKeysRepository, + testKeyValueRepository, + testPeersRepository, + testRefMessagesRepository, +} from '@mtcute/test' import { SqliteStorage } from '../src/index.js' @@ -12,9 +14,9 @@ if (import.meta.env.TEST_ENV === 'node') { describe('SqliteStorage', () => { const storage = new SqliteStorage(':memory:') - beforeAll(() => { + beforeAll(async () => { storage.driver.setup(new LogManager()) - storage.driver.load() + await storage.driver.load() }) testAuthKeysRepository(storage.authKeys) diff --git a/packages/test/src/client.ts b/packages/test/src/client.ts index 9ba350d0..a2913fa6 100644 --- a/packages/test/src/client.ts +++ b/packages/test/src/client.ts @@ -24,6 +24,7 @@ export class StubTelegramClient extends BaseTelegramClient { apiHash: '', logLevel: 0, storage, + disableUpdates: true, transport: () => { const transport = new StubTelegramTransport({ onMessage: (data) => { @@ -279,15 +280,8 @@ export class StubTelegramClient extends BaseTelegramClient { // helpers // - async connectAndWait() { - await this.connect() - await new Promise((resolve): void => { - this.mt.once('usable', resolve) - }) - } - async with(fn: () => MaybeAsync): Promise { - await this.connectAndWait() + await this.connect() let error: unknown diff --git a/packages/test/src/index.ts b/packages/test/src/index.ts index fbf0617c..e563c9ba 100644 --- a/packages/test/src/index.ts +++ b/packages/test/src/index.ts @@ -1,7 +1,7 @@ export * from './client.js' export * from './crypto.js' export * from './storage.js' -// export * from './storage-test.js' // todo +export * from './storage/index.js' export * from './stub.js' export * from './transport.js' export * from './types.js' diff --git a/packages/core/src/storage/repository/auth-keys.test-utils.ts b/packages/test/src/storage/auth-keys.ts similarity index 98% rename from packages/core/src/storage/repository/auth-keys.test-utils.ts rename to packages/test/src/storage/auth-keys.ts index 23a85a61..74c0510a 100644 --- a/packages/core/src/storage/repository/auth-keys.test-utils.ts +++ b/packages/test/src/storage/auth-keys.ts @@ -1,6 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' -import { IAuthKeysRepository } from './auth-keys.js' +import { IAuthKeysRepository } from '@mtcute/core' export function fakeAuthKeysRepository(): IAuthKeysRepository { return { diff --git a/packages/test/src/storage/index.ts b/packages/test/src/storage/index.ts new file mode 100644 index 00000000..03df2e41 --- /dev/null +++ b/packages/test/src/storage/index.ts @@ -0,0 +1,4 @@ +export * from './auth-keys.js' +export * from './key-value.js' +export * from './peers.js' +export * from './ref-messages.js' diff --git a/packages/core/src/storage/repository/key-value.test-utils.ts b/packages/test/src/storage/key-value.ts similarity index 93% rename from packages/core/src/storage/repository/key-value.test-utils.ts rename to packages/test/src/storage/key-value.ts index 13b66c01..e2537c50 100644 --- a/packages/core/src/storage/repository/key-value.test-utils.ts +++ b/packages/test/src/storage/key-value.ts @@ -1,7 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' -import { IStorageDriver } from '../driver.js' -import { IKeyValueRepository } from './key-value.js' +import { IKeyValueRepository, IStorageDriver } from '@mtcute/core' export function fakeKeyValueRepository(): IKeyValueRepository { return { diff --git a/packages/core/src/highlevel/storage/repository/peers.test-utils.ts b/packages/test/src/storage/peers.ts similarity index 88% rename from packages/core/src/highlevel/storage/repository/peers.test-utils.ts rename to packages/test/src/storage/peers.ts index 59f875e4..763c802b 100644 --- a/packages/core/src/highlevel/storage/repository/peers.test-utils.ts +++ b/packages/test/src/storage/peers.ts @@ -1,11 +1,10 @@ import { describe, expect, it, vi } from 'vitest' -import { createStub } from '@mtcute/test' +import { IPeersRepository, IStorageDriver } from '@mtcute/core' +import { TlBinaryWriter } from '@mtcute/core/utils.js' import { __tlWriterMap } from '@mtcute/tl/binary/writer.js' -import { TlBinaryWriter } from '@mtcute/tl-runtime' -import { IStorageDriver } from '../../../storage/driver.js' -import { IPeersRepository } from './peers.js' +import { createStub } from '../stub.js' export function fakePeersRepository(): IPeersRepository { return { @@ -56,8 +55,8 @@ export function testPeersRepository(repo: IPeersRepository, driver: IStorageDriv }) it('should store and retrieve peers', async () => { - repo.store(stubPeerUser) - repo.store(stubPeerChannel) + await repo.store(stubPeerUser) + await repo.store(stubPeerChannel) await driver.save?.() expect(fixPeerInfo(await repo.getById(123123))).toEqual(stubPeerUser) @@ -69,11 +68,11 @@ export function testPeersRepository(repo: IPeersRepository, driver: IStorageDriv }) it('should update peers usernames', async () => { - repo.store(stubPeerUser) + await repo.store(stubPeerUser) await driver.save?.() const modUser = { ...stubPeerUser, usernames: ['some_user2'] } - repo.store(modUser) + await repo.store(modUser) await driver.save?.() expect(fixPeerInfo(await repo.getById(123123))).toEqual(modUser) diff --git a/packages/core/src/highlevel/storage/repository/ref-messages.test-utils.ts b/packages/test/src/storage/ref-messages.ts similarity index 86% rename from packages/core/src/highlevel/storage/repository/ref-messages.test-utils.ts rename to packages/test/src/storage/ref-messages.ts index b8ffc5de..785690f2 100644 --- a/packages/core/src/highlevel/storage/repository/ref-messages.test-utils.ts +++ b/packages/test/src/storage/ref-messages.ts @@ -1,7 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' -import { IStorageDriver } from '../../../storage/driver.js' -import { IReferenceMessagesRepository } from './ref-messages.js' +import { IReferenceMessagesRepository, IStorageDriver } from '@mtcute/core' export function fakeRefMessagesRepository(): IReferenceMessagesRepository { return { @@ -27,7 +26,10 @@ export function testRefMessagesRepository(repo: IReferenceMessagesRepository, dr await repo.store(2, 6, 7) await driver.save?.() - expect(await repo.getByPeer(1)).deep.oneOf([[2, 3], [4, 5]]) + expect(await repo.getByPeer(1)).deep.oneOf([ + [2, 3], + [4, 5], + ]) expect(await repo.getByPeer(2)).toEqual([6, 7]) expect(await repo.getByPeer(3)).toEqual(null) expect(await repo.getByPeer(4)).toEqual(null) @@ -64,7 +66,11 @@ export function testRefMessagesRepository(repo: IReferenceMessagesRepository, dr await repo.deleteByPeer(1) await driver.save?.() expect(await repo.getByPeer(1)).toEqual(null) - expect(await repo.getByPeer(2)).deep.oneOf([[20, 30], [40, 50], [60, 70]]) + expect(await repo.getByPeer(2)).deep.oneOf([ + [20, 30], + [40, 50], + [60, 70], + ]) }) }) } diff --git a/packages/test/src/transport.ts b/packages/test/src/transport.ts index 47aecfdf..562469d4 100644 --- a/packages/test/src/transport.ts +++ b/packages/test/src/transport.ts @@ -1,8 +1,8 @@ import EventEmitter from 'events' -import { tl } from '@mtcute/tl' import { ITelegramTransport, TransportState } from '@mtcute/core' import { ICryptoProvider, Logger } from '@mtcute/core/utils.js' +import { tl } from '@mtcute/tl' export class StubTelegramTransport extends EventEmitter implements ITelegramTransport { constructor( diff --git a/packages/tl/scripts/fetch-api.ts b/packages/tl/scripts/fetch-api.ts index 295215a3..0a0b85a9 100644 --- a/packages/tl/scripts/fetch-api.ts +++ b/packages/tl/scripts/fetch-api.ts @@ -9,6 +9,7 @@ import { readFile, writeFile } from 'fs/promises' import { join } from 'path' import * as readline from 'readline' +import { hasPresentKey, isPresent } from '@mtcute/core/utils.js' import { generateTlSchemasDifference, mergeTlEntries, @@ -19,7 +20,6 @@ import { TlFullSchema, writeTlEntryToString, } from '@mtcute/tl-utils' -import { hasPresentKey, isPresent } from '@mtcute/core/utils.js' import { __dirname,