@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
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 ink-developer
4
+ Copyright (c) 2026 tsmax contributors
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,168 @@
1
+ # tsmax
2
+
3
+ Неофициальный Bun/TypeScript-клиент внутреннего API мессенджера MAX. Это TypeScript-форк
4
+ [PyMax](https://github.com/skar404/pymax), ориентированный на вход от имени обычного пользователя,
5
+ SMS- и QR-аутентификацию, сообщения, чаты, контакты и вложения.
6
+
7
+ > Это не официальный SDK MAX. Внутренний протокол может измениться без предупреждения. Используйте
8
+ > проект только для собственных аккаунтов и сценариев, которые не нарушают правила сервиса и закон.
9
+
10
+ ## Требования
11
+
12
+ - Bun 1.3.0 или новее;
13
+ - Node.js не нужен и не поддерживается как runtime;
14
+ - Bun используется и как runtime, и как пакетный менеджер;
15
+ - ESLint проверяет код, Prettier отвечает за форматирование.
16
+
17
+ ## Установка
18
+
19
+ ```bash
20
+ bun add tsmax
21
+ ```
22
+
23
+ До публикации пакета можно подключить локальный checkout:
24
+
25
+ ```bash
26
+ bun add ../tsmax
27
+ ```
28
+
29
+ ## SMS-вход
30
+
31
+ ```ts
32
+ import { Client } from "tsmax";
33
+
34
+ const client = new Client({
35
+ phone: "+79990000000",
36
+ smsCodeProvider: (phone) => prompt(`Код из SMS для ${phone}:`) ?? "",
37
+ passwordProvider: (hint) => prompt(`Пароль 2FA${hint ? ` (${hint})` : ""}:`) ?? "",
38
+ });
39
+
40
+ client.onStart(async (app) => {
41
+ console.log(`Вошли как ${app.me?.contact.id}`);
42
+ await app.sendMessage({ chatId: 123456789n, text: "Привет из **tsmax**" });
43
+ });
44
+
45
+ await client.start();
46
+ ```
47
+
48
+ `start()` держит клиент подключённым до закрытия соединения. Для корректной остановки вызовите
49
+ `await client.stop()`.
50
+
51
+ ## QR-вход
52
+
53
+ ```ts
54
+ import { WebClient } from "tsmax";
55
+
56
+ const client = new WebClient({
57
+ qrHandler: (link) => console.log("Откройте QR-ссылку:", link),
58
+ });
59
+
60
+ await client.start();
61
+ ```
62
+
63
+ Стандартный QR-handler выводит QR-код прямо в терминал.
64
+
65
+ ## События
66
+
67
+ ```ts
68
+ client.onMessage(
69
+ async (message) => {
70
+ if (message.text === "/ping") await message.reply("pong");
71
+ },
72
+ (message) => message.chatId !== null,
73
+ );
74
+
75
+ client.onMessageEdit((message) => console.log("Изменено:", message.text));
76
+ client.onTyping((event) => console.log(event.userId, event.typing));
77
+ client.onDisconnect((error, reconnect) => console.error(error.message, { reconnect }));
78
+ ```
79
+
80
+ Все идентификаторы пользователей, чатов и сообщений представлены как `bigint`. Передавайте литералы
81
+ с суффиксом `n` и превращайте их в строки перед JSON-сериализацией.
82
+
83
+ ## Вложения
84
+
85
+ ```ts
86
+ import { File, Photo, Video } from "tsmax/files";
87
+
88
+ await client.sendMessage({
89
+ chatId: 123456789n,
90
+ text: "Файлы",
91
+ attachments: [
92
+ new Photo({ path: "./photo.jpg" }),
93
+ new Video({ path: "./clip.mp4" }),
94
+ new File({ path: "./report.pdf" }),
95
+ ],
96
+ });
97
+ ```
98
+
99
+ Для видео и файлов клиент ждёт серверное событие о завершении обработки, как PyMax.
100
+
101
+ ## Сессии PyMax
102
+
103
+ По умолчанию используется SQLite-файл `session.db`. Схема и миграции совместимы с PyMax 2.3.1:
104
+ существующую базу можно открыть из обоих клиентов. Значения `sync_state` и токены сохраняются без
105
+ потери 64-битных ID.
106
+
107
+ ```ts
108
+ const client = new Client({
109
+ phone: "+79990000000",
110
+ workDir: "./data",
111
+ sessionName: "account.db",
112
+ });
113
+ ```
114
+
115
+ Не коммитьте базы сессий: они содержат токены авторизации.
116
+
117
+ ## Proxy и транспорт
118
+
119
+ Мобильный `Client` использует TCP/TLS и поддерживает HTTP CONNECT, HTTPS CONNECT, SOCKS4/4a и
120
+ SOCKS5. `WebClient` использует встроенный WebSocket Bun; его `proxy` поддерживает HTTP(S)-proxy в
121
+ формате Bun.
122
+
123
+ ```ts
124
+ const client = new Client({
125
+ phone: "+79990000000",
126
+ extraConfig: { proxy: "socks5://user:password@127.0.0.1:1080" },
127
+ });
128
+ ```
129
+
130
+ ## Разработка
131
+
132
+ ```bash
133
+ bun install
134
+ bun run check
135
+ ```
136
+
137
+ Основные команды: `lint`, `format:check`, `typecheck`, `test`, `build`, `pack:check`. Покрытие строк,
138
+ функций и statements не должно опускаться ниже 90% для загруженных тестами модулей.
139
+
140
+ ## Реальный smoke-test
141
+
142
+ Файл `scripts/real-test.ts` проверяет настоящее TCP-подключение и SMS/2FA-вход. После авторизации он
143
+ выводит имя пользователя, список активных подписок типа `CHANNEL` и остаётся подключённым. Каждый
144
+ новый пост выводится с ID поста, ID и названием канала, текстом и типами вложений:
145
+
146
+ ```bash
147
+ MAX_PHONE=+79990000000 bun run test:real
148
+ ```
149
+
150
+ Тест ничего не отправляет и не изменяет в аккаунте; остановите его через `Ctrl+C`. Дополнительные
151
+ переменные: `MAX_PROXY`, `MAX_WORK_DIR` и `MAX_SESSION_NAME`. Сессия по умолчанию хранится в
152
+ `.data/real-test.db`; не публикуйте этот файл и не передавайте его другим людям.
153
+
154
+ ## Отличия от Node.js-пакета
155
+
156
+ Выбор Bun-only даёт единый runtime и доступ к `bun:sqlite`, `Bun.connect`, `Bun.zstdDecompress`,
157
+ `Bun.file` и встроенному WebSocket. Цена этого решения — пакет нельзя исполнять в Node.js, Deno,
158
+ Cloudflare Workers и большинстве serverless-платформ без Bun; Node-специфичные тестовые инструменты и
159
+ APM-интеграции также не гарантируются. Скомпилированный `dist` всё равно имеет target `bun`.
160
+
161
+ ## Статус совместимости
162
+
163
+ Базовая линия: PyMax 2.3.1, commit `8c40b71`. Детали зафиксированы в [UPSTREAM.md](./UPSTREAM.md).
164
+ Публичный API сделан идиоматичным для TypeScript: `camelCase`, `bigint`, именованные методы событий и
165
+ явные providers для интерактивной аутентификации.
166
+
167
+ Лицензия: MIT. Проект содержит самостоятельную TypeScript-реализацию протокола и сохраняет
168
+ атрибуцию исходному PyMax.
package/UPSTREAM.md ADDED
@@ -0,0 +1,10 @@
1
+ # Upstream
2
+
3
+ `tsmax` is a TypeScript/Bun port of [MaxApiTeam/PyMax](https://github.com/MaxApiTeam/PyMax).
4
+
5
+ - Compatibility baseline: PyMax 2.3.1
6
+ - Git commit: `8c40b71`
7
+ - Upstream license: MIT
8
+
9
+ The local `PyMax/` checkout is used only as a development reference and is not included in the
10
+ published package.
@@ -0,0 +1,24 @@
1
+ import type { Photo } from "../files/index.ts";
2
+ import { type MaxId } from "../types/index.ts";
3
+ import type { ApiRuntime } from "./runtime.ts";
4
+ import type { UploadApi } from "./uploads.ts";
5
+ export declare class AccountApi {
6
+ private readonly app;
7
+ private readonly uploads;
8
+ constructor(app: ApiRuntime, uploads: UploadApi);
9
+ requestProfilePhotoUploadUrl(): Promise<string>;
10
+ changeProfile(options: {
11
+ firstName: string;
12
+ lastName?: string | null;
13
+ description?: string | null;
14
+ photo?: Photo | null;
15
+ photoToken?: string | null;
16
+ }): Promise<boolean>;
17
+ createFolder(title: string, chatInclude: MaxId[], filters?: unknown[]): Promise<Record<string, unknown>>;
18
+ getFolders(folderSync?: number): Promise<Record<string, unknown>>;
19
+ updateFolder(folderId: string, title: string, chatInclude?: MaxId[], filters?: unknown[], options?: unknown[]): Promise<Record<string, unknown>>;
20
+ deleteFolder(folderId: string): Promise<Record<string, unknown>>;
21
+ closeAllSessions(): Promise<boolean>;
22
+ logout(): Promise<boolean>;
23
+ }
24
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/api/account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,qBAAa,UAAU;IAEnB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,SAAS;IAG/B,4BAA4B,IAAI,OAAO,CAAC,MAAM,CAAC;IAM/C,aAAa,CAAC,OAAO,EAAE;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBd,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,KAAK,EAAE,EACpB,OAAO,GAAE,OAAO,EAAO,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAU7B,UAAU,CAAC,UAAU,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAG5D,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,WAAW,GAAE,KAAK,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO,EACvB,OAAO,GAAE,OAAO,EAAO,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAW7B,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGhE,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IASpC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAIjC"}
@@ -0,0 +1,57 @@
1
+ import { Chat, Message, Profile, User } from "../types/index.ts";
2
+ import type { ApiRuntime } from "./runtime.ts";
3
+ export interface PasswordChallenge {
4
+ trackId: string;
5
+ hint: string | null;
6
+ }
7
+ export interface CodeResult {
8
+ loginToken: string | null;
9
+ registerToken: string | null;
10
+ passwordChallenge: PasswordChallenge | null;
11
+ }
12
+ export interface QrRequest {
13
+ expiresAt: number;
14
+ pollingInterval: number;
15
+ qrLink: string;
16
+ trackId: string;
17
+ ttl: number;
18
+ }
19
+ export interface LoginResult {
20
+ chats: Chat[];
21
+ profile: Profile;
22
+ messages: Map<bigint, Message[]>;
23
+ contacts: Array<User | null>;
24
+ token: string | null;
25
+ time: number | null;
26
+ configHash: string | number | null;
27
+ }
28
+ export declare class AuthApi {
29
+ private readonly app;
30
+ constructor(app: ApiRuntime);
31
+ requestCode(phone: string): Promise<Record<string, unknown>>;
32
+ sendCode(token: string, verifyCode: string): Promise<CodeResult>;
33
+ checkPassword(trackId: string, password: string): Promise<CodeResult & {
34
+ error: string | null;
35
+ }>;
36
+ requestQr(): Promise<QrRequest>;
37
+ checkQr(trackId: string): Promise<{
38
+ expiresAt: number;
39
+ loginAvailable: boolean;
40
+ }>;
41
+ confirmQr(trackId: string): Promise<CodeResult>;
42
+ confirmRegistration(firstName: string, lastName: string | null, token: string): Promise<string>;
43
+ handshake(deviceId: string): Promise<void>;
44
+ login(): Promise<LoginResult>;
45
+ createTrack(): Promise<string>;
46
+ setTwoFactor(options: {
47
+ password: string;
48
+ hint?: string;
49
+ email?: string;
50
+ emailCodeProvider?: (email: string) => string | Promise<string>;
51
+ }): Promise<boolean>;
52
+ removeTwoFactor(password: string): Promise<boolean>;
53
+ changePassword(oldPassword: string, newPassword: string): Promise<boolean>;
54
+ authorizeQrLogin(qrLink: string): Promise<boolean>;
55
+ checkTwoFactor(): Promise<boolean>;
56
+ }
57
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/api/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { MaxId } from "../types/index.ts";
2
+ import type { ApiRuntime } from "./runtime.ts";
3
+ export declare class BotsApi {
4
+ private readonly app;
5
+ constructor(app: ApiRuntime);
6
+ getBotInitData(botId: MaxId, chatId?: MaxId | null, startParam?: string | null): Promise<Record<string, unknown>>;
7
+ }
8
+ //# sourceMappingURL=bots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bots.d.ts","sourceRoot":"","sources":["../../src/api/bots.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU;IACtC,cAAc,CAClB,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI,EACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CASpC"}
@@ -0,0 +1,41 @@
1
+ import { Chat, Message, type ChatActions, type MaxId } from "../types/index.ts";
2
+ import type { ApiRuntime } from "./runtime.ts";
3
+ export interface GroupSettings {
4
+ allCanPinMessage?: boolean | null;
5
+ onlyOwnerCanChangeIconTitle?: boolean | null;
6
+ onlyAdminCanAddMember?: boolean | null;
7
+ onlyAdminCanCall?: boolean | null;
8
+ membersCanSeePrivateLink?: boolean | null;
9
+ }
10
+ export declare class ChatApi implements ChatActions {
11
+ private readonly app;
12
+ private readonly cache;
13
+ constructor(app: ApiRuntime);
14
+ seed(chats: Chat[]): void;
15
+ createGroup(name: string, participantIds?: MaxId[], notify?: boolean): Promise<[Chat, Message] | null>;
16
+ inviteUsersToGroup(chatId: MaxId, userIds: MaxId[], showHistory?: boolean): Promise<Chat | null>;
17
+ inviteUsersToChannel(chatId: MaxId, userIds: MaxId[], showHistory?: boolean): Promise<Chat | null>;
18
+ removeUsersFromGroup(chatId: MaxId, userIds: MaxId[], cleanMsgPeriod?: number): Promise<Chat | null>;
19
+ changeGroupSettings(chatId: MaxId, settings: GroupSettings): Promise<void>;
20
+ changeGroupProfile(chatId: MaxId, name: string | null, description?: string | null): Promise<void>;
21
+ joinGroup(link: string): Promise<Chat>;
22
+ joinChannel(link: string): Promise<Chat>;
23
+ resolveGroupByLink(link: string): Promise<Chat | null>;
24
+ reworkInviteLink(chatId: MaxId): Promise<Chat>;
25
+ getChats(chatIds: MaxId[]): Promise<Chat[]>;
26
+ getChat(chatId: MaxId): Promise<Chat>;
27
+ fetchChats(marker?: number): Promise<Chat[]>;
28
+ leaveGroup(chatId: MaxId): Promise<void>;
29
+ leaveChannel(chatId: MaxId): Promise<void>;
30
+ deleteChat(chatId: MaxId, forMe?: boolean, lastEventTime?: number): Promise<boolean>;
31
+ getJoinRequests(chatId: MaxId, count?: number): Promise<Record<string, unknown>[]>;
32
+ confirmJoinRequests(chatId: MaxId, userIds: MaxId[], showHistory?: boolean): Promise<Chat | null>;
33
+ confirmJoinRequest(chatId: MaxId, userId: MaxId, showHistory?: boolean): Promise<Chat | null>;
34
+ declineJoinRequests(chatId: MaxId, userIds: MaxId[]): Promise<Chat | null>;
35
+ declineJoinRequest(chatId: MaxId, userId: MaxId): Promise<Chat | null>;
36
+ private join;
37
+ private memberAction;
38
+ private optionalChat;
39
+ private cacheChat;
40
+ }
41
+ //# sourceMappingURL=chats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/api/chats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { AccountApi } from "./account.ts";
2
+ import { AuthApi } from "./auth.ts";
3
+ import { BotsApi } from "./bots.ts";
4
+ import { ChatApi } from "./chats.ts";
5
+ import { MessageApi } from "./messages.ts";
6
+ import type { ApiRuntime } from "./runtime.ts";
7
+ import { UploadApi } from "./uploads.ts";
8
+ import { UserApi } from "./users.ts";
9
+ export declare class ApiFacade {
10
+ readonly auth: AuthApi;
11
+ readonly uploads: UploadApi;
12
+ readonly messages: MessageApi;
13
+ readonly chats: ChatApi;
14
+ readonly users: UserApi;
15
+ readonly account: AccountApi;
16
+ readonly bots: BotsApi;
17
+ constructor(app: ApiRuntime);
18
+ }
19
+ //# sourceMappingURL=facade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/api/facade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,qBAAa,SAAS;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,GAAG,EAAE,UAAU;CAS5B"}
@@ -0,0 +1,10 @@
1
+ export * from "./account.ts";
2
+ export * from "./auth.ts";
3
+ export * from "./bots.ts";
4
+ export * from "./chats.ts";
5
+ export * from "./facade.ts";
6
+ export * from "./messages.ts";
7
+ export * from "./runtime.ts";
8
+ export * from "./uploads.ts";
9
+ export * from "./users.ts";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { Message, type EditMessageOptions, type ForwardMessageOptions, type HistoryOptions, type MaxId, type MessageActions, type ReactionInfo, type ReadState, type SendMessageOptions } from "../types/index.ts";
2
+ import type { ApiRuntime } from "./runtime.ts";
3
+ import type { UploadApi } from "./uploads.ts";
4
+ export declare class MessageApi implements MessageActions {
5
+ private readonly app;
6
+ private readonly uploads;
7
+ private previousCid;
8
+ constructor(app: ApiRuntime, uploads: UploadApi);
9
+ sendMessage(options: SendMessageOptions): Promise<Message | null>;
10
+ forwardMessage(options: ForwardMessageOptions): Promise<Message | null>;
11
+ getMessages(chatId: MaxId, messageIds: MaxId[]): Promise<Message[]>;
12
+ getMessage(chatId: MaxId, messageId: MaxId): Promise<Message | null>;
13
+ editMessage(options: EditMessageOptions): Promise<Message>;
14
+ fetchHistory(options: HistoryOptions): Promise<Message[] | null>;
15
+ deleteMessage(options: {
16
+ chatId: MaxId;
17
+ messageIds: MaxId[];
18
+ forMe: boolean;
19
+ }): Promise<boolean>;
20
+ pinMessage(options: {
21
+ chatId: MaxId;
22
+ messageId: MaxId;
23
+ notifyPin: boolean;
24
+ }): Promise<boolean>;
25
+ readMessage(messageId: MaxId, chatId: MaxId): Promise<ReadState>;
26
+ addReaction(chatId: MaxId, messageId: MaxId, reaction: string): Promise<ReactionInfo | null>;
27
+ removeReaction(chatId: MaxId, messageId: MaxId): Promise<ReactionInfo | null>;
28
+ getReactions(chatId: MaxId, messageIds: MaxId[]): Promise<Map<MaxId, ReactionInfo> | null>;
29
+ getVideoById(chatId: MaxId, messageId: MaxId, videoId: number): Promise<Record<string, unknown> | null>;
30
+ getFileById(chatId: MaxId, messageId: MaxId, fileId: number): Promise<Record<string, unknown> | null>;
31
+ private nextCid;
32
+ private uploadAttachments;
33
+ private parseMessage;
34
+ }
35
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/api/messages.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,OAAO,EAKP,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,cAAc,CAAC;AAElE,qBAAa,UAAW,YAAW,cAAc;IAI7C,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,WAAW,CAAc;gBAGd,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,SAAS;IAG/B,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAoBjE,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiBvE,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IASnE,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAIpE,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB1D,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;IAmBhE,aAAa,CAAC,OAAO,EAAE;QAC3B,MAAM,EAAE,KAAK,CAAC;QACd,UAAU,EAAE,KAAK,EAAE,CAAC;QACpB,KAAK,EAAE,OAAO,CAAC;KAChB,GAAG,OAAO,CAAC,OAAO,CAAC;IAKd,UAAU,CAAC,OAAO,EAAE;QACxB,MAAM,EAAE,KAAK,CAAC;QACd,SAAS,EAAE,KAAK,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC;KACpB,GAAG,OAAO,CAAC,OAAO,CAAC;IASd,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;IAUhE,WAAW,CACf,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,KAAK,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IASzB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQ7E,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC;IAe1F,YAAY,CAChB,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,KAAK,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IASpC,WAAW,CACf,MAAM,EAAE,KAAK,EACb,SAAS,EAAE,KAAK,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAS1C,OAAO,CAAC,OAAO;YAMD,iBAAiB;IAQ/B,OAAO,CAAC,YAAY;CAMrB"}
@@ -0,0 +1,7 @@
1
+ import type { InboundFrame } from "../protocol/index.ts";
2
+ export declare function payload(frame: InboundFrame): Record<string, unknown>;
3
+ export declare function payloadItem(frame: InboundFrame, key: string): unknown;
4
+ export declare function requiredItem(frame: InboundFrame, key: string): unknown;
5
+ export declare function recordItem(frame: InboundFrame, key?: string): Record<string, unknown>;
6
+ export declare function listItem(frame: InboundFrame, key: string): unknown[];
7
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/api/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEpE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAItE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAErF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAEpE"}
@@ -0,0 +1,19 @@
1
+ import type { ResolvedConfig } from "../config.ts";
2
+ import type { InboundFrame } from "../protocol/index.ts";
3
+ import type { SessionInfo, SessionStore } from "../session/index.ts";
4
+ import type { Chat, Message, Profile, User } from "../types/index.ts";
5
+ export interface ApiRuntime {
6
+ readonly config: ResolvedConfig;
7
+ readonly store: SessionStore;
8
+ session: SessionInfo | null;
9
+ me: Profile | null;
10
+ invoke(opcode: number, payload?: Record<string, unknown>, timeout?: number): Promise<InboundFrame>;
11
+ bindMessage(message: Message): Message;
12
+ bindChat(chat: Chat): Chat;
13
+ bindUser(user: User): User;
14
+ createAttachmentWaiter?(field: "fileId" | "videoId", id: number, timeoutSeconds?: number): {
15
+ promise: Promise<void>;
16
+ cancel(): void;
17
+ };
18
+ }
19
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAAC;IACzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,sBAAsB,CAAC,CACrB,KAAK,EAAE,QAAQ,GAAG,SAAS,EAC3B,EAAE,EAAE,MAAM,EACV,cAAc,CAAC,EAAE,MAAM,GACtB;QACD,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,IAAI,IAAI,CAAC;KAChB,CAAC;CACH"}
@@ -0,0 +1,23 @@
1
+ import { File, Photo, Video, type SendAttachment } from "../files/index.ts";
2
+ import type { ApiRuntime } from "./runtime.ts";
3
+ export type UploadedAttachment = {
4
+ _type: "PHOTO";
5
+ photoToken: string;
6
+ } | {
7
+ _type: "VIDEO";
8
+ videoId: number;
9
+ token: string;
10
+ } | {
11
+ _type: "FILE";
12
+ fileId: number;
13
+ };
14
+ export declare class UploadApi {
15
+ private readonly app;
16
+ constructor(app: ApiRuntime);
17
+ upload(attachment: SendAttachment): Promise<UploadedAttachment>;
18
+ uploadPhoto(photo: Photo, profile?: boolean): Promise<UploadedAttachment>;
19
+ uploadVideo(video: Video): Promise<UploadedAttachment>;
20
+ uploadFile(file: File): Promise<UploadedAttachment>;
21
+ private postBinary;
22
+ }
23
+ //# sourceMappingURL=uploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/api/uploads.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAI5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAC1B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU;IAEtC,MAAM,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAO/D,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,UAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuBvE,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiBtD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAgB3C,UAAU;CAYzB"}
@@ -0,0 +1,25 @@
1
+ import { User, type MaxId, type UserActions } from "../types/index.ts";
2
+ import type { ApiRuntime } from "./runtime.ts";
3
+ export interface ContactInfo {
4
+ phone: string;
5
+ firstName: string;
6
+ lastName?: string | null;
7
+ }
8
+ export declare class UserApi implements UserActions {
9
+ private readonly app;
10
+ private readonly cache;
11
+ constructor(app: ApiRuntime);
12
+ seed(users: Array<User | null>): void;
13
+ getCachedUser(userId: MaxId): User | null;
14
+ getUsers(userIds: MaxId[]): Promise<User[]>;
15
+ getUser(userId: MaxId): Promise<User | null>;
16
+ fetchUsers(userIds: MaxId[]): Promise<User[]>;
17
+ searchByPhone(phone: string): Promise<User>;
18
+ getSessions(): Promise<Record<string, unknown>[]>;
19
+ addContact(contactId: MaxId): Promise<User>;
20
+ removeContact(contactId: MaxId): Promise<boolean>;
21
+ importContacts(contacts: ContactInfo[]): Promise<User[]>;
22
+ getChatId(firstUserId: MaxId, secondUserId: MaxId): MaxId;
23
+ private cacheUser;
24
+ }
25
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/api/users.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAY,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,OAAQ,YAAW,WAAW;IAE7B,OAAO,CAAC,QAAQ,CAAC,GAAG;IADhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBACnB,GAAG,EAAE,UAAU;IAE5C,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI;IAGrC,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI;IAGnC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAM3C,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAG5C,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAI7C,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAKjD,UAAU,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,aAAa,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAO9D,SAAS,CAAC,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,GAAG,KAAK;IAGzD,OAAO,CAAC,SAAS;CAKlB"}
package/dist/app.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import { ApiFacade, type ApiRuntime } from "./api/index.ts";
2
+ import type { AuthFlow } from "./auth/index.ts";
3
+ import type { ResolvedConfig } from "./config.ts";
4
+ import { Dispatcher, type Router } from "./dispatch/index.ts";
5
+ import { type InboundFrame, type OutboundFrame } from "./protocol/index.ts";
6
+ import { type SessionInfo, type SessionStore } from "./session/index.ts";
7
+ import { TelemetryService } from "./telemetry/index.ts";
8
+ import type { Chat, ChatActions, Message, MessageActions, Profile, User, UserActions } from "./types/index.ts";
9
+ export interface ConnectionContract {
10
+ readonly protocol: {
11
+ readonly version: number;
12
+ };
13
+ readonly isOpen?: boolean;
14
+ onEvent: ((frame: InboundFrame) => void | Promise<void>) | null;
15
+ onClose: ((error: Error | null) => void) | null;
16
+ open(): Promise<void>;
17
+ close(): Promise<void>;
18
+ request(frame: OutboundFrame, timeoutSeconds?: number): Promise<InboundFrame>;
19
+ waitClosed(): Promise<void>;
20
+ nextSequence(): number;
21
+ }
22
+ export declare class App<Client extends MessageActions & ChatActions & UserActions> implements ApiRuntime {
23
+ readonly connection: ConnectionContract;
24
+ readonly config: ResolvedConfig;
25
+ readonly authFlow: AuthFlow;
26
+ readonly dispatcher: Dispatcher<Client>;
27
+ readonly api: ApiFacade;
28
+ readonly telemetry: TelemetryService;
29
+ readonly store: SessionStore;
30
+ session: SessionInfo | null;
31
+ me: Profile | null;
32
+ chats: Chat[];
33
+ contacts: Array<User | null>;
34
+ messages: Map<bigint, Message[]>;
35
+ started: boolean;
36
+ private pingController;
37
+ private readonly attachmentWaiters;
38
+ constructor(connection: ConnectionContract, config: ResolvedConfig, authFlow: AuthFlow, rootRouter: Router<Client>);
39
+ bindClient(client: Client): void;
40
+ start(): Promise<void>;
41
+ close(): Promise<void>;
42
+ invoke(opcode: number, payload?: Record<string, unknown>, timeout?: number): Promise<InboundFrame>;
43
+ bindMessage(message: Message): Message;
44
+ bindChat(chat: Chat): Chat;
45
+ bindUser(user: User): User;
46
+ createAttachmentWaiter(field: "fileId" | "videoId", id: number, timeoutSeconds?: number): {
47
+ promise: Promise<void>;
48
+ cancel(): void;
49
+ };
50
+ private startPing;
51
+ private pingLoop;
52
+ private connectionLost;
53
+ private resolveAttachmentWaiters;
54
+ }
55
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ApiFacade } from "../api/index.ts";
2
+ import type { ResolvedConfig } from "../config.ts";
3
+ import { type PasswordProvider, type QrHandler, type SmsCodeProvider } from "./providers.ts";
4
+ export interface AuthResult {
5
+ token: string | null;
6
+ }
7
+ export interface AuthRuntime {
8
+ readonly api: ApiFacade;
9
+ readonly config: ResolvedConfig;
10
+ }
11
+ export interface AuthFlow {
12
+ authenticate(app: AuthRuntime): Promise<AuthResult>;
13
+ }
14
+ export declare class SmsAuthFlow implements AuthFlow {
15
+ readonly codeProvider: SmsCodeProvider;
16
+ readonly passwordProvider: PasswordProvider;
17
+ constructor(codeProvider?: SmsCodeProvider, passwordProvider?: PasswordProvider);
18
+ authenticate(app: AuthRuntime): Promise<AuthResult>;
19
+ private passwordLogin;
20
+ }
21
+ export declare class QrAuthFlow implements AuthFlow {
22
+ readonly qrHandler: QrHandler;
23
+ readonly passwordProvider: PasswordProvider;
24
+ constructor(qrHandler?: QrHandler, passwordProvider?: PasswordProvider);
25
+ authenticate(app: AuthRuntime): Promise<AuthResult>;
26
+ }
27
+ //# sourceMappingURL=flows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flows.d.ts","sourceRoot":"","sources":["../../src/auth/flows.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrD;AAED,qBAAa,WAAY,YAAW,QAAQ;IAExC,QAAQ,CAAC,YAAY,EAAE,eAAe;IACtC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;gBADlC,YAAY,GAAE,eAAwC,EACtD,gBAAgB,GAAE,gBAA0C;IAGjE,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YA+B3C,aAAa;CAU5B;AAED,qBAAa,UAAW,YAAW,QAAQ;IAEvC,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB;gBADlC,SAAS,GAAE,SAA4B,EACvC,gBAAgB,GAAE,gBAA0C;IAGjE,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;CAuB1D"}