@badzz88/baileys 8.4.9 → 8.5.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 (153) hide show
  1. package/WAProto/WAProto.proto +6 -347
  2. package/WAProto/fix-imports.js +85 -86
  3. package/WAProto/index.d.ts +25 -4913
  4. package/WAProto/index.js +93 -14069
  5. package/{src → lib}/Defaults/index.js +2 -13
  6. package/{src → lib}/Signal/Group/group_cipher.js +5 -5
  7. package/{src → lib}/Signal/Group/keyhelper.js +4 -4
  8. package/{src → lib}/Signal/Group/sender-chain-key.js +2 -2
  9. package/{src → lib}/Signal/Group/sender-key-distribution-message.js +1 -1
  10. package/{src → lib}/Signal/Group/sender-key-message.js +3 -3
  11. package/{src → lib}/Signal/Group/sender-key-record.js +1 -1
  12. package/{src → lib}/Signal/Group/sender-message-key.js +2 -2
  13. package/{src → lib}/Signal/libsignal.js +26 -6
  14. package/{src → lib}/Socket/chats.js +58 -616
  15. package/{src → lib}/Socket/communities.js +28 -59
  16. package/{src → lib}/Socket/graphql.js +103 -362
  17. package/{src → lib}/Socket/groups.js +29 -77
  18. package/{src → lib}/Socket/index.js +5 -3
  19. package/{src → lib}/Socket/interactive-handler.js +60 -117
  20. package/{src → lib}/Socket/interop.js +19 -36
  21. package/lib/Socket/luxu.js +387 -0
  22. package/{src → lib}/Socket/managed-account.js +27 -58
  23. package/{src → lib}/Socket/messages-recv.js +143 -715
  24. package/{src → lib}/Socket/messages-send.js +102 -412
  25. package/lib/Socket/mex.js +60 -0
  26. package/{src → lib}/Socket/newsletter.js +23 -266
  27. package/{src → lib}/Socket/privacy.js +38 -41
  28. package/{src → lib}/Socket/registration.js +106 -113
  29. package/{src → lib}/Socket/socket.js +101 -88
  30. package/{src → lib}/Socket/text-router.js +17 -1
  31. package/lib/Socket/username.js +243 -0
  32. package/lib/Store/keyed-db.js +108 -0
  33. package/{src → lib}/Store/make-in-memory-store.js +104 -6
  34. package/lib/Types/Mex.js +112 -0
  35. package/{src → lib}/Types/Newsletter.js +41 -72
  36. package/{src → lib}/Types/index.js +1 -0
  37. package/{src → lib}/Utils/chat-utils.js +9 -73
  38. package/lib/Utils/command-loader.d.ts +31 -0
  39. package/lib/Utils/command-loader.js +100 -0
  40. package/lib/Utils/companion-reg-client-utils.js +42 -0
  41. package/lib/Utils/crypto.js +155 -0
  42. package/lib/Utils/curve25519-js.js +275 -0
  43. package/{src → lib}/Utils/decode-wa-message.js +36 -284
  44. package/{src → lib}/Utils/event-buffer.js +27 -6
  45. package/{src → lib}/Utils/generics.js +37 -114
  46. package/{src → lib}/Utils/index.js +5 -1
  47. package/lib/Utils/lt-hash.js +39 -0
  48. package/{src → lib}/Utils/message-retry-manager.js +39 -0
  49. package/{src → lib}/Utils/messages-media.js +58 -105
  50. package/{src → lib}/Utils/messages.js +529 -115
  51. package/lib/Utils/meta-ai-msmsg.js +262 -0
  52. package/lib/Utils/native-bridge.js +82 -0
  53. package/{src → lib}/Utils/noise-handler.js +15 -13
  54. package/{src → lib}/Utils/process-message.js +55 -54
  55. package/{src → lib}/Utils/reporting-utils.js +2 -2
  56. package/lib/Utils/session-pool.d.ts +16 -0
  57. package/lib/Utils/session-pool.js +94 -0
  58. package/{src → lib}/Utils/signal.js +51 -19
  59. package/{src → lib}/Utils/stanza-ack.js +2 -36
  60. package/lib/Utils/sticker.d.ts +17 -0
  61. package/lib/Utils/sticker.js +145 -0
  62. package/{src → lib}/Utils/tc-token-utils.js +1 -1
  63. package/{src → lib}/Utils/validate-connection.js +11 -40
  64. package/lib/Utils/view-once-cache.d.ts +9 -0
  65. package/lib/Utils/view-once-cache.js +79 -0
  66. package/{src → lib}/WABinary/decode.js +4 -38
  67. package/lib/WABinary/encode.js +228 -0
  68. package/{src → lib}/WABinary/generic-utils.js +93 -1
  69. package/{src → lib}/WABinary/jid-utils.js +3 -16
  70. package/{src → lib}/WAM/encode.js +1 -1
  71. package/lib/WAUSync/Protocols/USyncBusinessProtocol.js +43 -0
  72. package/{src → lib}/WAUSync/Protocols/USyncContactProtocol.js +1 -7
  73. package/{src → lib}/WAUSync/Protocols/USyncDeviceProtocol.js +5 -13
  74. package/{src → lib}/WAUSync/Protocols/USyncDisappearingModeProtocol.js +4 -1
  75. package/{src → lib}/WAUSync/Protocols/USyncFeatureProtocol.js +2 -17
  76. package/{src → lib}/WAUSync/Protocols/USyncStatusProtocol.js +2 -7
  77. package/{src → lib}/WAUSync/Protocols/USyncUsernameProtocol.js +1 -2
  78. package/{src → lib}/WAUSync/Protocols/index.js +0 -1
  79. package/{src → lib}/WAUSync/USyncQuery.js +6 -77
  80. package/{src → lib}/WAUSync/USyncUser.js +8 -16
  81. package/{src → lib}/WAUSync/index.js +0 -1
  82. package/{src → lib}/antiban.js +266 -355
  83. package/{src → lib}/index.js +2 -2
  84. package/package.json +18 -15
  85. package/WAProto/fix-import.js +0 -38
  86. package/src/Socket/mex.js +0 -47
  87. package/src/Socket/username.js +0 -234
  88. package/src/Utils/crypto.js +0 -125
  89. package/src/Utils/lt-hash.js +0 -10
  90. package/src/Utils/message-inspect.js +0 -400
  91. package/src/Utils/meta-ai-msmsg.js +0 -133
  92. package/src/WABinary/encode.js +0 -58
  93. package/src/WAUSync/Protocols/USyncBusinessProtocol.js +0 -100
  94. package/src/WAUSync/USyncBackoff.js +0 -31
  95. /package/{src → lib}/Defaults/phonenumber-mcc.json +0 -0
  96. /package/{src → lib}/Signal/Group/ciphertext-message.js +0 -0
  97. /package/{src → lib}/Signal/Group/group-session-builder.js +0 -0
  98. /package/{src → lib}/Signal/Group/index.js +0 -0
  99. /package/{src → lib}/Signal/Group/sender-key-name.js +0 -0
  100. /package/{src → lib}/Signal/Group/sender-key-state.js +0 -0
  101. /package/{src → lib}/Signal/lid-mapping.js +0 -0
  102. /package/{src → lib}/Socket/Client/index.js +0 -0
  103. /package/{src → lib}/Socket/Client/types.js +0 -0
  104. /package/{src → lib}/Socket/Client/websocket.js +0 -0
  105. /package/{src → lib}/Socket/aigroups.js +0 -0
  106. /package/{src → lib}/Socket/business.js +0 -0
  107. /package/{src → lib}/Store/index.js +0 -0
  108. /package/{src → lib}/Store/make-cache-manager-store.js +0 -0
  109. /package/{src → lib}/Store/make-ordered-dictionary.js +0 -0
  110. /package/{src → lib}/Store/object-repository.js +0 -0
  111. /package/{src → lib}/Types/Auth.js +0 -0
  112. /package/{src → lib}/Types/Bussines.js +0 -0
  113. /package/{src → lib}/Types/Call.js +0 -0
  114. /package/{src → lib}/Types/Chat.js +0 -0
  115. /package/{src → lib}/Types/Contact.js +0 -0
  116. /package/{src → lib}/Types/Events.js +0 -0
  117. /package/{src → lib}/Types/GroupMetadata.js +0 -0
  118. /package/{src → lib}/Types/Label.js +0 -0
  119. /package/{src → lib}/Types/LabelAssociation.js +0 -0
  120. /package/{src → lib}/Types/Message.js +0 -0
  121. /package/{src → lib}/Types/Product.js +0 -0
  122. /package/{src → lib}/Types/Signal.js +0 -0
  123. /package/{src → lib}/Types/Socket.js +0 -0
  124. /package/{src → lib}/Types/State.js +0 -0
  125. /package/{src → lib}/Types/USync.js +0 -0
  126. /package/{src → lib}/Utils/auth-utils.js +0 -0
  127. /package/{src → lib}/Utils/browser-utils.js +0 -0
  128. /package/{src → lib}/Utils/business.js +0 -0
  129. /package/{src → lib}/Utils/consumer-application.js +0 -0
  130. /package/{src → lib}/Utils/group-history.js +0 -0
  131. /package/{src → lib}/Utils/history.js +0 -0
  132. /package/{src → lib}/Utils/identity-change-handler.js +0 -0
  133. /package/{src → lib}/Utils/jid-display-normalization.js +0 -0
  134. /package/{src → lib}/Utils/link-preview.js +0 -0
  135. /package/{src → lib}/Utils/logger.js +0 -0
  136. /package/{src → lib}/Utils/make-mutex.js +0 -0
  137. /package/{src → lib}/Utils/message-composer.js +0 -0
  138. /package/{src → lib}/Utils/offline-node-processor.js +0 -0
  139. /package/{src → lib}/Utils/pre-key-manager.js +0 -0
  140. /package/{src → lib}/Utils/sync-action-utils.js +0 -0
  141. /package/{src → lib}/Utils/use-multi-file-auth-state.js +0 -0
  142. /package/{src → lib}/Utils/voip-rekey.js +0 -0
  143. /package/{src → lib}/WABinary/constants.js +0 -0
  144. /package/{src → lib}/WABinary/index.js +0 -0
  145. /package/{src → lib}/WABinary/types.js +0 -0
  146. /package/{src → lib}/WAM/BinaryInfo.js +0 -0
  147. /package/{src → lib}/WAM/constants.js +0 -0
  148. /package/{src → lib}/WAM/index.js +0 -0
  149. /package/{src → lib}/WAUSync/Protocols/USyncBotProfileProtocol.js +0 -0
  150. /package/{src → lib}/WAUSync/Protocols/USyncLIDProtocol.js +0 -0
  151. /package/{src → lib}/WAUSync/Protocols/USyncPictureProtocol.js +0 -0
  152. /package/{src → lib}/WAUSync/Protocols/USyncSidelistProtocol.js +0 -0
  153. /package/{src → lib}/WAUSync/Protocols/USyncTextStatusProtocol.js +0 -0
