@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.
Files changed (174) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +168 -0
  3. package/UPSTREAM.md +10 -0
  4. package/dist/api/account.d.ts +24 -0
  5. package/dist/api/account.d.ts.map +1 -0
  6. package/dist/api/auth.d.ts +57 -0
  7. package/dist/api/auth.d.ts.map +1 -0
  8. package/dist/api/bots.d.ts +8 -0
  9. package/dist/api/bots.d.ts.map +1 -0
  10. package/dist/api/chats.d.ts +41 -0
  11. package/dist/api/chats.d.ts.map +1 -0
  12. package/dist/api/facade.d.ts +19 -0
  13. package/dist/api/facade.d.ts.map +1 -0
  14. package/dist/api/index.d.ts +10 -0
  15. package/dist/api/index.d.ts.map +1 -0
  16. package/dist/api/messages.d.ts +35 -0
  17. package/dist/api/messages.d.ts.map +1 -0
  18. package/dist/api/response.d.ts +7 -0
  19. package/dist/api/response.d.ts.map +1 -0
  20. package/dist/api/runtime.d.ts +19 -0
  21. package/dist/api/runtime.d.ts.map +1 -0
  22. package/dist/api/uploads.d.ts +23 -0
  23. package/dist/api/uploads.d.ts.map +1 -0
  24. package/dist/api/users.d.ts +25 -0
  25. package/dist/api/users.d.ts.map +1 -0
  26. package/dist/app.d.ts +55 -0
  27. package/dist/app.d.ts.map +1 -0
  28. package/dist/auth/flows.d.ts +27 -0
  29. package/dist/auth/flows.d.ts.map +1 -0
  30. package/dist/auth/index.d.ts +3 -0
  31. package/dist/auth/index.d.ts.map +1 -0
  32. package/dist/auth/index.js +109 -0
  33. package/dist/auth/index.js.map +11 -0
  34. package/dist/auth/providers.d.ts +11 -0
  35. package/dist/auth/providers.d.ts.map +1 -0
  36. package/dist/client.d.ts +139 -0
  37. package/dist/client.d.ts.map +1 -0
  38. package/dist/config.d.ts +80 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/connection/connection.d.ts +25 -0
  41. package/dist/connection/connection.d.ts.map +1 -0
  42. package/dist/connection/index.d.ts +4 -0
  43. package/dist/connection/index.d.ts.map +1 -0
  44. package/dist/connection/pending.d.ts +9 -0
  45. package/dist/connection/pending.d.ts.map +1 -0
  46. package/dist/connection/readers.d.ts +17 -0
  47. package/dist/connection/readers.d.ts.map +1 -0
  48. package/dist/dispatch/dispatcher.d.ts +16 -0
  49. package/dist/dispatch/dispatcher.d.ts.map +1 -0
  50. package/dist/dispatch/index.d.ts +3 -0
  51. package/dist/dispatch/index.d.ts.map +1 -0
  52. package/dist/dispatch/router.d.ts +64 -0
  53. package/dist/dispatch/router.d.ts.map +1 -0
  54. package/dist/errors.d.ts +24 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/files/file.d.ts +29 -0
  57. package/dist/files/file.d.ts.map +1 -0
  58. package/dist/files/index.d.ts +2 -0
  59. package/dist/files/index.d.ts.map +1 -0
  60. package/dist/files/index.js +95 -0
  61. package/dist/files/index.js.map +10 -0
  62. package/dist/formatting/index.d.ts +2 -0
  63. package/dist/formatting/index.d.ts.map +1 -0
  64. package/dist/formatting/markdown.d.ts +13 -0
  65. package/dist/formatting/markdown.d.ts.map +1 -0
  66. package/dist/index.d.ts +15 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +3967 -0
  69. package/dist/index.js.map +48 -0
  70. package/dist/logging.d.ts +10 -0
  71. package/dist/logging.d.ts.map +1 -0
  72. package/dist/protocol/compression.d.ts +8 -0
  73. package/dist/protocol/compression.d.ts.map +1 -0
  74. package/dist/protocol/enums.d.ts +175 -0
  75. package/dist/protocol/enums.d.ts.map +1 -0
  76. package/dist/protocol/index.d.ts +6 -0
  77. package/dist/protocol/index.d.ts.map +1 -0
  78. package/dist/protocol/index.js +438 -0
  79. package/dist/protocol/index.js.map +13 -0
  80. package/dist/protocol/tcp.d.ts +35 -0
  81. package/dist/protocol/tcp.d.ts.map +1 -0
  82. package/dist/protocol/types.d.ts +38 -0
  83. package/dist/protocol/types.d.ts.map +1 -0
  84. package/dist/protocol/websocket.d.ts +7 -0
  85. package/dist/protocol/websocket.d.ts.map +1 -0
  86. package/dist/session/index.d.ts +3 -0
  87. package/dist/session/index.d.ts.map +1 -0
  88. package/dist/session/index.js +179 -0
  89. package/dist/session/index.js.map +12 -0
  90. package/dist/session/store.d.ts +18 -0
  91. package/dist/session/store.d.ts.map +1 -0
  92. package/dist/session/types.d.ts +29 -0
  93. package/dist/session/types.d.ts.map +1 -0
  94. package/dist/telemetry/index.d.ts +4 -0
  95. package/dist/telemetry/index.d.ts.map +1 -0
  96. package/dist/telemetry/index.js +831 -0
  97. package/dist/telemetry/index.js.map +17 -0
  98. package/dist/telemetry/navigation.d.ts +41 -0
  99. package/dist/telemetry/navigation.d.ts.map +1 -0
  100. package/dist/telemetry/payloads.d.ts +30 -0
  101. package/dist/telemetry/payloads.d.ts.map +1 -0
  102. package/dist/telemetry/service.d.ts +53 -0
  103. package/dist/telemetry/service.d.ts.map +1 -0
  104. package/dist/transport/base.d.ts +18 -0
  105. package/dist/transport/base.d.ts.map +1 -0
  106. package/dist/transport/index.d.ts +4 -0
  107. package/dist/transport/index.d.ts.map +1 -0
  108. package/dist/transport/tcp.d.ts +28 -0
  109. package/dist/transport/tcp.d.ts.map +1 -0
  110. package/dist/transport/websocket.d.ts +14 -0
  111. package/dist/transport/websocket.d.ts.map +1 -0
  112. package/dist/types/attachments.d.ts +18 -0
  113. package/dist/types/attachments.d.ts.map +1 -0
  114. package/dist/types/index.d.ts +4 -0
  115. package/dist/types/index.d.ts.map +1 -0
  116. package/dist/types/index.js +376 -0
  117. package/dist/types/index.js.map +12 -0
  118. package/dist/types/models.d.ts +210 -0
  119. package/dist/types/models.d.ts.map +1 -0
  120. package/dist/types/utils.d.ts +10 -0
  121. package/dist/types/utils.d.ts.map +1 -0
  122. package/package.json +95 -0
  123. package/src/api/account.ts +93 -0
  124. package/src/api/auth.ts +312 -0
  125. package/src/api/bots.ts +21 -0
  126. package/src/api/chats.ts +234 -0
  127. package/src/api/facade.ts +28 -0
  128. package/src/api/index.ts +9 -0
  129. package/src/api/messages.ts +230 -0
  130. package/src/api/response.ts +24 -0
  131. package/src/api/runtime.ts +27 -0
  132. package/src/api/uploads.ts +91 -0
  133. package/src/api/users.ts +68 -0
  134. package/src/app.ts +271 -0
  135. package/src/auth/flows.ts +103 -0
  136. package/src/auth/index.ts +2 -0
  137. package/src/auth/providers.ts +30 -0
  138. package/src/client.ts +506 -0
  139. package/src/config.ts +161 -0
  140. package/src/connection/connection.ts +93 -0
  141. package/src/connection/index.ts +3 -0
  142. package/src/connection/pending.ts +49 -0
  143. package/src/connection/readers.ts +33 -0
  144. package/src/dispatch/dispatcher.ts +194 -0
  145. package/src/dispatch/index.ts +2 -0
  146. package/src/dispatch/router.ts +149 -0
  147. package/src/errors.ts +41 -0
  148. package/src/files/file.ts +92 -0
  149. package/src/files/index.ts +1 -0
  150. package/src/formatting/index.ts +1 -0
  151. package/src/formatting/markdown.ts +123 -0
  152. package/src/index.ts +15 -0
  153. package/src/logging.ts +67 -0
  154. package/src/protocol/compression.ts +69 -0
  155. package/src/protocol/enums.ts +175 -0
  156. package/src/protocol/index.ts +5 -0
  157. package/src/protocol/tcp.ts +139 -0
  158. package/src/protocol/types.ts +45 -0
  159. package/src/protocol/websocket.ts +47 -0
  160. package/src/session/index.ts +2 -0
  161. package/src/session/store.ts +154 -0
  162. package/src/session/types.ts +45 -0
  163. package/src/telemetry/index.ts +3 -0
  164. package/src/telemetry/navigation.ts +160 -0
  165. package/src/telemetry/payloads.ts +84 -0
  166. package/src/telemetry/service.ts +194 -0
  167. package/src/transport/base.ts +43 -0
  168. package/src/transport/index.ts +3 -0
  169. package/src/transport/tcp.ts +296 -0
  170. package/src/transport/websocket.ts +63 -0
  171. package/src/types/attachments.ts +24 -0
  172. package/src/types/index.ts +3 -0
  173. package/src/types/models.ts +461 -0
  174. package/src/types/utils.ts +45 -0
