max-account-api 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.
@@ -0,0 +1,456 @@
1
+ /**
2
+ * MAX protocol opcode catalogue.
3
+ *
4
+ * Source: extracted from decompiled `ru.oneme.app` (v26.15.1, build 6690) —
5
+ * specifically the `exc` enum class. Numbers + canonical names match the
6
+ * Android client's source-of-truth; the wire protocol uses the same numbers
7
+ * over WS (`ws-api.oneme.ru/websocket`, JSON frames) and TLS
8
+ * (`api.oneme.ru:443`, msgpack-+-LZ4 binary frames).
9
+ *
10
+ * **Transport overlap:**
11
+ * - **shared** ops (work on both transports): everything except auth/QR
12
+ * specifics. E.g. op 64 (MSG_SEND), op 49 (CHAT_HISTORY), op 128
13
+ * (NOTIF_MESSAGE), …
14
+ * - **mobile-only** (binary): 17 (AUTH_REQUEST), 18 (AUTH), 115
15
+ * (AUTH_LOGIN_CHECK_PASSWORD), 290 (AUTH_QR_APPROVE) — phone-auth +
16
+ * headless QR confirm.
17
+ * - **web-only** (WS): 288, 289, 291 — QR-code generation/poll/claim for a
18
+ * web device (the mobile enum doesn't include them; web client owns the
19
+ * QR side).
20
+ *
21
+ * **Backward compatibility:** every name that used to exist in this file is
22
+ * kept as an alias to the same number — no breaking changes. New canonical
23
+ * names from the decompilation are added alongside.
24
+ */
25
+ export const Opcode = {
26
+ // ───────── infra ─────────
27
+ PING: 1,
28
+ DEBUG: 2,
29
+ RECONNECT: 3,
30
+ LOG: 5,
31
+ /** Alias of {@link Opcode.LOG}. */
32
+ EVENT_LOG: 5,
33
+ // ───────── session / auth ─────────
34
+ SESSION_INIT: 6,
35
+ /** Alias of {@link Opcode.SESSION_INIT}. */
36
+ HELLO: 6,
37
+ PROFILE: 16,
38
+ /** Alias of {@link Opcode.PROFILE}. */
39
+ PROFILE_UPDATE: 16,
40
+ /**
41
+ * Mobile phone-auth START (op 17). Body prefix: `f0 15` (START_AUTH) or
42
+ * `f0 11` (RESEND). Returns short-lived `{token}` for op 18.
43
+ */
44
+ AUTH_REQUEST: 17,
45
+ /** Alias of {@link Opcode.AUTH_REQUEST}. */
46
+ PHONE_AUTH_START: 17,
47
+ /**
48
+ * Mobile phone-auth verify (op 18). Body prefix: `f0 ad`. Returns LOGIN
49
+ * token or `passwordChallenge` for 2FA.
50
+ */
51
+ AUTH: 18,
52
+ /** Alias of {@link Opcode.AUTH}. */
53
+ PHONE_AUTH_VERIFY: 18,
54
+ LOGIN: 19,
55
+ LOGOUT: 20,
56
+ SYNC: 21,
57
+ CONFIG: 22,
58
+ /** Alias of {@link Opcode.CONFIG}. */
59
+ SETTINGS: 22,
60
+ AUTH_CONFIRM: 23,
61
+ AUTH_LOGIN_RESTORE_PASSWORD: 101,
62
+ AUTH_2FA_DETAILS: 104,
63
+ /** Alias of {@link Opcode.AUTH_2FA_DETAILS}. */
64
+ AUTH_PASSWORD_INFO: 104,
65
+ AUTH_VALIDATE_PASSWORD: 107,
66
+ /** Alias of {@link Opcode.AUTH_VALIDATE_PASSWORD}. */
67
+ AUTH_PASSWORD_VALIDATE: 107,
68
+ AUTH_VALIDATE_HINT: 108,
69
+ /** Alias of {@link Opcode.AUTH_VALIDATE_HINT}. */
70
+ AUTH_PASSWORD_HINT: 108,
71
+ AUTH_VERIFY_EMAIL: 109,
72
+ /** Alias of {@link Opcode.AUTH_VERIFY_EMAIL}. */
73
+ AUTH_EMAIL_SEND_CODE: 109,
74
+ AUTH_CHECK_EMAIL: 110,
75
+ /** Alias of {@link Opcode.AUTH_CHECK_EMAIL}. */
76
+ AUTH_EMAIL_VERIFY_CODE: 110,
77
+ AUTH_SET_2FA: 111,
78
+ /** Alias of {@link Opcode.AUTH_SET_2FA}. */
79
+ AUTH_PASSWORD_COMMIT: 111,
80
+ AUTH_CREATE_TRACK: 112,
81
+ /** Alias of {@link Opcode.AUTH_CREATE_TRACK}. */
82
+ AUTH_TRACK_START: 112,
83
+ AUTH_CHECK_PASSWORD: 113,
84
+ /** Alias of {@link Opcode.AUTH_CHECK_PASSWORD}. */
85
+ AUTH_PASSWORD_VERIFY: 113,
86
+ /**
87
+ * Op 115: submit a 2FA cloud password (mobile binary uses prefix `f0 33`,
88
+ * flags=1). On mobile: completes phone-auth verifyCode → LOGIN token.
89
+ * On web: completes QR-claim → LOGIN token. Same op, both paths.
90
+ */
91
+ AUTH_LOGIN_CHECK_PASSWORD: 115,
92
+ /** Alias of {@link Opcode.AUTH_LOGIN_CHECK_PASSWORD}. */
93
+ AUTH_QR_PASSWORD_LOGIN: 115,
94
+ AUTH_LOGIN_PROFILE_DELETE: 116,
95
+ /**
96
+ * Op 290: **mobile** confirms a web-side QR-login (body `{qrLink}`, prefix
97
+ * `f0 34`, flags=1). The web client's op 289 long-poll flips to
98
+ * `loginAvailable:true` after this lands.
99
+ */
100
+ AUTH_QR_APPROVE: 290,
101
+ /** Alias of {@link Opcode.AUTH_QR_APPROVE}. */
102
+ QR_CONFIRM: 290,
103
+ // ───────── assets (stickers / emoji / animoji) ─────────
104
+ PRESET_AVATARS: 25,
105
+ ASSETS_GET: 26,
106
+ /** Alias of {@link Opcode.ASSETS_GET}. */
107
+ STICKER_LIST: 26,
108
+ ASSETS_UPDATE: 27,
109
+ /** Alias of {@link Opcode.ASSETS_UPDATE}. */
110
+ STICKER_SYNC: 27,
111
+ ASSETS_GET_BY_IDS: 28,
112
+ /**
113
+ * @deprecated Mis-named alias of {@link Opcode.ASSETS_GET_BY_IDS} (op 28).
114
+ * The canonical "contact info" op is **32** ({@link Opcode.CONTACT_INFO}).
115
+ * Old name kept only so existing imports continue to compile; do not use
116
+ * for new code.
117
+ */
118
+ CONTACT_INFO_LEGACY_28: 28,
119
+ ASSETS_ADD: 29,
120
+ /** Alias of {@link Opcode.ASSETS_ADD}. */
121
+ STICKER_PACK_ACTION: 29,
122
+ ASSETS_REMOVE: 259,
123
+ ASSETS_MOVE: 260,
124
+ ASSETS_LIST_MODIFY: 261,
125
+ // ───────── contacts ─────────
126
+ CONTACT_INFO: 32,
127
+ /** Alias of {@link Opcode.CONTACT_INFO}. */
128
+ CONTACTS_GET: 32,
129
+ CONTACT_ADD: 33,
130
+ CONTACT_UPDATE: 34,
131
+ /**
132
+ * @deprecated Mis-named alias of {@link Opcode.CONTACT_UPDATE} (op 34).
133
+ * `CONTACT_ACTION` is the historic name used by helpers like
134
+ * `contactAction(...)`; the canonical name is {@link Opcode.CONTACT_UPDATE}.
135
+ */
136
+ CONTACT_ACTION: 34,
137
+ CONTACT_PRESENCE: 35,
138
+ /** Alias of {@link Opcode.CONTACT_PRESENCE}. */
139
+ PRESENCE_GET: 35,
140
+ CONTACT_LIST: 36,
141
+ /** Alias of {@link Opcode.CONTACT_LIST}. */
142
+ CONTACTS_LIST_BY_STATUS: 36,
143
+ CONTACT_SEARCH: 37,
144
+ CONTACT_MUTUAL: 38,
145
+ CONTACT_PHOTOS: 39,
146
+ CONTACT_SORT: 40,
147
+ CONTACT_ADD_BY_PHONE: 41,
148
+ CONTACT_VERIFY: 42,
149
+ REMOVE_CONTACT_PHOTO: 43,
150
+ CONTACT_INFO_BY_PHONE: 46,
151
+ /** Alias of {@link Opcode.CONTACT_INFO_BY_PHONE}. */
152
+ CONTACT_LOOKUP_BY_PHONE: 46,
153
+ // ───────── chats ─────────
154
+ CHAT_INFO: 48,
155
+ /** Alias of {@link Opcode.CHAT_INFO}. */
156
+ CHATS_GET: 48,
157
+ CHAT_HISTORY: 49,
158
+ /** Alias of {@link Opcode.CHAT_HISTORY}. */
159
+ HISTORY_GET: 49,
160
+ CHAT_MARK: 50,
161
+ /** Alias of {@link Opcode.CHAT_MARK}. */
162
+ CHAT_EVENT: 50,
163
+ CHAT_MEDIA: 51,
164
+ /** Alias of {@link Opcode.CHAT_MEDIA}. */
165
+ HISTORY_BY_ATTACH: 51,
166
+ /**
167
+ * Op 52: fully delete the chat (removes it from the list). Use op 54
168
+ * ({@link Opcode.CHAT_CLEAR}) for clear-history-only.
169
+ */
170
+ CHAT_DELETE: 52,
171
+ CHATS_LIST: 53,
172
+ /** Alias of {@link Opcode.CHATS_LIST}. */
173
+ CHATS_SYNC: 53,
174
+ /**
175
+ * Op 54: clear history of a chat without removing it. The pre-decompile
176
+ * version of this file had op 52 and 54 SWAPPED. Use {@link Opcode.CHAT_DELETE}
177
+ * (op 52) for full delete.
178
+ */
179
+ CHAT_CLEAR: 54,
180
+ CHAT_UPDATE: 55,
181
+ /** Alias of {@link Opcode.CHAT_UPDATE}. */
182
+ CHAT_SETTINGS: 55,
183
+ /** Op 56: resolve a public link without joining. */
184
+ CHAT_CHECK_LINK: 56,
185
+ /** Op 57: actually join a chat (after CHECK_LINK). */
186
+ CHAT_JOIN: 57,
187
+ /**
188
+ * @deprecated Misleading alias: the pre-decompile name `CHAT_RESOLVE_LINK`
189
+ * (op 57) actually performs **CHAT_JOIN**. Use {@link Opcode.CHAT_CHECK_LINK}
190
+ * (op 56) if you only want to resolve.
191
+ */
192
+ CHAT_RESOLVE_LINK: 57,
193
+ CHAT_LEAVE: 58,
194
+ CHAT_MEMBERS: 59,
195
+ /** Alias of {@link Opcode.CHAT_MEMBERS}. */
196
+ MEMBERS_LIST: 59,
197
+ PUBLIC_SEARCH: 60,
198
+ /** Alias of {@link Opcode.PUBLIC_SEARCH}. */
199
+ GLOBAL_SEARCH_BY_TYPE: 60,
200
+ CHAT_PERSONAL_CONFIG: 61,
201
+ CHAT_LIVESTREAM_INFO: 62,
202
+ CHAT_CREATE: 63,
203
+ CHAT_SEARCH: 68,
204
+ /** Alias of {@link Opcode.CHAT_SEARCH}. */
205
+ GLOBAL_SEARCH: 68,
206
+ MSG_SEARCH_TOUCH: 72,
207
+ /**
208
+ * @deprecated Misleading alias: op 72 is `MSG_SEARCH_TOUCH` (focus the
209
+ * chat for search), not "open chat". Renamed for accuracy.
210
+ */
211
+ CHAT_OPEN: 72,
212
+ MSG_SEARCH: 73,
213
+ /** Alias of {@link Opcode.MSG_SEARCH}. */
214
+ MESSAGE_SEARCH: 73,
215
+ MSG_GET_STAT: 74,
216
+ /** Alias of {@link Opcode.MSG_GET_STAT}. */
217
+ MESSAGE_STATS: 74,
218
+ CHAT_SUBSCRIBE: 75,
219
+ CHAT_MEMBERS_UPDATE: 77,
220
+ /** Alias of {@link Opcode.CHAT_MEMBERS_UPDATE}. */
221
+ GROUP_PARTICIPANTS: 77,
222
+ CHAT_PIN_SET_VISIBILITY: 86,
223
+ CHAT_COMPLAIN: 117,
224
+ CHAT_HIDE: 196,
225
+ CHAT_SEARCH_COMMON_PARTICIPANTS: 198,
226
+ /** Alias of {@link Opcode.CHAT_SEARCH_COMMON_PARTICIPANTS}. */
227
+ COMMON_CHATS: 198,
228
+ CHAT_SUGGEST: 300,
229
+ // ───────── messages ─────────
230
+ MSG_SEND: 64,
231
+ /** Alias of {@link Opcode.MSG_SEND}. */
232
+ SEND_MESSAGE: 64,
233
+ MSG_TYPING: 65,
234
+ /** Alias of {@link Opcode.MSG_TYPING}. */
235
+ TYPING: 65,
236
+ MSG_DELETE: 66,
237
+ /** Alias of {@link Opcode.MSG_DELETE}. */
238
+ DELETE_MESSAGES: 66,
239
+ MSG_EDIT: 67,
240
+ /** Alias of {@link Opcode.MSG_EDIT}. */
241
+ EDIT_MESSAGE: 67,
242
+ MSG_SHARE_PREVIEW: 70,
243
+ /** Alias of {@link Opcode.MSG_SHARE_PREVIEW}. */
244
+ LINK_PREVIEW: 70,
245
+ MSG_GET: 71,
246
+ MSG_DELETE_RANGE: 92,
247
+ MSG_SEND_CALLBACK: 118,
248
+ MSG_REACTION: 178,
249
+ /** Alias of {@link Opcode.MSG_REACTION}. */
250
+ REACTION_SET: 178,
251
+ MSG_CANCEL_REACTION: 179,
252
+ /** Alias of {@link Opcode.MSG_CANCEL_REACTION}. */
253
+ REACTION_REMOVE: 179,
254
+ MSG_GET_REACTIONS: 180,
255
+ /** Alias of {@link Opcode.MSG_GET_REACTIONS}. */
256
+ REACTIONS_GET: 180,
257
+ MSG_GET_DETAILED_REACTIONS: 181,
258
+ /** Alias of {@link Opcode.MSG_GET_DETAILED_REACTIONS}. */
259
+ REACTIONS_LIST: 181,
260
+ MSG_DELIVERY: 303,
261
+ // ───────── video calls (rtc signalling) ─────────
262
+ VIDEO_CHAT_START: 76,
263
+ VIDEO_CHAT_START_ACTIVE: 78,
264
+ /**
265
+ * @deprecated Op 78 is canonically `VIDEO_CHAT_START_ACTIVE`. The historic
266
+ * `CALL_START` alias points at it for back-compat.
267
+ */
268
+ CALL_START: 78,
269
+ VIDEO_CHAT_HISTORY: 79,
270
+ /** Alias of {@link Opcode.VIDEO_CHAT_HISTORY}. */
271
+ CALL_HISTORY: 79,
272
+ VIDEO_CHAT_CREATE_JOIN_LINK: 84,
273
+ VIDEO_CHAT_JOIN: 166,
274
+ VIDEO_CHAT_MEMBERS: 195,
275
+ GET_INBOUND_CALLS: 103,
276
+ EXTERNAL_CALLBACK: 105,
277
+ // ───────── media uploads ─────────
278
+ PHOTO_UPLOAD: 80,
279
+ /** Alias of {@link Opcode.PHOTO_UPLOAD}. */
280
+ PHOTO_UPLOAD_URL: 80,
281
+ STICKER_UPLOAD: 81,
282
+ VIDEO_UPLOAD: 82,
283
+ /** Alias of {@link Opcode.VIDEO_UPLOAD}. */
284
+ VIDEO_UPLOAD_URL: 82,
285
+ VIDEO_PLAY: 83,
286
+ /** Alias of {@link Opcode.VIDEO_PLAY}. */
287
+ EXTERNAL_VIDEO_RESOLVE: 83,
288
+ FILE_UPLOAD: 87,
289
+ /** Alias of {@link Opcode.FILE_UPLOAD}. */
290
+ FILE_UPLOAD_URL: 87,
291
+ FILE_DOWNLOAD: 88,
292
+ /** Alias of {@link Opcode.FILE_DOWNLOAD}. */
293
+ FILE_DOWNLOAD_URL: 88,
294
+ LINK_INFO: 89,
295
+ STICKER_CREATE: 193,
296
+ STICKER_SUGGEST: 194,
297
+ // ───────── sessions ─────────
298
+ SESSIONS_INFO: 96,
299
+ /** Alias of {@link Opcode.SESSIONS_INFO}. */
300
+ SESSIONS_LIST: 96,
301
+ SESSIONS_CLOSE: 97,
302
+ PHONE_BIND_REQUEST: 98,
303
+ PHONE_BIND_CONFIRM: 99,
304
+ PHONE_WEBAPP_SHARE: 106,
305
+ // ───────── location ─────────
306
+ LOCATION_SEND: 125,
307
+ LOCATION_REQUEST: 126,
308
+ // ───────── mentions / drafts ─────────
309
+ GET_LAST_MENTIONS: 127,
310
+ DRAFT_SAVE: 176,
311
+ /**
312
+ * Op 177: discard a draft. The pre-decompile name
313
+ * `PRESENCE_SUBSCRIBE: 177` was incorrect — that op actually exists, but
314
+ * the WS protocol uses a different number for presence subscribe. Confirm
315
+ * before using {@link Opcode.PRESENCE_SUBSCRIBE} below.
316
+ */
317
+ DRAFT_DISCARD: 177,
318
+ /**
319
+ * @deprecated The pre-decompile binding said this is op 177, but the
320
+ * canonical Android enum slots `DRAFT_DISCARD` at 177. WS-side
321
+ * `presence/subscribe` likely uses a different opcode — not yet verified.
322
+ */
323
+ PRESENCE_SUBSCRIBE: 177,
324
+ // ───────── profile management ─────────
325
+ PROFILE_DELETE: 199,
326
+ PROFILE_DELETE_TIME: 200,
327
+ /**
328
+ * @deprecated The pre-decompile name `KEEPALIVE_TS: 200` was wrong —
329
+ * op 200 is `PROFILE_DELETE_TIME`, not a keep-alive. Use op 1 ({@link
330
+ * Opcode.PING}) for keep-alive. Kept for back-compat only.
331
+ */
332
+ KEEPALIVE_TS: 200,
333
+ // ───────── push events (server → client) ─────────
334
+ NOTIF_MESSAGE: 128,
335
+ /** Alias of {@link Opcode.NOTIF_MESSAGE}. */
336
+ MESSAGE_INCOMING: 128,
337
+ NOTIF_TYPING: 129,
338
+ /**
339
+ * @deprecated Wrong canonical name. Op 129 is `NOTIF_TYPING`, not
340
+ * `MEMBER_LEAVE_PUSH`. Renamed via deprecation; old name kept for compat.
341
+ */
342
+ MEMBER_LEAVE_PUSH: 129,
343
+ NOTIF_MARK: 130,
344
+ /** Alias of {@link Opcode.NOTIF_MARK}. */
345
+ READ_MARK_PUSH: 130,
346
+ NOTIF_CONTACT: 131,
347
+ NOTIF_PRESENCE: 132,
348
+ /** Alias of {@link Opcode.NOTIF_PRESENCE}. */
349
+ PRESENCE_PUSH: 132,
350
+ NOTIF_CONFIG: 134,
351
+ /** Alias of {@link Opcode.NOTIF_CONFIG}. */
352
+ CONFIG_HASH_PUSH: 134,
353
+ NOTIF_CHAT: 135,
354
+ /** Alias of {@link Opcode.NOTIF_CHAT}. */
355
+ CHAT_UPDATE_PUSH: 135,
356
+ NOTIF_ATTACH: 136,
357
+ /** Alias of {@link Opcode.NOTIF_ATTACH}. */
358
+ FILE_UPLOAD_DONE_PUSH: 136,
359
+ NOTIF_CALL_START: 137,
360
+ NOTIF_CONTACT_SORT: 139,
361
+ NOTIF_MSG_DELETE_RANGE: 140,
362
+ NOTIF_MSG_DELETE: 142,
363
+ NOTIF_CALLBACK_ANSWER: 143,
364
+ NOTIF_LOCATION: 147,
365
+ NOTIF_LOCATION_REQUEST: 148,
366
+ NOTIF_ASSETS_UPDATE: 150,
367
+ /** Alias of {@link Opcode.NOTIF_ASSETS_UPDATE}. */
368
+ STICKER_RECENTS_PUSH: 150,
369
+ NOTIF_DRAFT: 152,
370
+ NOTIF_DRAFT_DISCARD: 153,
371
+ NOTIF_MSG_DELAYED: 154,
372
+ NOTIF_MSG_REACTIONS_CHANGED: 155,
373
+ NOTIF_MSG_YOU_REACTED: 156,
374
+ NOTIF_PROFILE: 159,
375
+ /** Alias of {@link Opcode.NOTIF_PROFILE}. */
376
+ PROFILE_UPDATE_PUSH: 159,
377
+ NOTIF_FOLDERS: 277,
378
+ NOTIF_BANNERS: 292,
379
+ /** Alias of {@link Opcode.NOTIF_BANNERS}. */
380
+ BANNERS: 292,
381
+ NOTIF_TRANSCRIPTION: 293,
382
+ // ───────── bots / web apps ─────────
383
+ CHAT_BOT_COMMANDS: 144,
384
+ BOT_INFO: 145,
385
+ WEB_APP_INIT_DATA: 160,
386
+ /** Alias of {@link Opcode.WEB_APP_INIT_DATA}. */
387
+ BOT_MINI_APP_OPEN: 160,
388
+ // ───────── complaints ─────────
389
+ COMPLAIN: 161,
390
+ COMPLAIN_REASONS_GET: 162,
391
+ /** Alias of {@link Opcode.COMPLAIN_REASONS_GET}. */
392
+ COMPLAINS_SYNC: 162,
393
+ // ───────── tokens / 3rd-party ─────────
394
+ /**
395
+ * Op 158: short-lived OK-group access token (~14-min lifetime). Used to
396
+ * authenticate HTTP requests to `i.oneme.ru` / `videowebrtc.okcdn.ru`.
397
+ * Refresh before `token_refresh_ts`.
398
+ */
399
+ OK_TOKEN: 158,
400
+ /** Alias of {@link Opcode.OK_TOKEN}. */
401
+ WEB_TOKEN: 158,
402
+ // ───────── transcribe / audio ─────────
403
+ TRANSCRIBE_MEDIA: 202,
404
+ AUDIO_PLAY: 301,
405
+ // ───────── org / banners ─────────
406
+ ORG_INFO: 256,
407
+ BANNERS_GET: 302,
408
+ // ───────── reactions config ─────────
409
+ CHAT_REACTIONS_SETTINGS_SET: 257,
410
+ /** Alias of {@link Opcode.CHAT_REACTIONS_SETTINGS_SET}. */
411
+ CHAT_REACTIONS_SETTINGS: 257,
412
+ REACTIONS_SETTINGS_GET_BY_CHAT_ID: 258,
413
+ /** Alias of {@link Opcode.REACTIONS_SETTINGS_GET_BY_CHAT_ID}. */
414
+ CHAT_REACTIONS_SETTINGS_GET: 258,
415
+ // ───────── folders ─────────
416
+ FOLDERS_GET: 272,
417
+ /** Alias of {@link Opcode.FOLDERS_GET}. */
418
+ FOLDERS_SYNC: 272,
419
+ FOLDERS_GET_BY_ID: 273,
420
+ FOLDERS_UPDATE: 274,
421
+ /** Alias of {@link Opcode.FOLDERS_UPDATE}. */
422
+ FOLDER_UPSERT: 274,
423
+ FOLDERS_REORDER: 275,
424
+ /**
425
+ * Op 276: **delete** a folder. The pre-decompile name `FOLDERS_ORDER: 276`
426
+ * was wrong — reorder lives at op 275 ({@link Opcode.FOLDERS_REORDER}).
427
+ */
428
+ FOLDERS_DELETE: 276,
429
+ /**
430
+ * @deprecated Pre-decompile alias. Op 276 is **FOLDERS_DELETE**, not
431
+ * "reorder". For reordering use {@link Opcode.FOLDERS_REORDER} (op 275).
432
+ */
433
+ FOLDERS_ORDER: 276,
434
+ // ───────── polls ─────────
435
+ SEND_VOTE: 304,
436
+ /** Alias of {@link Opcode.SEND_VOTE}. */
437
+ POLL_VOTE: 304,
438
+ VOTERS_LIST_BY_ANSWER: 305,
439
+ GET_POLL_UPDATES: 306,
440
+ /** Alias of {@link Opcode.GET_POLL_UPDATES}. */
441
+ POLL_GET: 306,
442
+ // ───────── web-only (not in mobile enum) ─────────
443
+ /** Web WS: request a fresh QR session (returns `{qrLink, trackId, ttl}`). */
444
+ QR_START: 288,
445
+ /** Web WS: long-poll for `loginAvailable:true` flip. */
446
+ QR_POLL: 289,
447
+ /** Web WS: claim LOGIN token after `loginAvailable:true`. */
448
+ QR_LOGIN: 291,
449
+ };
450
+ export const Cmd = {
451
+ REQUEST: 0,
452
+ RESPONSE: 1,
453
+ ERROR: 3,
454
+ };
455
+ export const PROTOCOL_VERSION = 11;
456
+ //# sourceMappingURL=opcodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opcodes.js","sourceRoot":"","sources":["../src/opcodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { RawTransport } from './raw-transport.js';
2
+ import type { LoginResponse, PasswordChallenge, UserAgent } from './types.js';
3
+ export interface QrBindOptions {
4
+ /** WS endpoint. Default `wss://ws-api.oneme.ru/websocket`. */
5
+ wsUrl?: string;
6
+ /** UA for the web side. Default = bundled WEB Chrome on macOS UA. */
7
+ webUserAgent?: UserAgent;
8
+ /**
9
+ * Web-side `deviceId` UUID. Generated automatically if absent; pass an
10
+ * existing one to maintain device identity across runs (so the WS token
11
+ * issued here can be reused by a regular `MaxClient`).
12
+ */
13
+ webDeviceId?: string;
14
+ /**
15
+ * Resolver for the 2FA cloud-password challenge. Required when the account
16
+ * has 2FA enabled — otherwise this function throws on the password step.
17
+ */
18
+ resolvePassword?: (challenge: PasswordChallenge) => Promise<string | null>;
19
+ /** How many chats the final LOGIN (op 19) should preload. Default 40. */
20
+ chatsCount?: number;
21
+ /** Per-request timeout for the web WS in ms. Default 20_000. */
22
+ requestTimeoutMs?: number;
23
+ }
24
+ export interface QrBindResult {
25
+ /**
26
+ * Web-bound LOGIN token. Persist this as `StoredSession.loginToken` and
27
+ * pass to {@link import('./client.js').MaxClient} for subsequent runs.
28
+ */
29
+ webToken: string;
30
+ /**
31
+ * Web-side `deviceId` UUID used for HELLO/LOGIN. Persist this as
32
+ * `StoredSession.deviceId` — the token is bound to it.
33
+ */
34
+ webDeviceId: string;
35
+ /** Final `LoginResponse` (profile + chats + contacts + config). */
36
+ loginResponse: LoginResponse;
37
+ }
38
+ /**
39
+ * Bind a new **web** session using an already-authenticated **mobile** binary
40
+ * transport. This is the headless equivalent of the in-app camera QR scan.
41
+ *
42
+ * Flow:
43
+ * 1. open WS to `wss://ws-api.oneme.ru/websocket` → op 6 HELLO (`deviceType:'WEB'`)
44
+ * 2. op 288 → server returns `{qrLink, trackId, ttl, pollingInterval}`
45
+ * 3. **mobile** transport: op 290 with `{qrLink}` (the QR-confirm; same op as
46
+ * what the camera-scan path eventually invokes)
47
+ * 4. web side: poll op 289 until `status.loginAvailable === true`
48
+ * 5. web side: op 291 → either LOGIN token, or `passwordChallenge` if 2FA
49
+ * 6. if 2FA: op 115 with the password → LOGIN token
50
+ * 7. web side: op 19 LOGIN → full `LoginResponse`
51
+ *
52
+ * The returned `webToken` is the LOGIN token MaxClient (WS) expects.
53
+ *
54
+ * @param raw An authenticated `RawTransport` — must have already passed
55
+ * `hello()` + `mobileLogin()` (or `sendPhoneAuthCode` →
56
+ * `verifyPhoneAuthCode` → `mobileLogin`). Op 290 fails without
57
+ * a logged-in mobile session.
58
+ */
59
+ export declare function qrBindWebSession(raw: RawTransport, opts?: QrBindOptions): Promise<QrBindResult>;
60
+ //# sourceMappingURL=qr-bind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-bind.d.ts","sourceRoot":"","sources":["../src/qr-bind.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAGV,aAAa,EACb,iBAAiB,EAIjB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3E,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,YAAY,EACjB,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,YAAY,CAAC,CAwFvB"}
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { Opcode } from './opcodes.js';
3
+ import { Transport } from './transport.js';
4
+ import { DEFAULT_USER_AGENT } from './auth.js';
5
+ /**
6
+ * Bind a new **web** session using an already-authenticated **mobile** binary
7
+ * transport. This is the headless equivalent of the in-app camera QR scan.
8
+ *
9
+ * Flow:
10
+ * 1. open WS to `wss://ws-api.oneme.ru/websocket` → op 6 HELLO (`deviceType:'WEB'`)
11
+ * 2. op 288 → server returns `{qrLink, trackId, ttl, pollingInterval}`
12
+ * 3. **mobile** transport: op 290 with `{qrLink}` (the QR-confirm; same op as
13
+ * what the camera-scan path eventually invokes)
14
+ * 4. web side: poll op 289 until `status.loginAvailable === true`
15
+ * 5. web side: op 291 → either LOGIN token, or `passwordChallenge` if 2FA
16
+ * 6. if 2FA: op 115 with the password → LOGIN token
17
+ * 7. web side: op 19 LOGIN → full `LoginResponse`
18
+ *
19
+ * The returned `webToken` is the LOGIN token MaxClient (WS) expects.
20
+ *
21
+ * @param raw An authenticated `RawTransport` — must have already passed
22
+ * `hello()` + `mobileLogin()` (or `sendPhoneAuthCode` →
23
+ * `verifyPhoneAuthCode` → `mobileLogin`). Op 290 fails without
24
+ * a logged-in mobile session.
25
+ */
26
+ export async function qrBindWebSession(raw, opts = {}) {
27
+ const wsUrl = opts.wsUrl ?? 'wss://ws-api.oneme.ru/websocket';
28
+ const webDeviceId = opts.webDeviceId ?? randomUUID();
29
+ const userAgent = opts.webUserAgent ?? DEFAULT_USER_AGENT;
30
+ const ws = new Transport({
31
+ url: wsUrl,
32
+ headers: {
33
+ 'User-Agent': userAgent.headerUserAgent,
34
+ Origin: 'https://web.max.ru',
35
+ },
36
+ ...(opts.requestTimeoutMs !== undefined ? { requestTimeoutMs: opts.requestTimeoutMs } : {}),
37
+ });
38
+ await ws.connect();
39
+ try {
40
+ // 1. HELLO (web side)
41
+ await ws.request(Opcode.HELLO, { userAgent, deviceId: webDeviceId });
42
+ // 2. QR_START — ask for a fresh trackId
43
+ const qrStart = await ws.request(Opcode.QR_START);
44
+ // 3. Mobile side confirms the QR (op 290)
45
+ await raw.confirmQrAuth(qrStart.qrLink);
46
+ // 4. Long-poll op 289 until `loginAvailable` flips
47
+ const pollIntervalMs = Math.max(1_000, qrStart.pollingInterval ?? 2_000);
48
+ const deadline = qrStart.expiresAt ?? Date.now() + Math.max(qrStart.ttl ?? 120_000, 30_000);
49
+ let approved = false;
50
+ while (Date.now() < deadline) {
51
+ const poll = await ws.request(Opcode.QR_POLL, {
52
+ trackId: qrStart.trackId,
53
+ });
54
+ if (poll.status?.loginAvailable === true) {
55
+ approved = true;
56
+ break;
57
+ }
58
+ await sleep(pollIntervalMs);
59
+ }
60
+ if (!approved) {
61
+ throw new Error(`QR-bind timed out: trackId ${qrStart.trackId} did not flip to loginAvailable`);
62
+ }
63
+ // 5. CLAIM (op 291) — returns either LOGIN token or 2FA challenge
64
+ const claim = await ws.request(Opcode.QR_LOGIN, {
65
+ trackId: qrStart.trackId,
66
+ });
67
+ let webToken = claim.tokenAttrs?.LOGIN?.token;
68
+ // 6. 2FA: exchange password for LOGIN token (op 115)
69
+ if (!webToken && claim.passwordChallenge) {
70
+ if (!opts.resolvePassword) {
71
+ throw new Error('Account has a 2FA cloud password — pass `resolvePassword` in QrBindOptions');
72
+ }
73
+ const pw = await opts.resolvePassword(claim.passwordChallenge);
74
+ if (pw === null || pw === undefined || pw === '') {
75
+ throw new Error('2FA password not provided — QR-bind aborted');
76
+ }
77
+ const final = await ws.request(Opcode.AUTH_QR_PASSWORD_LOGIN, { trackId: claim.passwordChallenge.trackId, password: pw });
78
+ webToken = final.tokenAttrs?.LOGIN?.token;
79
+ }
80
+ if (!webToken) {
81
+ throw new Error('QR-bind completed without a LOGIN token (server response missing tokenAttrs.LOGIN)');
82
+ }
83
+ // 7. Final LOGIN (op 19) — also gives us profile + chats snapshot
84
+ const loginResponse = await ws.request(Opcode.LOGIN, {
85
+ token: webToken,
86
+ chatsCount: opts.chatsCount ?? 40,
87
+ interactive: true,
88
+ chatsSync: 0,
89
+ contactsSync: 0,
90
+ presenceSync: -1,
91
+ draftsSync: 0,
92
+ });
93
+ return { webToken, webDeviceId, loginResponse };
94
+ }
95
+ finally {
96
+ ws.close();
97
+ }
98
+ }
99
+ function sleep(ms) {
100
+ return new Promise((r) => setTimeout(r, ms));
101
+ }
102
+ //# sourceMappingURL=qr-bind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-bind.js","sourceRoot":"","sources":["../src/qr-bind.ts"],"names":[],"mappings":"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"}