@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,13 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/protocol/compression.ts", "../src/protocol/enums.ts", "../src/protocol/tcp.ts", "../src/protocol/websocket.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
+ ],
10
+ "mappings": "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",
11
+ "debugId": "48D4D6DC5C20417D64756E2164756E21",
12
+ "names": []
13
+ }
@@ -0,0 +1,35 @@
1
+ import { Lz4BlockCompression, ZstdCompression } from "./compression.ts";
2
+ import type { InboundFrame, OutboundFrame, PackedPacket, Payload, Protocol } from "./types.ts";
3
+ export declare const TCP_HEADER_SIZE = 10;
4
+ export declare class TcpPacketFramer {
5
+ pack(options: {
6
+ ver: number;
7
+ cmd: number;
8
+ seq: number;
9
+ opcode: number;
10
+ flags: number;
11
+ payloadBytes: Uint8Array;
12
+ }): Uint8Array;
13
+ unpack(data: Uint8Array): PackedPacket | null;
14
+ unpackPayloadLength(data: Uint8Array): number | null;
15
+ }
16
+ export declare class MsgpackPayloadCodec {
17
+ encode(payload: unknown): Uint8Array;
18
+ decode(payload: Uint8Array): Payload;
19
+ }
20
+ export declare class TcpPayloadDecoder {
21
+ private readonly serializer;
22
+ private readonly lz4;
23
+ private readonly zstd;
24
+ constructor(serializer?: MsgpackPayloadCodec, lz4?: Lz4BlockCompression, zstd?: ZstdCompression);
25
+ decode(payload: Uint8Array, flags?: number): Payload;
26
+ }
27
+ export declare class TcpProtocol implements Protocol<Uint8Array> {
28
+ readonly version = 10;
29
+ readonly framer: TcpPacketFramer;
30
+ readonly serializer: MsgpackPayloadCodec;
31
+ readonly payloadDecoder: TcpPayloadDecoder;
32
+ encode(frame: OutboundFrame): Uint8Array;
33
+ decode(raw: Uint8Array): InboundFrame;
34
+ }
35
+ //# sourceMappingURL=tcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/protocol/tcp.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE/F,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,qBAAa,eAAe;IAC1B,IAAI,CAAC,OAAO,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,UAAU,CAAC;KAC1B,GAAG,UAAU;IAgBd,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI;IAmB7C,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;CAMrD;AAED,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU;IAKpC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;CAIrC;AAED,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,UAAU,sBAA4B,EACtC,GAAG,sBAA4B,EAC/B,IAAI,kBAAwB;IAG/C,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,SAAI,GAAG,OAAO;CAQhD;AAED,qBAAa,WAAY,YAAW,QAAQ,CAAC,UAAU,CAAC;IACtD,QAAQ,CAAC,OAAO,MAAM;IACtB,QAAQ,CAAC,MAAM,kBAAyB;IACxC,QAAQ,CAAC,UAAU,sBAA6B;IAChD,QAAQ,CAAC,cAAc,oBAA0C;IAEjE,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU;IAYxC,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,YAAY;CAYtC"}
@@ -0,0 +1,38 @@
1
+ export type WirePrimitive = null | boolean | number | bigint | string | Uint8Array;
2
+ export type WireValue = WirePrimitive | WireValue[] | {
3
+ readonly [key: string]: WireValue;
4
+ } | ReadonlyMap<WirePrimitive, WireValue>;
5
+ export type Payload = Record<string, unknown>;
6
+ export interface OutboundFrame {
7
+ readonly ver: number;
8
+ readonly opcode: number;
9
+ readonly cmd?: number;
10
+ readonly seq: number;
11
+ readonly payload?: Payload | null;
12
+ readonly compress?: boolean;
13
+ }
14
+ export interface InboundFrame {
15
+ readonly opcode: number;
16
+ readonly cmd: number;
17
+ readonly seq: number | null;
18
+ readonly payload: Payload | null;
19
+ readonly raw: Payload | null;
20
+ }
21
+ export interface TcpPacketHeader {
22
+ readonly ver: number;
23
+ readonly cmd: number;
24
+ readonly seq: number;
25
+ readonly opcode: number;
26
+ readonly flags: number;
27
+ readonly payloadLength: number;
28
+ }
29
+ export interface PackedPacket {
30
+ readonly header: TcpPacketHeader;
31
+ readonly payloadBytes: Uint8Array;
32
+ }
33
+ export interface Protocol<Encoded extends string | Uint8Array = string | Uint8Array> {
34
+ readonly version: number;
35
+ encode(frame: OutboundFrame): Encoded;
36
+ decode(raw: Encoded): InboundFrame;
37
+ }
38
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AACnF,MAAM,MAAM,SAAS,GACjB,aAAa,GACb,SAAS,EAAE,GACX;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrC,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AAE1C,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC;CACnC;AAED,MAAM,WAAW,QAAQ,CAAC,OAAO,SAAS,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAAC;CACpC"}
@@ -0,0 +1,7 @@
1
+ import type { InboundFrame, OutboundFrame, Protocol } from "./types.ts";
2
+ export declare class WsProtocol implements Protocol<string> {
3
+ readonly version = 11;
4
+ encode(frame: OutboundFrame): string;
5
+ decode(raw: string): InboundFrame;
6
+ }
7
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/protocol/websocket.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAW,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjF,qBAAa,UAAW,YAAW,QAAQ,CAAC,MAAM,CAAC;IACjD,QAAQ,CAAC,OAAO,MAAM;IAEtB,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAIpC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;CAmBlC"}
@@ -0,0 +1,3 @@
1
+ export * from "./store.ts";
2
+ export * from "./types.ts";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,179 @@
1
+ // @bun
2
+ // src/session/store.ts
3
+ import { Database } from "bun:sqlite";
4
+ import { mkdirSync } from "fs";
5
+ import { join } from "path";
6
+
7
+ // src/logging.ts
8
+ var priorities = {
9
+ DEBUG: 10,
10
+ INFO: 20,
11
+ WARN: 30,
12
+ ERROR: 40,
13
+ SILENT: 100
14
+ };
15
+
16
+ class ConsoleLogger {
17
+ level;
18
+ constructor(level) {
19
+ this.level = level;
20
+ }
21
+ debug(message, context) {
22
+ this.write("DEBUG", message, context);
23
+ }
24
+ info(message, context) {
25
+ this.write("INFO", message, context);
26
+ }
27
+ warn(message, context) {
28
+ this.write("WARN", message, context);
29
+ }
30
+ error(message, context) {
31
+ this.write("ERROR", message, context);
32
+ }
33
+ write(level, message, context) {
34
+ if (priorities[level] < priorities[this.level])
35
+ return;
36
+ const suffix = context ? ` ${JSON.stringify(redact(context))}` : "";
37
+ const line = `[tsmax] ${level.toLowerCase()} ${message}${suffix}`;
38
+ if (level === "ERROR")
39
+ console.error(line);
40
+ else if (level === "WARN")
41
+ console.warn(line);
42
+ else
43
+ console.log(line);
44
+ }
45
+ }
46
+ var activeLogger = new ConsoleLogger("INFO");
47
+ function configureLogging(level = "INFO", logger) {
48
+ activeLogger = logger ?? new ConsoleLogger(level);
49
+ return activeLogger;
50
+ }
51
+ function getLogger() {
52
+ return activeLogger;
53
+ }
54
+ function redact(value) {
55
+ if (Array.isArray(value))
56
+ return value.map(redact);
57
+ if (value === null || typeof value !== "object")
58
+ return value;
59
+ const result = {};
60
+ for (const [key, item] of Object.entries(value)) {
61
+ result[key] = /token|password|phone|code/i.test(key) ? "[redacted]" : redact(item);
62
+ }
63
+ return result;
64
+ }
65
+
66
+ // src/session/types.ts
67
+ var DEFAULT_CONFIG_HASH = "00000000-0000000000000000-00000000-0000000000000000-0000000000000000-0-0000000000000000-00000000";
68
+ function defaultSyncState(overrides = {}) {
69
+ return {
70
+ chatsSync: overrides.chatsSync ?? -1,
71
+ contactsSync: overrides.contactsSync ?? -1,
72
+ draftsSync: overrides.draftsSync ?? -1,
73
+ presenceSync: overrides.presenceSync ?? -1,
74
+ configHash: overrides.configHash ?? DEFAULT_CONFIG_HASH
75
+ };
76
+ }
77
+ function resolveSync(saved, overrides = {}) {
78
+ return { ...saved, ...overrides };
79
+ }
80
+
81
+ // src/session/store.ts
82
+ var columns = `token, device_id, phone, mt_instance_id, chats_sync, contacts_sync,
83
+ drafts_sync, presence_sync, config_hash`;
84
+
85
+ class SqliteSessionStore {
86
+ path;
87
+ database = null;
88
+ constructor(workDir, databaseName = "session.db") {
89
+ mkdirSync(workDir, { recursive: true });
90
+ this.path = join(workDir, databaseName);
91
+ }
92
+ async saveSession(session) {
93
+ const db = this.getDatabase();
94
+ db.query(`INSERT OR REPLACE INTO sessions (${columns}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(session.token, session.deviceId, session.phone, session.mtInstanceId, session.sync.chatsSync, session.sync.contactsSync, session.sync.draftsSync, session.sync.presenceSync, String(session.sync.configHash));
95
+ getLogger().info("session saved");
96
+ }
97
+ async updateToken(oldToken, newToken) {
98
+ this.getDatabase().query("UPDATE sessions SET token = ? WHERE token = ?").run(newToken, oldToken);
99
+ }
100
+ async loadSession() {
101
+ return this.rowToSession(this.getDatabase().query(`SELECT ${columns} FROM sessions LIMIT 1`).get());
102
+ }
103
+ async loadSessionByDeviceId(deviceId) {
104
+ return this.rowToSession(this.getDatabase().query(`SELECT ${columns} FROM sessions WHERE device_id = ?`).get(deviceId));
105
+ }
106
+ async loadSessionByPhone(phone) {
107
+ return this.rowToSession(this.getDatabase().query(`SELECT ${columns} FROM sessions WHERE phone = ?`).get(phone));
108
+ }
109
+ async deleteSession(token) {
110
+ this.getDatabase().query("DELETE FROM sessions WHERE token = ?").run(token);
111
+ }
112
+ async deleteAllSessions() {
113
+ this.getDatabase().run("DELETE FROM sessions");
114
+ }
115
+ async close() {
116
+ this.database?.close();
117
+ this.database = null;
118
+ }
119
+ getDatabase() {
120
+ if (this.database)
121
+ return this.database;
122
+ const database = new Database(this.path, { create: true, strict: true });
123
+ database.run(`CREATE TABLE IF NOT EXISTS sessions (
124
+ token TEXT NOT NULL PRIMARY KEY,
125
+ device_id TEXT NOT NULL,
126
+ phone TEXT NOT NULL,
127
+ mt_instance_id TEXT NOT NULL DEFAULT '',
128
+ chats_sync INTEGER NOT NULL DEFAULT -1,
129
+ contacts_sync INTEGER NOT NULL DEFAULT -1,
130
+ drafts_sync INTEGER NOT NULL DEFAULT -1,
131
+ presence_sync INTEGER NOT NULL DEFAULT -1,
132
+ config_hash TEXT NOT NULL DEFAULT ''
133
+ )`);
134
+ this.ensureColumns(database);
135
+ database.query("UPDATE sessions SET config_hash = ? WHERE config_hash = ''").run(DEFAULT_CONFIG_HASH);
136
+ this.database = database;
137
+ return database;
138
+ }
139
+ ensureColumns(database) {
140
+ const existing = new Set(database.query("PRAGMA table_info(sessions)").all().map((row) => row.name));
141
+ const definitions = {
142
+ mt_instance_id: "TEXT NOT NULL DEFAULT ''",
143
+ chats_sync: "INTEGER NOT NULL DEFAULT -1",
144
+ contacts_sync: "INTEGER NOT NULL DEFAULT -1",
145
+ drafts_sync: "INTEGER NOT NULL DEFAULT -1",
146
+ presence_sync: "INTEGER NOT NULL DEFAULT -1",
147
+ config_hash: "TEXT NOT NULL DEFAULT ''"
148
+ };
149
+ for (const [name, definition] of Object.entries(definitions)) {
150
+ if (!existing.has(name))
151
+ database.run(`ALTER TABLE sessions ADD COLUMN ${name} ${definition}`);
152
+ }
153
+ }
154
+ rowToSession(row) {
155
+ if (!row)
156
+ return null;
157
+ return {
158
+ token: row.token,
159
+ deviceId: row.device_id,
160
+ phone: row.phone,
161
+ mtInstanceId: row.mt_instance_id || "",
162
+ sync: defaultSyncState({
163
+ chatsSync: row.chats_sync,
164
+ contactsSync: row.contacts_sync,
165
+ draftsSync: row.drafts_sync,
166
+ presenceSync: row.presence_sync,
167
+ configHash: row.config_hash || DEFAULT_CONFIG_HASH
168
+ })
169
+ };
170
+ }
171
+ }
172
+ export {
173
+ resolveSync,
174
+ defaultSyncState,
175
+ SqliteSessionStore,
176
+ DEFAULT_CONFIG_HASH
177
+ };
178
+
179
+ //# debugId=3B677B85799AC67A64756E2164756E21
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/session/store.ts", "../src/logging.ts", "../src/session/types.ts"],
4
+ "sourcesContent": [
5
+ "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",
6
+ "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",
7
+ "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"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "3B677B85799AC67A64756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,18 @@
1
+ import { type SessionInfo, type SessionStore as SessionStoreContract } from "./types.ts";
2
+ export declare class SqliteSessionStore implements SessionStoreContract {
3
+ readonly path: string;
4
+ private database;
5
+ constructor(workDir: string, databaseName?: string);
6
+ saveSession(session: SessionInfo): Promise<void>;
7
+ updateToken(oldToken: string, newToken: string): Promise<void>;
8
+ loadSession(): Promise<SessionInfo | null>;
9
+ loadSessionByDeviceId(deviceId: string): Promise<SessionInfo | null>;
10
+ loadSessionByPhone(phone: string): Promise<SessionInfo | null>;
11
+ deleteSession(token: string): Promise<void>;
12
+ deleteAllSessions(): Promise<void>;
13
+ close(): Promise<void>;
14
+ private getDatabase;
15
+ private ensureColumns;
16
+ private rowToSession;
17
+ }
18
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,IAAI,oBAAoB,EAC1C,MAAM,YAAY,CAAC;AAiBpB,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,OAAO,EAAE,MAAM,EAAE,YAAY,SAAe;IAKlD,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9D,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ1C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQpE,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAQ9D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,YAAY;CAgBrB"}
@@ -0,0 +1,29 @@
1
+ export declare const DEFAULT_CONFIG_HASH = "00000000-0000000000000000-00000000-0000000000000000-0000000000000000-0-0000000000000000-00000000";
2
+ export interface SyncState {
3
+ chatsSync: number;
4
+ contactsSync: number;
5
+ draftsSync: number;
6
+ presenceSync: number;
7
+ configHash: string | number;
8
+ }
9
+ export type SyncOverrides = Partial<SyncState>;
10
+ export interface SessionInfo {
11
+ token: string;
12
+ deviceId: string;
13
+ phone: string;
14
+ mtInstanceId: string;
15
+ sync: SyncState;
16
+ }
17
+ export interface SessionStore {
18
+ saveSession(session: SessionInfo): Promise<void>;
19
+ updateToken(oldToken: string, newToken: string): Promise<void>;
20
+ loadSession(): Promise<SessionInfo | null>;
21
+ loadSessionByDeviceId(deviceId: string): Promise<SessionInfo | null>;
22
+ loadSessionByPhone(phone: string): Promise<SessionInfo | null>;
23
+ deleteSession(token: string): Promise<void>;
24
+ deleteAllSessions(): Promise<void>;
25
+ close(): Promise<void>;
26
+ }
27
+ export declare function defaultSyncState(overrides?: SyncOverrides): SyncState;
28
+ export declare function resolveSync(saved: SyncState, overrides?: SyncOverrides): SyncState;
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,qGACoE,CAAC;AAErG,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC3C,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrE,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC/D,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,aAAkB,GAAG,SAAS,CAQzE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,GAAE,aAAkB,GAAG,SAAS,CAEtF"}
@@ -0,0 +1,4 @@
1
+ export * from "./navigation.ts";
2
+ export * from "./payloads.ts";
3
+ export * from "./service.ts";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}