@@ -0,0 +1,17 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/protocol/compression.ts", "../src/protocol/enums.ts", "../src/protocol/tcp.ts", "../src/protocol/websocket.ts", "../src/telemetry/navigation.ts", "../src/telemetry/payloads.ts", "../src/logging.ts", "../src/telemetry/service.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 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",
10
+ "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",
11
+ "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",
12
+ "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"
13
+ ],
14
+ "mappings": "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",
15
+ "debugId": "3534F2E6FEFBAE9064756E2164756E21",
16
+ "names": []
17
+ }
@@ -0,0 +1,41 @@
1
+ export declare const Screen: {
2
+ readonly BACKGROUND: 1;
3
+ readonly CONTACTS: 100;
4
+ readonly CHATS: 150;
5
+ readonly SEARCH: 151;
6
+ readonly CALLS: 300;
7
+ readonly CHAT: 350;
8
+ readonly SETTINGS: 450;
9
+ readonly MINIAPP: 500;
10
+ };
11
+ export type Screen = (typeof Screen)[keyof typeof Screen];
12
+ export interface RandomSource {
13
+ random(): number;
14
+ }
15
+ export interface RouteProfile {
16
+ steps: number;
17
+ minPause: number;
18
+ maxPause: number;
19
+ longPauseChance: number;
20
+ minLongPause: number;
21
+ maxLongPause: number;
22
+ backChance: number;
23
+ }
24
+ export declare const mainTabParams: {
25
+ readonly source_type: 5;
26
+ readonly source_id: 1;
27
+ readonly tab_config: 2;
28
+ };
29
+ export declare const defaultProfiles: Readonly<Record<string, RouteProfile>>;
30
+ export declare class NavigationPlanner {
31
+ private readonly random;
32
+ currentScreen: Screen;
33
+ readonly history: Screen[];
34
+ constructor(random?: RandomSource);
35
+ newProfile(): RouteProfile;
36
+ pause(profile: RouteProfile): number;
37
+ nextScreen(profile: RouteProfile): Screen;
38
+ resetToBackground(): void;
39
+ private between;
40
+ }
41
+ //# sourceMappingURL=navigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/telemetry/navigation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;CAST,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,MAAM,IAAI,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAOD,eAAO,MAAM,aAAa;;;;CAA2D,CAAC;AAEtF,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CA4BlE,CAAC;AA+CF,qBAAa,iBAAiB;IAIhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,aAAa,EAAE,MAAM,CAAqB;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAM;gBAEH,MAAM,GAAE,YAAmB;IAExD,UAAU,IAAI,YAAY;IAK1B,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAQpC,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;IAwBzC,iBAAiB,IAAI,IAAI;IAKzB,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,30 @@
1
+ import type { MaxId } from "../types/index.ts";
2
+ import type { RandomSource, Screen } from "./navigation.ts";
3
+ export interface TelemetryEvent {
4
+ time: number;
5
+ userId: MaxId;
6
+ type: "PERF" | "NAV";
7
+ event: string;
8
+ params: Record<string, unknown>;
9
+ sessionId: number;
10
+ }
11
+ export declare class TelemetryPayloadBuilder {
12
+ private readonly random;
13
+ constructor(random?: RandomSource);
14
+ login(userId: MaxId, sessionId: number): TelemetryEvent;
15
+ navigation(options: {
16
+ userId: MaxId;
17
+ sessionId: number;
18
+ screenFrom: Screen;
19
+ screenTo: Screen;
20
+ prevTime: number;
21
+ actionId: number;
22
+ extraParams?: Record<string, MaxId | number>;
23
+ }): TelemetryEvent;
24
+ openChat(userId: MaxId, sessionId: number): TelemetryEvent;
25
+ openChats(userId: MaxId, sessionId: number): TelemetryEvent;
26
+ toPayload(events: TelemetryEvent[]): Record<string, unknown>;
27
+ private event;
28
+ private integer;
29
+ }
30
+ //# sourceMappingURL=payloads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payloads.d.ts","sourceRoot":"","sources":["../../src/telemetry/payloads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,YAAmB;IAExD,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc;IAOvD,UAAU,CAAC,OAAO,EAAE;QAClB,MAAM,EAAE,KAAK,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;KAC9C,GAAG,cAAc;IAUlB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc;IAa1D,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc;IAa3D,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI5D,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,53 @@
1
+ import type { Chat, MaxId, Profile } from "../types/index.ts";
2
+ import { NavigationPlanner, Screen, type RandomSource } from "./navigation.ts";
3
+ import { TelemetryPayloadBuilder, type TelemetryEvent } from "./payloads.ts";
4
+ export interface TelemetryRuntime {
5
+ readonly config: {
6
+ requestTimeout: number;
7
+ device: {
8
+ clientSessionId: number;
9
+ };
10
+ };
11
+ readonly connection: {
12
+ readonly isOpen?: boolean;
13
+ };
14
+ readonly started: boolean;
15
+ readonly me: Profile | null;
16
+ readonly chats: Chat[];
17
+ invoke(opcode: number, payload?: Record<string, unknown>, timeout?: number): Promise<unknown>;
18
+ }
19
+ export interface TelemetryTiming {
20
+ startupDelay: readonly [number, number];
21
+ sessionIdleDelay: readonly [number, number];
22
+ renderDelay: readonly [number, number];
23
+ returnDelay: readonly [number, number];
24
+ returnToBackgroundChance: number;
25
+ openChatsRenderChance: number;
26
+ }
27
+ export declare const defaultTelemetryTiming: TelemetryTiming;
28
+ export declare class TelemetryService {
29
+ private readonly app;
30
+ private readonly random;
31
+ private readonly timing;
32
+ readonly planner: NavigationPlanner;
33
+ readonly payloads: TelemetryPayloadBuilder;
34
+ private controller;
35
+ private task;
36
+ private actionId;
37
+ private sessionId;
38
+ private lastNavTime;
39
+ constructor(app: TelemetryRuntime, random?: RandomSource, timing?: TelemetryTiming);
40
+ get running(): boolean;
41
+ get ready(): boolean;
42
+ start(): void;
43
+ stop(): Promise<void>;
44
+ sendEvents(events: TelemetryEvent[]): Promise<void>;
45
+ sourceParams(screen: Screen): Record<string, MaxId | number>;
46
+ private run;
47
+ private collectSessionEvents;
48
+ private navigationEvent;
49
+ private get userId();
50
+ private pickChat;
51
+ private between;
52
+ }
53
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/telemetry/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EACL,iBAAiB,EACjB,MAAM,EAEN,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAE7E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE;YAAE,eAAe,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACjF,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/F;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gBAAgB,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wBAAwB,EAAE,MAAM,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,sBAAsB,EAAE,eAOpC,CAAC;AAEF,qBAAa,gBAAgB;IAUzB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXzB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAc;gBAGd,GAAG,EAAE,gBAAgB,EACrB,MAAM,GAAE,YAAmB,EAC3B,MAAM,GAAE,eAAwC;IAOnE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,KAAK,IAAI,IAAI;IAYP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;YAS9C,GAAG;YAeH,oBAAoB;IA+BlC,OAAO,CAAC,eAAe;IAevB,OAAO,KAAK,MAAM,GAGjB;IAED,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,18 @@
1
+ export interface Transport<Message extends string | Uint8Array = string | Uint8Array> {
2
+ readonly connected: boolean;
3
+ connect(): Promise<void>;
4
+ close(): Promise<void>;
5
+ send(data: Message): Promise<void>;
6
+ recv(length?: number): Promise<Message>;
7
+ }
8
+ export declare class AsyncQueue<T> {
9
+ private readonly values;
10
+ private readonly waiters;
11
+ private failure;
12
+ push(value: T): void;
13
+ shift(): Promise<T>;
14
+ fail(reason: Error): void;
15
+ clear(): void;
16
+ reset(): void;
17
+ }
18
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/transport/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS,CAAC,OAAO,SAAS,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU;IAClF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AAED,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGhB;IACR,OAAO,CAAC,OAAO,CAAsB;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAMd,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC;IAOzB,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAKzB,KAAK,IAAI,IAAI;IAIb,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,4 @@
1
+ export * from "./base.ts";
2
+ export * from "./tcp.ts";
3
+ export * from "./websocket.ts";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Socket } from "bun";
2
+ import { type Transport } from "./base.ts";
3
+ export type TcpConnector = (options: Bun.TCPSocketConnectOptions<undefined>) => Promise<Socket<undefined>>;
4
+ export declare class TcpTransport implements Transport<Uint8Array> {
5
+ readonly host: string;
6
+ readonly port: number;
7
+ readonly useTls: boolean;
8
+ readonly proxy: string | null;
9
+ private readonly connector;
10
+ private socket;
11
+ private readonly chunks;
12
+ private buffered;
13
+ constructor(host: string, port: number, useTls?: boolean, proxy?: string | null, connector?: TcpConnector);
14
+ get connected(): boolean;
15
+ connect(): Promise<void>;
16
+ close(): Promise<void>;
17
+ send(data: Uint8Array): Promise<void>;
18
+ recv(length?: number): Promise<Uint8Array>;
19
+ private handlers;
20
+ private openTunnel;
21
+ private httpConnect;
22
+ private socks5Connect;
23
+ private socks4Connect;
24
+ private upgradeTls;
25
+ private sendRaw;
26
+ private readUntil;
27
+ }
28
+ //# sourceMappingURL=tcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/transport/tcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAGlC,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAEvD,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,GAAG,CAAC,uBAAuB,CAAC,SAAS,CAAC,KAC5C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAIhC,qBAAa,YAAa,YAAW,SAAS,CAAC,UAAU,CAAC;IAMtD,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM;IACf,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAiD;gBAGtD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,UAAO,EACb,KAAK,GAAE,MAAM,GAAG,IAAW,EACnB,SAAS,GAAE,YAA+B;IAG7D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0DxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAWhD,OAAO,CAAC,QAAQ;YAcF,UAAU;YAgBV,WAAW;YAmBX,aAAa;YAyCb,aAAa;YAsBb,UAAU;YAoBV,OAAO;YAgBP,SAAS;CAexB"}
@@ -0,0 +1,14 @@
1
+ import { type Transport } from "./base.ts";
2
+ export declare class WebSocketTransport implements Transport<string> {
3
+ readonly url: string;
4
+ readonly proxy: string | null;
5
+ private socket;
6
+ private readonly messages;
7
+ constructor(url: string, proxy?: string | null);
8
+ get connected(): boolean;
9
+ connect(): Promise<void>;
10
+ close(): Promise<void>;
11
+ send(data: string): Promise<void>;
12
+ recv(): Promise<string>;
13
+ }
14
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAGvD,qBAAa,kBAAmB,YAAW,SAAS,CAAC,MAAM,CAAC;IAKxD,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAL/B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;gBAG1C,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAM,GAAG,IAAW;IAGtC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAI9B"}
@@ -0,0 +1,18 @@
1
+ export declare const AttachmentType: {
2
+ readonly PHOTO: "PHOTO";
3
+ readonly VIDEO: "VIDEO";
4
+ readonly FILE: "FILE";
5
+ readonly CONTACT: "CONTACT";
6
+ readonly STICKER: "STICKER";
7
+ readonly AUDIO: "AUDIO";
8
+ readonly CONTROL: "CONTROL";
9
+ readonly INLINE_KEYBOARD: "INLINE_KEYBOARD";
10
+ readonly SHARE: "SHARE";
11
+ readonly CALL: "CALL";
12
+ };
13
+ export interface Attachment {
14
+ readonly type: string;
15
+ readonly raw: Readonly<Record<string, unknown>>;
16
+ }
17
+ export declare function parseAttachment(value: unknown): Attachment;
18
+ //# sourceMappingURL=attachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/types/attachments.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;;;;;CAWjB,CAAC;AAEX,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAG1D"}
@@ -0,0 +1,4 @@
1
+ export * from "./attachments.ts";
2
+ export * from "./models.ts";
3
+ export * from "./utils.ts";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}