@bruch/max-client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +168 -0
- package/UPSTREAM.md +10 -0
- package/dist/api/account.d.ts +24 -0
- package/dist/api/account.d.ts.map +1 -0
- package/dist/api/auth.d.ts +57 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/bots.d.ts +8 -0
- package/dist/api/bots.d.ts.map +1 -0
- package/dist/api/chats.d.ts +41 -0
- package/dist/api/chats.d.ts.map +1 -0
- package/dist/api/facade.d.ts +19 -0
- package/dist/api/facade.d.ts.map +1 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/messages.d.ts +35 -0
- package/dist/api/messages.d.ts.map +1 -0
- package/dist/api/response.d.ts +7 -0
- package/dist/api/response.d.ts.map +1 -0
- package/dist/api/runtime.d.ts +19 -0
- package/dist/api/runtime.d.ts.map +1 -0
- package/dist/api/uploads.d.ts +23 -0
- package/dist/api/uploads.d.ts.map +1 -0
- package/dist/api/users.d.ts +25 -0
- package/dist/api/users.d.ts.map +1 -0
- package/dist/app.d.ts +55 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/auth/flows.d.ts +27 -0
- package/dist/auth/flows.d.ts.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +109 -0
- package/dist/auth/index.js.map +11 -0
- package/dist/auth/providers.d.ts +11 -0
- package/dist/auth/providers.d.ts.map +1 -0
- package/dist/client.d.ts +139 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/config.d.ts +80 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/connection/connection.d.ts +25 -0
- package/dist/connection/connection.d.ts.map +1 -0
- package/dist/connection/index.d.ts +4 -0
- package/dist/connection/index.d.ts.map +1 -0
- package/dist/connection/pending.d.ts +9 -0
- package/dist/connection/pending.d.ts.map +1 -0
- package/dist/connection/readers.d.ts +17 -0
- package/dist/connection/readers.d.ts.map +1 -0
- package/dist/dispatch/dispatcher.d.ts +16 -0
- package/dist/dispatch/dispatcher.d.ts.map +1 -0
- package/dist/dispatch/index.d.ts +3 -0
- package/dist/dispatch/index.d.ts.map +1 -0
- package/dist/dispatch/router.d.ts +64 -0
- package/dist/dispatch/router.d.ts.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/files/file.d.ts +29 -0
- package/dist/files/file.d.ts.map +1 -0
- package/dist/files/index.d.ts +2 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +95 -0
- package/dist/files/index.js.map +10 -0
- package/dist/formatting/index.d.ts +2 -0
- package/dist/formatting/index.d.ts.map +1 -0
- package/dist/formatting/markdown.d.ts +13 -0
- package/dist/formatting/markdown.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3967 -0
- package/dist/index.js.map +48 -0
- package/dist/logging.d.ts +10 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/protocol/compression.d.ts +8 -0
- package/dist/protocol/compression.d.ts.map +1 -0
- package/dist/protocol/enums.d.ts +175 -0
- package/dist/protocol/enums.d.ts.map +1 -0
- package/dist/protocol/index.d.ts +6 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +438 -0
- package/dist/protocol/index.js.map +13 -0
- package/dist/protocol/tcp.d.ts +35 -0
- package/dist/protocol/tcp.d.ts.map +1 -0
- package/dist/protocol/types.d.ts +38 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/websocket.d.ts +7 -0
- package/dist/protocol/websocket.d.ts.map +1 -0
- package/dist/session/index.d.ts +3 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +179 -0
- package/dist/session/index.js.map +12 -0
- package/dist/session/store.d.ts +18 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/types.d.ts +29 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +831 -0
- package/dist/telemetry/index.js.map +17 -0
- package/dist/telemetry/navigation.d.ts +41 -0
- package/dist/telemetry/navigation.d.ts.map +1 -0
- package/dist/telemetry/payloads.d.ts +30 -0
- package/dist/telemetry/payloads.d.ts.map +1 -0
- package/dist/telemetry/service.d.ts +53 -0
- package/dist/telemetry/service.d.ts.map +1 -0
- package/dist/transport/base.d.ts +18 -0
- package/dist/transport/base.d.ts.map +1 -0
- package/dist/transport/index.d.ts +4 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/tcp.d.ts +28 -0
- package/dist/transport/tcp.d.ts.map +1 -0
- package/dist/transport/websocket.d.ts +14 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/types/attachments.d.ts +18 -0
- package/dist/types/attachments.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +376 -0
- package/dist/types/index.js.map +12 -0
- package/dist/types/models.d.ts +210 -0
- package/dist/types/models.d.ts.map +1 -0
- package/dist/types/utils.d.ts +10 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/package.json +95 -0
- package/src/api/account.ts +93 -0
- package/src/api/auth.ts +312 -0
- package/src/api/bots.ts +21 -0
- package/src/api/chats.ts +234 -0
- package/src/api/facade.ts +28 -0
- package/src/api/index.ts +9 -0
- package/src/api/messages.ts +230 -0
- package/src/api/response.ts +24 -0
- package/src/api/runtime.ts +27 -0
- package/src/api/uploads.ts +91 -0
- package/src/api/users.ts +68 -0
- package/src/app.ts +271 -0
- package/src/auth/flows.ts +103 -0
- package/src/auth/index.ts +2 -0
- package/src/auth/providers.ts +30 -0
- package/src/client.ts +506 -0
- package/src/config.ts +161 -0
- package/src/connection/connection.ts +93 -0
- package/src/connection/index.ts +3 -0
- package/src/connection/pending.ts +49 -0
- package/src/connection/readers.ts +33 -0
- package/src/dispatch/dispatcher.ts +194 -0
- package/src/dispatch/index.ts +2 -0
- package/src/dispatch/router.ts +149 -0
- package/src/errors.ts +41 -0
- package/src/files/file.ts +92 -0
- package/src/files/index.ts +1 -0
- package/src/formatting/index.ts +1 -0
- package/src/formatting/markdown.ts +123 -0
- package/src/index.ts +15 -0
- package/src/logging.ts +67 -0
- package/src/protocol/compression.ts +69 -0
- package/src/protocol/enums.ts +175 -0
- package/src/protocol/index.ts +5 -0
- package/src/protocol/tcp.ts +139 -0
- package/src/protocol/types.ts +45 -0
- package/src/protocol/websocket.ts +47 -0
- package/src/session/index.ts +2 -0
- package/src/session/store.ts +154 -0
- package/src/session/types.ts +45 -0
- package/src/telemetry/index.ts +3 -0
- package/src/telemetry/navigation.ts +160 -0
- package/src/telemetry/payloads.ts +84 -0
- package/src/telemetry/service.ts +194 -0
- package/src/transport/base.ts +43 -0
- package/src/transport/index.ts +3 -0
- package/src/transport/tcp.ts +296 -0
- package/src/transport/websocket.ts +63 -0
- package/src/types/attachments.ts +24 -0
- package/src/types/index.ts +3 -0
- package/src/types/models.ts +461 -0
- package/src/types/utils.ts +45 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/protocol/compression.ts", "../src/protocol/enums.ts", "../src/protocol/tcp.ts", "../src/protocol/websocket.ts", "../src/types/utils.ts", "../src/types/attachments.ts", "../src/types/models.ts", "../src/session/store.ts", "../src/logging.ts", "../src/session/types.ts", "../src/files/file.ts", "../src/auth/providers.ts", "../src/auth/flows.ts", "../src/telemetry/navigation.ts", "../src/telemetry/payloads.ts", "../src/telemetry/service.ts", "../src/api/response.ts", "../src/api/account.ts", "../src/config.ts", "../src/api/auth.ts", "../src/api/bots.ts", "../src/errors.ts", "../src/api/chats.ts", "../src/formatting/markdown.ts", "../src/api/messages.ts", "../src/api/uploads.ts", "../src/api/users.ts", "../src/api/facade.ts", "../src/dispatch/router.ts", "../src/dispatch/dispatcher.ts", "../src/app.ts", "../src/connection/pending.ts", "../src/connection/connection.ts", "../src/connection/readers.ts", "../src/transport/base.ts", "../src/transport/tcp.ts", "../src/transport/websocket.ts", "../src/client.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"const DEFAULT_MAX_OUTPUT = 5 * 1024 * 1024;\n\nexport class Lz4BlockCompression {\n decompress(source: Uint8Array, maxOutput = DEFAULT_MAX_OUTPUT): Uint8Array {\n const output: number[] = [];\n let position = 0;\n\n while (position < source.length) {\n const token = source[position++];\n if (token === undefined) break;\n\n let literalLength = token >>> 4;\n if (literalLength === 15) {\n while (position < source.length) {\n const byte = source[position++];\n if (byte === undefined) break;\n literalLength += byte;\n if (byte !== 255) break;\n }\n }\n\n if (position + literalLength > source.length) {\n throw new RangeError(\"LZ4: literal length out of bounds\");\n }\n for (let index = 0; index < literalLength; index += 1) {\n output.push(source[position + index] as number);\n }\n position += literalLength;\n this.ensureSize(output.length, maxOutput);\n if (position >= source.length) break;\n\n if (position + 1 >= source.length) throw new RangeError(\"LZ4: incomplete offset\");\n const offset = (source[position] as number) | ((source[position + 1] as number) << 8);\n position += 2;\n if (offset === 0) throw new RangeError(\"LZ4: zero offset\");\n\n let matchLength = (token & 0x0f) + 4;\n if ((token & 0x0f) === 0x0f) {\n while (position < source.length) {\n const byte = source[position++];\n if (byte === undefined) break;\n matchLength += byte;\n if (byte !== 255) break;\n }\n }\n\n const matchPosition = output.length - offset;\n if (matchPosition < 0) throw new RangeError(\"LZ4: match out of bounds\");\n for (let index = 0; index < matchLength; index += 1) {\n output.push(output[matchPosition + (index % offset)] as number);\n }\n this.ensureSize(output.length, maxOutput);\n }\n\n return Uint8Array.from(output);\n }\n\n private ensureSize(size: number, maximum: number): void {\n if (size > maximum) throw new RangeError(\"LZ4: output too large\");\n }\n}\n\nexport class ZstdCompression {\n decompress(source: Uint8Array, maxOutput = DEFAULT_MAX_OUTPUT): Uint8Array {\n const output = Bun.zstdDecompressSync(source);\n if (output.byteLength > maxOutput) throw new RangeError(\"Zstd: output too large\");\n return output;\n }\n}\n",
|
|
6
|
+
"export const Command = {\n REQUEST: 0,\n RESPONSE: 1,\n EVENT: 2,\n ERROR: 3,\n} as const;\nexport type Command = (typeof Command)[keyof typeof Command];\n\nexport const Opcode = {\n PING: 1,\n DEBUG: 2,\n RECONNECT: 3,\n LOG: 5,\n SESSION_INIT: 6,\n PROFILE: 16,\n AUTH_REQUEST: 17,\n AUTH: 18,\n LOGIN: 19,\n LOGOUT: 20,\n SYNC: 21,\n CONFIG: 22,\n AUTH_CONFIRM: 23,\n PRESET_AVATARS: 25,\n ASSETS_GET: 26,\n ASSETS_UPDATE: 27,\n ASSETS_GET_BY_IDS: 28,\n ASSETS_ADD: 29,\n SEARCH_FEEDBACK: 31,\n CONTACT_INFO: 32,\n CONTACT_ADD: 33,\n CONTACT_UPDATE: 34,\n CONTACT_PRESENCE: 35,\n CONTACT_LIST: 36,\n CONTACT_SEARCH: 37,\n CONTACT_MUTUAL: 38,\n CONTACT_PHOTOS: 39,\n CONTACT_SORT: 40,\n CONTACT_VERIFY: 42,\n REMOVE_CONTACT_PHOTO: 43,\n CONTACT_INFO_BY_PHONE: 46,\n CHAT_INFO: 48,\n CHAT_HISTORY: 49,\n CHAT_MARK: 50,\n CHAT_MEDIA: 51,\n CHAT_DELETE: 52,\n CHATS_LIST: 53,\n CHAT_CLEAR: 54,\n CHAT_UPDATE: 55,\n CHAT_CHECK_LINK: 56,\n CHAT_JOIN: 57,\n CHAT_LEAVE: 58,\n CHAT_MEMBERS: 59,\n PUBLIC_SEARCH: 60,\n CHAT_PERSONAL_CONFIG: 61,\n CHAT_LIVESTREAM_INFO: 62,\n CHAT_CREATE: 63,\n MSG_SEND: 64,\n MSG_TYPING: 65,\n MSG_DELETE: 66,\n MSG_EDIT: 67,\n CHAT_SEARCH: 68,\n MSG_SHARE_PREVIEW: 70,\n MSG_GET: 71,\n MSG_SEARCH_TOUCH: 72,\n MSG_SEARCH: 73,\n MSG_GET_STAT: 74,\n CHAT_SUBSCRIBE: 75,\n VIDEO_CHAT_START: 76,\n CHAT_MEMBERS_UPDATE: 77,\n VIDEO_CHAT_START_ACTIVE: 78,\n VIDEO_CHAT_HISTORY: 79,\n PHOTO_UPLOAD: 80,\n STICKER_UPLOAD: 81,\n VIDEO_UPLOAD: 82,\n VIDEO_PLAY: 83,\n VIDEO_CHAT_CREATE_JOIN_LINK: 84,\n CHAT_PIN_SET_VISIBILITY: 86,\n FILE_UPLOAD: 87,\n FILE_DOWNLOAD: 88,\n LINK_INFO: 89,\n MSG_DELETE_RANGE: 92,\n SESSIONS_INFO: 96,\n SESSIONS_CLOSE: 97,\n PHONE_BIND_REQUEST: 98,\n PHONE_BIND_CONFIRM: 99,\n AUTH_LOGIN_RESTORE_PASSWORD: 101,\n GET_INBOUND_CALLS: 103,\n AUTH_2FA_DETAILS: 104,\n EXTERNAL_CALLBACK: 105,\n AUTH_VALIDATE_PASSWORD: 107,\n AUTH_VALIDATE_HINT: 108,\n AUTH_VERIFY_EMAIL: 109,\n AUTH_CHECK_EMAIL: 110,\n AUTH_SET_2FA: 111,\n AUTH_CREATE_TRACK: 112,\n AUTH_CHECK_PASSWORD: 113,\n AUTH_LOGIN_CHECK_PASSWORD: 115,\n AUTH_LOGIN_PROFILE_DELETE: 116,\n CHAT_COMPLAIN: 117,\n MSG_SEND_CALLBACK: 118,\n SUSPEND_BOT: 119,\n LOCATION_STOP: 124,\n LOCATION_SEND: 125,\n LOCATION_REQUEST: 126,\n GET_LAST_MENTIONS: 127,\n NOTIF_MESSAGE: 128,\n NOTIF_TYPING: 129,\n NOTIF_MARK: 130,\n NOTIF_CONTACT: 131,\n NOTIF_PRESENCE: 132,\n NOTIF_CONFIG: 134,\n NOTIF_CHAT: 135,\n NOTIF_ATTACH: 136,\n NOTIF_CALL_START: 137,\n NOTIF_CONTACT_SORT: 139,\n NOTIF_MSG_DELETE_RANGE: 140,\n NOTIF_MSG_DELETE: 142,\n NOTIF_CALLBACK_ANSWER: 143,\n CHAT_BOT_COMMANDS: 144,\n BOT_INFO: 145,\n NOTIF_LOCATION: 147,\n NOTIF_LOCATION_REQUEST: 148,\n NOTIF_ASSETS_UPDATE: 150,\n NOTIF_DRAFT: 152,\n NOTIF_DRAFT_DISCARD: 153,\n NOTIF_MSG_DELAYED: 154,\n NOTIF_MSG_REACTIONS_CHANGED: 155,\n NOTIF_MSG_YOU_REACTED: 156,\n CALLS_TOKEN: 158,\n NOTIF_PROFILE: 159,\n WEB_APP_INIT_DATA: 160,\n COMPLAIN: 161,\n COMPLAIN_REASONS_GET: 162,\n VIDEO_CHAT_JOIN: 166,\n DRAFT_SAVE: 176,\n DRAFT_DISCARD: 177,\n MSG_REACTION: 178,\n MSG_CANCEL_REACTION: 179,\n MSG_GET_REACTIONS: 180,\n MSG_GET_DETAILED_REACTIONS: 181,\n STICKER_CREATE: 193,\n STICKER_SUGGEST: 194,\n VIDEO_CHAT_MEMBERS: 195,\n CHAT_HIDE: 196,\n CHAT_SEARCH_COMMON_PARTICIPANTS: 198,\n PROFILE_DELETE: 199,\n PROFILE_DELETE_TIME: 200,\n TRANSCRIBE_MEDIA: 202,\n ORG_INFO: 256,\n CHAT_REACTIONS_SETTINGS_SET: 257,\n REACTIONS_SETTINGS_GET_BY_CHAT_ID: 258,\n ASSETS_REMOVE: 259,\n ASSETS_MOVE: 260,\n ASSETS_LIST_MODIFY: 261,\n FOLDERS_GET: 272,\n FOLDERS_GET_BY_ID: 273,\n FOLDERS_UPDATE: 274,\n FOLDERS_REORDER: 275,\n FOLDERS_DELETE: 276,\n NOTIF_FOLDERS: 277,\n GET_QR: 288,\n GET_QR_STATUS: 289,\n AUTH_QR_APPROVE: 290,\n LOGIN_BY_QR: 291,\n NOTIF_BANNERS: 292,\n NOTIF_TRANSCRIPTION: 293,\n CHAT_SUGGEST: 300,\n AUDIO_PLAY: 301,\n BANNERS_GET: 302,\n MSG_DELIVERY: 303,\n SEND_VOTE: 304,\n VOTERS_LIST_BY_ANSWER: 305,\n GET_POLL_UPDATES: 306,\n} as const;\nexport type Opcode = (typeof Opcode)[keyof typeof Opcode];\n",
|
|
7
|
+
"import { decode, encode } from \"@msgpack/msgpack\";\n\nimport { Lz4BlockCompression, ZstdCompression } from \"./compression.ts\";\nimport type { InboundFrame, OutboundFrame, PackedPacket, Payload, Protocol } from \"./types.ts\";\n\nexport const TCP_HEADER_SIZE = 10;\n\nexport class TcpPacketFramer {\n pack(options: {\n ver: number;\n cmd: number;\n seq: number;\n opcode: number;\n flags: number;\n payloadBytes: Uint8Array;\n }): Uint8Array {\n if (options.payloadBytes.byteLength > 0x00ff_ffff) {\n throw new RangeError(\"TCP payload exceeds the 24-bit length field\");\n }\n const result = new Uint8Array(TCP_HEADER_SIZE + options.payloadBytes.byteLength);\n const view = new DataView(result.buffer);\n view.setUint8(0, options.ver);\n view.setUint8(1, options.cmd);\n view.setUint16(2, options.seq, false);\n view.setUint16(4, options.opcode, false);\n const packedLength = ((options.flags & 0xff) << 24) | options.payloadBytes.byteLength;\n view.setUint32(6, packedLength >>> 0, false);\n result.set(options.payloadBytes, TCP_HEADER_SIZE);\n return result;\n }\n\n unpack(data: Uint8Array): PackedPacket | null {\n if (data.byteLength < TCP_HEADER_SIZE) return null;\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const packedLength = view.getUint32(6, false);\n const payloadLength = packedLength & 0x00ff_ffff;\n if (data.byteLength < TCP_HEADER_SIZE + payloadLength) return null;\n return {\n header: {\n ver: view.getUint8(0),\n cmd: view.getUint8(1),\n seq: view.getUint16(2, false),\n opcode: view.getUint16(4, false),\n flags: packedLength >>> 24,\n payloadLength,\n },\n payloadBytes: data.slice(TCP_HEADER_SIZE, TCP_HEADER_SIZE + payloadLength),\n };\n }\n\n unpackPayloadLength(data: Uint8Array): number | null {\n if (data.byteLength < TCP_HEADER_SIZE) return null;\n return (\n new DataView(data.buffer, data.byteOffset, data.byteLength).getUint32(6, false) & 0x00ff_ffff\n );\n }\n}\n\nexport class MsgpackPayloadCodec {\n encode(payload: unknown): Uint8Array {\n if (payload === null || payload === undefined) return new Uint8Array();\n return encode(payload, { useBigInt64: true, ignoreUndefined: true });\n }\n\n decode(payload: Uint8Array): Payload {\n if (payload.byteLength === 0) return {};\n return normalizeKeys(decode(payload, { useBigInt64: true })) as Payload;\n }\n}\n\nexport class TcpPayloadDecoder {\n constructor(\n private readonly serializer = new MsgpackPayloadCodec(),\n private readonly lz4 = new Lz4BlockCompression(),\n private readonly zstd = new ZstdCompression(),\n ) {}\n\n decode(payload: Uint8Array, flags = 0): Payload {\n if (payload.byteLength === 0) return {};\n let decoded = payload;\n if (flags === 0xff) decoded = this.zstd.decompress(payload);\n else if (flags > 0x7f) throw new RangeError(`Invalid TCP compression factor: ${flags}`);\n else if (flags > 0) decoded = this.lz4.decompress(payload);\n return this.serializer.decode(decoded);\n }\n}\n\nexport class TcpProtocol implements Protocol<Uint8Array> {\n readonly version = 10;\n readonly framer = new TcpPacketFramer();\n readonly serializer = new MsgpackPayloadCodec();\n readonly payloadDecoder = new TcpPayloadDecoder(this.serializer);\n\n encode(frame: OutboundFrame): Uint8Array {\n const payloadBytes = this.serializer.encode(frame.payload);\n return this.framer.pack({\n ver: this.version,\n cmd: frame.cmd ?? 0,\n seq: frame.seq,\n opcode: frame.opcode,\n flags: 0,\n payloadBytes,\n });\n }\n\n decode(raw: Uint8Array): InboundFrame {\n const packet = this.framer.unpack(raw);\n if (!packet) return { opcode: 0, cmd: 0, seq: null, payload: null, raw: null };\n const payload = this.payloadDecoder.decode(packet.payloadBytes, packet.header.flags);\n return {\n opcode: packet.header.opcode,\n cmd: packet.header.cmd,\n seq: packet.header.seq,\n payload,\n raw: payload,\n };\n }\n}\n\nfunction normalizeKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(normalizeKeys);\n if (value instanceof Map) {\n const result: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (const [key, item] of value) result[normalizeKey(key)] = normalizeKeys(item);\n return result;\n }\n if (value !== null && typeof value === \"object\" && !(value instanceof Uint8Array)) {\n const result: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (const [key, item] of Object.entries(value))\n result[normalizeKey(key)] = normalizeKeys(item);\n return result;\n }\n return value;\n}\n\nfunction normalizeKey(value: unknown): string {\n if (value instanceof Uint8Array) return new TextDecoder().decode(value);\n return String(value);\n}\n",
|
|
8
|
+
"import { isInteger, isSafeNumber, parse, stringify } from \"lossless-json\";\n\nimport type { InboundFrame, OutboundFrame, Payload, Protocol } from \"./types.ts\";\n\nexport class WsProtocol implements Protocol<string> {\n readonly version = 11;\n\n encode(frame: OutboundFrame): string {\n return stringify({ ...frame, cmd: frame.cmd ?? 0, ver: this.version }) as string;\n }\n\n decode(raw: string): InboundFrame {\n try {\n const value = parse(raw, undefined, {\n parseNumber: (text) => {\n if (isInteger(text) && !isSafeNumber(text)) return BigInt(text);\n return Number(text);\n },\n });\n if (!isRecord(value)) return emptyFrame();\n const opcode = safeHeaderNumber(value.opcode);\n const cmd = safeHeaderNumber(value.cmd ?? 0);\n const seq =\n value.seq === null || value.seq === undefined ? null : safeHeaderNumber(value.seq);\n const payload = isRecord(value.payload) ? value.payload : null;\n return { opcode, cmd, seq, payload, raw: payload };\n } catch {\n return emptyFrame();\n }\n }\n}\n\nfunction safeHeaderNumber(value: unknown): number {\n const result = typeof value === \"bigint\" ? Number(value) : value;\n if (typeof result !== \"number\" || !Number.isSafeInteger(result)) {\n throw new TypeError(\"Invalid WebSocket frame header\");\n }\n return result;\n}\n\nfunction isRecord(value: unknown): value is Payload {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction emptyFrame(): InboundFrame {\n return { opcode: 0, cmd: 0, seq: null, payload: null, raw: null };\n}\n",
|
|
9
|
+
"export type MaxId = bigint;\n\nexport function toMaxId(value: unknown, field = \"id\"): MaxId {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"string\" && /^-?\\d+$/.test(value)) return BigInt(value);\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return BigInt(value);\n throw new TypeError(`${field} must be a lossless integer`);\n}\n\nexport function optionalMaxId(value: unknown, field = \"id\"): MaxId | null {\n return value === null || value === undefined ? null : toMaxId(value, field);\n}\n\nexport function asRecord(value: unknown, field = \"payload\"): Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(`${field} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nexport function optionalRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function asNumber(value: unknown, fallback = 0): number {\n if (typeof value === \"bigint\") {\n const number = Number(value);\n return Number.isSafeInteger(number) ? number : fallback;\n }\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nexport function asBoolean(value: unknown, fallback = false): boolean {\n return typeof value === \"boolean\" ? value : fallback;\n}\n\nexport function asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n",
|
|
10
|
+
"import { asRecord, asString } from \"./utils.ts\";\n\nexport const AttachmentType = {\n PHOTO: \"PHOTO\",\n VIDEO: \"VIDEO\",\n FILE: \"FILE\",\n CONTACT: \"CONTACT\",\n STICKER: \"STICKER\",\n AUDIO: \"AUDIO\",\n CONTROL: \"CONTROL\",\n INLINE_KEYBOARD: \"INLINE_KEYBOARD\",\n SHARE: \"SHARE\",\n CALL: \"CALL\",\n} as const;\n\nexport interface Attachment {\n readonly type: string;\n readonly raw: Readonly<Record<string, unknown>>;\n}\n\nexport function parseAttachment(value: unknown): Attachment {\n const raw = asRecord(value, \"attachment\");\n return { type: asString(raw.type ?? raw._type, \"UNKNOWN\"), raw };\n}\n",
|
|
11
|
+
"import type { Attachment } from \"./attachments.ts\";\nimport { parseAttachment } from \"./attachments.ts\";\nimport {\n asArray,\n asNumber,\n asRecord,\n asString,\n optionalMaxId,\n optionalRecord,\n toMaxId,\n type MaxId,\n} from \"./utils.ts\";\n\nexport const ChatType = {\n DIALOG: \"DIALOG\",\n CHAT: \"CHAT\",\n CHANNEL: \"CHANNEL\",\n} as const;\n\nexport interface ReactionCounter {\n count: number;\n reaction: string;\n}\n\nexport interface ReactionInfo {\n totalCount: number;\n counters: ReactionCounter[];\n yourReaction: string | null;\n}\n\nexport interface ReadState {\n unread: number;\n mark: number;\n}\n\nexport interface MessageActions {\n sendMessage(options: SendMessageOptions): Promise<Message | null>;\n forwardMessage(options: ForwardMessageOptions): Promise<Message | null>;\n editMessage(options: EditMessageOptions): Promise<Message>;\n deleteMessage(options: { chatId: MaxId; messageIds: MaxId[]; forMe: boolean }): Promise<boolean>;\n pinMessage(options: { chatId: MaxId; messageId: MaxId; notifyPin: boolean }): Promise<boolean>;\n readMessage(messageId: MaxId, chatId: MaxId): Promise<ReadState>;\n addReaction(chatId: MaxId, messageId: MaxId, reaction: string): Promise<ReactionInfo | null>;\n removeReaction(chatId: MaxId, messageId: MaxId): Promise<ReactionInfo | null>;\n getReactions(chatId: MaxId, messageIds: MaxId[]): Promise<Map<MaxId, ReactionInfo> | null>;\n getMessages(chatId: MaxId, messageIds: MaxId[]): Promise<Message[]>;\n fetchHistory(options: HistoryOptions): Promise<Message[] | null>;\n}\n\nexport interface ChatActions {\n leaveGroup(chatId: MaxId): Promise<void>;\n leaveChannel(chatId: MaxId): Promise<void>;\n deleteChat(chatId: MaxId, forMe: boolean): Promise<boolean>;\n inviteUsersToGroup(chatId: MaxId, userIds: MaxId[]): Promise<Chat | null>;\n removeUsersFromGroup(chatId: MaxId, userIds: MaxId[]): Promise<Chat | null>;\n}\n\nexport interface UserActions {\n addContact(contactId: MaxId): Promise<User>;\n removeContact(contactId: MaxId): Promise<boolean>;\n getChatId(firstUserId: MaxId, secondUserId: MaxId): MaxId;\n}\n\nexport interface SendMessageOptions {\n chatId: MaxId;\n text: string;\n replyTo?: MaxId | null;\n attachments?: readonly unknown[] | null;\n notify?: boolean;\n}\n\nexport interface ForwardMessageOptions {\n chatId: MaxId;\n messageId: MaxId;\n sourceChatId?: MaxId | null;\n notify?: boolean;\n}\n\nexport interface EditMessageOptions {\n chatId: MaxId;\n messageId: MaxId;\n text: string;\n attachments?: readonly unknown[] | null;\n}\n\nexport interface HistoryOptions {\n chatId: MaxId;\n forward?: number;\n backward?: number;\n backwardTime?: number;\n forwardTime?: number;\n from?: number;\n itemType?: string;\n getChat?: boolean;\n getMessages?: boolean;\n interactive?: boolean;\n}\n\nexport class Message {\n readonly id: MaxId;\n chatId: MaxId | null;\n readonly sender: MaxId | null;\n readonly text: string;\n readonly time: number;\n readonly type: string;\n readonly cid: MaxId | null;\n readonly attaches: Attachment[];\n readonly stats: Record<string, unknown> | null;\n readonly status: string | null;\n readonly reactionInfo: ReactionInfo | null;\n readonly options: number | Record<string, unknown> | null;\n readonly previousMessageId: MaxId | null;\n readonly ttl: boolean | null;\n readonly unread: number | null;\n readonly mark: number | null;\n readonly elements: Record<string, unknown>[];\n readonly raw: Readonly<Record<string, unknown>>;\n private actions: MessageActions | null = null;\n\n private constructor(payload: Record<string, unknown>) {\n this.id = toMaxId(payload.id, \"message.id\");\n this.chatId = optionalMaxId(payload.chatId, \"message.chatId\");\n this.sender = optionalMaxId(payload.sender, \"message.sender\");\n this.text = asString(payload.text);\n this.time = asNumber(payload.time);\n this.type = asString(payload.type);\n this.cid = optionalMaxId(payload.cid, \"message.cid\");\n this.attaches = asArray(payload.attaches).map(parseAttachment);\n this.stats = optionalRecord(payload.stats);\n this.status = typeof payload.status === \"string\" ? payload.status : null;\n this.reactionInfo = parseReactionInfo(payload.reactionInfo);\n this.options =\n typeof payload.options === \"number\" || optionalRecord(payload.options) !== null\n ? (payload.options as number | Record<string, unknown>)\n : null;\n this.previousMessageId = optionalMaxId(payload.prevMessageId, \"message.prevMessageId\");\n this.ttl = typeof payload.ttl === \"boolean\" ? payload.ttl : null;\n this.unread =\n payload.unread === null || payload.unread === undefined ? null : asNumber(payload.unread);\n this.mark = payload.mark === null || payload.mark === undefined ? null : asNumber(payload.mark);\n this.elements = asArray(payload.elements).map((item) => asRecord(item, \"element\"));\n this.raw = Object.freeze({ ...payload });\n }\n\n static fromPayload(value: unknown): Message {\n return new Message(asRecord(value, \"message\"));\n }\n\n bind(actions: MessageActions): this {\n this.actions = actions;\n return this;\n }\n\n async reply(\n text: string,\n options: Omit<SendMessageOptions, \"chatId\" | \"text\" | \"replyTo\"> = {},\n ): Promise<Message | null> {\n return await this.requireActions().sendMessage({\n ...options,\n chatId: this.requireChatId(),\n text,\n replyTo: this.id,\n });\n }\n\n async answer(\n text: string,\n options: Omit<SendMessageOptions, \"chatId\" | \"text\"> = {},\n ): Promise<Message | null> {\n return await this.requireActions().sendMessage({\n ...options,\n chatId: this.requireChatId(),\n text,\n });\n }\n\n async forward(chatId: MaxId, notify = true): Promise<Message | null> {\n return await this.requireActions().forwardMessage({\n chatId,\n messageId: this.id,\n sourceChatId: this.requireChatId(),\n notify,\n });\n }\n\n async edit(text: string, attachments?: readonly unknown[] | null): Promise<Message> {\n return await this.requireActions().editMessage({\n chatId: this.requireChatId(),\n messageId: this.id,\n text,\n ...(attachments !== undefined ? { attachments } : {}),\n });\n }\n\n async pin(notifyPin = true): Promise<boolean> {\n return await this.requireActions().pinMessage({\n chatId: this.requireChatId(),\n messageId: this.id,\n notifyPin,\n });\n }\n\n async delete(forMe = false): Promise<boolean> {\n return await this.requireActions().deleteMessage({\n chatId: this.requireChatId(),\n messageIds: [this.id],\n forMe,\n });\n }\n\n async read(): Promise<ReadState> {\n return await this.requireActions().readMessage(this.id, this.requireChatId());\n }\n\n async react(reaction: string): Promise<ReactionInfo | null> {\n return await this.requireActions().addReaction(this.requireChatId(), this.id, reaction);\n }\n\n async unreact(): Promise<ReactionInfo | null> {\n return await this.requireActions().removeReaction(this.requireChatId(), this.id);\n }\n\n async getReactions(): Promise<ReactionInfo | null> {\n return (\n (await this.requireActions().getReactions(this.requireChatId(), [this.id]))?.get(this.id) ??\n null\n );\n }\n\n private requireActions(): MessageActions {\n if (!this.actions) throw new Error(\"Message is not bound to a client\");\n return this.actions;\n }\n\n private requireChatId(): MaxId {\n if (this.chatId === null) throw new Error(\"Message has no chatId\");\n return this.chatId;\n }\n}\n\nexport class Chat {\n readonly id: MaxId;\n readonly type: string;\n readonly status: string;\n readonly owner: MaxId;\n readonly participants: Map<MaxId, number>;\n readonly title: string | null;\n readonly lastMessage: Message | null;\n readonly pinnedMessage: Message | null;\n readonly lastEventTime: number;\n readonly link: string | null;\n readonly description: string | null;\n readonly raw: Readonly<Record<string, unknown>>;\n private messageActions: MessageActions | null = null;\n private chatActions: ChatActions | null = null;\n\n private constructor(payload: Record<string, unknown>) {\n this.id = toMaxId(payload.id, \"chat.id\");\n this.type = asString(payload.type);\n this.status = asString(payload.status);\n this.owner = optionalMaxId(payload.owner, \"chat.owner\") ?? 0n;\n this.participants = parseParticipants(payload.participants);\n this.title = typeof payload.title === \"string\" ? payload.title : null;\n this.lastMessage = payload.lastMessage ? Message.fromPayload(payload.lastMessage) : null;\n this.pinnedMessage = payload.pinnedMessage ? Message.fromPayload(payload.pinnedMessage) : null;\n this.lastEventTime = asNumber(payload.lastEventTime);\n this.link = typeof payload.link === \"string\" ? payload.link : null;\n this.description = typeof payload.description === \"string\" ? payload.description : null;\n this.raw = Object.freeze({ ...payload });\n }\n\n static fromPayload(value: unknown): Chat {\n return new Chat(asRecord(value, \"chat\"));\n }\n\n bind(messageActions: MessageActions, chatActions: ChatActions): this {\n this.messageActions = messageActions;\n this.chatActions = chatActions;\n this.lastMessage?.bind(messageActions);\n this.pinnedMessage?.bind(messageActions);\n return this;\n }\n\n async answer(\n text: string,\n options: Omit<SendMessageOptions, \"chatId\" | \"text\"> = {},\n ): Promise<Message | null> {\n return await this.requireMessageActions().sendMessage({ ...options, chatId: this.id, text });\n }\n\n async history(options: Omit<HistoryOptions, \"chatId\"> = {}): Promise<Message[] | null> {\n return await this.requireMessageActions().fetchHistory({ ...options, chatId: this.id });\n }\n\n async getMessage(messageId: MaxId): Promise<Message | null> {\n return (await this.requireMessageActions().getMessages(this.id, [messageId]))[0] ?? null;\n }\n\n async getMessages(messageIds: MaxId[]): Promise<Message[]> {\n return await this.requireMessageActions().getMessages(this.id, messageIds);\n }\n\n async leave(): Promise<void> {\n const actions = this.requireChatActions();\n if (this.type === ChatType.CHANNEL) await actions.leaveChannel(this.id);\n else if (this.type === ChatType.CHAT) await actions.leaveGroup(this.id);\n else throw new Error(\"Cannot leave a dialog\");\n }\n\n async delete(forMe = true): Promise<boolean> {\n return await this.requireChatActions().deleteChat(this.id, forMe);\n }\n\n async invite(userIds: MaxId[]): Promise<Chat | null> {\n return await this.requireChatActions().inviteUsersToGroup(this.id, userIds);\n }\n\n async removeUsers(userIds: MaxId[]): Promise<Chat | null> {\n return await this.requireChatActions().removeUsersFromGroup(this.id, userIds);\n }\n\n private requireMessageActions(): MessageActions {\n if (!this.messageActions) throw new Error(\"Chat is not bound to a client\");\n return this.messageActions;\n }\n private requireChatActions(): ChatActions {\n if (!this.chatActions) throw new Error(\"Chat is not bound to a client\");\n return this.chatActions;\n }\n}\n\nexport class User {\n readonly id: MaxId;\n readonly names: ReadonlyArray<{ firstName: string; lastName: string | null; name?: string }>;\n readonly phone: MaxId | null;\n readonly status: string | null;\n readonly description: string | null;\n readonly gender: string | number | null;\n readonly link: string | null;\n readonly webApp: Record<string, unknown> | string | null;\n readonly raw: Readonly<Record<string, unknown>>;\n private actions: UserActions | null = null;\n\n private constructor(payload: Record<string, unknown>) {\n this.id = toMaxId(payload.id, \"user.id\");\n this.names = asArray(payload.names).map((item) => {\n const name = asRecord(item, \"name\");\n return {\n firstName: asString(name.firstName),\n lastName: typeof name.lastName === \"string\" ? name.lastName : null,\n ...(typeof name.name === \"string\" ? { name: name.name } : {}),\n };\n });\n this.phone = optionalMaxId(payload.phone, \"user.phone\");\n this.status = typeof payload.status === \"string\" ? payload.status : null;\n this.description = typeof payload.description === \"string\" ? payload.description : null;\n this.gender =\n typeof payload.gender === \"string\" || typeof payload.gender === \"number\"\n ? payload.gender\n : null;\n this.link = typeof payload.link === \"string\" ? payload.link : null;\n this.webApp =\n typeof payload.webApp === \"string\" ? payload.webApp : optionalRecord(payload.webApp);\n this.raw = Object.freeze({ ...payload });\n }\n\n static fromPayload(value: unknown): User {\n return new User(asRecord(value, \"user\"));\n }\n bind(actions: UserActions): this {\n this.actions = actions;\n return this;\n }\n async addContact(): Promise<User> {\n return await this.requireActions().addContact(this.id);\n }\n async removeContact(): Promise<boolean> {\n return await this.requireActions().removeContact(this.id);\n }\n getChatId(userId: MaxId): MaxId {\n return this.requireActions().getChatId(userId, this.id);\n }\n private requireActions(): UserActions {\n if (!this.actions) throw new Error(\"User is not bound to a client\");\n return this.actions;\n }\n}\n\nexport class Profile {\n readonly contact: User;\n readonly profileOptions: number[] | null;\n readonly raw: Readonly<Record<string, unknown>>;\n private constructor(payload: Record<string, unknown>) {\n this.contact = User.fromPayload(payload.contact);\n const rawOptions = payload.profileOptions ?? payload.options;\n this.profileOptions = Array.isArray(rawOptions)\n ? rawOptions.map((item) => asNumber(item))\n : null;\n this.raw = Object.freeze({ ...payload });\n }\n static fromPayload(value: unknown): Profile {\n return new Profile(asRecord(value, \"profile\"));\n }\n}\n\nexport interface MessageDeleteEvent {\n chatId: MaxId;\n messageIds: MaxId[];\n chat?: Chat | null;\n message?: Message | null;\n ttl?: boolean;\n}\nexport interface MessageReadEvent {\n chatId: MaxId;\n userId: MaxId | null;\n mark: number;\n}\nexport interface TypingEvent {\n chatId: MaxId;\n userId: MaxId;\n typing: boolean;\n}\nexport interface PresenceEvent {\n userId: MaxId;\n online: boolean;\n lastSeen: number | null;\n raw: Readonly<Record<string, unknown>>;\n}\nexport interface ReactionUpdateEvent {\n chatId: MaxId;\n messageId: MaxId;\n reactionInfo: ReactionInfo | null;\n}\n\nexport function parseReactionInfo(value: unknown): ReactionInfo | null {\n if (value === null || value === undefined) return null;\n const payload = asRecord(value, \"reactionInfo\");\n return {\n totalCount: asNumber(payload.totalCount),\n counters: asArray(payload.counters).map((item) => {\n const counter = asRecord(item, \"reactionCounter\");\n return { count: asNumber(counter.count), reaction: asString(counter.reaction) };\n }),\n yourReaction: typeof payload.yourReaction === \"string\" ? payload.yourReaction : null,\n };\n}\n\nexport function parseReadState(value: unknown): ReadState {\n const payload = asRecord(value, \"readState\");\n return { unread: asNumber(payload.unread), mark: asNumber(payload.mark) };\n}\n\nfunction parseParticipants(value: unknown): Map<MaxId, number> {\n const result = new Map<MaxId, number>();\n if (value instanceof Map) {\n for (const [id, role] of value) result.set(toMaxId(id), asNumber(role));\n } else if (value !== null && typeof value === \"object\") {\n for (const [id, role] of Object.entries(value)) result.set(toMaxId(id), asNumber(role));\n }\n return result;\n}\n",
|
|
12
|
+
"import { Database } from \"bun:sqlite\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { getLogger } from \"../logging.ts\";\nimport {\n DEFAULT_CONFIG_HASH,\n defaultSyncState,\n type SessionInfo,\n type SessionStore as SessionStoreContract,\n} from \"./types.ts\";\n\ninterface SessionRow {\n token: string;\n device_id: string;\n phone: string;\n mt_instance_id: string;\n chats_sync: number;\n contacts_sync: number;\n drafts_sync: number;\n presence_sync: number;\n config_hash: string | number;\n}\n\nconst columns = `token, device_id, phone, mt_instance_id, chats_sync, contacts_sync,\n drafts_sync, presence_sync, config_hash`;\n\nexport class SqliteSessionStore implements SessionStoreContract {\n readonly path: string;\n private database: Database | null = null;\n\n constructor(workDir: string, databaseName = \"session.db\") {\n mkdirSync(workDir, { recursive: true });\n this.path = join(workDir, databaseName);\n }\n\n async saveSession(session: SessionInfo): Promise<void> {\n const db = this.getDatabase();\n db.query(`INSERT OR REPLACE INTO sessions (${columns}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(\n session.token,\n session.deviceId,\n session.phone,\n session.mtInstanceId,\n session.sync.chatsSync,\n session.sync.contactsSync,\n session.sync.draftsSync,\n session.sync.presenceSync,\n String(session.sync.configHash),\n );\n getLogger().info(\"session saved\");\n }\n\n async updateToken(oldToken: string, newToken: string): Promise<void> {\n this.getDatabase()\n .query(\"UPDATE sessions SET token = ? WHERE token = ?\")\n .run(newToken, oldToken);\n }\n\n async loadSession(): Promise<SessionInfo | null> {\n return this.rowToSession(\n this.getDatabase()\n .query(`SELECT ${columns} FROM sessions LIMIT 1`)\n .get() as SessionRow | null,\n );\n }\n\n async loadSessionByDeviceId(deviceId: string): Promise<SessionInfo | null> {\n return this.rowToSession(\n this.getDatabase()\n .query(`SELECT ${columns} FROM sessions WHERE device_id = ?`)\n .get(deviceId) as SessionRow | null,\n );\n }\n\n async loadSessionByPhone(phone: string): Promise<SessionInfo | null> {\n return this.rowToSession(\n this.getDatabase()\n .query(`SELECT ${columns} FROM sessions WHERE phone = ?`)\n .get(phone) as SessionRow | null,\n );\n }\n\n async deleteSession(token: string): Promise<void> {\n this.getDatabase().query(\"DELETE FROM sessions WHERE token = ?\").run(token);\n }\n\n async deleteAllSessions(): Promise<void> {\n this.getDatabase().run(\"DELETE FROM sessions\");\n }\n\n async close(): Promise<void> {\n this.database?.close();\n this.database = null;\n }\n\n private getDatabase(): Database {\n if (this.database) return this.database;\n const database = new Database(this.path, { create: true, strict: true });\n database.run(`CREATE TABLE IF NOT EXISTS sessions (\n token TEXT NOT NULL PRIMARY KEY,\n device_id TEXT NOT NULL,\n phone TEXT NOT NULL,\n mt_instance_id TEXT NOT NULL DEFAULT '',\n chats_sync INTEGER NOT NULL DEFAULT -1,\n contacts_sync INTEGER NOT NULL DEFAULT -1,\n drafts_sync INTEGER NOT NULL DEFAULT -1,\n presence_sync INTEGER NOT NULL DEFAULT -1,\n config_hash TEXT NOT NULL DEFAULT ''\n )`);\n this.ensureColumns(database);\n database\n .query(\"UPDATE sessions SET config_hash = ? WHERE config_hash = ''\")\n .run(DEFAULT_CONFIG_HASH);\n this.database = database;\n return database;\n }\n\n private ensureColumns(database: Database): void {\n const existing = new Set(\n (database.query(\"PRAGMA table_info(sessions)\").all() as { name: string }[]).map(\n (row) => row.name,\n ),\n );\n const definitions: Record<string, string> = {\n mt_instance_id: \"TEXT NOT NULL DEFAULT ''\",\n chats_sync: \"INTEGER NOT NULL DEFAULT -1\",\n contacts_sync: \"INTEGER NOT NULL DEFAULT -1\",\n drafts_sync: \"INTEGER NOT NULL DEFAULT -1\",\n presence_sync: \"INTEGER NOT NULL DEFAULT -1\",\n config_hash: \"TEXT NOT NULL DEFAULT ''\",\n };\n for (const [name, definition] of Object.entries(definitions)) {\n if (!existing.has(name))\n database.run(`ALTER TABLE sessions ADD COLUMN ${name} ${definition}`);\n }\n }\n\n private rowToSession(row: SessionRow | null): SessionInfo | null {\n if (!row) return null;\n return {\n token: row.token,\n deviceId: row.device_id,\n phone: row.phone,\n mtInstanceId: row.mt_instance_id || \"\",\n sync: defaultSyncState({\n chatsSync: row.chats_sync,\n contactsSync: row.contacts_sync,\n draftsSync: row.drafts_sync,\n presenceSync: row.presence_sync,\n configHash: row.config_hash || DEFAULT_CONFIG_HASH,\n }),\n };\n }\n}\n",
|
|
13
|
+
"export type LogLevel = \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\" | \"SILENT\";\n\nexport interface Logger {\n debug(message: string, context?: Record<string, unknown>): void;\n info(message: string, context?: Record<string, unknown>): void;\n warn(message: string, context?: Record<string, unknown>): void;\n error(message: string, context?: Record<string, unknown>): void;\n}\n\nconst priorities: Record<LogLevel, number> = {\n DEBUG: 10,\n INFO: 20,\n WARN: 30,\n ERROR: 40,\n SILENT: 100,\n};\n\nclass ConsoleLogger implements Logger {\n constructor(private readonly level: LogLevel) {}\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.write(\"DEBUG\", message, context);\n }\n info(message: string, context?: Record<string, unknown>): void {\n this.write(\"INFO\", message, context);\n }\n warn(message: string, context?: Record<string, unknown>): void {\n this.write(\"WARN\", message, context);\n }\n error(message: string, context?: Record<string, unknown>): void {\n this.write(\"ERROR\", message, context);\n }\n\n private write(\n level: Exclude<LogLevel, \"SILENT\">,\n message: string,\n context?: Record<string, unknown>,\n ): void {\n if (priorities[level] < priorities[this.level]) return;\n const suffix = context ? ` ${JSON.stringify(redact(context))}` : \"\";\n const line = `[tsmax] ${level.toLowerCase()} ${message}${suffix}`;\n if (level === \"ERROR\") console.error(line);\n else if (level === \"WARN\") console.warn(line);\n else console.log(line);\n }\n}\n\nlet activeLogger: Logger = new ConsoleLogger(\"INFO\");\n\nexport function configureLogging(level: LogLevel = \"INFO\", logger?: Logger): Logger {\n activeLogger = logger ?? new ConsoleLogger(level);\n return activeLogger;\n}\n\nexport function getLogger(): Logger {\n return activeLogger;\n}\n\nfunction redact(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redact);\n if (value === null || typeof value !== \"object\") return value;\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n result[key] = /token|password|phone|code/i.test(key) ? \"[redacted]\" : redact(item);\n }\n return result;\n}\n",
|
|
14
|
+
"export const DEFAULT_CONFIG_HASH =\n \"00000000-0000000000000000-00000000-0000000000000000-0000000000000000-0-0000000000000000-00000000\";\n\nexport interface SyncState {\n chatsSync: number;\n contactsSync: number;\n draftsSync: number;\n presenceSync: number;\n configHash: string | number;\n}\n\nexport type SyncOverrides = Partial<SyncState>;\n\nexport interface SessionInfo {\n token: string;\n deviceId: string;\n phone: string;\n mtInstanceId: string;\n sync: SyncState;\n}\n\nexport interface SessionStore {\n saveSession(session: SessionInfo): Promise<void>;\n updateToken(oldToken: string, newToken: string): Promise<void>;\n loadSession(): Promise<SessionInfo | null>;\n loadSessionByDeviceId(deviceId: string): Promise<SessionInfo | null>;\n loadSessionByPhone(phone: string): Promise<SessionInfo | null>;\n deleteSession(token: string): Promise<void>;\n deleteAllSessions(): Promise<void>;\n close(): Promise<void>;\n}\n\nexport function defaultSyncState(overrides: SyncOverrides = {}): SyncState {\n return {\n chatsSync: overrides.chatsSync ?? -1,\n contactsSync: overrides.contactsSync ?? -1,\n draftsSync: overrides.draftsSync ?? -1,\n presenceSync: overrides.presenceSync ?? -1,\n configHash: overrides.configHash ?? DEFAULT_CONFIG_HASH,\n };\n}\n\nexport function resolveSync(saved: SyncState, overrides: SyncOverrides = {}): SyncState {\n return { ...saved, ...overrides };\n}\n",
|
|
15
|
+
"import { basename, extname } from \"node:path\";\n\nexport interface FileSource {\n raw?: Uint8Array;\n path?: string;\n url?: string;\n name?: string;\n}\n\nexport class MaxFile {\n readonly raw: Uint8Array | null;\n readonly path: string | null;\n readonly url: string | null;\n readonly name: string;\n\n constructor(source: FileSource) {\n const sources = [source.raw, source.path, source.url].filter((value) => value !== undefined);\n if (sources.length !== 1)\n throw new TypeError(\"Exactly one of raw, path, or url must be provided\");\n this.raw = source.raw ?? null;\n this.path = source.path ?? null;\n this.url = source.url ?? null;\n this.name = source.name ?? inferName(source.path, source.url);\n if (!this.name) throw new TypeError(\"A name is required for raw file data\");\n }\n\n async read(): Promise<Uint8Array> {\n if (this.raw) return this.raw;\n if (this.path) return new Uint8Array(await Bun.file(this.path).arrayBuffer());\n if (this.url) {\n const response = await fetch(this.url);\n if (!response.ok) throw new Error(`Failed to download ${this.url}: ${response.status}`);\n return new Uint8Array(await response.arrayBuffer());\n }\n throw new Error(\"File has no source\");\n }\n\n async size(): Promise<number> {\n if (this.raw) return this.raw.byteLength;\n if (this.path) return Bun.file(this.path).size;\n if (this.url) {\n const response = await fetch(this.url, { method: \"HEAD\" });\n if (!response.ok) throw new Error(`Failed to inspect ${this.url}: ${response.status}`);\n const length = response.headers.get(\"content-length\");\n if (!length) return (await this.read()).byteLength;\n return Number(length);\n }\n throw new Error(\"File has no source\");\n }\n\n async *chunks(chunkSize: number): AsyncGenerator<Uint8Array> {\n if (!Number.isInteger(chunkSize) || chunkSize <= 0)\n throw new RangeError(\"chunkSize must be positive\");\n const data = await this.read();\n for (let offset = 0; offset < data.byteLength; offset += chunkSize) {\n yield data.slice(offset, offset + chunkSize);\n }\n }\n}\n\nexport class File extends MaxFile {}\nexport class Video extends MaxFile {}\n\nconst allowedPhotoExtensions = new Set([\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".bmp\"]);\n\nexport class Photo extends MaxFile {\n constructor(source: FileSource) {\n super(source);\n const extension = extname(\n this.url ? new URL(this.url).pathname : (this.path ?? this.name),\n ).toLowerCase();\n if (!allowedPhotoExtensions.has(extension)) {\n throw new TypeError(`Invalid photo extension: ${extension}`);\n }\n }\n\n get format(): { extension: string; mimeType: string } {\n const extension = extname(this.url ? new URL(this.url).pathname : (this.path ?? this.name))\n .toLowerCase()\n .slice(1);\n const normalized = extension === \"jpg\" ? \"jpeg\" : extension;\n return { extension, mimeType: `image/${normalized}` };\n }\n}\n\nexport type SendAttachment = File | Video | Photo;\n\nfunction inferName(path?: string, url?: string): string {\n if (path) return basename(path);\n if (url) return basename(new URL(url).pathname);\n return \"\";\n}\n",
|
|
16
|
+
"import QRCode from \"qrcode\";\n\ntype MaybePromise<T> = T | Promise<T>;\nexport type SmsCodeProvider = (phone: string) => MaybePromise<string>;\nexport type PasswordProvider = (hint: string | null) => MaybePromise<string>;\nexport type EmailCodeProvider = (email: string) => MaybePromise<string>;\nexport type QrHandler = (link: string) => MaybePromise<void>;\n\nexport const consoleSmsCodeProvider: SmsCodeProvider = (phone) => {\n const code = prompt(`SMS code for ${phone}:`);\n if (!code) throw new Error(\"SMS code is required\");\n return code;\n};\n\nexport const consolePasswordProvider: PasswordProvider = (hint) => {\n const password = prompt(`2FA password${hint ? ` (${hint})` : \"\"}:`);\n if (!password) throw new Error(\"2FA password is required\");\n return password;\n};\n\nexport const consoleEmailCodeProvider: EmailCodeProvider = (email) => {\n const code = prompt(`Email code for ${email}:`);\n if (!code) throw new Error(\"Email code is required\");\n return code;\n};\n\nexport const consoleQrHandler: QrHandler = async (link) => {\n console.log(await QRCode.toString(link, { type: \"terminal\", small: true }));\n console.log(link);\n};\n",
|
|
17
|
+
"import type { ApiFacade } from \"../api/index.ts\";\nimport type { ResolvedConfig } from \"../config.ts\";\nimport {\n consolePasswordProvider,\n consoleQrHandler,\n consoleSmsCodeProvider,\n type PasswordProvider,\n type QrHandler,\n type SmsCodeProvider,\n} from \"./providers.ts\";\n\nexport interface AuthResult {\n token: string | null;\n}\n\nexport interface AuthRuntime {\n readonly api: ApiFacade;\n readonly config: ResolvedConfig;\n}\n\nexport interface AuthFlow {\n authenticate(app: AuthRuntime): Promise<AuthResult>;\n}\n\nexport class SmsAuthFlow implements AuthFlow {\n constructor(\n readonly codeProvider: SmsCodeProvider = consoleSmsCodeProvider,\n readonly passwordProvider: PasswordProvider = consolePasswordProvider,\n ) {}\n\n async authenticate(app: AuthRuntime): Promise<AuthResult> {\n const phone = app.config.phone;\n if (!phone) throw new Error(\"Phone is required for SMS authentication\");\n const start = await app.api.auth.requestCode(phone);\n const token = typeof start.token === \"string\" ? start.token : \"\";\n if (!token) throw new Error(\"SMS request returned no token\");\n const result = await app.api.auth.sendCode(token, await this.codeProvider(phone));\n if (result.loginToken) return { token: result.loginToken };\n if (result.passwordChallenge) {\n return {\n token: await this.passwordLogin(\n app,\n result.passwordChallenge.trackId,\n result.passwordChallenge.hint,\n ),\n };\n }\n if (result.registerToken) {\n const registration = app.config.registrationConfig;\n if (!registration) throw new Error(\"registrationConfig is required for a new account\");\n return {\n token: await app.api.auth.confirmRegistration(\n registration.firstName,\n registration.lastName ?? null,\n result.registerToken,\n ),\n };\n }\n throw new Error(\"Authentication returned no login, registration, or password challenge\");\n }\n\n private async passwordLogin(\n app: AuthRuntime,\n trackId: string,\n hint: string | null,\n ): Promise<string> {\n for (;;) {\n const result = await app.api.auth.checkPassword(trackId, await this.passwordProvider(hint));\n if (result.loginToken) return result.loginToken;\n }\n }\n}\n\nexport class QrAuthFlow implements AuthFlow {\n constructor(\n readonly qrHandler: QrHandler = consoleQrHandler,\n readonly passwordProvider: PasswordProvider = consolePasswordProvider,\n ) {}\n\n async authenticate(app: AuthRuntime): Promise<AuthResult> {\n const request = await app.api.auth.requestQr();\n await this.qrHandler(request.qrLink);\n while (Date.now() < request.expiresAt) {\n const status = await app.api.auth.checkQr(request.trackId);\n if (status.loginAvailable) {\n const result = await app.api.auth.confirmQr(request.trackId);\n if (result.loginToken) return { token: result.loginToken };\n if (result.passwordChallenge) {\n for (;;) {\n const checked = await app.api.auth.checkPassword(\n result.passwordChallenge.trackId,\n await this.passwordProvider(result.passwordChallenge.hint),\n );\n if (checked.loginToken) return { token: checked.loginToken };\n }\n }\n break;\n }\n await Bun.sleep(request.pollingInterval);\n }\n throw new Error(\"QR authentication expired\");\n }\n}\n",
|
|
18
|
+
"export const Screen = {\n BACKGROUND: 1,\n CONTACTS: 100,\n CHATS: 150,\n SEARCH: 151,\n CALLS: 300,\n CHAT: 350,\n SETTINGS: 450,\n MINIAPP: 500,\n} as const;\nexport type Screen = (typeof Screen)[keyof typeof Screen];\n\nexport interface RandomSource {\n random(): number;\n}\n\nexport interface RouteProfile {\n steps: number;\n minPause: number;\n maxPause: number;\n longPauseChance: number;\n minLongPause: number;\n maxLongPause: number;\n backChance: number;\n}\n\ninterface ScreenTransition {\n screen: Screen;\n weight: number;\n}\n\nexport const mainTabParams = { source_type: 5, source_id: 1, tab_config: 2 } as const;\n\nexport const defaultProfiles: Readonly<Record<string, RouteProfile>> = {\n quick: {\n steps: 2,\n minPause: 35,\n maxPause: 95,\n longPauseChance: 0.05,\n minLongPause: 180,\n maxLongPause: 420,\n backChance: 0.3,\n },\n browse: {\n steps: 4,\n minPause: 70,\n maxPause: 210,\n longPauseChance: 0.12,\n minLongPause: 240,\n maxLongPause: 720,\n backChance: 0.22,\n },\n read: {\n steps: 3,\n minPause: 140,\n maxPause: 360,\n longPauseChance: 0.25,\n minLongPause: 420,\n maxLongPause: 1200,\n backChance: 0.18,\n },\n};\n\nconst graph: Readonly<Record<Screen, readonly ScreenTransition[]>> = {\n [Screen.BACKGROUND]: [\n { screen: Screen.CHATS, weight: 10 },\n { screen: Screen.SETTINGS, weight: 1 },\n ],\n [Screen.CHATS]: [\n { screen: Screen.CHAT, weight: 7 },\n { screen: Screen.CONTACTS, weight: 2 },\n { screen: Screen.SEARCH, weight: 2 },\n { screen: Screen.CALLS, weight: 1 },\n { screen: Screen.SETTINGS, weight: 1 },\n { screen: Screen.CHATS, weight: 2 },\n ],\n [Screen.CHAT]: [\n { screen: Screen.CHATS, weight: 8 },\n { screen: Screen.CHAT, weight: 2 },\n { screen: Screen.SETTINGS, weight: 1 },\n ],\n [Screen.CONTACTS]: [\n { screen: Screen.CHATS, weight: 6 },\n { screen: Screen.CHAT, weight: 2 },\n { screen: Screen.SEARCH, weight: 1 },\n ],\n [Screen.SEARCH]: [\n { screen: Screen.CHATS, weight: 5 },\n { screen: Screen.CHAT, weight: 3 },\n { screen: Screen.CONTACTS, weight: 1 },\n ],\n [Screen.CALLS]: [\n { screen: Screen.CHATS, weight: 5 },\n { screen: Screen.CONTACTS, weight: 2 },\n { screen: Screen.SETTINGS, weight: 2 },\n ],\n [Screen.SETTINGS]: [\n { screen: Screen.CHATS, weight: 7 },\n { screen: Screen.CONTACTS, weight: 2 },\n { screen: Screen.CALLS, weight: 2 },\n { screen: Screen.MINIAPP, weight: 1 },\n ],\n [Screen.MINIAPP]: [\n { screen: Screen.SETTINGS, weight: 3 },\n { screen: Screen.CHATS, weight: 6 },\n ],\n};\n\nexport class NavigationPlanner {\n currentScreen: Screen = Screen.BACKGROUND;\n readonly history: Screen[] = [];\n\n constructor(private readonly random: RandomSource = Math) {}\n\n newProfile(): RouteProfile {\n const profiles = Object.values(defaultProfiles);\n return profiles[Math.floor(this.random.random() * profiles.length)] as RouteProfile;\n }\n\n pause(profile: RouteProfile): number {\n const long = this.random.random() < profile.longPauseChance;\n return this.between(\n long ? profile.minLongPause : profile.minPause,\n long ? profile.maxLongPause : profile.maxPause,\n );\n }\n\n nextScreen(profile: RouteProfile): Screen {\n if (this.history.length > 0 && this.random.random() < profile.backChance) {\n this.currentScreen = this.history.pop() as Screen;\n return this.currentScreen;\n }\n const transitions = graph[this.currentScreen];\n const total = transitions.reduce((sum, item) => sum + item.weight, 0);\n let point = Math.floor(this.random.random() * total) + 1;\n let selected = transitions[transitions.length - 1] as ScreenTransition;\n for (const transition of transitions) {\n point -= transition.weight;\n if (point <= 0) {\n selected = transition;\n break;\n }\n }\n if (selected.screen !== this.currentScreen) {\n this.history.push(this.currentScreen);\n if (this.history.length > 4) this.history.shift();\n }\n this.currentScreen = selected.screen;\n return selected.screen;\n }\n\n resetToBackground(): void {\n this.currentScreen = Screen.BACKGROUND;\n this.history.length = 0;\n }\n\n private between(minimum: number, maximum: number): number {\n return minimum + this.random.random() * (maximum - minimum);\n }\n}\n",
|
|
19
|
+
"import type { MaxId } from \"../types/index.ts\";\nimport type { RandomSource, Screen } from \"./navigation.ts\";\n\nexport interface TelemetryEvent {\n time: number;\n userId: MaxId;\n type: \"PERF\" | \"NAV\";\n event: string;\n params: Record<string, unknown>;\n sessionId: number;\n}\n\nexport class TelemetryPayloadBuilder {\n constructor(private readonly random: RandomSource = Math) {}\n\n login(userId: MaxId, sessionId: number): TelemetryEvent {\n return this.event(userId, sessionId, \"PERF\", \"login\", {\n properties: { connection_type: 2, vpn: 0, class: 2, background: 1, warm_start: 1 },\n errorType: 100,\n });\n }\n\n navigation(options: {\n userId: MaxId;\n sessionId: number;\n screenFrom: Screen;\n screenTo: Screen;\n prevTime: number;\n actionId: number;\n extraParams?: Record<string, MaxId | number>;\n }): TelemetryEvent {\n return this.event(options.userId, options.sessionId, \"NAV\", \"GO\", {\n prev_time: options.prevTime,\n screen_to: options.screenTo,\n action_id: options.actionId,\n screen_from: options.screenFrom,\n ...options.extraParams,\n });\n }\n\n openChat(userId: MaxId, sessionId: number): TelemetryEvent {\n const messages = this.integer(60, 240);\n const render = this.integer(50, 260);\n return this.event(userId, sessionId, \"PERF\", \"open_chat_to_render\", {\n spans: [\n { duration: messages + render, name: \"open_chat_to_render\" },\n { duration: messages, name: \"messages_list_created\" },\n { duration: render, name: \"messages_render\" },\n ],\n properties: { class: 2, warm: 1, flow: 1 },\n });\n }\n\n openChats(userId: MaxId, sessionId: number): TelemetryEvent {\n const created = this.integer(50, 230);\n const rendered = this.integer(180, 650);\n return this.event(userId, sessionId, \"PERF\", \"open_chats_to_render\", {\n spans: [\n { duration: created + rendered, name: \"open_chats_to_render\" },\n { duration: created, name: \"chats_tab_created\" },\n { duration: rendered, name: \"chat_list_render\" },\n ],\n properties: { class: 2 },\n });\n }\n\n toPayload(events: TelemetryEvent[]): Record<string, unknown> {\n return { events };\n }\n\n private event(\n userId: MaxId,\n sessionId: number,\n type: TelemetryEvent[\"type\"],\n event: string,\n params: Record<string, unknown>,\n ): TelemetryEvent {\n return { time: Date.now(), userId, type, event, params, sessionId };\n }\n\n private integer(minimum: number, maximum: number): number {\n return Math.floor(this.random.random() * (maximum - minimum + 1)) + minimum;\n }\n}\n",
|
|
20
|
+
"import { getLogger } from \"../logging.ts\";\nimport { Opcode } from \"../protocol/index.ts\";\nimport type { Chat, MaxId, Profile } from \"../types/index.ts\";\nimport {\n NavigationPlanner,\n Screen,\n mainTabParams,\n type RandomSource,\n type RouteProfile,\n} from \"./navigation.ts\";\nimport { TelemetryPayloadBuilder, type TelemetryEvent } from \"./payloads.ts\";\n\nexport interface TelemetryRuntime {\n readonly config: { requestTimeout: number; device: { clientSessionId: number } };\n readonly connection: { readonly isOpen?: boolean };\n readonly started: boolean;\n readonly me: Profile | null;\n readonly chats: Chat[];\n invoke(opcode: number, payload?: Record<string, unknown>, timeout?: number): Promise<unknown>;\n}\n\nexport interface TelemetryTiming {\n startupDelay: readonly [number, number];\n sessionIdleDelay: readonly [number, number];\n renderDelay: readonly [number, number];\n returnDelay: readonly [number, number];\n returnToBackgroundChance: number;\n openChatsRenderChance: number;\n}\n\nexport const defaultTelemetryTiming: TelemetryTiming = {\n startupDelay: [15, 90],\n sessionIdleDelay: [900, 2700],\n renderDelay: [0.15, 1.2],\n returnDelay: [12, 45],\n returnToBackgroundChance: 0.4,\n openChatsRenderChance: 0.2,\n};\n\nexport class TelemetryService {\n readonly planner: NavigationPlanner;\n readonly payloads: TelemetryPayloadBuilder;\n private controller: AbortController | null = null;\n private task: Promise<void> | null = null;\n private actionId = 0;\n private sessionId: number;\n private lastNavTime = Date.now();\n\n constructor(\n private readonly app: TelemetryRuntime,\n private readonly random: RandomSource = Math,\n private readonly timing: TelemetryTiming = defaultTelemetryTiming,\n ) {\n this.planner = new NavigationPlanner(random);\n this.payloads = new TelemetryPayloadBuilder(random);\n this.sessionId = app.config.device.clientSessionId;\n }\n\n get running(): boolean {\n return this.task !== null;\n }\n\n get ready(): boolean {\n return this.app.started && this.app.me !== null && this.app.connection.isOpen !== false;\n }\n\n start(): void {\n if (this.running || !this.ready) return;\n const controller = new AbortController();\n this.controller = controller;\n this.task = this.run(controller.signal).finally(() => {\n if (this.controller === controller) {\n this.controller = null;\n this.task = null;\n }\n });\n }\n\n async stop(): Promise<void> {\n const task = this.task;\n this.controller?.abort();\n this.controller = null;\n if (task) await task.catch(() => undefined);\n this.task = null;\n }\n\n async sendEvents(events: TelemetryEvent[]): Promise<void> {\n if (events.length === 0 || !this.ready) return;\n await this.app.invoke(\n Opcode.LOG,\n this.payloads.toPayload(events),\n this.app.config.requestTimeout,\n );\n }\n\n sourceParams(screen: Screen): Record<string, MaxId | number> {\n if (screen === Screen.CHATS) return { ...mainTabParams };\n if (screen !== Screen.CHAT) return {};\n const chat = this.pickChat();\n return chat\n ? { source_type: chat.type === \"DIALOG\" ? 1 : 2, source_id: chat.id }\n : { source_type: 1, source_id: this.userId };\n }\n\n private async run(signal: AbortSignal): Promise<void> {\n try {\n await sleep(this.between(this.timing.startupDelay) * 1000, signal);\n await this.sendEvents([this.payloads.login(this.userId, this.sessionId)]);\n while (!signal.aborted) {\n this.sessionId += 1;\n await this.sendEvents(await this.collectSessionEvents(this.planner.newProfile(), signal));\n this.planner.resetToBackground();\n await sleep(this.between(this.timing.sessionIdleDelay) * 1000, signal);\n }\n } catch (error) {\n if (!signal.aborted) getLogger().debug(\"telemetry loop stopped\", { error: String(error) });\n }\n }\n\n private async collectSessionEvents(\n profile: RouteProfile,\n signal: AbortSignal,\n ): Promise<TelemetryEvent[]> {\n const events: TelemetryEvent[] = [];\n for (let step = 0; step < profile.steps; step += 1) {\n await sleep(this.planner.pause(profile) * 1000, signal);\n if (!this.ready) return events;\n const from = this.planner.currentScreen;\n const to = this.planner.nextScreen(profile);\n events.push(this.navigationEvent(from, to));\n if (to === Screen.CHAT) {\n await sleep(this.between(this.timing.renderDelay) * 1000, signal);\n events.push(this.payloads.openChat(this.userId, this.sessionId));\n } else if (to === Screen.CHATS && this.random.random() < this.timing.openChatsRenderChance) {\n await sleep(this.between(this.timing.renderDelay) * 1000, signal);\n events.push(this.payloads.openChats(this.userId, this.sessionId));\n }\n }\n if (\n this.planner.currentScreen !== Screen.BACKGROUND &&\n this.random.random() < this.timing.returnToBackgroundChance\n ) {\n await sleep(this.between(this.timing.returnDelay) * 1000, signal);\n const from = this.planner.currentScreen;\n this.planner.resetToBackground();\n events.push(this.navigationEvent(from, Screen.BACKGROUND));\n }\n return events;\n }\n\n private navigationEvent(from: Screen, to: Screen): TelemetryEvent {\n this.actionId = (this.actionId + 1) >>> 0;\n const event = this.payloads.navigation({\n userId: this.userId,\n sessionId: this.sessionId,\n screenFrom: from,\n screenTo: to,\n prevTime: this.lastNavTime,\n actionId: this.actionId,\n extraParams: this.sourceParams(to),\n });\n this.lastNavTime = event.time;\n return event;\n }\n\n private get userId(): MaxId {\n if (!this.app.me) throw new Error(\"Telemetry requires an authenticated profile\");\n return this.app.me.contact.id;\n }\n\n private pickChat(): Chat | null {\n if (this.app.chats.length === 0) return null;\n return this.app.chats[Math.floor(this.random.random() * this.app.chats.length)] ?? null;\n }\n\n private between(range: readonly [number, number]): number {\n return range[0] + this.random.random() * (range[1] - range[0]);\n }\n}\n\nasync function sleep(milliseconds: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) throw signal.reason;\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, milliseconds);\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason);\n },\n { once: true },\n );\n });\n}\n",
|
|
21
|
+
"import type { InboundFrame } from \"../protocol/index.ts\";\nimport { asArray, asRecord } from \"../types/index.ts\";\n\nexport function payload(frame: InboundFrame): Record<string, unknown> {\n return frame.payload ?? {};\n}\n\nexport function payloadItem(frame: InboundFrame, key: string): unknown {\n return payload(frame)[key];\n}\n\nexport function requiredItem(frame: InboundFrame, key: string): unknown {\n const value = payloadItem(frame, key);\n if (value === null || value === undefined) throw new TypeError(`Response is missing ${key}`);\n return value;\n}\n\nexport function recordItem(frame: InboundFrame, key?: string): Record<string, unknown> {\n return asRecord(key ? requiredItem(frame, key) : payload(frame));\n}\n\nexport function listItem(frame: InboundFrame, key: string): unknown[] {\n return asArray(payloadItem(frame, key));\n}\n",
|
|
22
|
+
"import type { Photo } from \"../files/index.ts\";\nimport { Opcode } from \"../protocol/index.ts\";\nimport { Profile, asString, type MaxId } from \"../types/index.ts\";\nimport { payload, requiredItem } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\nimport type { UploadApi } from \"./uploads.ts\";\n\nexport class AccountApi {\n constructor(\n private readonly app: ApiRuntime,\n private readonly uploads: UploadApi,\n ) {}\n\n async requestProfilePhotoUploadUrl(): Promise<string> {\n return asString(\n requiredItem(await this.app.invoke(Opcode.PHOTO_UPLOAD, { count: 1, profile: true }), \"url\"),\n );\n }\n\n async changeProfile(options: {\n firstName: string;\n lastName?: string | null;\n description?: string | null;\n photo?: Photo | null;\n photoToken?: string | null;\n }): Promise<boolean> {\n let photoToken = options.photoToken ?? null;\n if (options.photo) {\n const uploaded = await this.uploads.uploadPhoto(options.photo, true);\n if (uploaded._type === \"PHOTO\") photoToken = uploaded.photoToken;\n }\n const frame = await this.app.invoke(Opcode.PROFILE, {\n firstName: options.firstName,\n lastName: options.lastName ?? null,\n description: options.description ?? null,\n photoToken,\n avatarType: \"USER_AVATAR\",\n });\n this.app.me = Profile.fromPayload(requiredItem(frame, \"profile\"));\n return true;\n }\n\n async createFolder(\n title: string,\n chatInclude: MaxId[],\n filters: unknown[] = [],\n ): Promise<Record<string, unknown>> {\n return payload(\n await this.app.invoke(Opcode.FOLDERS_UPDATE, {\n id: crypto.randomUUID(),\n title,\n include: chatInclude,\n filters,\n }),\n );\n }\n async getFolders(folderSync = 0): Promise<Record<string, unknown>> {\n return payload(await this.app.invoke(Opcode.FOLDERS_GET, { folderSync }));\n }\n async updateFolder(\n folderId: string,\n title: string,\n chatInclude: MaxId[] = [],\n filters: unknown[] = [],\n options: unknown[] = [],\n ): Promise<Record<string, unknown>> {\n return payload(\n await this.app.invoke(Opcode.FOLDERS_UPDATE, {\n id: folderId,\n title,\n include: chatInclude,\n filters,\n options,\n }),\n );\n }\n async deleteFolder(folderId: string): Promise<Record<string, unknown>> {\n return payload(await this.app.invoke(Opcode.FOLDERS_DELETE, { folderIds: [folderId] }));\n }\n async closeAllSessions(): Promise<boolean> {\n if (!this.app.session) return false;\n const data = payload(await this.app.invoke(Opcode.SESSIONS_CLOSE, {}));\n const token = asString(data.token);\n if (!token) return false;\n await this.app.store.updateToken(this.app.session.token, token);\n this.app.session = { ...this.app.session, token };\n return true;\n }\n async logout(): Promise<boolean> {\n await this.app.invoke(Opcode.LOGOUT, {});\n return true;\n }\n}\n",
|
|
23
|
+
"import { defaultSyncState, type SessionStore, type SyncOverrides } from \"./session/index.ts\";\n\nexport const DeviceType = {\n WEB: \"WEB\",\n ANDROID: \"ANDROID\",\n IOS: \"IOS\",\n DESKTOP: \"DESKTOP\",\n} as const;\nexport type DeviceType = (typeof DeviceType)[keyof typeof DeviceType];\n\nexport interface UserAgent {\n deviceType: DeviceType;\n appVersion: string;\n osVersion: string;\n timezone: string;\n screen: string;\n locale: string;\n deviceName: string;\n deviceLocale: string;\n pushDeviceType?: string;\n arch?: string;\n buildNumber?: number;\n release?: number;\n headerUserAgent?: string;\n}\n\nexport interface RegistrationConfig {\n firstName: string;\n lastName?: string | null;\n}\n\nexport interface ExtraConfig {\n token?: string | null;\n registrationConfig?: RegistrationConfig | null;\n host?: string;\n port?: number;\n url?: string;\n useTls?: boolean;\n proxy?: string | null;\n reconnect?: boolean;\n reconnectDelay?: number;\n deviceId?: string;\n deviceType?: DeviceType;\n userAgent?: UserAgent;\n mtInstanceId?: string;\n requestTimeout?: number;\n logLevel?: \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\" | \"SILENT\";\n telemetry?: boolean;\n store?: SessionStore;\n sync?: SyncOverrides;\n}\n\nexport interface ResolvedConfig {\n phone: string | null;\n workDir: string;\n sessionName: string;\n token: string | null;\n registrationConfig: RegistrationConfig | null;\n host: string;\n port: number;\n url: string;\n useTls: boolean;\n proxy: string | null;\n reconnect: boolean;\n reconnectDelay: number;\n requestTimeout: number;\n logLevel: \"DEBUG\" | \"INFO\" | \"WARN\" | \"ERROR\" | \"SILENT\";\n telemetry: boolean;\n store?: SessionStore;\n sync: SyncOverrides;\n device: {\n deviceId: string;\n mtInstanceId: string;\n clientSessionId: number;\n userAgent: UserAgent;\n };\n}\n\nconst androidAgents: readonly Omit<UserAgent, \"appVersion\" | \"buildNumber\">[] = [\n {\n deviceType: DeviceType.ANDROID,\n osVersion: \"Android 14\",\n timezone: \"Europe/Moscow\",\n screen: \"411dpi 411dpi 1080x2400\",\n pushDeviceType: \"GCM\",\n arch: \"arm64-v8a\",\n locale: \"ru\",\n deviceName: \"Pixel 8\",\n deviceLocale: \"ru\",\n },\n {\n deviceType: DeviceType.ANDROID,\n osVersion: \"Android 14\",\n timezone: \"Europe/Moscow\",\n screen: \"425dpi 425dpi 1080x2340\",\n pushDeviceType: \"GCM\",\n arch: \"arm64-v8a\",\n locale: \"ru\",\n deviceName: \"Samsung SM-S911B\",\n deviceLocale: \"ru\",\n },\n];\n\nexport function resolveConfig(options: {\n phone?: string | null;\n workDir?: string;\n sessionName?: string;\n web?: boolean;\n extra?: ExtraConfig;\n}): ResolvedConfig {\n const extra = options.extra ?? {};\n const userAgent = extra.userAgent ?? (options.web ? createWebAgent() : createMobileAgent());\n return {\n phone: options.phone ?? null,\n workDir: options.workDir ?? \".\",\n sessionName: options.sessionName ?? \"session.db\",\n token: extra.token ?? null,\n registrationConfig: extra.registrationConfig ?? null,\n host: extra.host ?? \"api.oneme.ru\",\n port: extra.port ?? 443,\n url: extra.url ?? \"wss://ws-api.oneme.ru/websocket\",\n useTls: extra.useTls ?? true,\n proxy: extra.proxy ?? null,\n reconnect: extra.reconnect ?? true,\n reconnectDelay: extra.reconnectDelay ?? 1,\n requestTimeout: extra.requestTimeout ?? 30,\n logLevel: extra.logLevel ?? \"INFO\",\n telemetry: extra.telemetry ?? true,\n ...(extra.store ? { store: extra.store } : {}),\n sync: extra.sync ?? defaultSyncState(),\n device: {\n deviceId: extra.deviceId ?? crypto.randomUUID(),\n mtInstanceId: extra.mtInstanceId ?? crypto.randomUUID(),\n clientSessionId: Math.floor(Math.random() * 70) + 1,\n userAgent,\n },\n };\n}\n\nfunction createMobileAgent(): UserAgent {\n const base = androidAgents[Math.floor(Math.random() * androidAgents.length)] as Omit<\n UserAgent,\n \"appVersion\" | \"buildNumber\"\n >;\n return { ...base, appVersion: \"26.14.1\", buildNumber: 6686 };\n}\n\nfunction createWebAgent(): UserAgent {\n return {\n deviceType: DeviceType.WEB,\n appVersion: \"26.5.5\",\n osVersion: \"Linux\",\n timezone: \"Europe/Moscow\",\n screen: \"1080x1920 1.0x\",\n locale: \"ru\",\n deviceName: \"Chrome\",\n deviceLocale: \"ru\",\n headerUserAgent:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36\",\n };\n}\n",
|
|
24
|
+
"import { DeviceType, type UserAgent } from \"../config.ts\";\nimport { Opcode } from \"../protocol/index.ts\";\nimport { defaultSyncState, resolveSync, type SyncState } from \"../session/index.ts\";\nimport {\n Chat,\n Message,\n Profile,\n User,\n asArray,\n asNumber,\n asRecord,\n asString,\n toMaxId,\n} from \"../types/index.ts\";\nimport { payload, requiredItem } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\n\nexport interface PasswordChallenge {\n trackId: string;\n hint: string | null;\n}\nexport interface CodeResult {\n loginToken: string | null;\n registerToken: string | null;\n passwordChallenge: PasswordChallenge | null;\n}\nexport interface QrRequest {\n expiresAt: number;\n pollingInterval: number;\n qrLink: string;\n trackId: string;\n ttl: number;\n}\nexport interface LoginResult {\n chats: Chat[];\n profile: Profile;\n messages: Map<bigint, Message[]>;\n contacts: Array<User | null>;\n token: string | null;\n time: number | null;\n configHash: string | number | null;\n}\n\nexport class AuthApi {\n constructor(private readonly app: ApiRuntime) {}\n\n async requestCode(phone: string): Promise<Record<string, unknown>> {\n const frame = await this.app.invoke(Opcode.AUTH_REQUEST, {\n phone,\n type: \"START_AUTH\",\n language: \"ru\",\n });\n return payload(frame);\n }\n\n async sendCode(token: string, verifyCode: string): Promise<CodeResult> {\n const frame = await this.app.invoke(Opcode.AUTH, {\n token,\n verifyCode,\n authTokenType: \"CHECK_CODE\",\n });\n return parseCodeResult(payload(frame));\n }\n\n async checkPassword(\n trackId: string,\n password: string,\n ): Promise<CodeResult & { error: string | null }> {\n const frame = await this.app.invoke(Opcode.AUTH_LOGIN_CHECK_PASSWORD, { trackId, password });\n const data = payload(frame);\n return { ...parseCodeResult(data), error: typeof data.error === \"string\" ? data.error : null };\n }\n\n async requestQr(): Promise<QrRequest> {\n const data = payload(await this.app.invoke(Opcode.GET_QR, {}));\n return {\n expiresAt: asNumber(data.expiresAt),\n pollingInterval: asNumber(data.pollingInterval),\n qrLink: asString(data.qrLink),\n trackId: asString(data.trackId),\n ttl: asNumber(data.ttl),\n };\n }\n\n async checkQr(trackId: string): Promise<{ expiresAt: number; loginAvailable: boolean }> {\n const data = asRecord(\n requiredItem(await this.app.invoke(Opcode.GET_QR_STATUS, { trackId }), \"status\"),\n );\n return { expiresAt: asNumber(data.expiresAt), loginAvailable: data.loginAvailable === true };\n }\n\n async confirmQr(trackId: string): Promise<CodeResult> {\n return parseCodeResult(payload(await this.app.invoke(Opcode.LOGIN_BY_QR, { trackId })));\n }\n\n async confirmRegistration(\n firstName: string,\n lastName: string | null,\n token: string,\n ): Promise<string> {\n const data = payload(\n await this.app.invoke(Opcode.AUTH_CONFIRM, {\n firstName,\n lastName,\n token,\n tokenType: \"REGISTER\",\n }),\n );\n return asString(data.token);\n }\n\n async handshake(deviceId: string): Promise<void> {\n const { userAgent, mtInstanceId, clientSessionId } = this.app.config.device;\n if (userAgent.deviceType === DeviceType.WEB) {\n await this.app.invoke(Opcode.SESSION_INIT, {\n userAgent: webUserAgent(userAgent),\n deviceId,\n });\n } else {\n await this.app.invoke(Opcode.SESSION_INIT, {\n mt_instanceid: mtInstanceId,\n userAgent,\n clientSessionId,\n deviceId,\n });\n }\n }\n\n async login(): Promise<LoginResult> {\n const session = this.app.session;\n if (!session) throw new Error(\"No session available for login\");\n const sync = resolveSync(session.sync, this.app.config.sync);\n const userAgent = this.app.config.device.userAgent;\n const loginPayload =\n userAgent.deviceType === DeviceType.WEB\n ? {\n token: session.token,\n chatsCount: 40,\n interactive: true,\n chatsSync: sync.chatsSync,\n contactsSync: sync.contactsSync,\n presenceSync: sync.presenceSync,\n draftsSync: sync.draftsSync,\n }\n : {\n userAgent,\n token: session.token,\n chatsSync: sync.chatsSync,\n contactsSync: sync.contactsSync,\n draftsSync: sync.draftsSync,\n presenceSync: sync.presenceSync,\n interactive: true,\n exp: { chatsCountGroups: Uint8Array.from([0x0a, 0x32]) },\n configHash: sync.configHash,\n };\n const result = parseLogin(payload(await this.app.invoke(Opcode.LOGIN, loginPayload)), this.app);\n const updatedSync: SyncState = defaultSyncState({\n chatsSync: result.time ?? session.sync.chatsSync,\n contactsSync: result.time ?? session.sync.contactsSync,\n draftsSync: result.time ?? session.sync.draftsSync,\n presenceSync: result.time ?? session.sync.presenceSync,\n configHash: result.configHash ?? session.sync.configHash,\n });\n this.app.session = {\n ...session,\n mtInstanceId: this.app.config.device.mtInstanceId,\n sync: updatedSync,\n };\n await this.app.store.saveSession(this.app.session);\n return result;\n }\n\n async createTrack(): Promise<string> {\n const data = payload(await this.app.invoke(Opcode.AUTH_CREATE_TRACK, { type: 0 }));\n const trackId = asString(data.trackId);\n if (!trackId) throw new Error(\"Failed to create auth track\");\n return trackId;\n }\n\n async setTwoFactor(options: {\n password: string;\n hint?: string;\n email?: string;\n emailCodeProvider?: (email: string) => string | Promise<string>;\n }): Promise<boolean> {\n const trackId = await this.createTrack();\n await this.app.invoke(Opcode.AUTH_VALIDATE_PASSWORD, { trackId, password: options.password });\n const capabilities = [1];\n if (options.email !== undefined) {\n await this.app.invoke(Opcode.AUTH_VERIFY_EMAIL, { trackId, email: options.email });\n if (!options.emailCodeProvider) throw new Error(\"emailCodeProvider is required\");\n const verifyCode = await options.emailCodeProvider(options.email);\n await this.app.invoke(Opcode.AUTH_CHECK_EMAIL, { trackId, verifyCode });\n capabilities.push(3);\n }\n if (options.hint !== undefined) {\n await this.app.invoke(Opcode.AUTH_VALIDATE_HINT, { trackId, hint: options.hint });\n capabilities.push(2);\n }\n await this.app.invoke(Opcode.AUTH_SET_2FA, {\n trackId,\n password: options.password,\n hint: options.hint ?? null,\n expectedCapabilities: capabilities,\n });\n return true;\n }\n\n async removeTwoFactor(password: string): Promise<boolean> {\n const trackId = await this.createTrack();\n await this.app.invoke(Opcode.AUTH_CHECK_PASSWORD, { trackId, password });\n await this.app.invoke(Opcode.AUTH_SET_2FA, {\n trackId,\n remove2fa: true,\n expectedCapabilities: [4],\n });\n return true;\n }\n\n async changePassword(oldPassword: string, newPassword: string): Promise<boolean> {\n const trackId = await this.createTrack();\n await this.app.invoke(Opcode.AUTH_CHECK_PASSWORD, { trackId, password: oldPassword });\n await this.app.invoke(Opcode.AUTH_VALIDATE_PASSWORD, { trackId, password: newPassword });\n await this.app.invoke(Opcode.AUTH_SET_2FA, {\n trackId,\n password: newPassword,\n hint: null,\n expectedCapabilities: [5],\n });\n return true;\n }\n\n async authorizeQrLogin(qrLink: string): Promise<boolean> {\n await this.app.invoke(Opcode.AUTH_QR_APPROVE, { qrLink });\n return true;\n }\n\n async checkTwoFactor(): Promise<boolean> {\n return this.app.me?.profileOptions?.includes(2) ?? false;\n }\n}\n\nfunction parseCodeResult(data: Record<string, unknown>): CodeResult {\n const attrs = data.tokenAttrs ? asRecord(data.tokenAttrs) : {};\n const login = attrs.LOGIN ? asRecord(attrs.LOGIN) : null;\n const register = attrs.REGISTER ? asRecord(attrs.REGISTER) : null;\n const challenge = data.passwordChallenge ? asRecord(data.passwordChallenge) : null;\n return {\n loginToken: login ? asString(login.token) || null : null,\n registerToken: register ? asString(register.token) || null : null,\n passwordChallenge: challenge\n ? {\n trackId: asString(challenge.trackId),\n hint: typeof challenge.hint === \"string\" ? challenge.hint : null,\n }\n : null,\n };\n}\n\nfunction parseLogin(data: Record<string, unknown>, app: ApiRuntime): LoginResult {\n const profile = Profile.fromPayload(data.profile);\n app.bindUser(profile.contact);\n const chats = asArray(data.chats).map((item) => app.bindChat(Chat.fromPayload(item)));\n const contacts = asArray(data.contacts).map((item) =>\n item ? app.bindUser(User.fromPayload(item)) : null,\n );\n const messages = new Map<bigint, Message[]>();\n if (data.messages && typeof data.messages === \"object\") {\n for (const [chatId, items] of Object.entries(data.messages)) {\n messages.set(\n toMaxId(chatId),\n asArray(items).map((item) => app.bindMessage(Message.fromPayload(item))),\n );\n }\n }\n const config = data.config ? asRecord(data.config) : null;\n return {\n chats,\n profile,\n messages,\n contacts,\n token: typeof data.token === \"string\" ? data.token : null,\n time: data.time === null || data.time === undefined ? null : asNumber(data.time),\n configHash:\n typeof config?.hash === \"string\" || typeof config?.hash === \"number\" ? config.hash : null,\n };\n}\n\nfunction webUserAgent(agent: UserAgent): Partial<UserAgent> {\n const {\n deviceType,\n locale,\n deviceLocale,\n osVersion,\n deviceName,\n headerUserAgent,\n appVersion,\n screen,\n timezone,\n } = agent;\n return {\n deviceType,\n locale,\n deviceLocale,\n osVersion,\n deviceName,\n appVersion,\n screen,\n timezone,\n ...(headerUserAgent ? { headerUserAgent } : {}),\n };\n}\n",
|
|
25
|
+
"import { Opcode } from \"../protocol/index.ts\";\nimport type { MaxId } from \"../types/index.ts\";\nimport { payload } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\n\nexport class BotsApi {\n constructor(private readonly app: ApiRuntime) {}\n async getBotInitData(\n botId: MaxId,\n chatId?: MaxId | null,\n startParam?: string | null,\n ): Promise<Record<string, unknown>> {\n return payload(\n await this.app.invoke(Opcode.WEB_APP_INIT_DATA, {\n botId,\n chatId: chatId ?? null,\n startParam: startParam ?? null,\n }),\n );\n }\n}\n",
|
|
26
|
+
"export class TsMaxError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class UploadError extends TsMaxError {}\nexport class ConnectionError extends TsMaxError {}\nexport class TimeoutError extends TsMaxError {}\n\nexport class ApiError extends TsMaxError {\n readonly payload: Record<string, unknown>;\n\n constructor(\n readonly opcode: number,\n options: {\n error?: string | null;\n title?: string | null;\n message?: string | null;\n localizedMessage?: string | null;\n payload?: Record<string, unknown> | null;\n } = {},\n ) {\n const parts: string[] = [];\n if (options.localizedMessage) parts.push(options.localizedMessage);\n if (options.message && options.message !== options.localizedMessage)\n parts.push(options.message);\n if (options.title) parts.push(`(${options.title})`);\n if (options.error) parts.push(`[${options.error}]`);\n super(parts.join(\" \") || \"API request failed\");\n this.payload = options.payload ?? {};\n this.error = options.error ?? null;\n this.title = options.title ?? null;\n this.localizedMessage = options.localizedMessage ?? null;\n }\n\n readonly error: string | null;\n readonly title: string | null;\n readonly localizedMessage: string | null;\n}\n",
|
|
27
|
+
"import { TsMaxError } from \"../errors.ts\";\nimport { Opcode } from \"../protocol/index.ts\";\nimport { Chat, Message, asRecord, type ChatActions, type MaxId } from \"../types/index.ts\";\nimport { listItem, payload, payloadItem } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\n\nexport interface GroupSettings {\n allCanPinMessage?: boolean | null;\n onlyOwnerCanChangeIconTitle?: boolean | null;\n onlyAdminCanAddMember?: boolean | null;\n onlyAdminCanCall?: boolean | null;\n membersCanSeePrivateLink?: boolean | null;\n}\n\nexport class ChatApi implements ChatActions {\n private readonly cache = new Map<MaxId, Chat>();\n\n constructor(private readonly app: ApiRuntime) {}\n\n seed(chats: Chat[]): void {\n for (const chat of chats) this.cache.set(chat.id, this.app.bindChat(chat));\n }\n\n async createGroup(\n name: string,\n participantIds: MaxId[] = [],\n notify = true,\n ): Promise<[Chat, Message] | null> {\n const frame = await this.app.invoke(Opcode.MSG_SEND, {\n message: {\n cid: BigInt(Date.now()),\n attaches: [\n {\n _type: \"CONTROL\",\n event: \"new\",\n chatType: \"CHAT\",\n title: name,\n userIds: participantIds,\n },\n ],\n },\n notify,\n });\n const chatRaw = payloadItem(frame, \"chat\");\n if (!chatRaw) return null;\n const chat = this.cacheChat(Chat.fromPayload(chatRaw));\n const data = payload(frame);\n const message = this.app.bindMessage(Message.fromPayload(data.message ?? data));\n return [chat, message];\n }\n\n async inviteUsersToGroup(\n chatId: MaxId,\n userIds: MaxId[],\n showHistory = true,\n ): Promise<Chat | null> {\n return await this.memberAction(chatId, userIds, \"add\", showHistory);\n }\n\n async inviteUsersToChannel(\n chatId: MaxId,\n userIds: MaxId[],\n showHistory = true,\n ): Promise<Chat | null> {\n return await this.inviteUsersToGroup(chatId, userIds, showHistory);\n }\n\n async removeUsersFromGroup(\n chatId: MaxId,\n userIds: MaxId[],\n cleanMsgPeriod = 0,\n ): Promise<Chat | null> {\n const frame = await this.app.invoke(Opcode.CHAT_MEMBERS_UPDATE, {\n chatId,\n userIds,\n operation: \"remove\",\n cleanMsgPeriod,\n });\n return this.optionalChat(payloadItem(frame, \"chat\"));\n }\n\n async changeGroupSettings(chatId: MaxId, settings: GroupSettings): Promise<void> {\n const options: Record<string, boolean> = {};\n const keys: Array<[keyof GroupSettings, string]> = [\n [\"allCanPinMessage\", \"ALL_CAN_PIN_MESSAGE\"],\n [\"onlyOwnerCanChangeIconTitle\", \"ONLY_OWNER_CAN_CHANGE_ICON_TITLE\"],\n [\"onlyAdminCanAddMember\", \"ONLY_ADMIN_CAN_ADD_MEMBER\"],\n [\"onlyAdminCanCall\", \"ONLY_ADMIN_CAN_CALL\"],\n [\"membersCanSeePrivateLink\", \"MEMBERS_CAN_SEE_PRIVATE_LINK\"],\n ];\n for (const [source, target] of keys) {\n const value = settings[source];\n if (typeof value === \"boolean\") options[target] = value;\n }\n const frame = await this.app.invoke(Opcode.CHAT_UPDATE, { chatId, options });\n this.optionalChat(payloadItem(frame, \"chat\"));\n }\n\n async changeGroupProfile(\n chatId: MaxId,\n name: string | null,\n description: string | null = null,\n ): Promise<void> {\n const frame = await this.app.invoke(Opcode.CHAT_UPDATE, { chatId, theme: name, description });\n this.optionalChat(payloadItem(frame, \"chat\"));\n }\n\n async joinGroup(link: string): Promise<Chat> {\n const processed = processJoinLink(link);\n if (!processed) throw new TypeError(\"Invalid group link\");\n return await this.join(processed);\n }\n\n async joinChannel(link: string): Promise<Chat> {\n return await this.join(processJoinLink(link) ?? link);\n }\n\n async resolveGroupByLink(link: string): Promise<Chat | null> {\n const processed = processJoinLink(link);\n if (!processed) throw new TypeError(\"Invalid group link\");\n const frame = await this.app.invoke(Opcode.LINK_INFO, { link: processed });\n return this.optionalChat(payloadItem(frame, \"chat\"));\n }\n\n async reworkInviteLink(chatId: MaxId): Promise<Chat> {\n const frame = await this.app.invoke(Opcode.CHAT_UPDATE, { revokePrivateLink: true, chatId });\n const chat = this.optionalChat(payloadItem(frame, \"chat\"));\n if (!chat) throw new TsMaxError(\"Chat not found in response\");\n return chat;\n }\n\n async getChats(chatIds: MaxId[]): Promise<Chat[]> {\n const missing = chatIds.filter((id) => !this.cache.has(id));\n if (missing.length > 0) {\n const frame = await this.app.invoke(Opcode.CHAT_INFO, { chatIds: missing });\n for (const raw of listItem(frame, \"chats\")) this.cacheChat(Chat.fromPayload(raw));\n }\n return chatIds.flatMap((id) => {\n const chat = this.cache.get(id);\n return chat ? [chat] : [];\n });\n }\n\n async getChat(chatId: MaxId): Promise<Chat> {\n const chat = (await this.getChats([chatId]))[0];\n if (!chat) throw new TsMaxError(\"Chat not found in response\");\n return chat;\n }\n\n async fetchChats(marker = Date.now()): Promise<Chat[]> {\n const frame = await this.app.invoke(Opcode.CHATS_LIST, { marker });\n return listItem(frame, \"chats\").map((raw) => this.cacheChat(Chat.fromPayload(raw)));\n }\n\n async leaveGroup(chatId: MaxId): Promise<void> {\n await this.app.invoke(Opcode.CHAT_LEAVE, { chatId });\n this.cache.delete(chatId);\n }\n\n async leaveChannel(chatId: MaxId): Promise<void> {\n await this.leaveGroup(chatId);\n }\n\n async deleteChat(chatId: MaxId, forMe = true, lastEventTime = Date.now()): Promise<boolean> {\n await this.app.invoke(Opcode.CHAT_DELETE, { chatId, lastEventTime, forAll: !forMe });\n this.cache.delete(chatId);\n return true;\n }\n\n async getJoinRequests(chatId: MaxId, count = 100): Promise<Record<string, unknown>[]> {\n return listItem(\n await this.app.invoke(Opcode.CHAT_MEMBERS, { chatId, type: \"JOIN_REQUEST\", count }),\n \"members\",\n ).map((item) => asRecord(item));\n }\n\n async confirmJoinRequests(\n chatId: MaxId,\n userIds: MaxId[],\n showHistory = true,\n ): Promise<Chat | null> {\n return await this.memberAction(chatId, userIds, \"add\", showHistory, \"JOIN_REQUEST\");\n }\n\n async confirmJoinRequest(chatId: MaxId, userId: MaxId, showHistory = true): Promise<Chat | null> {\n return await this.confirmJoinRequests(chatId, [userId], showHistory);\n }\n\n async declineJoinRequests(chatId: MaxId, userIds: MaxId[]): Promise<Chat | null> {\n return await this.memberAction(chatId, userIds, \"remove\", null, \"JOIN_REQUEST\");\n }\n\n async declineJoinRequest(chatId: MaxId, userId: MaxId): Promise<Chat | null> {\n return await this.declineJoinRequests(chatId, [userId]);\n }\n\n private async join(link: string): Promise<Chat> {\n const frame = await this.app.invoke(Opcode.CHAT_JOIN, { link });\n const chat = this.optionalChat(payloadItem(frame, \"chat\"));\n if (!chat) throw new TsMaxError(\"Chat not found in response\");\n return chat;\n }\n\n private async memberAction(\n chatId: MaxId,\n userIds: MaxId[],\n operation: \"add\" | \"remove\",\n showHistory: boolean | null,\n type?: string,\n ): Promise<Chat | null> {\n const frame = await this.app.invoke(Opcode.CHAT_MEMBERS_UPDATE, {\n chatId,\n userIds,\n operation,\n showHistory,\n ...(type ? { type } : {}),\n });\n return this.optionalChat(payloadItem(frame, \"chat\"));\n }\n\n private optionalChat(raw: unknown): Chat | null {\n return raw ? this.cacheChat(Chat.fromPayload(raw)) : null;\n }\n private cacheChat(chat: Chat): Chat {\n const bound = this.app.bindChat(chat);\n this.cache.set(bound.id, bound);\n return bound;\n }\n}\n\nfunction processJoinLink(link: string): string | null {\n const index = link.indexOf(\"join/\");\n return index >= 0 ? link.slice(index) : null;\n}\n",
|
|
28
|
+
"export interface TextElement {\n type: string;\n from: number;\n length: number;\n attributes?: { url?: string };\n}\n\nconst markers = new Map([\n [\"```\", \"CODE\"],\n [\"**\", \"STRONG\"],\n [\"__\", \"UNDERLINE\"],\n [\"~~\", \"STRIKETHROUGH\"],\n [\"`\", \"MONOSPACED\"],\n [\"_\", \"EMPHASIZED\"],\n [\"*\", \"EMPHASIZED\"],\n]);\n\nexport function formatMarkdown(text: string): { text: string; elements: TextElement[] } {\n let clean = \"\";\n let index = 0;\n let cleanPosition = 0;\n let lineStart = true;\n const active = new Map<string, number>();\n const elements: TextElement[] = [];\n\n while (index < text.length) {\n const link = parseLink(text, index);\n if (link) {\n const length = utf16Length(link.label);\n elements.push({ type: \"LINK\", from: cleanPosition, length, attributes: { url: link.url } });\n clean += link.label;\n cleanPosition += length;\n index = link.next;\n lineStart = false;\n continue;\n }\n\n const current = text[index] as string;\n if (lineStart && (current === \"#\" || current === \">\")) {\n const result = parseLineEntity(text, index, current === \"#\" ? \"HEADING\" : \"QUOTE\");\n if (result) {\n clean += result.value;\n const length = utf16Length(result.value);\n elements.push({ type: result.type, from: cleanPosition, length });\n cleanPosition += length;\n index = result.next;\n lineStart = false;\n continue;\n }\n }\n\n let handled = false;\n for (const [marker, type] of markers) {\n if (!text.startsWith(marker, index)) continue;\n const open = active.get(marker);\n if (open === undefined) {\n const closing = text.indexOf(marker, index + marker.length);\n const newline = text.indexOf(\"\\n\", index + marker.length);\n if (\n closing <= index + marker.length ||\n (marker !== \"```\" && newline !== -1 && closing > newline)\n ) {\n clean += marker;\n cleanPosition += utf16Length(marker);\n } else {\n active.set(marker, cleanPosition);\n }\n } else {\n const length = cleanPosition - open;\n if (length > 0) elements.push({ type, from: open, length });\n active.delete(marker);\n }\n index += marker.length;\n handled = true;\n break;\n }\n if (handled) {\n lineStart = false;\n continue;\n }\n\n clean += current;\n cleanPosition += utf16Length(current);\n index += 1;\n lineStart = current === \"\\n\";\n }\n return { text: clean, elements };\n}\n\nfunction parseLink(\n text: string,\n index: number,\n): { label: string; url: string; next: number } | null {\n if (text[index] !== \"[\") return null;\n const labelEnd = text.indexOf(\"]\", index + 1);\n if (labelEnd < 0 || text[labelEnd + 1] !== \"(\") return null;\n const urlEnd = text.indexOf(\")\", labelEnd + 2);\n if (urlEnd < 0) return null;\n const label = text.slice(index + 1, labelEnd);\n const url = text.slice(labelEnd + 2, urlEnd);\n return label && url ? { label, url, next: urlEnd + 1 } : null;\n}\n\nfunction parseLineEntity(\n text: string,\n index: number,\n type: \"HEADING\" | \"QUOTE\",\n): { type: string; value: string; next: number } | null {\n let contentStart = index + 1;\n if (type === \"HEADING\") {\n while (text[contentStart] === \"#\") contentStart += 1;\n if (text[contentStart] !== \" \") return null;\n }\n if (text[contentStart] === \" \") contentStart += 1;\n const newline = text.indexOf(\"\\n\", contentStart);\n const next = newline < 0 ? text.length : newline;\n const value = text.slice(contentStart, next);\n return value ? { type, value, next } : null;\n}\n\nfunction utf16Length(value: string): number {\n return value.length;\n}\n",
|
|
29
|
+
"import type { SendAttachment } from \"../files/index.ts\";\nimport { formatMarkdown } from \"../formatting/index.ts\";\nimport { Opcode } from \"../protocol/index.ts\";\nimport {\n Message,\n asRecord,\n parseReactionInfo,\n parseReadState,\n toMaxId,\n type EditMessageOptions,\n type ForwardMessageOptions,\n type HistoryOptions,\n type MaxId,\n type MessageActions,\n type ReactionInfo,\n type ReadState,\n type SendMessageOptions,\n} from \"../types/index.ts\";\nimport { listItem, payload, payloadItem, requiredItem } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\nimport type { UploadApi, UploadedAttachment } from \"./uploads.ts\";\n\nexport class MessageApi implements MessageActions {\n private previousCid = Date.now();\n\n constructor(\n private readonly app: ApiRuntime,\n private readonly uploads: UploadApi,\n ) {}\n\n async sendMessage(options: SendMessageOptions): Promise<Message | null> {\n const formatted = formatMarkdown(options.text);\n const attaches = await this.uploadAttachments(\n options.attachments as readonly SendAttachment[] | null,\n );\n const link = options.replyTo ? { type: \"REPLY\", messageId: options.replyTo } : undefined;\n const frame = await this.app.invoke(Opcode.MSG_SEND, {\n chatId: options.chatId,\n message: {\n text: formatted.text,\n cid: this.nextCid(),\n elements: formatted.elements,\n attaches,\n ...(link ? { link } : {}),\n },\n notify: options.notify ?? true,\n });\n return this.parseMessage(payload(frame));\n }\n\n async forwardMessage(options: ForwardMessageOptions): Promise<Message | null> {\n const frame = await this.app.invoke(Opcode.MSG_SEND, {\n chatId: options.chatId,\n message: {\n cid: -this.nextCid(),\n link: {\n type: \"FORWARD\",\n messageId: options.messageId.toString(),\n chatId: options.sourceChatId ?? options.chatId,\n },\n attaches: [],\n },\n notify: options.notify ?? true,\n });\n return this.parseMessage(payload(frame));\n }\n\n async getMessages(chatId: MaxId, messageIds: MaxId[]): Promise<Message[]> {\n const frame = await this.app.invoke(Opcode.MSG_GET, { chatId, messageIds });\n return listItem(frame, \"messages\").map((item) => {\n const message = this.app.bindMessage(Message.fromPayload(item));\n message.chatId ??= chatId;\n return message;\n });\n }\n\n async getMessage(chatId: MaxId, messageId: MaxId): Promise<Message | null> {\n return (await this.getMessages(chatId, [messageId]))[0] ?? null;\n }\n\n async editMessage(options: EditMessageOptions): Promise<Message> {\n const formatted = formatMarkdown(options.text);\n const frame = await this.app.invoke(Opcode.MSG_EDIT, {\n chatId: options.chatId,\n messageId: options.messageId,\n text: formatted.text,\n elements: formatted.elements,\n attachments: await this.uploadAttachments(\n options.attachments as readonly SendAttachment[] | null,\n ),\n });\n const message = this.app.bindMessage(Message.fromPayload(requiredItem(frame, \"message\")));\n message.chatId ??= options.chatId;\n return message;\n }\n\n async fetchHistory(options: HistoryOptions): Promise<Message[] | null> {\n const frame = await this.app.invoke(Opcode.CHAT_HISTORY, {\n chatId: options.chatId,\n forward: options.forward ?? 0,\n backward: options.backward ?? 40,\n backwardTime: options.backwardTime ?? 0,\n forwardTime: options.forwardTime ?? 0,\n from: options.from ?? Date.now(),\n itemType: options.itemType ?? \"REGULAR\",\n getChat: options.getChat ?? false,\n getMessages: options.getMessages ?? true,\n interactive: options.interactive ?? false,\n });\n const result = listItem(frame, \"messages\").map((item) =>\n this.app.bindMessage(Message.fromPayload(item)),\n );\n return result.length > 0 ? result : null;\n }\n\n async deleteMessage(options: {\n chatId: MaxId;\n messageIds: MaxId[];\n forMe: boolean;\n }): Promise<boolean> {\n await this.app.invoke(Opcode.MSG_DELETE, options);\n return true;\n }\n\n async pinMessage(options: {\n chatId: MaxId;\n messageId: MaxId;\n notifyPin: boolean;\n }): Promise<boolean> {\n await this.app.invoke(Opcode.CHAT_UPDATE, {\n chatId: options.chatId,\n notifyPin: options.notifyPin,\n pinMessageId: options.messageId,\n });\n return true;\n }\n\n async readMessage(messageId: MaxId, chatId: MaxId): Promise<ReadState> {\n const frame = await this.app.invoke(Opcode.CHAT_MARK, {\n type: \"READ_MESSAGE\",\n chatId,\n messageId,\n mark: Date.now(),\n });\n return parseReadState(payload(frame));\n }\n\n async addReaction(\n chatId: MaxId,\n messageId: MaxId,\n reaction: string,\n ): Promise<ReactionInfo | null> {\n const frame = await this.app.invoke(Opcode.MSG_REACTION, {\n chatId,\n messageId: messageId.toString(),\n reaction: { id: reaction },\n });\n return parseReactionInfo(payloadItem(frame, \"reactionInfo\"));\n }\n\n async removeReaction(chatId: MaxId, messageId: MaxId): Promise<ReactionInfo | null> {\n const frame = await this.app.invoke(Opcode.MSG_CANCEL_REACTION, {\n chatId,\n messageId: messageId.toString(),\n });\n return parseReactionInfo(payloadItem(frame, \"reactionInfo\"));\n }\n\n async getReactions(chatId: MaxId, messageIds: MaxId[]): Promise<Map<MaxId, ReactionInfo> | null> {\n const frame = await this.app.invoke(Opcode.MSG_GET_REACTIONS, {\n chatId,\n messageIds: messageIds.map(String),\n });\n const raw = payloadItem(frame, \"messagesReactions\");\n if (!raw) return null;\n const result = new Map<MaxId, ReactionInfo>();\n for (const [id, info] of Object.entries(asRecord(raw))) {\n const parsed = parseReactionInfo(info);\n if (parsed) result.set(toMaxId(id), parsed);\n }\n return result;\n }\n\n async getVideoById(\n chatId: MaxId,\n messageId: MaxId,\n videoId: number,\n ): Promise<Record<string, unknown> | null> {\n const frame = await this.app.invoke(Opcode.VIDEO_PLAY, {\n chatId,\n messageId: messageId.toString(),\n videoId,\n });\n return frame.payload;\n }\n\n async getFileById(\n chatId: MaxId,\n messageId: MaxId,\n fileId: number,\n ): Promise<Record<string, unknown> | null> {\n const frame = await this.app.invoke(Opcode.FILE_DOWNLOAD, {\n chatId,\n messageId: messageId.toString(),\n fileId,\n });\n return frame.payload;\n }\n\n private nextCid(): bigint {\n const next = Math.max(Date.now(), this.previousCid + 1);\n this.previousCid = next;\n return BigInt(next);\n }\n\n private async uploadAttachments(\n attachments?: readonly SendAttachment[] | null,\n ): Promise<UploadedAttachment[]> {\n const result: UploadedAttachment[] = [];\n for (const attachment of attachments ?? []) result.push(await this.uploads.upload(attachment));\n return result;\n }\n\n private parseMessage(value: unknown): Message | null {\n if (!value) return null;\n const data = asRecord(value);\n const candidate = data.message ?? value;\n return this.app.bindMessage(Message.fromPayload(candidate));\n }\n}\n",
|
|
30
|
+
"import { UploadError } from \"../errors.ts\";\nimport { File, Photo, Video, type SendAttachment } from \"../files/index.ts\";\nimport { Opcode } from \"../protocol/index.ts\";\nimport { asArray, asNumber, asRecord, asString } from \"../types/index.ts\";\nimport { payload } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\n\nexport type UploadedAttachment =\n | { _type: \"PHOTO\"; photoToken: string }\n | { _type: \"VIDEO\"; videoId: number; token: string }\n | { _type: \"FILE\"; fileId: number };\n\nexport class UploadApi {\n constructor(private readonly app: ApiRuntime) {}\n\n async upload(attachment: SendAttachment): Promise<UploadedAttachment> {\n if (attachment instanceof Photo) return await this.uploadPhoto(attachment);\n if (attachment instanceof Video) return await this.uploadVideo(attachment);\n if (attachment instanceof File) return await this.uploadFile(attachment);\n throw new UploadError(\"Unsupported attachment\");\n }\n\n async uploadPhoto(photo: Photo, profile = false): Promise<UploadedAttachment> {\n const response = payload(await this.app.invoke(Opcode.PHOTO_UPLOAD, { count: 1, profile }));\n const url = asString(response.url);\n if (!url) throw new UploadError(\"No photo upload URL received\");\n const photoId = new URL(url).searchParams.get(\"photoIds\");\n if (!photoId) throw new UploadError(\"Photo upload URL has no photoIds\");\n const form = new FormData();\n const bytes = await photo.read();\n form.append(\n \"file\",\n new Blob([bytes], { type: photo.format.mimeType }),\n `image.${photo.format.extension}`,\n );\n const upload = await fetch(url, { method: \"POST\", body: form });\n if (!upload.ok) throw new UploadError(`Photo upload failed with status ${upload.status}`);\n const result = asRecord(await upload.json(), \"photo upload response\");\n const photos = asRecord(result.photos, \"photos\");\n const item = asRecord(photos[photoId], \"photo result\");\n const token = asString(item.token);\n if (!token) throw new UploadError(\"Photo upload response has no token\");\n return { _type: \"PHOTO\", photoToken: token };\n }\n\n async uploadVideo(video: Video): Promise<UploadedAttachment> {\n const response = payload(\n await this.app.invoke(Opcode.VIDEO_UPLOAD, { count: 1, profile: false }),\n );\n const info = asRecord(asArray(response.info)[0], \"video upload info\");\n const videoId = asNumber(info.videoId);\n const token = asString(info.token);\n const waiter = this.app.createAttachmentWaiter?.(\"videoId\", videoId, 60);\n try {\n await this.postBinary(asString(info.url), video, true);\n await waiter?.promise;\n return { _type: \"VIDEO\", videoId, token };\n } finally {\n waiter?.cancel();\n }\n }\n\n async uploadFile(file: File): Promise<UploadedAttachment> {\n const response = payload(\n await this.app.invoke(Opcode.FILE_UPLOAD, { count: 1, profile: false }),\n );\n const info = asRecord(asArray(response.info)[0], \"file upload info\");\n const fileId = asNumber(info.fileId);\n const waiter = this.app.createAttachmentWaiter?.(\"fileId\", fileId, 60);\n try {\n await this.postBinary(asString(info.url), file, false);\n await waiter?.promise;\n return { _type: \"FILE\", fileId };\n } finally {\n waiter?.cancel();\n }\n }\n\n private async postBinary(url: string, file: File | Video, contentRange: boolean): Promise<void> {\n if (!url) throw new UploadError(\"No upload URL received\");\n const bytes = await file.read();\n const headers: Record<string, string> = {\n \"Content-Disposition\": `attachment; filename=${encodeURIComponent(file.name)}`,\n \"Content-Length\": String(bytes.byteLength),\n };\n if (contentRange || bytes.byteLength > 0)\n headers[\"Content-Range\"] = `0-${bytes.byteLength - 1}/${bytes.byteLength}`;\n const response = await fetch(url, { method: \"POST\", headers, body: bytes });\n if (!response.ok) throw new UploadError(`Upload failed with status ${response.status}`);\n }\n}\n",
|
|
31
|
+
"import { Opcode } from \"../protocol/index.ts\";\nimport { User, asRecord, type MaxId, type UserActions } from \"../types/index.ts\";\nimport { listItem, requiredItem } from \"./response.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\n\nexport interface ContactInfo {\n phone: string;\n firstName: string;\n lastName?: string | null;\n}\n\nexport class UserApi implements UserActions {\n private readonly cache = new Map<MaxId, User>();\n constructor(private readonly app: ApiRuntime) {}\n\n seed(users: Array<User | null>): void {\n for (const user of users) if (user) this.cacheUser(user);\n }\n getCachedUser(userId: MaxId): User | null {\n return this.cache.get(userId) ?? null;\n }\n async getUsers(userIds: MaxId[]): Promise<User[]> {\n const missing = userIds.filter((id) => !this.cache.has(id));\n if (missing.length > 0)\n for (const user of await this.fetchUsers(missing)) this.cache.set(user.id, user);\n return userIds.flatMap((id) => (this.cache.has(id) ? [this.cache.get(id) as User] : []));\n }\n async getUser(userId: MaxId): Promise<User | null> {\n return (await this.getUsers([userId]))[0] ?? null;\n }\n async fetchUsers(userIds: MaxId[]): Promise<User[]> {\n const frame = await this.app.invoke(Opcode.CONTACT_INFO, { contactIds: userIds });\n return listItem(frame, \"contacts\").map((raw) => this.cacheUser(User.fromPayload(raw)));\n }\n async searchByPhone(phone: string): Promise<User> {\n const frame = await this.app.invoke(Opcode.CONTACT_INFO_BY_PHONE, { phone });\n return this.cacheUser(User.fromPayload(requiredItem(frame, \"contact\")));\n }\n async getSessions(): Promise<Record<string, unknown>[]> {\n return listItem(await this.app.invoke(Opcode.SESSIONS_INFO, {}), \"sessions\").map((item) =>\n asRecord(item),\n );\n }\n async addContact(contactId: MaxId): Promise<User> {\n const frame = await this.app.invoke(Opcode.CONTACT_UPDATE, { contactId, action: \"add\" });\n return this.cacheUser(User.fromPayload(requiredItem(frame, \"contact\")));\n }\n async removeContact(contactId: MaxId): Promise<boolean> {\n await this.app.invoke(Opcode.CONTACT_UPDATE, { contactId, action: \"remove\" });\n this.cache.delete(contactId);\n return true;\n }\n async importContacts(contacts: ContactInfo[]): Promise<User[]> {\n const contactList = Object.fromEntries(\n contacts.map((item) => [item.phone, { firstName: item.firstName }]),\n );\n const frame = await this.app.invoke(Opcode.SYNC, { contactList });\n return listItem(frame, \"contacts\").map((raw) => this.cacheUser(User.fromPayload(raw)));\n }\n getChatId(firstUserId: MaxId, secondUserId: MaxId): MaxId {\n return firstUserId ^ secondUserId;\n }\n private cacheUser(user: User): User {\n const bound = this.app.bindUser(user);\n this.cache.set(bound.id, bound);\n return bound;\n }\n}\n",
|
|
32
|
+
"import { AccountApi } from \"./account.ts\";\nimport { AuthApi } from \"./auth.ts\";\nimport { BotsApi } from \"./bots.ts\";\nimport { ChatApi } from \"./chats.ts\";\nimport { MessageApi } from \"./messages.ts\";\nimport type { ApiRuntime } from \"./runtime.ts\";\nimport { UploadApi } from \"./uploads.ts\";\nimport { UserApi } from \"./users.ts\";\n\nexport class ApiFacade {\n readonly auth: AuthApi;\n readonly uploads: UploadApi;\n readonly messages: MessageApi;\n readonly chats: ChatApi;\n readonly users: UserApi;\n readonly account: AccountApi;\n readonly bots: BotsApi;\n\n constructor(app: ApiRuntime) {\n this.auth = new AuthApi(app);\n this.uploads = new UploadApi(app);\n this.messages = new MessageApi(app, this.uploads);\n this.chats = new ChatApi(app);\n this.users = new UserApi(app);\n this.account = new AccountApi(app, this.uploads);\n this.bots = new BotsApi(app);\n }\n}\n",
|
|
33
|
+
"import type { InboundFrame } from \"../protocol/index.ts\";\nimport type {\n Chat,\n Message,\n MessageDeleteEvent,\n MessageReadEvent,\n PresenceEvent,\n ReactionUpdateEvent,\n TypingEvent,\n} from \"../types/index.ts\";\n\nexport const EventType = {\n MESSAGE_NEW: \"messageNew\",\n MESSAGE_EDIT: \"messageEdit\",\n MESSAGE_DELETE: \"messageDelete\",\n MESSAGE_READ: \"messageRead\",\n TYPING: \"typing\",\n PRESENCE: \"presence\",\n REACTION_UPDATE: \"reactionUpdate\",\n CHAT_UPDATE: \"chatUpdate\",\n RAW: \"raw\",\n} as const;\nexport type EventType = (typeof EventType)[keyof typeof EventType];\n\nexport interface EventMap {\n messageNew: Message;\n messageEdit: Message;\n messageDelete: MessageDeleteEvent;\n messageRead: MessageReadEvent;\n typing: TypingEvent;\n presence: PresenceEvent;\n reactionUpdate: ReactionUpdateEvent;\n chatUpdate: Chat;\n raw: InboundFrame;\n}\n\nexport type MaybePromise<T> = T | Promise<T>;\nexport type Handler<Event, Client> = (event: Event, client: Client) => MaybePromise<void>;\nexport type Filter<Event> = (event: Event) => MaybePromise<boolean>;\nexport type StartHandler<Client> = (client: Client) => MaybePromise<void>;\nexport type DisconnectHandler = (\n error: Error,\n reconnect: boolean,\n delay: number,\n) => MaybePromise<void>;\n\nexport interface ErrorContext<Client> {\n client: Client;\n eventType: EventType | \"start\";\n event: unknown;\n router: Router<Client>;\n}\nexport type ErrorHandler<Client> = (\n error: Error,\n context: ErrorContext<Client>,\n) => MaybePromise<void>;\n\ninterface HandlerEntry<Event, Client> {\n handler: Handler<Event, Client>;\n filters: Filter<Event>[];\n}\n\nexport class Router<Client> {\n readonly children: Router<Client>[] = [];\n readonly handlers = new Map<EventType, HandlerEntry<unknown, Client>[]>();\n readonly startHandlers: StartHandler<Client>[] = [];\n readonly errorHandlers: ErrorHandler<Client>[] = [];\n readonly disconnectHandlers: DisconnectHandler[] = [];\n\n includeRouter(router: Router<Client>): () => void {\n this.children.push(router);\n return () => {\n const index = this.children.indexOf(router);\n if (index >= 0) this.children.splice(index, 1);\n };\n }\n\n on<Key extends keyof EventMap>(\n event: Key,\n handler: Handler<EventMap[Key], Client>,\n ...filters: Filter<EventMap[Key]>[]\n ): () => void {\n const entry: HandlerEntry<EventMap[Key], Client> = { handler, filters };\n const entries = (this.handlers.get(event) ?? []) as HandlerEntry<EventMap[Key], Client>[];\n entries.push(entry);\n this.handlers.set(event, entries as HandlerEntry<unknown, Client>[]);\n return () => {\n const index = entries.indexOf(entry);\n if (index >= 0) entries.splice(index, 1);\n };\n }\n\n onStart(handler: StartHandler<Client>): () => void {\n this.startHandlers.push(handler);\n return () => remove(this.startHandlers, handler);\n }\n onError(handler: ErrorHandler<Client>): () => void {\n this.errorHandlers.push(handler);\n return () => remove(this.errorHandlers, handler);\n }\n onDisconnect(handler: DisconnectHandler): () => void {\n this.disconnectHandlers.push(handler);\n return () => remove(this.disconnectHandlers, handler);\n }\n onMessage(handler: Handler<Message, Client>, ...filters: Filter<Message>[]): () => void {\n return this.on(\"messageNew\", handler, ...filters);\n }\n onMessageEdit(handler: Handler<Message, Client>, ...filters: Filter<Message>[]): () => void {\n return this.on(\"messageEdit\", handler, ...filters);\n }\n onMessageDelete(\n handler: Handler<MessageDeleteEvent, Client>,\n ...filters: Filter<MessageDeleteEvent>[]\n ): () => void {\n return this.on(\"messageDelete\", handler, ...filters);\n }\n onMessageRead(\n handler: Handler<MessageReadEvent, Client>,\n ...filters: Filter<MessageReadEvent>[]\n ): () => void {\n return this.on(\"messageRead\", handler, ...filters);\n }\n onTyping(handler: Handler<TypingEvent, Client>, ...filters: Filter<TypingEvent>[]): () => void {\n return this.on(\"typing\", handler, ...filters);\n }\n onPresence(\n handler: Handler<PresenceEvent, Client>,\n ...filters: Filter<PresenceEvent>[]\n ): () => void {\n return this.on(\"presence\", handler, ...filters);\n }\n onReactionUpdate(\n handler: Handler<ReactionUpdateEvent, Client>,\n ...filters: Filter<ReactionUpdateEvent>[]\n ): () => void {\n return this.on(\"reactionUpdate\", handler, ...filters);\n }\n onChatUpdate(handler: Handler<Chat, Client>, ...filters: Filter<Chat>[]): () => void {\n return this.on(\"chatUpdate\", handler, ...filters);\n }\n onRaw(handler: Handler<InboundFrame, Client>, ...filters: Filter<InboundFrame>[]): () => void {\n return this.on(\"raw\", handler, ...filters);\n }\n}\n\nfunction remove<T>(values: T[], value: T): void {\n const index = values.indexOf(value);\n if (index >= 0) values.splice(index, 1);\n}\n",
|
|
34
|
+
"import { Command, Opcode, type InboundFrame } from \"../protocol/index.ts\";\nimport {\n Chat,\n Message,\n asArray,\n asBoolean,\n asNumber,\n asRecord,\n optionalMaxId,\n parseReactionInfo,\n toMaxId,\n type MessageDeleteEvent,\n type MessageReadEvent,\n type PresenceEvent,\n type ReactionUpdateEvent,\n type TypingEvent,\n} from \"../types/index.ts\";\nimport { EventType, type EventMap, type Router } from \"./router.ts\";\n\nexport class Dispatcher<Client> {\n private client: Client | null = null;\n\n constructor(readonly rootRouter: Router<Client>) {}\n\n bindClient(client: Client): void {\n this.client = client;\n }\n\n async emitStart(): Promise<void> {\n const client = this.requireClient();\n for (const router of this.routers()) {\n for (const handler of router.startHandlers) {\n try {\n await handler(client);\n } catch (error) {\n await this.emitError(error, \"start\", null, router);\n }\n }\n }\n }\n\n async emitDisconnect(error: Error, reconnect: boolean, delay: number): Promise<void> {\n for (const router of this.routers()) {\n for (const handler of router.disconnectHandlers) {\n try {\n await handler(error, reconnect, delay);\n } catch {\n // Disconnect handlers cannot make reconnect fail.\n }\n }\n }\n }\n\n async dispatch(frame: InboundFrame): Promise<void> {\n await this.dispatchEvent(\"raw\", frame);\n if (frame.cmd !== Command.REQUEST || !frame.payload) return;\n const resolved = resolveEvent(frame);\n if (resolved) await this.dispatchEvent(resolved.type, resolved.event);\n }\n\n private async dispatchEvent<Key extends keyof EventMap>(\n type: Key,\n event: EventMap[Key],\n ): Promise<void> {\n const client = this.requireClient();\n for (const router of this.routers()) {\n const entries = router.handlers.get(type) ?? [];\n for (const rawEntry of entries) {\n const entry = rawEntry as {\n handler(event: EventMap[Key], client: Client): void | Promise<void>;\n filters: Array<(event: EventMap[Key]) => boolean | Promise<boolean>>;\n };\n try {\n let matches = true;\n for (const filter of entry.filters) {\n if (!(await filter(event))) {\n matches = false;\n break;\n }\n }\n if (matches) await entry.handler(event, client);\n } catch (error) {\n await this.emitError(error, type, event, router);\n }\n }\n }\n }\n\n private async emitError(\n error: unknown,\n eventType: keyof EventMap | \"start\",\n event: unknown,\n source: Router<Client>,\n ): Promise<void> {\n const failure = error instanceof Error ? error : new Error(String(error));\n const client = this.requireClient();\n let handled = false;\n for (const router of this.routers()) {\n for (const handler of router.errorHandlers) {\n handled = true;\n await handler(failure, { client, eventType, event, router: source });\n }\n }\n if (!handled) throw failure;\n }\n\n private *routers(router = this.rootRouter): Generator<Router<Client>> {\n yield router;\n for (const child of router.children) yield* this.routers(child);\n }\n\n private requireClient(): Client {\n if (!this.client) throw new Error(\"Dispatcher has no bound client\");\n return this.client;\n }\n}\n\nfunction resolveEvent(\n frame: InboundFrame,\n): { type: keyof EventMap; event: EventMap[keyof EventMap] } | null {\n const payload = frame.payload as Record<string, unknown>;\n if (frame.opcode === Opcode.NOTIF_MESSAGE || frame.opcode === Opcode.MSG_EDIT) {\n const messagePayload = payload.message ?? payload;\n const message = Message.fromPayload(messagePayload);\n if (message.status === \"REMOVED\")\n return { type: EventType.MESSAGE_DELETE, event: deleteFromMessage(message, payload) };\n return {\n type: message.status === \"EDITED\" ? EventType.MESSAGE_EDIT : EventType.MESSAGE_NEW,\n event: message,\n };\n }\n if (frame.opcode === Opcode.NOTIF_CHAT) {\n return { type: EventType.CHAT_UPDATE, event: Chat.fromPayload(payload.chat ?? payload) };\n }\n if (frame.opcode === Opcode.NOTIF_MSG_DELETE) {\n const chat = payload.chat ? asRecord(payload.chat) : null;\n const event: MessageDeleteEvent = {\n chatId: toMaxId(payload.chatId ?? chat?.id, \"delete.chatId\"),\n messageIds: asArray(payload.messageIds).map((id) => toMaxId(id)),\n chat: chat ? Chat.fromPayload(chat) : null,\n ttl: asBoolean(payload.ttl),\n };\n return { type: EventType.MESSAGE_DELETE, event };\n }\n if (frame.opcode === Opcode.NOTIF_TYPING) {\n const event: TypingEvent = {\n chatId: toMaxId(payload.chatId),\n userId: toMaxId(payload.userId),\n typing: asBoolean(payload.typing, true),\n };\n return { type: EventType.TYPING, event };\n }\n if (frame.opcode === Opcode.NOTIF_MARK) {\n const event: MessageReadEvent = {\n chatId: toMaxId(payload.chatId),\n userId: optionalMaxId(payload.userId),\n mark: asNumber(payload.mark),\n };\n return { type: EventType.MESSAGE_READ, event };\n }\n if (frame.opcode === Opcode.NOTIF_PRESENCE) {\n const presence = payload.presence ? asRecord(payload.presence) : payload;\n const event: PresenceEvent = {\n userId: toMaxId(payload.userId),\n online: asBoolean(presence.online ?? presence.status === \"ONLINE\"),\n lastSeen: presence.lastSeen === undefined ? null : asNumber(presence.lastSeen),\n raw: presence,\n };\n return { type: EventType.PRESENCE, event };\n }\n if (frame.opcode === Opcode.NOTIF_MSG_REACTIONS_CHANGED) {\n const event: ReactionUpdateEvent = {\n chatId: toMaxId(payload.chatId),\n messageId: toMaxId(payload.messageId),\n reactionInfo: parseReactionInfo({\n totalCount: payload.totalCount,\n counters: payload.counters,\n yourReaction: payload.yourReaction,\n }),\n };\n return { type: EventType.REACTION_UPDATE, event };\n }\n return null;\n}\n\nfunction deleteFromMessage(message: Message, payload: Record<string, unknown>): MessageDeleteEvent {\n if (message.chatId === null) throw new TypeError(\"Removed message has no chatId\");\n return {\n chatId: message.chatId,\n messageIds: [message.id],\n message,\n ttl: asBoolean(payload.ttl),\n };\n}\n",
|
|
35
|
+
"import { ApiFacade, type ApiRuntime } from \"./api/index.ts\";\nimport type { AuthFlow } from \"./auth/index.ts\";\nimport type { ResolvedConfig } from \"./config.ts\";\nimport { Dispatcher, type Router } from \"./dispatch/index.ts\";\nimport { ApiError } from \"./errors.ts\";\nimport { getLogger } from \"./logging.ts\";\nimport { Command, Opcode, type InboundFrame, type OutboundFrame } from \"./protocol/index.ts\";\nimport {\n SqliteSessionStore,\n defaultSyncState,\n type SessionInfo,\n type SessionStore,\n} from \"./session/index.ts\";\nimport { TelemetryService } from \"./telemetry/index.ts\";\nimport type {\n Chat,\n ChatActions,\n Message,\n MessageActions,\n Profile,\n User,\n UserActions,\n} from \"./types/index.ts\";\n\nexport interface ConnectionContract {\n readonly protocol: { readonly version: number };\n readonly isOpen?: boolean;\n onEvent: ((frame: InboundFrame) => void | Promise<void>) | null;\n onClose: ((error: Error | null) => void) | null;\n open(): Promise<void>;\n close(): Promise<void>;\n request(frame: OutboundFrame, timeoutSeconds?: number): Promise<InboundFrame>;\n waitClosed(): Promise<void>;\n nextSequence(): number;\n}\n\nexport class App<Client extends MessageActions & ChatActions & UserActions> implements ApiRuntime {\n readonly dispatcher: Dispatcher<Client>;\n readonly api: ApiFacade;\n readonly telemetry: TelemetryService;\n readonly store: SessionStore;\n session: SessionInfo | null = null;\n me: Profile | null = null;\n chats: Chat[] = [];\n contacts: Array<User | null> = [];\n messages = new Map<bigint, Message[]>();\n started = false;\n private pingController: AbortController | null = null;\n private readonly attachmentWaiters = new Map<\n string,\n Set<{ resolve(): void; reject(error: Error): void }>\n >();\n\n constructor(\n readonly connection: ConnectionContract,\n readonly config: ResolvedConfig,\n readonly authFlow: AuthFlow,\n rootRouter: Router<Client>,\n ) {\n this.dispatcher = new Dispatcher(rootRouter);\n this.store = config.store ?? new SqliteSessionStore(config.workDir, config.sessionName);\n this.api = new ApiFacade(this);\n this.telemetry = new TelemetryService(this);\n this.connection.onEvent = async (frame) => {\n this.resolveAttachmentWaiters(frame);\n await this.dispatcher.dispatch(frame);\n };\n this.connection.onClose = (error) => this.connectionLost(error);\n }\n\n bindClient(client: Client): void {\n this.dispatcher.bindClient(client);\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n let saved = await this.store.loadSession();\n if (saved?.mtInstanceId) this.config.device.mtInstanceId = saved.mtInstanceId;\n await this.connection.open();\n await this.api.auth.handshake(saved?.deviceId ?? this.config.device.deviceId);\n this.startPing();\n\n if (!saved) {\n const token = this.config.token ?? (await this.authFlow.authenticate(this)).token;\n if (!token) throw new Error(\"Authentication failed: no token returned\");\n saved = {\n token,\n deviceId: this.config.device.deviceId,\n phone: this.config.phone ?? \"\",\n mtInstanceId: this.config.device.mtInstanceId,\n sync: defaultSyncState(),\n };\n await this.store.saveSession(saved);\n }\n this.session = saved;\n const login = await this.api.auth.login();\n let activeSession = this.session ?? saved;\n if (login.token && login.token !== activeSession.token) {\n await this.store.updateToken(activeSession.token, login.token);\n activeSession = { ...activeSession, token: login.token };\n }\n this.session = activeSession;\n this.me = login.profile;\n this.chats = login.chats;\n this.contacts = login.contacts;\n this.messages = login.messages;\n this.api.chats.seed(this.chats);\n this.api.users.seed([...this.contacts, this.me.contact]);\n this.bindUser(this.me.contact);\n this.started = true;\n if (this.config.telemetry) this.telemetry.start();\n getLogger().info(\"client started\", {\n profileId: this.me.contact.id.toString(),\n chats: this.chats.length,\n });\n }\n\n async close(): Promise<void> {\n this.pingController?.abort();\n this.pingController = null;\n await this.telemetry.stop();\n for (const entries of this.attachmentWaiters.values()) {\n for (const entry of entries)\n entry.reject(new Error(\"Client closed before upload processing completed\"));\n }\n this.attachmentWaiters.clear();\n await this.connection.close();\n await this.store.close();\n this.started = false;\n }\n\n async invoke(\n opcode: number,\n payload: Record<string, unknown> = {},\n timeout?: number,\n ): Promise<InboundFrame> {\n const frame: OutboundFrame = {\n ver: this.connection.protocol.version,\n opcode,\n cmd: Command.REQUEST,\n seq: this.connection.nextSequence(),\n payload,\n };\n const response = await this.connection.request(frame, timeout ?? this.config.requestTimeout);\n if (response.cmd === Command.ERROR) throw buildApiError(response);\n return response;\n }\n\n bindMessage(message: Message): Message {\n return message.bind(this.api.messages);\n }\n bindChat(chat: Chat): Chat {\n return chat.bind(this.api.messages, this.api.chats);\n }\n bindUser(user: User): User {\n return user.bind(this.api.users);\n }\n\n createAttachmentWaiter(\n field: \"fileId\" | \"videoId\",\n id: number,\n timeoutSeconds = 60,\n ): { promise: Promise<void>; cancel(): void } {\n const key = `${field}:${id}`;\n const entries = this.attachmentWaiters.get(key) ?? new Set();\n let active = true;\n let resolvePromise: () => void = () => undefined;\n let rejectPromise: (error: Error) => void = () => undefined;\n const promise = new Promise<void>((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n });\n const entry = {\n resolve: () => {\n if (!active) return;\n active = false;\n clearTimeout(timer);\n entries.delete(entry);\n resolvePromise();\n },\n reject: (error: Error) => {\n if (!active) return;\n active = false;\n clearTimeout(timer);\n entries.delete(entry);\n rejectPromise(error);\n },\n };\n entries.add(entry);\n this.attachmentWaiters.set(key, entries);\n const timer = setTimeout(\n () => entry.reject(new Error(`Timed out waiting for ${field}=${id} processing`)),\n timeoutSeconds * 1000,\n );\n return {\n promise,\n cancel: () => {\n if (!active) return;\n active = false;\n clearTimeout(timer);\n entries.delete(entry);\n if (entries.size === 0) this.attachmentWaiters.delete(key);\n promise.catch(() => undefined);\n },\n };\n }\n\n private startPing(): void {\n const controller = new AbortController();\n this.pingController = controller;\n void this.pingLoop(controller.signal);\n }\n\n private async pingLoop(signal: AbortSignal): Promise<void> {\n try {\n while (!signal.aborted) {\n await this.invoke(Opcode.PING, { interactive: true });\n await sleep(30_000, signal);\n }\n } catch (error) {\n if (!signal.aborted) {\n getLogger().warn(\"ping failed\", { error: String(error) });\n await this.connection.close();\n }\n }\n }\n\n private connectionLost(error: Error | null): void {\n this.started = false;\n this.pingController?.abort();\n if (error) getLogger().warn(\"connection lost\", { error: error.message });\n }\n\n private resolveAttachmentWaiters(frame: InboundFrame): void {\n if (frame.opcode !== Opcode.NOTIF_ATTACH || !frame.payload) return;\n for (const field of [\"fileId\", \"videoId\"] as const) {\n const value = frame.payload[field];\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) continue;\n const key = `${field}:${value}`;\n const entries = this.attachmentWaiters.get(key);\n if (!entries) continue;\n this.attachmentWaiters.delete(key);\n for (const entry of entries) entry.resolve();\n }\n }\n}\n\nfunction buildApiError(frame: InboundFrame): ApiError {\n const data = frame.payload ?? {};\n return new ApiError(frame.opcode, {\n error: typeof data.error === \"string\" ? data.error : null,\n title: typeof data.title === \"string\" ? data.title : null,\n message: typeof data.message === \"string\" ? data.message : null,\n localizedMessage: typeof data.localizedMessage === \"string\" ? data.localizedMessage : null,\n payload: data,\n });\n}\n\nasync function sleep(milliseconds: number, signal: AbortSignal): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, milliseconds);\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason);\n },\n { once: true },\n );\n });\n}\n",
|
|
36
|
+
"import type { InboundFrame } from \"../protocol/index.ts\";\nimport { ConnectionError, TimeoutError } from \"../errors.ts\";\n\ninterface PendingRequest {\n resolve(frame: InboundFrame): void;\n reject(reason: unknown): void;\n timer: ReturnType<typeof setTimeout> | null;\n}\n\nexport class PendingRequests {\n private readonly requests = new Map<number, PendingRequest>();\n\n create(sequence: number, timeoutSeconds?: number): Promise<InboundFrame> {\n if (this.requests.has(sequence)) throw new Error(`Duplicate request sequence: ${sequence}`);\n return new Promise<InboundFrame>((resolve, reject) => {\n const request: PendingRequest = { resolve, reject, timer: null };\n if (timeoutSeconds !== undefined) {\n request.timer = setTimeout(() => {\n this.requests.delete(sequence);\n reject(new TimeoutError(`Request ${sequence} timed out`));\n }, timeoutSeconds * 1000);\n }\n this.requests.set(sequence, request);\n });\n }\n\n resolve(sequence: number, frame: InboundFrame): boolean {\n const request = this.requests.get(sequence);\n if (!request) return false;\n this.requests.delete(sequence);\n if (request.timer) clearTimeout(request.timer);\n request.resolve(frame);\n return true;\n }\n\n discard(sequence: number): void {\n const request = this.requests.get(sequence);\n if (request?.timer) clearTimeout(request.timer);\n this.requests.delete(sequence);\n }\n\n cancelAll(reason: Error = new ConnectionError(\"Connection closed\")): void {\n for (const request of this.requests.values()) {\n if (request.timer) clearTimeout(request.timer);\n request.reject(reason);\n }\n this.requests.clear();\n }\n}\n",
|
|
37
|
+
"import {\n Command,\n type InboundFrame,\n type OutboundFrame,\n type Protocol,\n} from \"../protocol/index.ts\";\nimport { ConnectionError } from \"../errors.ts\";\nimport type { Transport } from \"../transport/index.ts\";\nimport { PendingRequests } from \"./pending.ts\";\nimport type { Reader } from \"./readers.ts\";\n\nexport class ConnectionManager<Raw extends string | Uint8Array> {\n readonly requests = new PendingRequests();\n onEvent: ((frame: InboundFrame) => void | Promise<void>) | null = null;\n onClose: ((error: Error | null) => void) | null = null;\n private sequence = -1;\n private receiveTask: Promise<void> | null = null;\n private abortController: AbortController | null = null;\n\n constructor(\n readonly reader: Reader<Raw>,\n readonly transport: Transport<Raw>,\n readonly protocol: Protocol<Raw>,\n ) {}\n\n get isOpen(): boolean {\n return this.transport.connected;\n }\n\n async open(): Promise<void> {\n if (this.isOpen) return;\n await this.transport.connect();\n this.abortController = new AbortController();\n this.receiveTask = this.receiveLoop(this.abortController.signal);\n }\n\n async close(): Promise<void> {\n this.abortController?.abort();\n this.abortController = null;\n this.requests.cancelAll();\n await this.transport.close();\n try {\n await this.receiveTask;\n } catch {\n // Closing intentionally interrupts recv().\n }\n this.receiveTask = null;\n }\n\n async send(frame: OutboundFrame): Promise<void> {\n if (!this.isOpen) throw new ConnectionError(\"Connection is not open\");\n await this.transport.send(this.protocol.encode(frame));\n }\n\n async request(frame: OutboundFrame, timeoutSeconds?: number): Promise<InboundFrame> {\n const response = this.requests.create(frame.seq, timeoutSeconds);\n try {\n await this.send(frame);\n return await response;\n } catch (error) {\n this.requests.discard(frame.seq);\n throw error;\n }\n }\n\n async waitClosed(): Promise<void> {\n await this.receiveTask;\n }\n\n nextSequence(): number {\n this.sequence = (this.sequence + 1) & 0xffff;\n return this.sequence;\n }\n\n private async receiveLoop(signal: AbortSignal): Promise<void> {\n try {\n while (!signal.aborted) {\n const raw = await this.reader.read();\n const frame = this.protocol.decode(raw);\n if ((frame.cmd === Command.RESPONSE || frame.cmd === Command.ERROR) && frame.seq !== null) {\n this.requests.resolve(frame.seq, frame);\n }\n if (this.onEvent) void Promise.resolve(this.onEvent(frame));\n }\n } catch (error) {\n if (signal.aborted) return;\n const failure = error instanceof Error ? error : new ConnectionError(String(error));\n this.requests.cancelAll(failure);\n this.onClose?.(failure);\n throw failure;\n }\n }\n}\n",
|
|
38
|
+
"import { TCP_HEADER_SIZE, TcpPacketFramer } from \"../protocol/index.ts\";\nimport { ConnectionError } from \"../errors.ts\";\nimport type { Transport } from \"../transport/index.ts\";\n\nexport interface Reader<Raw extends string | Uint8Array> {\n read(): Promise<Raw>;\n}\n\nexport class TcpReader implements Reader<Uint8Array> {\n constructor(\n private readonly transport: Transport<Uint8Array>,\n private readonly framer = new TcpPacketFramer(),\n ) {}\n\n async read(): Promise<Uint8Array> {\n const header = await this.transport.recv(TCP_HEADER_SIZE);\n const payloadLength = this.framer.unpackPayloadLength(header);\n if (payloadLength === null) throw new ConnectionError(\"Incomplete TCP header\");\n if (payloadLength === 0) return header;\n const payload = await this.transport.recv(payloadLength);\n const result = new Uint8Array(header.byteLength + payload.byteLength);\n result.set(header);\n result.set(payload, header.byteLength);\n return result;\n }\n}\n\nexport class WsReader implements Reader<string> {\n constructor(private readonly transport: Transport<string>) {}\n async read(): Promise<string> {\n return await this.transport.recv();\n }\n}\n",
|
|
39
|
+
"export interface Transport<Message extends string | Uint8Array = string | Uint8Array> {\n readonly connected: boolean;\n connect(): Promise<void>;\n close(): Promise<void>;\n send(data: Message): Promise<void>;\n recv(length?: number): Promise<Message>;\n}\n\nexport class AsyncQueue<T> {\n private readonly values: T[] = [];\n private readonly waiters: Array<{\n resolve(value: T): void;\n reject(reason: unknown): void;\n }> = [];\n private failure: Error | null = null;\n\n push(value: T): void {\n const waiter = this.waiters.shift();\n if (waiter) waiter.resolve(value);\n else this.values.push(value);\n }\n\n async shift(): Promise<T> {\n const value = this.values.shift();\n if (value !== undefined) return value;\n if (this.failure) throw this.failure;\n return await new Promise<T>((resolve, reject) => this.waiters.push({ resolve, reject }));\n }\n\n fail(reason: Error): void {\n this.failure = reason;\n for (const waiter of this.waiters.splice(0)) waiter.reject(reason);\n }\n\n clear(): void {\n this.values.length = 0;\n }\n\n reset(): void {\n this.clear();\n this.failure = null;\n }\n}\n",
|
|
40
|
+
"import type { Socket } from \"bun\";\n\nimport { ConnectionError } from \"../errors.ts\";\nimport { AsyncQueue, type Transport } from \"./base.ts\";\n\nexport type TcpConnector = (\n options: Bun.TCPSocketConnectOptions<undefined>,\n) => Promise<Socket<undefined>>;\n\nconst defaultConnector: TcpConnector = async (options) => await Bun.connect(options);\n\nexport class TcpTransport implements Transport<Uint8Array> {\n private socket: Socket<undefined> | null = null;\n private readonly chunks = new AsyncQueue<Uint8Array>();\n private buffered: Uint8Array<ArrayBufferLike> = new Uint8Array();\n\n constructor(\n readonly host: string,\n readonly port: number,\n readonly useTls = true,\n readonly proxy: string | null = null,\n private readonly connector: TcpConnector = defaultConnector,\n ) {}\n\n get connected(): boolean {\n return this.socket !== null && this.socket.readyState === 1;\n }\n\n async connect(): Promise<void> {\n if (this.socket) return;\n this.chunks.reset();\n const endpoint = this.proxy ? new URL(this.proxy) : null;\n let resolveOpen: () => void = () => undefined;\n let rejectOpen: (error: Error) => void = () => undefined;\n let opened = false;\n const open = new Promise<void>((resolve, reject) => {\n resolveOpen = resolve;\n rejectOpen = reject;\n });\n const handlers = this.handlers();\n try {\n this.socket = await this.connector({\n hostname: endpoint?.hostname ?? this.host,\n port: endpoint ? Number(endpoint.port || defaultProxyPort(endpoint.protocol)) : this.port,\n tls:\n endpoint?.protocol === \"https:\"\n ? { serverName: endpoint.hostname }\n : !endpoint && this.useTls\n ? { serverName: this.host }\n : false,\n socket: {\n ...handlers,\n open: () => {\n opened = true;\n resolveOpen();\n },\n close: (socket, error) => {\n void handlers.close?.(socket, error);\n if (!opened)\n rejectOpen(error ?? new ConnectionError(\"Connection closed while opening\"));\n },\n error: (socket, error) => {\n void handlers.error?.(socket, error);\n if (!opened) rejectOpen(error);\n },\n connectError: (socket, error) => {\n void handlers.connectError?.(socket, error);\n if (!opened) rejectOpen(error);\n },\n timeout: (socket) => {\n void handlers.timeout?.(socket);\n if (!opened) rejectOpen(new ConnectionError(\"Connection timed out while opening\"));\n },\n },\n });\n await open;\n } catch (error) {\n this.socket = null;\n throw error;\n }\n if (endpoint) {\n await this.openTunnel(endpoint);\n if (this.useTls) await this.upgradeTls();\n }\n }\n\n async close(): Promise<void> {\n this.socket?.end();\n this.socket = null;\n this.buffered = new Uint8Array();\n this.chunks.reset();\n }\n\n async send(data: Uint8Array): Promise<void> {\n if (!this.socket || !this.connected) throw new ConnectionError(\"Transport is not connected\");\n await this.sendRaw(data);\n }\n\n async recv(length?: number): Promise<Uint8Array> {\n if (!this.connected) throw new ConnectionError(\"Transport is not connected\");\n if (length === undefined) return await this.chunks.shift();\n while (this.buffered.byteLength < length) {\n this.buffered = concatBytes(this.buffered, await this.chunks.shift());\n }\n const result = this.buffered.slice(0, length);\n this.buffered = this.buffered.slice(length);\n return result;\n }\n\n private handlers(): Bun.SocketHandler<undefined> {\n return {\n data: (_socket, data) => this.chunks.push(Uint8Array.from(data)),\n close: (_socket, error) => {\n this.socket = null;\n this.chunks.fail(error ?? new ConnectionError(\"Connection closed\"));\n },\n end: () => this.chunks.fail(new ConnectionError(\"Connection closed by server\")),\n error: (_socket, error) => this.chunks.fail(error),\n connectError: (_socket, error) => this.chunks.fail(error),\n timeout: () => this.chunks.fail(new ConnectionError(\"Connection timed out\")),\n };\n }\n\n private async openTunnel(proxy: URL): Promise<void> {\n if (proxy.protocol === \"http:\" || proxy.protocol === \"https:\") {\n await this.httpConnect(proxy);\n return;\n }\n if (proxy.protocol === \"socks5:\" || proxy.protocol === \"socks5h:\") {\n await this.socks5Connect(proxy);\n return;\n }\n if (proxy.protocol === \"socks4:\" || proxy.protocol === \"socks4a:\") {\n await this.socks4Connect(proxy);\n return;\n }\n throw new TypeError(`Unsupported proxy protocol: ${proxy.protocol}`);\n }\n\n private async httpConnect(proxy: URL): Promise<void> {\n const headers = [\n `CONNECT ${this.host}:${this.port} HTTP/1.1`,\n `Host: ${this.host}:${this.port}`,\n ];\n if (proxy.username || proxy.password) {\n headers.push(\n `Proxy-Authorization: Basic ${Buffer.from(`${decodeURIComponent(proxy.username)}:${decodeURIComponent(proxy.password)}`).toString(\"base64\")}`,\n );\n }\n await this.sendRaw(new TextEncoder().encode(`${headers.join(\"\\r\\n\")}\\r\\n\\r\\n`));\n const response = new TextDecoder().decode(\n await this.readUntil(Uint8Array.from([13, 10, 13, 10])),\n );\n const status = Number(/^HTTP\\/\\d(?:\\.\\d)?\\s+(\\d{3})/.exec(response)?.[1]);\n if (status !== 200)\n throw new ConnectionError(`HTTP proxy CONNECT failed with status ${status || \"unknown\"}`);\n }\n\n private async socks5Connect(proxy: URL): Promise<void> {\n const authenticated = Boolean(proxy.username || proxy.password);\n await this.sendRaw(Uint8Array.from(authenticated ? [5, 2, 0, 2] : [5, 1, 0]));\n const greeting = await this.recv(2);\n if (greeting[0] !== 5 || greeting[1] === 0xff)\n throw new ConnectionError(\"SOCKS5 negotiation failed\");\n if (greeting[1] === 2) {\n const username = new TextEncoder().encode(decodeURIComponent(proxy.username));\n const password = new TextEncoder().encode(decodeURIComponent(proxy.password));\n if (username.length > 255 || password.length > 255)\n throw new TypeError(\"SOCKS5 credentials are too long\");\n await this.sendRaw(\n Uint8Array.from([1, username.length, ...username, password.length, ...password]),\n );\n const auth = await this.recv(2);\n if (auth[1] !== 0) throw new ConnectionError(\"SOCKS5 authentication failed\");\n } else if (greeting[1] !== 0) {\n throw new ConnectionError(`Unsupported SOCKS5 auth method: ${greeting[1]}`);\n }\n const hostname = new TextEncoder().encode(this.host);\n if (hostname.length > 255) throw new TypeError(\"SOCKS5 hostname is too long\");\n await this.sendRaw(\n Uint8Array.from([\n 5,\n 1,\n 0,\n 3,\n hostname.length,\n ...hostname,\n (this.port >>> 8) & 0xff,\n this.port & 0xff,\n ]),\n );\n const head = await this.recv(4);\n if (head[0] !== 5 || head[1] !== 0)\n throw new ConnectionError(`SOCKS5 CONNECT failed: ${head[1]}`);\n const addressLength = head[3] === 1 ? 4 : head[3] === 4 ? 16 : (await this.recv(1))[0];\n if (addressLength === undefined) throw new ConnectionError(\"Invalid SOCKS5 response\");\n await this.recv(addressLength + 2);\n }\n\n private async socks4Connect(proxy: URL): Promise<void> {\n const user = new TextEncoder().encode(decodeURIComponent(proxy.username));\n const host = new TextEncoder().encode(this.host);\n const request = Uint8Array.from([\n 4,\n 1,\n (this.port >>> 8) & 0xff,\n this.port & 0xff,\n 0,\n 0,\n 0,\n 1,\n ...user,\n 0,\n ...host,\n 0,\n ]);\n await this.sendRaw(request);\n const response = await this.recv(8);\n if (response[1] !== 90) throw new ConnectionError(`SOCKS4 CONNECT failed: ${response[1]}`);\n }\n\n private async upgradeTls(): Promise<void> {\n const socket = this.socket;\n if (!socket) throw new ConnectionError(\"Proxy socket closed before TLS upgrade\");\n await new Promise<void>((resolve, reject) => {\n const handlers = this.handlers();\n const [, tls] = socket.upgradeTLS({\n tls: { serverName: this.host },\n socket: {\n ...handlers,\n open: () => resolve(),\n error: (_socket, error) => {\n void handlers.error?.(_socket, error);\n reject(error);\n },\n },\n });\n this.socket = tls;\n });\n }\n\n private async sendRaw(data: Uint8Array): Promise<void> {\n const socket = this.socket;\n if (!socket || socket.readyState <= 0) throw new ConnectionError(\"Socket is not connected\");\n let offset = 0;\n while (offset < data.byteLength) {\n const written = socket.write(data, offset, data.byteLength - offset);\n if (written < 0) throw new ConnectionError(\"Socket closed while writing\");\n if (written === 0) {\n await Bun.sleep(0);\n continue;\n }\n offset += written;\n }\n socket.flush();\n }\n\n private async readUntil(delimiter: Uint8Array): Promise<Uint8Array> {\n let data = this.buffered;\n for (;;) {\n const index = findBytes(data, delimiter);\n if (index >= 0) {\n const end = index + delimiter.length;\n const result = data.slice(0, end);\n this.buffered = data.slice(end);\n return result;\n }\n if (data.byteLength > 64 * 1024)\n throw new ConnectionError(\"Proxy response header is too large\");\n data = concatBytes(data, await this.chunks.shift());\n }\n }\n}\n\nfunction concatBytes(left: Uint8Array, right: Uint8Array): Uint8Array {\n const result = new Uint8Array(left.byteLength + right.byteLength);\n result.set(left);\n result.set(right, left.byteLength);\n return result;\n}\n\nfunction defaultProxyPort(protocol: string): number {\n if (protocol === \"https:\") return 443;\n if (protocol === \"http:\") return 8080;\n return 1080;\n}\n\nfunction findBytes(source: Uint8Array, target: Uint8Array): number {\n outer: for (let index = 0; index <= source.length - target.length; index += 1) {\n for (let offset = 0; offset < target.length; offset += 1) {\n if (source[index + offset] !== target[offset]) continue outer;\n }\n return index;\n }\n return -1;\n}\n",
|
|
41
|
+
"import { AsyncQueue, type Transport } from \"./base.ts\";\nimport { ConnectionError } from \"../errors.ts\";\n\nexport class WebSocketTransport implements Transport<string> {\n private socket: WebSocket | null = null;\n private readonly messages = new AsyncQueue<string>();\n\n constructor(\n readonly url: string,\n readonly proxy: string | null = null,\n ) {}\n\n get connected(): boolean {\n return this.socket?.readyState === WebSocket.OPEN;\n }\n\n async connect(): Promise<void> {\n if (this.socket) return;\n const socket = new WebSocket(this.url, {\n headers: { Origin: \"https://web.max.ru\" },\n ...(this.proxy ? { proxy: this.proxy } : {}),\n });\n this.socket = socket;\n await new Promise<void>((resolve, reject) => {\n socket.addEventListener(\"open\", () => resolve(), { once: true });\n socket.addEventListener(\n \"error\",\n () => reject(new ConnectionError(\"WebSocket connection failed\")),\n {\n once: true,\n },\n );\n });\n socket.addEventListener(\"message\", (event) => {\n if (typeof event.data === \"string\") this.messages.push(event.data);\n else this.messages.fail(new TypeError(\"Expected a text WebSocket frame\"));\n });\n socket.addEventListener(\"close\", () => {\n this.socket = null;\n this.messages.fail(new ConnectionError(\"WebSocket closed\"));\n });\n socket.addEventListener(\"error\", () =>\n this.messages.fail(new ConnectionError(\"WebSocket failed\")),\n );\n }\n\n async close(): Promise<void> {\n const socket = this.socket;\n this.socket = null;\n if (socket && socket.readyState < WebSocket.CLOSING) socket.close();\n this.messages.clear();\n }\n\n async send(data: string): Promise<void> {\n if (!this.socket || !this.connected) throw new ConnectionError(\"Transport is not connected\");\n this.socket.send(data);\n }\n\n async recv(): Promise<string> {\n if (!this.connected) throw new ConnectionError(\"Transport is not connected\");\n return await this.messages.shift();\n }\n}\n",
|
|
42
|
+
"import type { AccountApi, AuthApi, BotsApi, ChatApi, ContactInfo, UserApi } from \"./api/index.ts\";\nimport { App } from \"./app.ts\";\nimport {\n QrAuthFlow,\n SmsAuthFlow,\n type AuthFlow,\n type PasswordProvider,\n type QrHandler,\n type SmsCodeProvider,\n} from \"./auth/index.ts\";\nimport { resolveConfig, type ExtraConfig, type ResolvedConfig } from \"./config.ts\";\nimport { ConnectionManager, TcpReader, WsReader } from \"./connection/index.ts\";\nimport {\n Router,\n type DisconnectHandler,\n type ErrorHandler,\n type Filter,\n type Handler,\n type StartHandler,\n} from \"./dispatch/index.ts\";\nimport { configureLogging } from \"./logging.ts\";\nimport { TcpProtocol, WsProtocol, type InboundFrame } from \"./protocol/index.ts\";\nimport type { SessionInfo } from \"./session/index.ts\";\nimport { TcpTransport, WebSocketTransport } from \"./transport/index.ts\";\nimport type {\n Chat,\n ChatActions,\n EditMessageOptions,\n ForwardMessageOptions,\n HistoryOptions,\n MaxId,\n Message,\n MessageActions,\n MessageDeleteEvent,\n MessageReadEvent,\n PresenceEvent,\n ReactionInfo,\n ReactionUpdateEvent,\n ReadState,\n SendMessageOptions,\n TypingEvent,\n User,\n UserActions,\n} from \"./types/index.ts\";\n\nexport interface ClientOptions {\n phone: string;\n sessionName?: string;\n workDir?: string;\n extraConfig?: ExtraConfig;\n authFlow?: AuthFlow;\n smsCodeProvider?: SmsCodeProvider;\n passwordProvider?: PasswordProvider;\n}\n\nexport interface WebClientOptions {\n sessionName?: string;\n workDir?: string;\n extraConfig?: ExtraConfig;\n authFlow?: AuthFlow;\n qrHandler?: QrHandler;\n passwordProvider?: PasswordProvider;\n}\n\nexport abstract class BaseClient implements MessageActions, ChatActions, UserActions {\n readonly router = new Router<BaseClient>();\n protected app: App<BaseClient>;\n readonly config: ResolvedConfig;\n private stopping = false;\n\n protected constructor(config: ResolvedConfig, _authFlow: AuthFlow, app: App<BaseClient>) {\n this.config = config;\n configureLogging(config.logLevel);\n this.app = app;\n this.app.bindClient(this);\n }\n\n get me() {\n return this.app.me;\n }\n get chats(): Chat[] {\n return this.app.chats;\n }\n get contacts(): Array<User | null> {\n return this.app.contacts;\n }\n get messages(): Map<bigint, Message[]> {\n return this.app.messages;\n }\n get session(): SessionInfo | null {\n return this.app.session;\n }\n get api() {\n return this.app.api;\n }\n get account(): AccountApi {\n return this.api.account;\n }\n get auth(): AuthApi {\n return this.api.auth;\n }\n get bots(): BotsApi {\n return this.api.bots;\n }\n get chatApi(): ChatApi {\n return this.api.chats;\n }\n get users(): UserApi {\n return this.api.users;\n }\n\n async start(): Promise<void> {\n this.stopping = false;\n for (;;) {\n try {\n await this.app.start();\n await this.app.dispatcher.emitStart();\n await this.app.connection.waitClosed();\n await this.app.close();\n return;\n } catch (error) {\n await this.app.close();\n if (this.stopping) return;\n const failure = error instanceof Error ? error : new Error(String(error));\n await this.app.dispatcher.emitDisconnect(\n failure,\n this.config.reconnect,\n this.config.reconnectDelay,\n );\n if (!this.config.reconnect) throw failure;\n await Bun.sleep(this.config.reconnectDelay * 1000);\n this.app = this.rebuildApp();\n this.app.bindClient(this);\n }\n }\n }\n\n async stop(): Promise<void> {\n this.stopping = true;\n await this.app.close();\n }\n async close(): Promise<void> {\n await this.stop();\n }\n async relogin(start = true): Promise<void> {\n if (!this.app.session) throw new Error(\"Cannot relogin before session is loaded\");\n await this.app.store.deleteSession(this.app.session.token);\n await this.app.close();\n this.config.token = null;\n this.app = this.rebuildApp();\n this.app.bindClient(this);\n if (start) await this.start();\n }\n\n includeRouter(router: Router<BaseClient>): () => void {\n return this.router.includeRouter(router);\n }\n onStart(handler: StartHandler<BaseClient>): () => void {\n return this.router.onStart(handler);\n }\n onError(handler: ErrorHandler<BaseClient>): () => void {\n return this.router.onError(handler);\n }\n onDisconnect(handler: DisconnectHandler): () => void {\n return this.router.onDisconnect(handler);\n }\n onMessage(handler: Handler<Message, BaseClient>, ...filters: Filter<Message>[]): () => void {\n return this.router.onMessage(handler, ...filters);\n }\n onMessageEdit(handler: Handler<Message, BaseClient>, ...filters: Filter<Message>[]): () => void {\n return this.router.onMessageEdit(handler, ...filters);\n }\n onMessageDelete(\n handler: Handler<MessageDeleteEvent, BaseClient>,\n ...filters: Filter<MessageDeleteEvent>[]\n ): () => void {\n return this.router.onMessageDelete(handler, ...filters);\n }\n onMessageRead(\n handler: Handler<MessageReadEvent, BaseClient>,\n ...filters: Filter<MessageReadEvent>[]\n ): () => void {\n return this.router.onMessageRead(handler, ...filters);\n }\n onTyping(\n handler: Handler<TypingEvent, BaseClient>,\n ...filters: Filter<TypingEvent>[]\n ): () => void {\n return this.router.onTyping(handler, ...filters);\n }\n onPresence(\n handler: Handler<PresenceEvent, BaseClient>,\n ...filters: Filter<PresenceEvent>[]\n ): () => void {\n return this.router.onPresence(handler, ...filters);\n }\n onReactionUpdate(\n handler: Handler<ReactionUpdateEvent, BaseClient>,\n ...filters: Filter<ReactionUpdateEvent>[]\n ): () => void {\n return this.router.onReactionUpdate(handler, ...filters);\n }\n onChatUpdate(handler: Handler<Chat, BaseClient>, ...filters: Filter<Chat>[]): () => void {\n return this.router.onChatUpdate(handler, ...filters);\n }\n onRaw(\n handler: Handler<InboundFrame, BaseClient>,\n ...filters: Filter<InboundFrame>[]\n ): () => void {\n return this.router.onRaw(handler, ...filters);\n }\n\n async sendMessage(options: SendMessageOptions): Promise<Message | null> {\n return await this.api.messages.sendMessage(options);\n }\n async forwardMessage(options: ForwardMessageOptions): Promise<Message | null> {\n return await this.api.messages.forwardMessage(options);\n }\n async getMessages(chatId: MaxId, messageIds: MaxId[]): Promise<Message[]> {\n return await this.api.messages.getMessages(chatId, messageIds);\n }\n async getMessage(chatId: MaxId, messageId: MaxId): Promise<Message | null> {\n return await this.api.messages.getMessage(chatId, messageId);\n }\n async editMessage(options: EditMessageOptions): Promise<Message> {\n return await this.api.messages.editMessage(options);\n }\n async fetchHistory(options: HistoryOptions): Promise<Message[] | null> {\n return await this.api.messages.fetchHistory(options);\n }\n async deleteMessage(options: {\n chatId: MaxId;\n messageIds: MaxId[];\n forMe: boolean;\n }): Promise<boolean> {\n return await this.api.messages.deleteMessage(options);\n }\n async pinMessage(options: {\n chatId: MaxId;\n messageId: MaxId;\n notifyPin: boolean;\n }): Promise<boolean> {\n return await this.api.messages.pinMessage(options);\n }\n async readMessage(messageId: MaxId, chatId: MaxId): Promise<ReadState> {\n return await this.api.messages.readMessage(messageId, chatId);\n }\n async addReaction(\n chatId: MaxId,\n messageId: MaxId,\n reaction: string,\n ): Promise<ReactionInfo | null> {\n return await this.api.messages.addReaction(chatId, messageId, reaction);\n }\n async removeReaction(chatId: MaxId, messageId: MaxId): Promise<ReactionInfo | null> {\n return await this.api.messages.removeReaction(chatId, messageId);\n }\n async getReactions(chatId: MaxId, messageIds: MaxId[]): Promise<Map<MaxId, ReactionInfo> | null> {\n return await this.api.messages.getReactions(chatId, messageIds);\n }\n async getVideoById(chatId: MaxId, messageId: MaxId, videoId: number) {\n return await this.api.messages.getVideoById(chatId, messageId, videoId);\n }\n async getFileById(chatId: MaxId, messageId: MaxId, fileId: number) {\n return await this.api.messages.getFileById(chatId, messageId, fileId);\n }\n\n async createGroup(name: string, participantIds: MaxId[] = [], notify = true) {\n return await this.api.chats.createGroup(name, participantIds, notify);\n }\n async inviteUsersToGroup(\n chatId: MaxId,\n userIds: MaxId[],\n showHistory = true,\n ): Promise<Chat | null> {\n return await this.api.chats.inviteUsersToGroup(chatId, userIds, showHistory);\n }\n async inviteUsersToChannel(\n chatId: MaxId,\n userIds: MaxId[],\n showHistory = true,\n ): Promise<Chat | null> {\n return await this.api.chats.inviteUsersToChannel(chatId, userIds, showHistory);\n }\n async removeUsersFromGroup(chatId: MaxId, userIds: MaxId[]): Promise<Chat | null> {\n return await this.api.chats.removeUsersFromGroup(chatId, userIds);\n }\n async getChats(chatIds: MaxId[]): Promise<Chat[]> {\n return await this.api.chats.getChats(chatIds);\n }\n async getChat(chatId: MaxId): Promise<Chat> {\n return await this.api.chats.getChat(chatId);\n }\n async fetchChats(marker?: number): Promise<Chat[]> {\n return await this.api.chats.fetchChats(marker);\n }\n async joinGroup(link: string): Promise<Chat> {\n return await this.api.chats.joinGroup(link);\n }\n async joinChannel(link: string): Promise<Chat> {\n return await this.api.chats.joinChannel(link);\n }\n async leaveGroup(chatId: MaxId): Promise<void> {\n await this.api.chats.leaveGroup(chatId);\n }\n async leaveChannel(chatId: MaxId): Promise<void> {\n await this.api.chats.leaveChannel(chatId);\n }\n async deleteChat(chatId: MaxId, forMe = true): Promise<boolean> {\n return await this.api.chats.deleteChat(chatId, forMe);\n }\n async changeGroupSettings(\n chatId: MaxId,\n settings: Parameters<ChatApi[\"changeGroupSettings\"]>[1],\n ): Promise<void> {\n await this.api.chats.changeGroupSettings(chatId, settings);\n }\n async changeGroupProfile(\n chatId: MaxId,\n name: string | null,\n description: string | null = null,\n ): Promise<void> {\n await this.api.chats.changeGroupProfile(chatId, name, description);\n }\n async resolveGroupByLink(link: string): Promise<Chat | null> {\n return await this.api.chats.resolveGroupByLink(link);\n }\n async reworkInviteLink(chatId: MaxId): Promise<Chat> {\n return await this.api.chats.reworkInviteLink(chatId);\n }\n async getJoinRequests(chatId: MaxId, count = 100) {\n return await this.api.chats.getJoinRequests(chatId, count);\n }\n async confirmJoinRequests(\n chatId: MaxId,\n userIds: MaxId[],\n showHistory = true,\n ): Promise<Chat | null> {\n return await this.api.chats.confirmJoinRequests(chatId, userIds, showHistory);\n }\n async confirmJoinRequest(chatId: MaxId, userId: MaxId, showHistory = true): Promise<Chat | null> {\n return await this.api.chats.confirmJoinRequest(chatId, userId, showHistory);\n }\n async declineJoinRequests(chatId: MaxId, userIds: MaxId[]): Promise<Chat | null> {\n return await this.api.chats.declineJoinRequests(chatId, userIds);\n }\n async declineJoinRequest(chatId: MaxId, userId: MaxId): Promise<Chat | null> {\n return await this.api.chats.declineJoinRequest(chatId, userId);\n }\n\n getCachedUser(userId: MaxId): User | null {\n return this.api.users.getCachedUser(userId);\n }\n async getUsers(userIds: MaxId[]): Promise<User[]> {\n return await this.api.users.getUsers(userIds);\n }\n async getUser(userId: MaxId): Promise<User | null> {\n return await this.api.users.getUser(userId);\n }\n async fetchUsers(userIds: MaxId[]): Promise<User[]> {\n return await this.api.users.fetchUsers(userIds);\n }\n async searchByPhone(phone: string): Promise<User> {\n return await this.api.users.searchByPhone(phone);\n }\n async addContact(contactId: MaxId): Promise<User> {\n return await this.api.users.addContact(contactId);\n }\n async removeContact(contactId: MaxId): Promise<boolean> {\n return await this.api.users.removeContact(contactId);\n }\n async importContacts(contacts: ContactInfo[]): Promise<User[]> {\n return await this.api.users.importContacts(contacts);\n }\n getChatId(firstUserId: MaxId, secondUserId: MaxId): MaxId {\n return this.api.users.getChatId(firstUserId, secondUserId);\n }\n\n async setTwoFactor(options: Parameters<AuthApi[\"setTwoFactor\"]>[0]): Promise<boolean> {\n return await this.auth.setTwoFactor(options);\n }\n async removeTwoFactor(password: string): Promise<boolean> {\n return await this.auth.removeTwoFactor(password);\n }\n async changePassword(oldPassword: string, newPassword: string): Promise<boolean> {\n return await this.auth.changePassword(oldPassword, newPassword);\n }\n async authorizeQrLogin(qrLink: string): Promise<boolean> {\n return await this.auth.authorizeQrLogin(qrLink);\n }\n async checkTwoFactor(): Promise<boolean> {\n return await this.auth.checkTwoFactor();\n }\n async changeProfile(options: Parameters<AccountApi[\"changeProfile\"]>[0]): Promise<boolean> {\n return await this.account.changeProfile(options);\n }\n async requestProfilePhotoUploadUrl(): Promise<string> {\n return await this.account.requestProfilePhotoUploadUrl();\n }\n async createFolder(\n title: string,\n chatInclude: MaxId[],\n filters: unknown[] = [],\n ): Promise<Record<string, unknown>> {\n return await this.account.createFolder(title, chatInclude, filters);\n }\n async getFolders(folderSync = 0): Promise<Record<string, unknown>> {\n return await this.account.getFolders(folderSync);\n }\n async updateFolder(\n folderId: string,\n title: string,\n chatInclude: MaxId[] = [],\n filters: unknown[] = [],\n options: unknown[] = [],\n ): Promise<Record<string, unknown>> {\n return await this.account.updateFolder(folderId, title, chatInclude, filters, options);\n }\n async deleteFolder(folderId: string): Promise<Record<string, unknown>> {\n return await this.account.deleteFolder(folderId);\n }\n async closeAllSessions(): Promise<boolean> {\n return await this.account.closeAllSessions();\n }\n async logout(): Promise<boolean> {\n return await this.account.logout();\n }\n async getSessions(): Promise<Record<string, unknown>[]> {\n return await this.users.getSessions();\n }\n async getBotInitData(botId: MaxId, chatId?: MaxId | null, startParam?: string | null) {\n return await this.bots.getBotInitData(botId, chatId, startParam);\n }\n\n protected abstract rebuildApp(): App<BaseClient>;\n}\n\nexport class Client extends BaseClient {\n private readonly authFlow: AuthFlow;\n\n constructor(options: ClientOptions) {\n const config = resolveConfig({\n phone: options.phone,\n ...(options.workDir !== undefined ? { workDir: options.workDir } : {}),\n ...(options.sessionName !== undefined ? { sessionName: options.sessionName } : {}),\n ...(options.extraConfig !== undefined ? { extra: options.extraConfig } : {}),\n });\n const authFlow =\n options.authFlow ?? new SmsAuthFlow(options.smsCodeProvider, options.passwordProvider);\n const transport = new TcpTransport(config.host, config.port, config.useTls, config.proxy);\n const connection = new ConnectionManager(\n new TcpReader(transport),\n transport,\n new TcpProtocol(),\n );\n const placeholder = new Router<BaseClient>();\n const app = new App(connection, config, authFlow, placeholder);\n super(config, authFlow, app);\n this.authFlow = authFlow;\n app.dispatcher.rootRouter.children.push(this.router);\n }\n\n protected rebuildApp(): App<BaseClient> {\n const transport = new TcpTransport(\n this.config.host,\n this.config.port,\n this.config.useTls,\n this.config.proxy,\n );\n const connection = new ConnectionManager(\n new TcpReader(transport),\n transport,\n new TcpProtocol(),\n );\n return new App(connection, this.config, this.authFlow, this.router);\n }\n}\n\nexport class WebClient extends BaseClient {\n private readonly authFlow: AuthFlow;\n\n constructor(options: WebClientOptions = {}) {\n const config = resolveConfig({\n phone: null,\n ...(options.workDir !== undefined ? { workDir: options.workDir } : {}),\n ...(options.sessionName !== undefined ? { sessionName: options.sessionName } : {}),\n web: true,\n ...(options.extraConfig !== undefined ? { extra: options.extraConfig } : {}),\n });\n const authFlow =\n options.authFlow ?? new QrAuthFlow(options.qrHandler, options.passwordProvider);\n const transport = new WebSocketTransport(config.url, config.proxy);\n const connection = new ConnectionManager(new WsReader(transport), transport, new WsProtocol());\n const placeholder = new Router<BaseClient>();\n const app = new App(connection, config, authFlow, placeholder);\n super(config, authFlow, app);\n this.authFlow = authFlow;\n app.dispatcher.rootRouter.children.push(this.router);\n }\n\n protected rebuildApp(): App<BaseClient> {\n const transport = new WebSocketTransport(this.config.url, this.config.proxy);\n const connection = new ConnectionManager(new WsReader(transport), transport, new WsProtocol());\n return new App(connection, this.config, this.authFlow, this.router);\n }\n}\n",
|
|
43
|
+
"export const VERSION = \"0.1.0\";\n\nexport * from \"./api/index.ts\";\nexport * from \"./auth/index.ts\";\nexport * from \"./client.ts\";\nexport * from \"./config.ts\";\nexport * from \"./dispatch/index.ts\";\nexport * from \"./errors.ts\";\nexport * from \"./files/index.ts\";\nexport * from \"./formatting/index.ts\";\nexport * from \"./logging.ts\";\nexport * from \"./protocol/index.ts\";\nexport * from \"./session/index.ts\";\nexport * from \"./telemetry/index.ts\";\nexport * from \"./types/index.ts\";\n"
|
|
44
|
+
],
|
|
45
|
+
"mappings": "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",
|
|
46
|
+
"debugId": "DCB99DD4AB754F0E64756E2164756E21",
|
|
47
|
+
"names": []
|
|
48
|
+
}
|