@@ -0,0 +1,108 @@
1
+ export default class KeyedDB {
2
+ constructor(compareFn, idGetter) {
3
+ if (typeof compareFn !== "function" || typeof idGetter !== "function") {
4
+ throw new Error("KeyedDB requires compare and idGetter functions");
5
+ }
6
+ this._compare = compareFn;
7
+ this._idGetter = idGetter;
8
+ this._array = [];
9
+ this._dict = {};
10
+ }
11
+ get length() {
12
+ return this._array.length;
13
+ }
14
+ get(id) {
15
+ return this._dict[id];
16
+ }
17
+ insert(entry, mode = "insert") {
18
+ const id = this._idGetter(entry);
19
+ const existing = this._dict[id];
20
+ if (existing && mode === "insert") {
21
+ return false;
22
+ }
23
+ this._dict[id] = entry;
24
+ let inserted = false;
25
+ for (let i = 0; i < this._array.length; i++) {
26
+ const cmp = this._compare(this._idGetter(this._array[i]), id);
27
+ if (cmp < 0) {
28
+ this._array.splice(i, 0, entry);
29
+ inserted = true;
30
+ break;
31
+ }
32
+ }
33
+ if (!inserted) this._array.push(entry);
34
+ return true;
35
+ }
36
+ insertIfAbsent(...entries) {
37
+ const added = [];
38
+ for (const entry of entries) {
39
+ if (!this._dict[this._idGetter(entry)]) {
40
+ this.insert(entry);
41
+ added.push(entry);
42
+ }
43
+ }
44
+ return added;
45
+ }
46
+ upsert(...entries) {
47
+ const added = [];
48
+ for (const entry of entries) {
49
+ const id = this._idGetter(entry);
50
+ if (this._dict[id]) {
51
+ const idx = this._array.findIndex(e => this._idGetter(e) === id);
52
+ if (idx >= 0) this._array[idx] = entry;
53
+ this._dict[id] = entry;
54
+ } else {
55
+ this.insert(entry);
56
+ added.push(entry);
57
+ }
58
+ }
59
+ return added;
60
+ }
61
+ update(id, updater) {
62
+ const item = this._dict[id];
63
+ if (!item) return false;
64
+ updater(item);
65
+ const idx = this._array.findIndex(e => this._idGetter(e) === id);
66
+ if (idx >= 0) this._array[idx] = item;
67
+ return true;
68
+ }
69
+ updateAssign(id, update) {
70
+ const item = this._dict[id];
71
+ if (!item) return false;
72
+ Object.assign(item, update);
73
+ const idx = this._array.findIndex(e => this._idGetter(e) === id);
74
+ if (idx >= 0) this._array[idx] = item;
75
+ return true;
76
+ }
77
+ deleteById(id) {
78
+ if (!this._dict[id]) return false;
79
+ delete this._dict[id];
80
+ const idx = this._array.findIndex(e => this._idGetter(e) === id);
81
+ if (idx >= 0) this._array.splice(idx, 1);
82
+ return true;
83
+ }
84
+ clear() {
85
+ this._array = [];
86
+ this._dict = {};
87
+ }
88
+ all() {
89
+ return [...this._array];
90
+ }
91
+ filter(predicate) {
92
+ this._array = this._array.filter(predicate);
93
+ this._dict = {};
94
+ for (const entry of this._array) {
95
+ this._dict[this._idGetter(entry)] = entry;
96
+ }
97
+ }
98
+ count() {
99
+ return this._array.length;
100
+ }
101
+ toJSON() {
102
+ return this._array;
103
+ }
104
+ fromJSON(array) {
105
+ this.clear();
106
+ for (const entry of array) this.insert(entry);
107
+ }
108
+ }
@@ -37,6 +37,44 @@ const waLabelAssociationKey = {
37
37
 
38
38
  const makeMessagesDictionary = () => Store_1.makeOrderedDictionary(waMessageID)
39
39
 
40
+ const ENCRYPTED_STORE_MARKER = 'xazbails-store-v1'
41
+
42
+ const deriveStoreKey = secret => {
43
+ const { createHash } = require('crypto')
44
+ return createHash('sha256').update(String(secret)).digest()
45
+ }
46
+
47
+ const encryptStoreJSON = (jsonStr, secret) => {
48
+ const { createCipheriv, randomBytes } = require('crypto')
49
+ const key = deriveStoreKey(secret)
50
+ const iv = randomBytes(12)
51
+ const cipher = createCipheriv('aes-256-gcm', key, iv)
52
+ const encrypted = Buffer.concat([cipher.update(jsonStr, 'utf-8'), cipher.final()])
53
+ const authTag = cipher.getAuthTag()
54
+ return JSON.stringify({
55
+ marker: ENCRYPTED_STORE_MARKER,
56
+ iv: iv.toString('base64'),
57
+ authTag: authTag.toString('base64'),
58
+ data: encrypted.toString('base64')
59
+ })
60
+ }
61
+
62
+ const decryptStoreJSON = (fileStr, secret) => {
63
+ const parsed = JSON.parse(fileStr)
64
+ if (parsed.marker !== ENCRYPTED_STORE_MARKER) {
65
+ // not an encrypted store file -- assume it's already plain JSON
66
+ return fileStr
67
+ }
68
+ const { createDecipheriv } = require('crypto')
69
+ const key = deriveStoreKey(secret)
70
+ const iv = Buffer.from(parsed.iv, 'base64')
71
+ const authTag = Buffer.from(parsed.authTag, 'base64')
72
+ const decipher = createDecipheriv('aes-256-gcm', key, iv)
73
+ decipher.setAuthTag(authTag)
74
+ const decrypted = Buffer.concat([decipher.update(Buffer.from(parsed.data, 'base64')), decipher.final()])
75
+ return decrypted.toString('utf-8')
76
+ }
77
+
40
78
  const makeInMemoryStore = config => {
41
79
  const socket = config.socket
42
80
  const chatKey = config.chatKey || waChatKey(true)
@@ -55,6 +93,19 @@ const makeInMemoryStore = config => {
55
93
  const state = { connection: 'close' }
56
94
  const labels = new object_repository_1.ObjectRepository()
57
95
  const labelAssociations = new KeyedDB(labelAssociationKey, labelAssociationKey.key)
96
+ const maxMessagesPerChat = config.maxMessagesPerChat
97
+ const trimMessagesIfNeeded = jid => {
98
+ if (!maxMessagesPerChat) return
99
+ const list = messages[jid]
100
+ if (!list || list.array.length <= maxMessagesPerChat) return
101
+ while (list.array.length > maxMessagesPerChat) {
102
+ let oldest = list.array[0]
103
+ for (const m of list.array) {
104
+ if ((m.messageTimestamp || 0) < (oldest.messageTimestamp || 0)) oldest = m
105
+ }
106
+ list.remove(oldest)
107
+ }
108
+ }
58
109
  const assertMessageList = jid => {
59
110
  if (!messages[jid]) {
60
111
  messages[jid] = makeMessagesDictionary()
@@ -88,8 +139,8 @@ const makeInMemoryStore = config => {
88
139
  'messaging-history.set',
89
140
  ({ chats: newChats, contacts: newContacts, messages: newMessages, isLatest, syncType }) => {
90
141
  if (syncType === WAProto_1.proto.HistorySync.HistorySyncType.ON_DEMAND) {
91
- // ON_DEMAND syncs are chunk-based and need cursor tracking — skip for now
92
- return
142
+ return // FOR NOW,
143
+ //TODO: HANDLE
93
144
  }
94
145
  if (isLatest) {
95
146
  chats.clear()
@@ -110,6 +161,7 @@ const makeInMemoryStore = config => {
110
161
  const jid = msg.key.remoteJid
111
162
  const list = assertMessageList(jid)
112
163
  list.upsert(msg, 'prepend')
164
+ trimMessagesIfNeeded(jid)
113
165
  }
114
166
  logger.debug({ messages: newMessages.length }, 'synced messages')
115
167
  }
@@ -204,6 +256,7 @@ const makeInMemoryStore = config => {
204
256
  const jid = WABinary_1.jidNormalizedUser(msg.key.remoteJid)
205
257
  const list = assertMessageList(jid)
206
258
  list.upsert(msg, 'append')
259
+ trimMessagesIfNeeded(jid)
207
260
  if (type === 'notify' && !chats.get(jid)) {
208
261
  ev.emit('chats.upsert', [
209
262
  {
@@ -369,7 +422,10 @@ const makeInMemoryStore = config => {
369
422
  contacts,
370
423
  messages,
371
424
  labels,
372
- labelAssociations
425
+ labelAssociations,
426
+ groupMetadata,
427
+ presences,
428
+ state
373
429
  })
374
430
  const fromJSON = json => {
375
431
  chats.upsert(...json.chats)
@@ -381,6 +437,16 @@ const makeInMemoryStore = config => {
381
437
  for (const msg of json.messages[jid]) {
382
438
  list.upsert(WAProto_1.proto.WebMessageInfo.fromObject(msg), 'append')
383
439
  }
440
+ trimMessagesIfNeeded(jid)
441
+ }
442
+ if (json.groupMetadata) {
443
+ Object.assign(groupMetadata, json.groupMetadata)
444
+ }
445
+ if (json.presences) {
446
+ Object.assign(presences, json.presences)
447
+ }
448
+ if (json.state) {
449
+ Object.assign(state, json.state)
384
450
  }
385
451
  }
386
452
  return {
@@ -452,7 +518,7 @@ const makeInMemoryStore = config => {
452
518
  if (!contact) {
453
519
  return suki?.profilePictureUrl(jid)
454
520
  }
455
- if (contact.imgUrl === undefined) {
521
+ if (typeof contact.imgUrl === 'undefined') {
456
522
  contact.imgUrl = await suki?.profilePictureUrl(jid)
457
523
  }
458
524
  return contact.imgUrl
@@ -485,17 +551,49 @@ const makeInMemoryStore = config => {
485
551
  writeToFile: path => {
486
552
  // require fs here so that in case "fs" is not available -- the app does not crash
487
553
  const { writeFileSync } = require('fs')
488
- writeFileSync(path, JSON.stringify(toJSON()))
554
+ const jsonStr = JSON.stringify(toJSON())
555
+ writeFileSync(path, config.encryptionKey ? encryptStoreJSON(jsonStr, config.encryptionKey) : jsonStr)
489
556
  },
490
557
  readFromFile: path => {
491
558
  // require fs here so that in case "fs" is not available -- the app does not crash
492
559
  const { readFileSync, existsSync } = require('fs')
493
560
  if (existsSync(path)) {
494
561
  logger.debug({ path }, 'reading from file')
495
- const jsonStr = readFileSync(path, { encoding: 'utf-8' })
562
+ const fileStr = readFileSync(path, { encoding: 'utf-8' })
563
+ const jsonStr = config.encryptionKey ? decryptStoreJSON(fileStr, config.encryptionKey) : fileStr
496
564
  const json = JSON.parse(jsonStr)
497
565
  fromJSON(json)
498
566
  }
567
+ },
568
+ /**
569
+ * Periodically writes the store to `path` every `intervalMs` (default 30s),
570
+ * and does one final write when the bound socket closes (if `registerSocketEndHandler`
571
+ * is available on it). Returns a function that stops the auto-save.
572
+ */
573
+ startAutoSave: (path, intervalMs = 30000) => {
574
+ const timer = setInterval(() => {
575
+ try {
576
+ const { writeFileSync } = require('fs')
577
+ const jsonStr = JSON.stringify(toJSON())
578
+ writeFileSync(path, config.encryptionKey ? encryptStoreJSON(jsonStr, config.encryptionKey) : jsonStr)
579
+ } catch (error) {
580
+ logger.warn({ error, path }, 'failed to auto-save store')
581
+ }
582
+ }, intervalMs)
583
+ if (timer.unref) timer.unref()
584
+ if (socket && typeof socket.registerSocketEndHandler === 'function') {
585
+ socket.registerSocketEndHandler(async () => {
586
+ try {
587
+ const { writeFileSync } = require('fs')
588
+ const jsonStr = JSON.stringify(toJSON())
589
+ writeFileSync(path, config.encryptionKey ? encryptStoreJSON(jsonStr, config.encryptionKey) : jsonStr)
590
+ logger.debug({ path }, 'final store flush on socket end')
591
+ } catch (error) {
592
+ logger.warn({ error, path }, 'failed to flush store on socket end')
593
+ }
594
+ })
595
+ }
596
+ return () => clearInterval(timer)
499
597
  }
500
598
  }
501
599
  }
@@ -0,0 +1,112 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.QueryIds = exports.XWAPaths = void 0
4
+ var XWAPaths
5
+ ;(function (XWAPaths) {
6
+ XWAPaths['xwa2_newsletter_create'] = 'xwa2_newsletter_create'
7
+ XWAPaths['xwa2_newsletter_subscribers'] = 'xwa2_newsletter_subscribers'
8
+ XWAPaths['xwa2_newsletter_view'] = 'xwa2_newsletter_view'
9
+ XWAPaths['xwa2_newsletter_metadata'] = 'xwa2_newsletter'
10
+ XWAPaths['xwa2_newsletter_admin_count'] = 'xwa2_newsletter_admin'
11
+ XWAPaths['xwa2_newsletter_mute_v2'] = 'xwa2_newsletter_mute_v2'
12
+ XWAPaths['xwa2_newsletter_unmute_v2'] = 'xwa2_newsletter_unmute_v2'
13
+ XWAPaths['xwa2_newsletter_follow'] = 'xwa2_newsletter_follow'
14
+ XWAPaths['xwa2_newsletter_unfollow'] = 'xwa2_newsletter_unfollow'
15
+ XWAPaths['xwa2_newsletter_join_v2'] = 'xwa2_newsletter_join_v2'
16
+ XWAPaths['xwa2_newsletter_leave_v2'] = 'xwa2_newsletter_leave_v2'
17
+ XWAPaths['xwa2_newsletter_change_owner'] = 'xwa2_newsletter_change_owner'
18
+ XWAPaths['xwa2_newsletter_demote'] = 'xwa2_newsletter_demote'
19
+ XWAPaths['xwa2_newsletter_delete_v2'] = 'xwa2_newsletter_delete_v2'
20
+ XWAPaths['xwa2_fetch_account_reachout_timelock'] = 'xwa2_fetch_account_reachout_timelock'
21
+ XWAPaths['xwa2_message_capping_info'] = 'xwa2_message_capping_info'
22
+ XWAPaths['xwa2_newsletter_subscribed'] = 'xwa2_newsletter_subscribed'
23
+ XWAPaths['xwa2_newsletter_update'] = 'xwa2_newsletter_update'
24
+ XWAPaths['xwa2_newsletter_admin'] = 'xwa2_newsletter_admin'
25
+ XWAPaths['xwa2_newsletter_admin_invite_create'] = 'xwa2_newsletter_admin_invite_create'
26
+ XWAPaths['xwa2_newsletter_admin_invite_revoke'] = 'xwa2_newsletter_admin_invite_revoke'
27
+ XWAPaths['xwa2_newsletter_admin_invite_accept'] = 'xwa2_newsletter_admin_invite_accept'
28
+ XWAPaths['xwa2_newsletter_admin_profile_update'] = 'xwa2_newsletter_admin_profile_update'
29
+ XWAPaths['xwa2_newsletter_admin_insights'] = 'xwa2_newsletter_admin_insights'
30
+ XWAPaths['xwa2_newsletter_following'] = 'xwa2_newsletter_following'
31
+ XWAPaths['xwa2_newsletter_create_verified'] = 'xwa2_newsletter_create_verified'
32
+ XWAPaths['xwa2_newsletter_enforcements'] = 'xwa2_newsletter_enforcements'
33
+ XWAPaths['xwa2_newsletter_user_reports'] = 'xwa2_newsletter_user_reports'
34
+ XWAPaths['xwa2_newsletter_create_report_appeal'] = 'xwa2_newsletter_create_report_appeal'
35
+ XWAPaths['xwa2_newsletter_link_preview_check'] = 'xwa2_newsletter_link_preview_check'
36
+ XWAPaths['xwa2_newsletter_update_verification'] = 'xwa2_newsletter_update_verification'
37
+ XWAPaths['xwa2_newsletter_label_paid_partnership'] = 'xwa2_newsletter_label_paid_partnership'
38
+ XWAPaths['xwa2_newsletter_log_exposures'] = 'xwa2_newsletter_log_exposures'
39
+ XWAPaths['xwa2_newsletter_update_user_setting'] = 'xwa2_newsletter_update_user_setting'
40
+ XWAPaths['xwa2_newsletter_ranking_features'] = 'xwa2_newsletter_ranking_features'
41
+ XWAPaths['xwa2_newsletter_block_user'] = 'xwa2_newsletter_block_user'
42
+ XWAPaths['xwa2_newsletters_directory_list'] = 'xwa2_newsletters_directory_list'
43
+ XWAPaths['xwa2_newsletters_directory_search'] = 'xwa2_newsletters_directory_search'
44
+ XWAPaths['xwa2_newsletters_directory_category_preview'] = 'xwa2_newsletters_directory_category_preview'
45
+ XWAPaths['xwa2_newsletters_search'] = 'xwa2_newsletters_search'
46
+ XWAPaths['xwa2_newsletters_recommended'] = 'xwa2_newsletters_recommended'
47
+ XWAPaths['xwa2_newsletters_similar'] = 'xwa2_newsletters_similar'
48
+ XWAPaths['xwa2_newsletters_poll_voter_list'] = 'xwa2_newsletters_poll_voter_list'
49
+ XWAPaths['xwa2_newsletters_reaction_sender_list'] = 'xwa2_newsletters_reaction_sender_list'
50
+ XWAPaths['xwa2_wamo_afs_age_collection'] = 'xwa2_wamo_afs_age_collection'
51
+ XWAPaths['xwa2_wamo_asset_collection'] = 'xwa2_wamo_asset_collection'
52
+ XWAPaths['xwa2_wamo_fetch_adhoc_notice_by_id'] = 'xwa2_wamo_fetch_adhoc_notice_by_id'
53
+ XWAPaths['xwa2_wamo_fetch_identity_token'] = 'xwa2_wamo_fetch_identity_token'
54
+ XWAPaths['xwa2_wamo_sub_get_compliance_info'] = 'xwa2_wamo_sub_get_compliance_info'
55
+ XWAPaths['xwa2_wamo_user_id_version'] = 'xwa2_wamo_user_id_version'
56
+ XWAPaths['xwa2_wamo_set_user_id_version'] = 'xwa2_wamo_set_user_id_version'
57
+ })((XWAPaths = exports.XWAPaths || (exports.XWAPaths = {})))
58
+ var QueryIds
59
+ ;(function (QueryIds) {
60
+ QueryIds['CREATE'] = '8823471724422422'
61
+ QueryIds['METADATA'] = '26099060629688646'
62
+ QueryIds['UPDATE_METADATA'] = '25976052865358570'
63
+ QueryIds['SUBSCRIBERS'] = '9783111038412085'
64
+ QueryIds['FOLLOW'] = '24404358912487870'
65
+ QueryIds['UNFOLLOW'] = '9767147403369991'
66
+ QueryIds['MUTE'] = '29766401636284406'
67
+ QueryIds['UNMUTE'] = '9864994326891137'
68
+ QueryIds['ADMIN_COUNT'] = '7130823597031706'
69
+ QueryIds['CHANGE_OWNER'] = '7341777602580933'
70
+ QueryIds['DEMOTE'] = '6551828931592903'
71
+ QueryIds['DELETE'] = '30062808666639665'
72
+ QueryIds['REACHOUT_TIMELOCK'] = '23983697327930364'
73
+ QueryIds['MESSAGE_CAPPING_INFO'] = '24503548349331633'
74
+ QueryIds['FETCH_SUBSCRIBE'] = '6388546374527196'
75
+ QueryIds['LEAVE'] = '9784043202933196'
76
+ QueryIds['ADMIN_INVITE'] = '7148599488585196'
77
+ QueryIds['ADMIN_INVITE_REVOKE'] = '6345824195482235'
78
+ QueryIds['ADMIN_INVITE_ACCEPT'] = '6345824195482236'
79
+ QueryIds['ADMIN_METADATA'] = '6895563180530100'
80
+ QueryIds['ADMIN_PROFILE_UPDATE'] = '6895563180530101'
81
+ QueryIds['INSIGHTS'] = '6243647912368353'
82
+ QueryIds['FOLLOWING_LIST'] = '6388546374527197'
83
+ QueryIds['CREATE_VERIFIED'] = '8823471724422423'
84
+ QueryIds['ENFORCEMENTS'] = '7130823597031707'
85
+ QueryIds['USER_REPORTS'] = '9783111038412086'
86
+ QueryIds['CREATE_REPORT_APPEAL'] = '6551828931592904'
87
+ QueryIds['LINK_PREVIEW_CHECK'] = '24404358912487871'
88
+ QueryIds['UPDATE_VERIFICATION'] = '25976052865358571'
89
+ QueryIds['LABEL_PAID_PARTNERSHIP'] = '7341777602580934'
90
+ QueryIds['LOG_EXPOSURES'] = '9864994326891138'
91
+ QueryIds['UPDATE_USER_SETTING'] = '29766401636284407'
92
+ QueryIds['RANKING_FEATURES'] = '7130823597031708'
93
+ QueryIds['BLOCK_USER'] = '6345824195482237'
94
+ QueryIds['DIRECTORY_LIST'] = '6388546374527198'
95
+ QueryIds['DIRECTORY_SEARCH'] = '6388546374527199'
96
+ QueryIds['DIRECTORY_CATEGORY_PREVIEW'] = '6388546374527200'
97
+ QueryIds['SEARCH'] = '26099060629688647'
98
+ QueryIds['RECOMMENDED'] = '26099060629688648'
99
+ QueryIds['SIMILAR'] = '26099060629688649'
100
+ QueryIds['POLL_VOTER_LIST'] = '9783111038412087'
101
+ QueryIds['REACTION_SENDERS_LIST'] = '9783111038412088'
102
+ QueryIds['WAMO_ENABLE_SUB'] = '7148599488585197'
103
+ QueryIds['WAMO_DISABLE_SUB'] = '7148599488585198'
104
+ QueryIds['WAMO_CHANGE_SUB'] = '7148599488585199'
105
+ QueryIds['WAMO_AFS_AGE_COLLECTION'] = '6895563180530102'
106
+ QueryIds['WAMO_ASSET_COLLECTION'] = '6895563180530103'
107
+ QueryIds['WAMO_FETCH_ADHOC_NOTICE'] = '6895563180530104'
108
+ QueryIds['WAMO_FETCH_IDENTITY_TOKEN'] = '6895563180530105'
109
+ QueryIds['WAMO_SUB_COMPLIANCE_INFO'] = '6895563180530106'
110
+ QueryIds['WAMO_USER_ID_VERSION'] = '6895563180530107'
111
+ QueryIds['WAMO_SET_USER_ID_VERSION'] = '6895563180530108'
112
+ })((QueryIds = exports.QueryIds || (exports.QueryIds = {})))
@@ -1,37 +1,10 @@
1
1
  'use strict'
2
2
  Object.defineProperty(exports, '__esModule', { value: true })
3
- exports.QueryIds =
4
- exports.XWAPaths =
5
- exports.NewsletterReactionSetting =
6
- exports.NewsletterState =
7
- exports.NewsletterRole =
8
- void 0
9
- var NewsletterRole
10
- ;(function (NewsletterRole) {
11
- NewsletterRole['SUBSCRIBER'] = 'SUBSCRIBER'
12
- NewsletterRole['ADMIN'] = 'ADMIN'
13
- NewsletterRole['OWNER'] = 'OWNER'
14
- NewsletterRole['GUEST'] = 'GUEST'
15
- })(NewsletterRole || (exports.NewsletterRole = NewsletterRole = {}))
16
- var NewsletterState
17
- ;(function (NewsletterState) {
18
- NewsletterState['ACTIVE'] = 'ACTIVE'
19
- NewsletterState['SUSPENDED'] = 'SUSPENDED'
20
- NewsletterState['GEO_SUSPENDED'] = 'GEO_SUSPENDED'
21
- NewsletterState['UNKNOWN'] = 'UNKNOWN'
22
- })(NewsletterState || (exports.NewsletterState = NewsletterState = {}))
23
- var NewsletterReactionSetting
24
- ;(function (NewsletterReactionSetting) {
25
- NewsletterReactionSetting['ALLOWLIST'] = 'ALLOWLIST'
26
- NewsletterReactionSetting['BLOCKLIST'] = 'BLOCKLIST'
27
- NewsletterReactionSetting['NONE'] = 'NONE'
28
- })(NewsletterReactionSetting || (exports.NewsletterReactionSetting = NewsletterReactionSetting = {}))
3
+ exports.QueryIds = exports.XWAPaths = void 0
29
4
  var XWAPaths
30
5
  ;(function (XWAPaths) {
31
6
  XWAPaths['xwa2_newsletter_create'] = 'xwa2_newsletter_create'
32
- // stale, kept only for backwards references — server no longer returns these keys, use _followers/_admin_demote below
33
7
  XWAPaths['xwa2_newsletter_subscribers'] = 'xwa2_newsletter_subscribers'
34
- XWAPaths['xwa2_newsletter_followers'] = 'xwa2_newsletter_followers'
35
8
  XWAPaths['xwa2_newsletter_view'] = 'xwa2_newsletter_view'
36
9
  XWAPaths['xwa2_newsletter_metadata'] = 'xwa2_newsletter'
37
10
  XWAPaths['xwa2_newsletter_admin_count'] = 'xwa2_newsletter_admin'
@@ -41,7 +14,6 @@ var XWAPaths
41
14
  XWAPaths['xwa2_newsletter_unfollow'] = 'xwa2_newsletter_unfollow'
42
15
  XWAPaths['xwa2_newsletter_change_owner'] = 'xwa2_newsletter_change_owner'
43
16
  XWAPaths['xwa2_newsletter_demote'] = 'xwa2_newsletter_demote'
44
- XWAPaths['xwa2_newsletter_admin_demote'] = 'xwa2_newsletter_admin_demote'
45
17
  XWAPaths['xwa2_newsletter_delete_v2'] = 'xwa2_newsletter_delete_v2'
46
18
  XWAPaths['xwa2_newsletter_join_v2'] = 'xwa2_newsletter_join_v2'
47
19
  XWAPaths['xwa2_newsletter_leave_v2'] = 'xwa2_newsletter_leave_v2'
@@ -77,7 +49,6 @@ var XWAPaths
77
49
  XWAPaths['xwa2_newsletter_update_user_setting'] = 'xwa2_newsletter_update_user_setting'
78
50
  XWAPaths['xwa2_newsletter_create_verified'] = 'xwa2_newsletter_create_verified'
79
51
  XWAPaths['xwa2_newsletter_ranking_features'] = 'xwa2_newsletter_ranking_features'
80
- XWAPaths['xwa2_newsletter_question_response_state_update'] = 'xwa2_newsletter_question_response_state_update'
81
52
  // Wamo paths
82
53
  XWAPaths['xwa2_wamo_afs_age_collection'] = 'xwa2_wamo_afs_age_collection'
83
54
  XWAPaths['xwa2_wamo_asset_collection'] = 'xwa2_wamo_asset_collection'
@@ -90,63 +61,61 @@ var XWAPaths
90
61
  var QueryIds
91
62
  ;(function (QueryIds) {
92
63
  // Newsletter core
93
- // IDs below marked "verified 2026-07-19" were cross-checked against a live WA Web
94
- // graphql module dump; the rest are unverified and may also be stale.
95
- QueryIds['CREATE'] = '25149874324715067' // NewsletterCreate — verified 2026-07-19
96
- QueryIds['CREATE_VERIFIED'] = '27777918425146464' // NewsletterCreateVerified
97
- QueryIds['UPDATE_METADATA'] = '27150690864552229' // NewsletterMetadataUpdate
98
- QueryIds['METADATA'] = '26629010453445271' // NewsletterMetadata
99
- QueryIds['SUBSCRIBERS'] = '27472091235714801' // NewsletterFollowers — verified 2026-07-19
100
- QueryIds['FOLLOW'] = '24404358912487870' // NewsletterJoin — verified 2026-07-19
101
- QueryIds['LEAVE'] = '9767147403369991' // NewsletterLeave — verified 2026-07-19
102
- QueryIds['UNFOLLOW'] = '9767147403369991' // NewsletterLeave (unfollow == leave) — verified 2026-07-19
103
- QueryIds['MUTE'] = '25033614912931367' // NewsletterHide
64
+ QueryIds['CREATE'] = '26278417231751160' // NewsletterCreate
65
+ QueryIds['CREATE_VERIFIED'] = '25691091733891788' // NewsletterCreateVerified
66
+ QueryIds['UPDATE_METADATA'] = '25976052865358570' // NewsletterMetadataUpdate
67
+ QueryIds['METADATA'] = '26099060629688650' // NewsletterMetadata
68
+ QueryIds['SUBSCRIBERS'] = '25646542368289350' // NewsletterFollowers
69
+ QueryIds['FOLLOW'] = '24658527423838740' // NewsletterJoin
70
+ QueryIds['LEAVE'] = '25758579043742316' // NewsletterLeave
71
+ QueryIds['UNFOLLOW'] = '25757497553878990' // NewsletterFollowing (used for unfollow path)
72
+ QueryIds['MUTE'] = '25033614912931370' // NewsletterHide
104
73
  QueryIds['UNMUTE'] = '24551592861177484' // NewsletterUnhide
105
74
  QueryIds['ADMIN_COUNT'] = '27579307995002556' // NewslettersAdminCapabilitiesQuery
106
- QueryIds['CHANGE_OWNER'] = '24737692515842078' // NewsletterChangeOwner
107
- QueryIds['DEMOTE'] = '9880997548630971' // NewsletterAdminDemote — verified 2026-07-19
108
- QueryIds['DELETE'] = '30062808666639665' // NewsletterDelete — verified 2026-07-19
109
- QueryIds['REACHOUT_TIMELOCK'] = '25627902213558773' // FetchReachoutTimelockQuery
110
- QueryIds['MESSAGE_CAPPING_INFO'] = '37491736743758664' // XWA2MessageCappingInfoQuery
111
- QueryIds['UPDATE_USER_SETTING'] = '24935528202764688' // NewsletterUpdateUserSetting
75
+ QueryIds['CHANGE_OWNER'] = '24737692515842080' // NewsletterChangeOwner
76
+ QueryIds['DEMOTE'] = '25054538847517280' // NewsletterAdminDemote
77
+ QueryIds['DELETE'] = '31838460859131916' // NewsletterDelete
78
+ QueryIds['REACHOUT_TIMELOCK'] = '25627902213558772' // FetchReachoutTimelockQuery
79
+ QueryIds['MESSAGE_CAPPING_INFO'] = '25311901238461920' // XWA2MessageCappingInfoQuery
80
+ QueryIds['UPDATE_USER_SETTING'] = '24935528202764690' // NewsletterUpdateUserSetting
112
81
  // Newsletter admin/invite
113
- QueryIds['ADMIN_INVITE'] = '26278681041745438' // NewsletterAdminInvite
82
+ QueryIds['ADMIN_INVITE'] = '26278681041745440' // NewsletterAdminInvite
114
83
  QueryIds['ADMIN_INVITE_REVOKE'] = '24369392486051948' // NewsletterAdminInviteRevoke
115
- QueryIds['ADMIN_INVITE_ACCEPT'] = '24934958956134858' // NewsletterAcceptAdminInvite
84
+ QueryIds['ADMIN_INVITE_ACCEPT'] = '24934958956134856' // NewsletterAcceptAdminInvite
116
85
  QueryIds['ADMIN_METADATA'] = '26882701001369256' // NewsletterAdminMetadataQuery
117
86
  QueryIds['ADMIN_PROFILE_UPDATE'] = '25959584293627630' // NewsletterAdminProfileUpdate
118
87
  // Newsletter directory/search
119
- QueryIds['DIRECTORY_LIST'] = '27480627564903390' // NewsletterDirectoryList
120
- QueryIds['DIRECTORY_SEARCH'] = '27887355094203575' // NewsletterDirectorySearch
121
- QueryIds['DIRECTORY_CATEGORY_PREVIEW'] = '27432651036395658' // NewsletterDirectoryCategoryPreview
122
- QueryIds['SEARCH'] = '25909596625362196' // NewsletterSearch (no APK match — kept as-is)
123
- QueryIds['RECOMMENDED'] = '26638880912457992' // NewsletterRecommended
124
- QueryIds['SIMILAR'] = '36410329795280256' // NewsletterSimilar
125
- QueryIds['FOLLOWING_LIST'] = '26856957210673444' // NewsletterFollowing
88
+ QueryIds['DIRECTORY_LIST'] = '35420207774244120' // NewsletterDirectoryList
89
+ QueryIds['DIRECTORY_SEARCH'] = '26545699395089024' // NewsletterDirectorySearch
90
+ QueryIds['DIRECTORY_CATEGORY_PREVIEW'] = '25554326764266960' // NewsletterDirectoryCategoryPreview
91
+ QueryIds['SEARCH'] = '25909596625362196' // NewsletterSearch
92
+ QueryIds['RECOMMENDED'] = '26234104032880280' // NewsletterRecommended
93
+ QueryIds['SIMILAR'] = '33639678252347084' // NewsletterSimilar
94
+ QueryIds['FOLLOWING_LIST'] = '25757497553878990' // NewsletterFollowing
126
95
  // Newsletter engagement
127
- QueryIds['INSIGHTS'] = '24672564052397921' // NewsletterInsights
96
+ QueryIds['INSIGHTS'] = '24672564052397920' // NewsletterInsights
128
97
  QueryIds['POLL_VOTER_LIST'] = '24803802869271956' // NewsletterPollVoterList
129
- QueryIds['REACTION_SENDERS_LIST'] = '25219734117717032' // NewsletterReactionSendersList
98
+ QueryIds['REACTION_SENDERS_LIST'] = '25219734117717030' // NewsletterReactionSendersList
130
99
  QueryIds['QUESTION_RESPONSE_STATE_UPDATE'] = '24896618076668076' // NewsletterQuestionResponseStateUpdate
131
- QueryIds['LOG_EXPOSURES'] = '24606408825709914' // NewsletterLogExposures
132
- QueryIds['RANKING_FEATURES'] = '24742757908756088' // FetchNewsletterRankingFeatures
100
+ QueryIds['LOG_EXPOSURES'] = '24606408825709910' // NewsletterLogExposures
101
+ QueryIds['RANKING_FEATURES'] = '24742757908756090' // FetchNewsletterRankingFeatures
133
102
  // Newsletter moderation
134
103
  QueryIds['BLOCK_USER'] = '25106066249006236' // NewsletterBlockUser
135
- QueryIds['USER_REPORTS'] = '27149305681394065' // NewsletterUserReports
136
- QueryIds['CREATE_REPORT_APPEAL'] = '27792557363683798' // NewsletterCreateReportAppeal
137
- QueryIds['ENFORCEMENTS'] = '27089116857425014' // NewsletterEnforcements
138
- QueryIds['LINK_PREVIEW_CHECK'] = '24188786150796507' // NewsletterLinkPreviewCheck
139
- QueryIds['UPDATE_VERIFICATION'] = '27133493439664458' // NewsletterUpdateVerification
140
- QueryIds['LABEL_PAID_PARTNERSHIP'] = '26102375079404865' // NewsletterLabelPaidPartnership
104
+ QueryIds['USER_REPORTS'] = '26334442806191824' // NewsletterUserReports
105
+ QueryIds['CREATE_REPORT_APPEAL'] = '26787508127520150' // NewsletterCreateReportAppeal
106
+ QueryIds['ENFORCEMENTS'] = '25956852020603264' // NewsletterEnforcements
107
+ QueryIds['LINK_PREVIEW_CHECK'] = '24188786150796508' // NewsletterLinkPreviewCheck
108
+ QueryIds['UPDATE_VERIFICATION'] = '33965625006384290' // NewsletterUpdateVerification
109
+ QueryIds['LABEL_PAID_PARTNERSHIP'] = '26221505494211176' // NewsletterLabelPaidPartnership
141
110
  // Newsletter Wamo (paid subscription)
142
- QueryIds['WAMO_CHANGE_SUB'] = '25201342542835866' // NewsletterChangeWamoSub
111
+ QueryIds['WAMO_CHANGE_SUB'] = '25201342542835864' // NewsletterChangeWamoSub
143
112
  QueryIds['WAMO_ENABLE_SUB'] = '25122474967344830' // NewsletterEnableWamoSub
144
113
  QueryIds['WAMO_DISABLE_SUB'] = '31916794074578680' // NewsletterDisableWamoSub
145
- QueryIds['WAMO_AFS_AGE_COLLECTION'] = '25012618978387375' // WamoAfsAgeCollection
146
- QueryIds['WAMO_ASSET_COLLECTION'] = '24347085218298773' // WamoAssetCollection
147
- QueryIds['WAMO_FETCH_ADHOC_NOTICE'] = '24758534413802422' // WamoFetchAdhocNoticeById
148
- QueryIds['WAMO_FETCH_IDENTITY_TOKEN'] = '24677346488597665' // WamoFetchIdentityToken
114
+ QueryIds['WAMO_AFS_AGE_COLLECTION'] = '25012618978387376' // WamoAfsAgeCollection
115
+ QueryIds['WAMO_ASSET_COLLECTION'] = '24347085218298772' // WamoAssetCollection
116
+ QueryIds['WAMO_FETCH_ADHOC_NOTICE'] = '24758534413802424' // WamoFetchAdhocNoticeById
117
+ QueryIds['WAMO_FETCH_IDENTITY_TOKEN'] = '24677346488597664' // WamoFetchIdentityToken
149
118
  QueryIds['WAMO_SUB_COMPLIANCE_INFO'] = '25105596879072480' // WamoSubGetComplianceInfo
150
- QueryIds['WAMO_USER_ID_VERSION'] = '24958410737155269' // WamoUserIdVersion
119
+ QueryIds['WAMO_USER_ID_VERSION'] = '24958410737155268' // WamoUserIdVersion
151
120
  QueryIds['WAMO_SET_USER_ID_VERSION'] = '8148672891859281' // SetWamoUserIdVersion
152
121
  })(QueryIds || (exports.QueryIds = QueryIds = {}))
@@ -39,6 +39,7 @@ __exportStar(require('./Product'), exports)
39
39
  __exportStar(require('./Call'), exports)
40
40
  __exportStar(require('./Signal'), exports)
41
41
  __exportStar(require('./Newsletter'), exports)
42
+ __exportStar(require('./Mex'), exports)
42
43
  var DisconnectReason
43
44
  ;(function (DisconnectReason) {
44
45
  DisconnectReason[(DisconnectReason['connectionClosed'] = 428)] = 'connectionClosed'