diff --git a/packages/client/src/client.ts b/packages/client/src/client.ts index 13243e24..cedd949a 100644 --- a/packages/client/src/client.ts +++ b/packages/client/src/client.ts @@ -3478,14 +3478,14 @@ export class TelegramClient extends BaseTelegramClient { protected _parseModes: Record protected _defaultParseMode: string | null protected _updLock: AsyncLock - protected _pts: number - protected _date: number - protected _seq: number - protected _oldPts: number - protected _oldDate: number - protected _oldSeq: number + protected _pts?: number + protected _date?: number + protected _seq?: number + protected _oldPts?: number + protected _oldDate?: number + protected _oldSeq?: number protected _selfChanged: boolean - protected _catchUpChannels: boolean + protected _catchUpChannels?: boolean protected _cpts: Record protected _cptsMod: Record constructor(opts: BaseTelegramClient.Options) { diff --git a/packages/client/src/methods/updates.ts b/packages/client/src/methods/updates.ts index 4d47d5bd..c108080e 100644 --- a/packages/client/src/methods/updates.ts +++ b/packages/client/src/methods/updates.ts @@ -27,20 +27,20 @@ interface UpdatesState { // accessing storage every time might be expensive, // so store everything here, and load & save // every time session is loaded & saved. - _pts: number - _date: number - _seq: number + _pts?: number + _date?: number + _seq?: number // old values of the updates state (i.e. as in DB) // used to avoid redundant storage calls - _oldPts: number - _oldDate: number - _oldSeq: number + _oldPts?: number + _oldDate?: number + _oldSeq?: number _selfChanged: boolean // whether to catch up channels from the locally stored pts // usually set in start() method based on `catchUp` param - _catchUpChannels: boolean + _catchUpChannels?: boolean _cpts: Record _cptsMod: Record @@ -129,9 +129,9 @@ export async function _saveStorage( if (this._oldPts === undefined || this._oldPts !== this._pts) await this.storage.setUpdatesPts(this._pts) if (this._oldDate === undefined || this._oldDate !== this._date) - await this.storage.setUpdatesDate(this._date) + await this.storage.setUpdatesDate(this._date!) if (this._oldSeq === undefined || this._oldSeq !== this._seq) - await this.storage.setUpdatesSeq(this._seq) + await this.storage.setUpdatesSeq(this._seq!) // update old* values this._oldPts = this._pts @@ -399,8 +399,8 @@ async function _loadDifference( for (;;) { const diff = await this.call({ _: 'updates.getDifference', - pts: this._pts, - date: this._date, + pts: this._pts!, + date: this._date!, qts: 0, }) @@ -631,7 +631,7 @@ export function _handleUpdate( : update.seq if (seqStart !== 0) { // https://t.me/tdlibchat/5843 - const nextLocalSeq = this._seq + 1 + const nextLocalSeq = this._seq! + 1 debug( 'received %s (seq_start=%d, seq_end=%d)', @@ -680,7 +680,7 @@ export function _handleUpdate( if (pts !== undefined && ptsCount !== undefined) { let nextLocalPts: number | null = null if (channelId === undefined) - nextLocalPts = this._pts + ptsCount + nextLocalPts = this._pts! + ptsCount else if (channelId in this._cpts) nextLocalPts = this._cpts[channelId] + ptsCount else if (this._catchUpChannels) { @@ -770,7 +770,7 @@ export function _handleUpdate( case 'updateShortMessage': { if (noDispatch) return - const nextLocalPts = this._pts + update.ptsCount + const nextLocalPts = this._pts! + update.ptsCount if (nextLocalPts > update.pts) // "the update was already applied, and must be ignored" return @@ -818,7 +818,7 @@ export function _handleUpdate( case 'updateShortChatMessage': { if (noDispatch) return - const nextLocalPts = this._pts + update.ptsCount + const nextLocalPts = this._pts! + update.ptsCount if (nextLocalPts > update.pts) // "the update was already applied, and must be ignored" return @@ -867,7 +867,7 @@ export function _handleUpdate( // only store the new pts and date values // we never need to dispatch this - const nextLocalPts = this._pts + update.ptsCount + const nextLocalPts = this._pts! + update.ptsCount if (nextLocalPts > update.pts) // "the update was already applied, and must be ignored" return diff --git a/packages/client/src/types/conversation.ts b/packages/client/src/types/conversation.ts index a3cba484..96bc15a1 100644 --- a/packages/client/src/types/conversation.ts +++ b/packages/client/src/types/conversation.ts @@ -32,12 +32,12 @@ interface QueuedHandler { * and synchronize them manually. */ export class Conversation { - private _inputPeer: tl.TypeInputPeer - private _chatId: number + private _inputPeer!: tl.TypeInputPeer + private _chatId!: number private _started = false - private _lastMessage: number - private _lastReceivedMessage: number + private _lastMessage!: number + private _lastReceivedMessage!: number private _queuedNewMessage = new Queue>() private _pendingNewMessages = new Queue() diff --git a/packages/client/src/types/errors.ts b/packages/client/src/types/errors.ts index 6a759842..5191d15d 100644 --- a/packages/client/src/types/errors.ts +++ b/packages/client/src/types/errors.ts @@ -50,6 +50,9 @@ export class MtqtTypeAssertionError extends MtqtError { super( `Type assertion error at ${context}: expected ${expected}, but got ${actual}` ) + this.context = context + this.expected = expected + this.actual = actual } } diff --git a/packages/client/src/types/media/audio.ts b/packages/client/src/types/media/audio.ts index a2cbd388..b5612518 100644 --- a/packages/client/src/types/media/audio.ts +++ b/packages/client/src/types/media/audio.ts @@ -10,7 +10,6 @@ import { tdFileId } from '@mtqt/file-id' export class Audio extends RawDocument { readonly type = 'audio' as const - readonly doc: tl.RawDocument readonly attr: tl.RawDocumentAttributeAudio protected _fileIdType(): tdFileId.FileType { diff --git a/packages/client/src/types/media/photo.ts b/packages/client/src/types/media/photo.ts index 8c522620..df50ebb4 100644 --- a/packages/client/src/types/media/photo.ts +++ b/packages/client/src/types/media/photo.ts @@ -14,16 +14,6 @@ export class Photo extends FileLocation { /** Raw TL object */ readonly raw: tl.RawPhoto - /** - * Photo size in bytes - */ - readonly fileSize: number - - /** - * DC where the photo is stored - */ - readonly dcId: number - /** Biggest available photo width */ readonly width: number diff --git a/packages/client/src/types/media/thumbnail.ts b/packages/client/src/types/media/thumbnail.ts index 57d177a7..6d0f21f5 100644 --- a/packages/client/src/types/media/thumbnail.ts +++ b/packages/client/src/types/media/thumbnail.ts @@ -31,16 +31,6 @@ export class Thumbnail extends FileLocation { static readonly THUMB_STRIP = 'i' static readonly THUMB_OUTLINE = 'j' - /** - * Thumbnail size in bytes - */ - readonly fileSize: number - - /** - * DC where the thumbnail is stored - */ - readonly dcId: number - readonly raw: tl.TypePhotoSize /** @@ -177,7 +167,7 @@ export class Thumbnail extends FileLocation { if (this._media._ === 'stickerSet') { this._fileId = toFileId({ type: td.FileType.Thumbnail, - dcId: this.dcId, + dcId: this.dcId!, fileReference: null, location: { _: 'photo', @@ -197,7 +187,7 @@ export class Thumbnail extends FileLocation { this._media._ === 'photo' ? td.FileType.Photo : td.FileType.Thumbnail, - dcId: this.dcId, + dcId: this.dcId!, fileReference: this._media.fileReference, location: { _: 'photo', diff --git a/packages/client/src/types/media/venue.ts b/packages/client/src/types/media/venue.ts index b67bd21f..2b0c465b 100644 --- a/packages/client/src/types/media/venue.ts +++ b/packages/client/src/types/media/venue.ts @@ -39,7 +39,7 @@ export class Venue { this.raw = raw } - private _location: Location + private _location?: Location /** * Geolocation of the venue */ diff --git a/packages/client/src/types/media/voice.ts b/packages/client/src/types/media/voice.ts index ba8d0089..0584c438 100644 --- a/packages/client/src/types/media/voice.ts +++ b/packages/client/src/types/media/voice.ts @@ -11,7 +11,6 @@ import { decodeWaveform } from '../../utils/voice-utils' export class Voice extends RawDocument { readonly type = 'voice' as const - readonly doc: tl.RawDocument readonly attr: tl.RawDocumentAttributeAudio protected _fileIdType(): tdFileId.FileType { diff --git a/packages/client/src/types/messages/message-entity.ts b/packages/client/src/types/messages/message-entity.ts index e4417dcd..70439d79 100644 --- a/packages/client/src/types/messages/message-entity.ts +++ b/packages/client/src/types/messages/message-entity.ts @@ -68,26 +68,26 @@ export class MessageEntity { /** * Underlying raw TL object */ - readonly raw: tl.TypeMessageEntity + readonly raw!: tl.TypeMessageEntity /** * Type of the entity. See {@link MessageEntity.Type} for a list of possible values */ - readonly type: MessageEntity.Type + readonly type!: MessageEntity.Type /** * Offset in UTF-16 code units to the start of the entity. * * Since JS strings are UTF-16, you can use this as-is */ - readonly offset: number + readonly offset!: number /** * Length of the entity in UTF-16 code units. * * Since JS strings are UTF-16, you can use this as-is */ - readonly length: number + readonly length!: number /** * When `type=text_link`, contains the URL that would be opened if user taps on the text diff --git a/packages/client/src/types/messages/message.ts b/packages/client/src/types/messages/message.ts index 4b3860d6..5ab36f51 100644 --- a/packages/client/src/types/messages/message.ts +++ b/packages/client/src/types/messages/message.ts @@ -363,7 +363,7 @@ export class Message { return this.raw.mentioned! } - private _viaBot: User | null + private _viaBot?: User | null /** * If this message is generated from an inline query, * information about the bot which generated it diff --git a/packages/client/src/types/messages/search-filters.ts b/packages/client/src/types/messages/search-filters.ts index f74df96c..dd6bfd14 100644 --- a/packages/client/src/types/messages/search-filters.ts +++ b/packages/client/src/types/messages/search-filters.ts @@ -30,27 +30,27 @@ import { tl } from '@mtqt/tl' * - `Pinned`: Search for pinned messages */ export const SearchFilters = { - Empty: { _: 'inputMessagesFilterEmpty' } as tl.TypeMessagesFilter, - Photo: { _: 'inputMessagesFilterPhotos' } as tl.TypeMessagesFilter, - Video: { _: 'inputMessagesFilterVideo' } as tl.TypeMessagesFilter, + Empty: { _: 'inputMessagesFilterEmpty' } as const, + Photo: { _: 'inputMessagesFilterPhotos' } as const, + Video: { _: 'inputMessagesFilterVideo' } as const, PhotoAndVideo: { _: 'inputMessagesFilterPhotoVideo', - } as tl.TypeMessagesFilter, - Document: { _: 'inputMessagesFilterDocument' } as tl.TypeMessagesFilter, - Url: { _: 'inputMessagesFilterUrl' } as tl.TypeMessagesFilter, - Gif: { _: 'inputMessagesFilterGif' } as tl.TypeMessagesFilter, - Voice: { _: 'inputMessagesFilterVoice' } as tl.TypeMessagesFilter, - Audio: { _: 'inputMessagesFilterMusic' } as tl.TypeMessagesFilter, + } as const, + Document: { _: 'inputMessagesFilterDocument' } as const, + Url: { _: 'inputMessagesFilterUrl' } as const, + Gif: { _: 'inputMessagesFilterGif' } as const, + Voice: { _: 'inputMessagesFilterVoice' } as const, + Audio: { _: 'inputMessagesFilterMusic' } as const, ChatPhotoChange: { _: 'inputMessagesFilterChatPhotos', - } as tl.TypeMessagesFilter, - Call: { _: 'inputMessagesFilterPhoneCalls' } as tl.TypeMessagesFilter, - Round: { _: 'inputMessagesFilterRoundVideo' } as tl.TypeMessagesFilter, + } as const, + Call: { _: 'inputMessagesFilterPhoneCalls' } as const, + Round: { _: 'inputMessagesFilterRoundVideo' } as const, RoundAndVoice: { _: 'inputMessagesFilterRoundVoice', - } as tl.TypeMessagesFilter, - MyMention: { _: 'inputMessagesFilterMyMentions' } as tl.TypeMessagesFilter, - Location: { _: 'inputMessagesFilterGeo' } as tl.TypeMessagesFilter, - Contact: { _: 'inputMessagesFilterContacts' } as tl.TypeMessagesFilter, - Pinned: { _: 'inputMessagesFilterPinned' } as tl.TypeMessagesFilter, + } as const, + MyMention: { _: 'inputMessagesFilterMyMentions' } as const, + Location: { _: 'inputMessagesFilterGeo' } as const, + Contact: { _: 'inputMessagesFilterContacts' } as const, + Pinned: { _: 'inputMessagesFilterPinned' } as const, } as const diff --git a/packages/client/src/types/peers/chat-photo.ts b/packages/client/src/types/peers/chat-photo.ts index d9459668..13f8cb5a 100644 --- a/packages/client/src/types/peers/chat-photo.ts +++ b/packages/client/src/types/peers/chat-photo.ts @@ -148,7 +148,7 @@ export class ChatPhoto { return this._smallFile } - private _bigFile: ChatPhotoSize + private _bigFile?: ChatPhotoSize /** Chat photo file location in big resolution (640x640) */ get big(): ChatPhotoSize { if (!this._bigFile) { diff --git a/packages/client/src/types/updates/poll-update.ts b/packages/client/src/types/updates/poll-update.ts index 0ef4d068..73323ee4 100644 --- a/packages/client/src/types/updates/poll-update.ts +++ b/packages/client/src/types/updates/poll-update.ts @@ -33,7 +33,7 @@ export class PollUpdate { return this.raw.pollId } - private _poll: Poll + private _poll?: Poll /** * The poll. * diff --git a/packages/client/src/types/updates/user-typing-update.ts b/packages/client/src/types/updates/user-typing-update.ts index 7f7ce66a..6dc81980 100644 --- a/packages/client/src/types/updates/user-typing-update.ts +++ b/packages/client/src/types/updates/user-typing-update.ts @@ -113,7 +113,7 @@ export class UserTypingUpdate { } /** - * Fetch the chat where the update has happenned + * Fetch the chat where the update has happened */ getChat(): Promise { return this.client.getChat(this.chatId) diff --git a/packages/client/src/types/utils.ts b/packages/client/src/types/utils.ts index 006708e5..f1f614fd 100644 --- a/packages/client/src/types/utils.ts +++ b/packages/client/src/types/utils.ts @@ -30,7 +30,7 @@ function getAllGettersNames(obj: object): string[] { } const bufferToJsonOriginal = (Buffer as any).toJSON -const bufferToJsonInspect = function () { return this.toString('base64') } +const bufferToJsonInspect = function (this: Buffer) { return this.toString('base64') } /** * Small helper function that adds `toJSON` and `util.custom.inspect` diff --git a/packages/core/src/base-client.ts b/packages/core/src/base-client.ts index aeb118f5..b5c763cb 100644 --- a/packages/core/src/base-client.ts +++ b/packages/core/src/base-client.ts @@ -235,7 +235,7 @@ export class BaseTelegramClient extends EventEmitter { private _niceStacks: boolean readonly _layer: number - private _keepAliveInterval: NodeJS.Timeout + private _keepAliveInterval?: NodeJS.Timeout private _lastRequestTime = 0 private _floodWaitedRequests: Record = {} @@ -255,7 +255,7 @@ export class BaseTelegramClient extends EventEmitter { * * Methods for downloading/uploading files may create additional connections as needed. */ - primaryConnection: TelegramConnection + primaryConnection!: TelegramConnection private _importFrom?: string diff --git a/packages/core/src/network/persistent-connection.ts b/packages/core/src/network/persistent-connection.ts index b1f99aa1..ec6ade5b 100644 --- a/packages/core/src/network/persistent-connection.ts +++ b/packages/core/src/network/persistent-connection.ts @@ -25,7 +25,7 @@ export interface PersistentConnectionParams { */ export abstract class PersistentConnection extends EventEmitter { readonly params: PersistentConnectionParams - private _transport: ITelegramTransport + private _transport!: ITelegramTransport private _sendOnceConnected: Buffer[] = [] diff --git a/packages/core/src/network/reconnection.ts b/packages/core/src/network/reconnection.ts index 028ee753..8b7eb854 100644 --- a/packages/core/src/network/reconnection.ts +++ b/packages/core/src/network/reconnection.ts @@ -14,7 +14,7 @@ export type ReconnectionStrategy = ( * default reconnection strategy: first - immediate reconnection, * then 1s with linear increase up to 5s (with 1s step) */ -export const defaultReconnectionStrategy: ReconnectionStrategy = ( +export const defaultReconnectionStrategy: ReconnectionStrategy = ( params, lastError, consequentFails, diff --git a/packages/core/src/network/telegram-connection.ts b/packages/core/src/network/telegram-connection.ts index 68fe220a..b1786c1f 100644 --- a/packages/core/src/network/telegram-connection.ts +++ b/packages/core/src/network/telegram-connection.ts @@ -75,7 +75,7 @@ interface PendingMessage { // TODO: error handling basically everywhere, most importantly (de-)serialization errors // noinspection JSUnusedLocalSymbols export class TelegramConnection extends PersistentConnection { - readonly params: TelegramConnectionParams + readonly params!: TelegramConnectionParams private readonly _mtproto: MtprotoSession diff --git a/packages/core/src/network/transports/tcp.ts b/packages/core/src/network/transports/tcp.ts index 21863065..d43e1d7e 100644 --- a/packages/core/src/network/transports/tcp.ts +++ b/packages/core/src/network/transports/tcp.ts @@ -19,7 +19,7 @@ export abstract class BaseTcpTransport protected _socket: Socket | null = null abstract _packetCodec: IPacketCodec - protected _crypto: ICryptoProvider + protected _crypto!: ICryptoProvider packetCodecInitialized = false diff --git a/packages/core/src/network/transports/websocket.ts b/packages/core/src/network/transports/websocket.ts index f194a1c0..efc1ed6f 100644 --- a/packages/core/src/network/transports/websocket.ts +++ b/packages/core/src/network/transports/websocket.ts @@ -40,7 +40,7 @@ export abstract class BaseWebSocketTransport private _currentDc: tl.RawDcOption | null = null private _state: TransportState = TransportState.Idle private _socket: WebSocket | null = null - private _crypto: ICryptoProvider + private _crypto!: ICryptoProvider abstract _packetCodec: IPacketCodec packetCodecInitialized = false diff --git a/packages/core/src/network/transports/wrapped.ts b/packages/core/src/network/transports/wrapped.ts index a5bf795e..d87b72c0 100644 --- a/packages/core/src/network/transports/wrapped.ts +++ b/packages/core/src/network/transports/wrapped.ts @@ -3,7 +3,7 @@ import { IPacketCodec } from './abstract' import { ICryptoProvider } from '../../utils/crypto' export abstract class WrappedCodec extends EventEmitter { - protected _crypto: ICryptoProvider + protected _crypto!: ICryptoProvider protected _inner: IPacketCodec constructor(inner: IPacketCodec) { diff --git a/packages/core/src/storage/json-file.ts b/packages/core/src/storage/json-file.ts index 6a1fdfa5..9b4bb25c 100644 --- a/packages/core/src/storage/json-file.ts +++ b/packages/core/src/storage/json-file.ts @@ -15,7 +15,7 @@ export class JsonFileStorage extends JsonMemoryStorage { private readonly _safe: boolean private readonly _cleanup: boolean - private readonly _unsubscribe: () => void + private readonly _unsubscribe?: () => void constructor( filename: string, @@ -114,7 +114,7 @@ export class JsonFileStorage extends JsonMemoryStorage { destroy(): void { if (this._cleanup) { - this._unsubscribe() + this._unsubscribe!() } } } diff --git a/packages/core/src/storage/json.ts b/packages/core/src/storage/json.ts index 5bfcce88..8e7ab611 100644 --- a/packages/core/src/storage/json.ts +++ b/packages/core/src/storage/json.ts @@ -35,8 +35,8 @@ export class JsonMemoryStorage extends MemoryStorage { return Object.entries(value) .filter((it) => it[1] !== null) .map( - ([dcId, key]: [string, Buffer]) => - dcId + ',' + key.toString('base64') + ([dcId, key]) => + dcId + ',' + (key as Buffer).toString('base64') ) .join('|') } diff --git a/packages/core/src/storage/memory.ts b/packages/core/src/storage/memory.ts index 35540807..fa416323 100644 --- a/packages/core/src/storage/memory.ts +++ b/packages/core/src/storage/memory.ts @@ -52,12 +52,12 @@ interface MemorySessionState { const USERNAME_TTL = 86400000 // 24 hours export class MemoryStorage implements ITelegramStorage /*, IStateStorage */ { - protected _state: MemorySessionState + protected _state!: MemorySessionState private _cachedInputPeers: LruMap = new LruMap(100) private _cachedFull: LruMap - private _vacuumTimeout: NodeJS.Timeout + private _vacuumTimeout?: NodeJS.Timeout private _vacuumInterval: number constructor(params?: { @@ -96,7 +96,7 @@ export class MemoryStorage implements ITelegramStorage /*, IStateStorage */ { } destroy(): void { - clearInterval(this._vacuumTimeout) + clearInterval(this._vacuumTimeout!) } reset(): void { diff --git a/packages/dispatcher/src/dispatcher.ts b/packages/dispatcher/src/dispatcher.ts index 9662769c..6eaef059 100644 --- a/packages/dispatcher/src/dispatcher.ts +++ b/packages/dispatcher/src/dispatcher.ts @@ -57,14 +57,14 @@ export class Dispatcher { private _client?: TelegramClient private _parent?: Dispatcher - private _children: Dispatcher[] = [] + private _children: Dispatcher[] = [] - private _scenes: Record> + private _scenes?: Record> private _scene?: SceneName private _sceneScoped?: boolean - private _storage: State extends never ? undefined : IStateStorage - private _stateKeyDelegate: State extends never + private _storage?: State extends never ? undefined : IStateStorage + private _stateKeyDelegate?: State extends never ? undefined : StateKeyDelegate @@ -437,7 +437,7 @@ export class Dispatcher { 'Cannot use ToScene without entering a scene' ) - return this._scenes[ + return this._scenes![ scene ]._dispatchUpdateNowImpl( update, @@ -643,7 +643,7 @@ export class Dispatcher { return this._parent ?? null } - private _prepareChild(child: Dispatcher): void { + private _prepareChild(child: Dispatcher): void { if (child._client) { throw new MtqtArgumentError( 'Provided dispatcher is ' + @@ -756,7 +756,7 @@ export class Dispatcher { * * @param child Other dispatcher */ - removeChild(child: Dispatcher): void { + removeChild(child: Dispatcher): void { const idx = this._children.indexOf(child) if (idx > -1) { child._unparent() @@ -812,17 +812,19 @@ export class Dispatcher { }) if (other._scenes) { + if (!this._scenes) this._scenes = {} + Object.keys(other._scenes).forEach((key) => { - other._scenes[key]._unparent() - if (key in this._scenes) { + other._scenes![key]._unparent() + if (key in this._scenes!) { // will be overwritten - delete this._scenes[key] + delete this._scenes![key] } this.addScene( key as any, - other._scenes[key] as any, - other._scenes[key]._sceneScoped as any + other._scenes![key] as any, + other._scenes![key]._sceneScoped as any ) }) } @@ -851,11 +853,11 @@ export class Dispatcher { dp._groups[idx] = {} as any - Object.keys(this._groups[idx]).forEach( - (type: UpdateHandler['name']) => { - dp._groups[idx][type] = [...this._groups[idx][type]] - } - ) + Object.keys(this._groups[idx]).forEach((type) => { + dp._groups[idx][type as UpdateHandler['name']] = [ + ...this._groups[idx][type as UpdateHandler['name']], + ] + }) }) dp._groupsOrder = [...this._groupsOrder] @@ -871,11 +873,11 @@ export class Dispatcher { if (this._scenes) { Object.keys(this._scenes).forEach((key) => { - const scene = this._scenes[key].clone(true) + const scene = this._scenes![key].clone(true) dp.addScene( key as any, scene as any, - this._scenes[key]._sceneScoped as any + this._scenes![key]._sceneScoped as any ) }) } @@ -1004,16 +1006,19 @@ export class Dispatcher { group?: number ): void { if (typeof handler === 'number') { - this.addUpdateHandler({ - name, - callback: filter - }, handler) + this.addUpdateHandler( + { + name, + callback: filter, + }, + handler + ) } else { this.addUpdateHandler( { name, callback: handler, - check: filter + check: filter, }, group ) @@ -1026,10 +1031,7 @@ export class Dispatcher { * @param handler Raw update handler * @param group Handler group index */ - onRawUpdate( - handler: RawUpdateHandler['callback'], - group?: number - ): void + onRawUpdate(handler: RawUpdateHandler['callback'], group?: number): void /** * Register a raw update handler without any filters diff --git a/packages/dispatcher/src/filters.ts b/packages/dispatcher/src/filters.ts index cfbd7164..028c927c 100644 --- a/packages/dispatcher/src/filters.ts +++ b/packages/dispatcher/src/filters.ts @@ -253,12 +253,12 @@ export namespace filters { * * @param fns Filters to combine */ - export function every[], T>( + export function every[]>( ...fns: Filters ): UpdateFilter< - ExtractBase, + UnionToIntersection>, UnionToIntersection< - ExtractMod, Filters[number]> + ExtractMod, Filters[number]> > > { if (fns.length === 2) return and(fns[0], fns[1]) @@ -301,11 +301,11 @@ export namespace filters { * * @param fns Filters to combine */ - export function some[], T>( + export function some[]>( ...fns: Filters ): UpdateFilter< - ExtractBase, - ExtractMod, Filters[number]> + UnionToIntersection>, + ExtractMod, Filters[number]> > { if (fns.length === 2) return or(fns[0], fns[1]) @@ -1034,7 +1034,9 @@ export namespace filters { params: MaybeArray ): UpdateFilter => { if (!Array.isArray(params)) { - return and(start, (msg: Message & { command: string[] }) => { + return and(start, (_msg: Message) => { + const msg = _msg as Message & { command: string[] } + if (msg.command.length !== 2) return false const p = msg.command[1] @@ -1048,7 +1050,9 @@ export namespace filters { }) } - return and(start, (msg: Message & { command: string[] }) => { + return and(start, (_msg: Message) => { + const msg = _msg as Message & { command: string[] } + if (msg.command.length !== 2) return false const p = msg.command[1] diff --git a/packages/dispatcher/src/state/update-state.ts b/packages/dispatcher/src/state/update-state.ts index 5c1276b0..36d3561c 100644 --- a/packages/dispatcher/src/state/update-state.ts +++ b/packages/dispatcher/src/state/update-state.ts @@ -19,7 +19,7 @@ export class RateLimitError extends MtqtError { */ export class UpdateState { private _key: string - private _localKey: string + private _localKey!: string private _storage: IStateStorage diff --git a/packages/dispatcher/tsconfig.json b/packages/dispatcher/tsconfig.json index 755ef0d0..33da2057 100644 --- a/packages/dispatcher/tsconfig.json +++ b/packages/dispatcher/tsconfig.json @@ -7,9 +7,9 @@ "./src" ], "typedocOptions": { - "name": "@mtqt/client", + "name": "@mtqt/dispatcher", "includeVersion": true, - "out": "../../docs/packages/client", + "out": "../../docs/packages/dispatcher", "listInvalidSymbolLinks": true, "excludePrivate": true, "entryPoints": [ diff --git a/packages/http-proxy/index.ts b/packages/http-proxy/index.ts index 62001244..37bf7364 100644 --- a/packages/http-proxy/index.ts +++ b/packages/http-proxy/index.ts @@ -2,8 +2,8 @@ import { IntermediatePacketCodec, BaseTcpTransport, TransportState, + tl } from '@mtqt/core' -import { tl } from '@mtqt/tl' import { connect as connectTcp } from 'net' import { connect as connectTls, SecureContextOptions } from 'tls' diff --git a/packages/node/index.ts b/packages/node/index.ts index 4036da91..49e0d34c 100644 --- a/packages/node/index.ts +++ b/packages/node/index.ts @@ -1,6 +1,5 @@ import { TelegramClient, User } from '@mtqt/client' import { BaseTelegramClient } from '@mtqt/core' -import type { NodeNativeCryptoProvider } from '@mtqt/crypto-node' import { HtmlMessageEntityParser } from '@mtqt/html-parser' import { MarkdownMessageEntityParser } from '@mtqt/markdown-parser' import { SqliteStorage } from '@mtqt/sqlite' @@ -12,7 +11,7 @@ export * from '@mtqt/html-parser' export * from '@mtqt/markdown-parser' export { SqliteStorage } -let nativeCrypto: typeof NodeNativeCryptoProvider | null +let nativeCrypto: any try { nativeCrypto = require('@mtqt/crypto-node').NodeNativeCryptoProvider } catch (e) {} @@ -52,7 +51,7 @@ export namespace NodeTelegramClient { export class NodeTelegramClient extends TelegramClient { constructor(opts: NodeTelegramClient.Options) { super({ - crypto: nativeCrypto ? () => new nativeCrypto!() : undefined, + crypto: nativeCrypto ? () => new nativeCrypto() : undefined, ...opts, storage: typeof opts.storage === 'string' diff --git a/packages/node/package.json b/packages/node/package.json index 079c436e..13cb7748 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -12,6 +12,7 @@ "build": "tsc" }, "dependencies": { + "@mtqt/core": "^1.0.0", "@mtqt/client": "^1.0.0", "@mtqt/sqlite": "^1.0.0", "@mtqt/markdown-parser": "^1.0.0", diff --git a/packages/node/tsconfig.json b/packages/node/tsconfig.json index 36dc2b5c..8b0a839c 100644 --- a/packages/node/tsconfig.json +++ b/packages/node/tsconfig.json @@ -13,7 +13,7 @@ "listInvalidSymbolLinks": true, "excludePrivate": true, "entryPoints": [ - "./src/index.ts" + "./index.ts" ] } } diff --git a/packages/socks-proxy/index.ts b/packages/socks-proxy/index.ts index 8e9600f6..89ba2238 100644 --- a/packages/socks-proxy/index.ts +++ b/packages/socks-proxy/index.ts @@ -2,8 +2,8 @@ import { IntermediatePacketCodec, BaseTcpTransport, TransportState, + tl } from '@mtqt/core' -import { tl } from '@mtqt/tl' import { connect } from 'net' // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore diff --git a/packages/sqlite/index.ts b/packages/sqlite/index.ts index 46fb343b..f6263dd7 100644 --- a/packages/sqlite/index.ts +++ b/packages/sqlite/index.ts @@ -161,8 +161,8 @@ const EMPTY_BUFFER = Buffer.alloc(0) * Uses `better-sqlite3` library */ export class SqliteStorage implements ITelegramStorage /*, IStateStorage */ { - private _db: sqlite3.Database - private _statements: Record + private _db!: sqlite3.Database + private _statements!: Record private readonly _filename: string private _pending: [sqlite3.Statement, any[]][] = [] @@ -178,7 +178,7 @@ export class SqliteStorage implements ITelegramStorage /*, IStateStorage */ { private _saveUnimportantLater: () => void - private _vacuumTimeout: NodeJS.Timeout + private _vacuumTimeout?: NodeJS.Timeout private _vacuumInterval: number /** @@ -343,8 +343,8 @@ export class SqliteStorage implements ITelegramStorage /*, IStateStorage */ { } } - private _runMany: (stmts: [sqlite3.Statement, any[]][]) => void - private _updateManyPeers: (updates: any[]) => void + private _runMany!: (stmts: [sqlite3.Statement, any[]][]) => void + private _updateManyPeers!: (updates: any[]) => void // eslint-disable-next-line @typescript-eslint/no-unused-vars private _upgradeDatabase(from: number): void { @@ -430,7 +430,7 @@ export class SqliteStorage implements ITelegramStorage /*, IStateStorage */ { destroy(): void { this._db.close() - clearInterval(this._vacuumTimeout) + clearInterval(this._vacuumTimeout!) } reset(): void { diff --git a/packages/sqlite/tsconfig.json b/packages/sqlite/tsconfig.json index 2b17ae32..edc3d342 100644 --- a/packages/sqlite/tsconfig.json +++ b/packages/sqlite/tsconfig.json @@ -13,7 +13,7 @@ "listInvalidSymbolLinks": true, "excludePrivate": true, "entryPoints": [ - "./src/index.ts" + "./index.ts" ] } } diff --git a/packages/tl/binary/writer.d.ts b/packages/tl/binary/writer.d.ts index 62ddb488..b797aa50 100644 --- a/packages/tl/binary/writer.d.ts +++ b/packages/tl/binary/writer.d.ts @@ -57,7 +57,8 @@ export interface ITlBinaryWriter { export type TlBinaryWriterFunction = ( this: ITlBinaryWriter, - obj: unknown + obj: unknown, + bare?: boolean ) => void /** diff --git a/packages/tl/package.json b/packages/tl/package.json index 058cc8fc..dc7b470c 100644 --- a/packages/tl/package.json +++ b/packages/tl/package.json @@ -16,7 +16,6 @@ "big-integer": "^1.6.48" }, "devDependencies": { - "@mtqt/core": "^1.0.0", "cheerio": "^1.0.0-rc.5", "eager-async-pool": "^1.0.0", "csv-parser": "^3.0.0", diff --git a/packages/tl/scripts/generate-keys.js b/packages/tl/scripts/generate-keys.js index 598530ee..09cae707 100644 --- a/packages/tl/scripts/generate-keys.js +++ b/packages/tl/scripts/generate-keys.js @@ -1,10 +1,10 @@ // generates fingerprints for public keys. // since they are rarely changed, not included in `generate-code` npm script // keys can still be added at runtime, this is just an optimization -const { parsePublicKey } = require('@mtqt/core/dist/utils/crypto/keys') +const { parsePublicKey } = require('../../core/dist/utils/crypto/keys') const { NodeCryptoProvider, -} = require('@mtqt/core/dist/utils/crypto/node-crypto') +} = require('../../core/dist/utils/crypto/node-crypto') const { createWriter } = require('./common') // https://github.com/DrKLO/Telegram/blob/a724d96e9c008b609fe188d122aa2922e40de5fc/TMessagesProj/jni/tgnet/Handshake.cpp#L356-L436 diff --git a/packages/tl/scripts/generate-types.js b/packages/tl/scripts/generate-types.js index 42f0b5fc..bacda10d 100644 --- a/packages/tl/scripts/generate-types.js +++ b/packages/tl/scripts/generate-types.js @@ -21,6 +21,7 @@ import { BigInteger } from 'big-integer'; * - you can use \`{ _: 'error', ... }\` to create needed types * - to check if something is of some type, check \`_\` property of an object * - to check if something is of some union, use \`isAny*()\` functions + * @hidden */ export declare namespace tl { /** diff --git a/tsconfig.json b/tsconfig.json index f5b670c0..ff77a05b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,8 +9,9 @@ "baseUrl": ".", "declaration": true, "esModuleInterop": true, - "strictNullChecks": true, + "strict": true, "noImplicitAny": true, + "noImplicitThis": true, "incremental": true, "stripInternal": true },