@openclaw/crabline 0.1.10 → 0.1.12

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 (197) hide show
  1. package/README.md +99 -12
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +264 -50
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/matrix-ids.d.ts +5 -0
  31. package/dist/src/matrix-ids.js +83 -0
  32. package/dist/src/matrix-ids.js.map +1 -0
  33. package/dist/src/openclaw/artifact-generation.d.ts +12 -2
  34. package/dist/src/openclaw/artifact-generation.js +436 -15
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  36. package/dist/src/openclaw/bridges/matrix.js +21 -4
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +13 -8
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  41. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  42. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  43. package/dist/src/openclaw/bridges/signal.js +15 -6
  44. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  45. package/dist/src/openclaw/bridges/slack.js +116 -23
  46. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  47. package/dist/src/openclaw/bridges/telegram.js +45 -19
  48. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  49. package/dist/src/openclaw/bridges/whatsapp.js +32 -16
  50. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  51. package/dist/src/openclaw/bridges/zalo.js +8 -3
  52. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  53. package/dist/src/openclaw/private-file.d.ts +40 -3
  54. package/dist/src/openclaw/private-file.js +2070 -95
  55. package/dist/src/openclaw/private-file.js.map +1 -1
  56. package/dist/src/openclaw/shared.d.ts +1 -0
  57. package/dist/src/openclaw/shared.js +48 -13
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +9 -0
  60. package/dist/src/openclaw/smoke-lock.js +696 -187
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -1
  62. package/dist/src/openclaw.js +352 -29
  63. package/dist/src/openclaw.js.map +1 -1
  64. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  65. package/dist/src/platform/process-owned-lock.js +1698 -0
  66. package/dist/src/platform/process-owned-lock.js.map +1 -0
  67. package/dist/src/platform/recorder-directory.d.ts +1 -0
  68. package/dist/src/platform/recorder-directory.js +14 -0
  69. package/dist/src/platform/recorder-directory.js.map +1 -0
  70. package/dist/src/platform/windows-acl.d.ts +18 -0
  71. package/dist/src/platform/windows-acl.js +1367 -0
  72. package/dist/src/platform/windows-acl.js.map +1 -0
  73. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  74. package/dist/src/platform/windows-lock-root.js +98 -0
  75. package/dist/src/platform/windows-lock-root.js.map +1 -0
  76. package/dist/src/providers/builtin/discord.d.ts +4 -0
  77. package/dist/src/providers/builtin/discord.js +52 -9
  78. package/dist/src/providers/builtin/discord.js.map +1 -1
  79. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  80. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  81. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  82. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  83. package/dist/src/providers/builtin/feishu.js +96 -26
  84. package/dist/src/providers/builtin/feishu.js.map +1 -1
  85. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  86. package/dist/src/providers/builtin/googlechat.js +95 -26
  87. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  88. package/dist/src/providers/builtin/imessage.js +60 -17
  89. package/dist/src/providers/builtin/imessage.js.map +1 -1
  90. package/dist/src/providers/builtin/loopback.js +88 -35
  91. package/dist/src/providers/builtin/loopback.js.map +1 -1
  92. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  93. package/dist/src/providers/builtin/matrix.js +78 -21
  94. package/dist/src/providers/builtin/matrix.js.map +1 -1
  95. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  96. package/dist/src/providers/builtin/mattermost.js +138 -24
  97. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  98. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  99. package/dist/src/providers/builtin/msteams.js +118 -38
  100. package/dist/src/providers/builtin/msteams.js.map +1 -1
  101. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  102. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  103. package/dist/src/providers/builtin/script.js +1057 -146
  104. package/dist/src/providers/builtin/script.js.map +1 -1
  105. package/dist/src/providers/builtin/slack.d.ts +8 -1
  106. package/dist/src/providers/builtin/slack.js +327 -24
  107. package/dist/src/providers/builtin/slack.js.map +1 -1
  108. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  109. package/dist/src/providers/builtin/telegram.js +55 -14
  110. package/dist/src/providers/builtin/telegram.js.map +1 -1
  111. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  112. package/dist/src/providers/builtin/whatsapp.js +157 -29
  113. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  114. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  115. package/dist/src/providers/builtin/zalo.js +31 -7
  116. package/dist/src/providers/builtin/zalo.js.map +1 -1
  117. package/dist/src/providers/catalog.d.ts +1 -1
  118. package/dist/src/providers/catalog.js +1 -1
  119. package/dist/src/providers/catalog.js.map +1 -1
  120. package/dist/src/providers/local-mock.d.ts +4 -0
  121. package/dist/src/providers/local-mock.js +162 -35
  122. package/dist/src/providers/local-mock.js.map +1 -1
  123. package/dist/src/providers/native-ids.d.ts +2 -0
  124. package/dist/src/providers/native-ids.js +3 -0
  125. package/dist/src/providers/native-ids.js.map +1 -1
  126. package/dist/src/providers/recorder.d.ts +14 -3
  127. package/dist/src/providers/recorder.js +532 -42
  128. package/dist/src/providers/recorder.js.map +1 -1
  129. package/dist/src/providers/registry.d.ts +1 -0
  130. package/dist/src/providers/registry.js +65 -20
  131. package/dist/src/providers/registry.js.map +1 -1
  132. package/dist/src/providers/signed-jwt.d.ts +6 -1
  133. package/dist/src/providers/signed-jwt.js +241 -50
  134. package/dist/src/providers/signed-jwt.js.map +1 -1
  135. package/dist/src/providers/slack-ids.d.ts +1 -0
  136. package/dist/src/providers/slack-ids.js +5 -0
  137. package/dist/src/providers/slack-ids.js.map +1 -1
  138. package/dist/src/providers/target-normalizers.d.ts +9 -1
  139. package/dist/src/providers/target-normalizers.js +177 -58
  140. package/dist/src/providers/target-normalizers.js.map +1 -1
  141. package/dist/src/providers/webhook-server.d.ts +3 -0
  142. package/dist/src/providers/webhook-server.js +268 -47
  143. package/dist/src/providers/webhook-server.js.map +1 -1
  144. package/dist/src/servers/http.d.ts +14 -2
  145. package/dist/src/servers/http.js +229 -58
  146. package/dist/src/servers/http.js.map +1 -1
  147. package/dist/src/servers/matrix.d.ts +3 -0
  148. package/dist/src/servers/matrix.js +268 -110
  149. package/dist/src/servers/matrix.js.map +1 -1
  150. package/dist/src/servers/mattermost.d.ts +5 -0
  151. package/dist/src/servers/mattermost.js +389 -91
  152. package/dist/src/servers/mattermost.js.map +1 -1
  153. package/dist/src/servers/recorder.d.ts +11 -0
  154. package/dist/src/servers/recorder.js +1241 -22
  155. package/dist/src/servers/recorder.js.map +1 -1
  156. package/dist/src/servers/signal.d.ts +1 -0
  157. package/dist/src/servers/signal.js +279 -44
  158. package/dist/src/servers/signal.js.map +1 -1
  159. package/dist/src/servers/slack.d.ts +15 -0
  160. package/dist/src/servers/slack.js +259 -51
  161. package/dist/src/servers/slack.js.map +1 -1
  162. package/dist/src/servers/telegram-identity.d.ts +6 -0
  163. package/dist/src/servers/telegram-identity.js +27 -0
  164. package/dist/src/servers/telegram-identity.js.map +1 -0
  165. package/dist/src/servers/telegram.d.ts +17 -6
  166. package/dist/src/servers/telegram.js +1193 -118
  167. package/dist/src/servers/telegram.js.map +1 -1
  168. package/dist/src/servers/webhook-target.d.ts +12 -4
  169. package/dist/src/servers/webhook-target.js +226 -28
  170. package/dist/src/servers/webhook-target.js.map +1 -1
  171. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  172. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  173. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  174. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  175. package/dist/src/servers/whatsapp-jid.js +9 -5
  176. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  177. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  178. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  179. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  181. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  182. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  183. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  184. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  185. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  186. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  187. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  188. package/dist/src/servers/whatsapp.d.ts +7 -0
  189. package/dist/src/servers/whatsapp.js +149 -24
  190. package/dist/src/servers/whatsapp.js.map +1 -1
  191. package/dist/src/servers/zalo.d.ts +1 -0
  192. package/dist/src/servers/zalo.js +193 -82
  193. package/dist/src/servers/zalo.js.map +1 -1
  194. package/docs/channel-setup.md +185 -43
  195. package/fixtures/examples/crabline.example.yaml +3 -2
  196. package/package.json +18 -10
  197. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -1,4 +1,5 @@
1
1
  import { Buffer } from "node:buffer";
2
+ const MAX_PROTOBUF_GROUP_DEPTH = 64;
2
3
  export function decodeHandshakeMessage(data) {
3
4
  const reader = new ProtoReader(data);
4
5
  const message = {};
@@ -7,42 +8,125 @@ export function decodeHandshakeMessage(data) {
7
8
  const field = tag >>> 3;
8
9
  if (field === 2) {
9
10
  requireBytesWireType(tag, field);
10
- message.clientHello = decodeClientHello(reader.bytes());
11
+ message.clientHello = {
12
+ ...message.clientHello,
13
+ ...decodeClientHello(reader.bytes()),
14
+ };
15
+ }
16
+ else if (field === 3) {
17
+ requireBytesWireType(tag, field);
18
+ message.serverHello = {
19
+ ...message.serverHello,
20
+ ...decodeServerHello(reader.bytes()),
21
+ };
11
22
  }
12
23
  else if (field === 4) {
13
24
  requireBytesWireType(tag, field);
14
- message.clientFinish = decodeClientFinish(reader.bytes());
25
+ message.clientFinish = {
26
+ ...message.clientFinish,
27
+ ...decodeClientFinish(reader.bytes()),
28
+ };
15
29
  }
16
30
  else {
17
- reader.skip(tag & 7);
31
+ reader.skip(field, tag & 7);
18
32
  }
19
33
  }
20
34
  return message;
21
35
  }
22
36
  export function encodeHandshakeMessage(message) {
23
37
  const writer = new ProtoWriter();
38
+ if (message.clientHello) {
39
+ writer.bytesField(2, encodeClientHello(message.clientHello));
40
+ }
24
41
  if (message.serverHello) {
25
42
  writer.bytesField(3, encodeServerHello(message.serverHello));
26
43
  }
44
+ if (message.clientFinish) {
45
+ writer.bytesField(4, encodeClientFinish(message.clientFinish));
46
+ }
27
47
  return writer.finish();
28
48
  }
29
49
  function decodeClientHello(data) {
30
50
  const reader = new ProtoReader(data);
31
51
  let ephemeral;
52
+ let extendedCiphertext;
53
+ let payload;
54
+ let staticKey;
55
+ let useExtended;
32
56
  while (!reader.done()) {
33
57
  const tag = reader.tag();
34
- if (tag >>> 3 === 1) {
35
- requireBytesWireType(tag, 1);
58
+ const field = tag >>> 3;
59
+ if (field === 1) {
60
+ requireBytesWireType(tag, field);
36
61
  ephemeral = reader.bytes();
37
62
  }
63
+ else if (field === 2) {
64
+ requireBytesWireType(tag, field);
65
+ staticKey = reader.bytes();
66
+ }
67
+ else if (field === 3) {
68
+ requireBytesWireType(tag, field);
69
+ payload = reader.bytes();
70
+ }
71
+ else if (field === 4) {
72
+ requireVarintWireType(tag, field);
73
+ useExtended = reader.uint32() !== 0;
74
+ }
75
+ else if (field === 5) {
76
+ requireBytesWireType(tag, field);
77
+ extendedCiphertext = reader.bytes();
78
+ }
38
79
  else {
39
- reader.skip(tag & 7);
80
+ reader.skip(field, tag & 7);
40
81
  }
41
82
  }
42
- return ephemeral === undefined ? {} : { ephemeral };
83
+ return {
84
+ ...(ephemeral === undefined ? {} : { ephemeral }),
85
+ ...(extendedCiphertext === undefined ? {} : { extendedCiphertext }),
86
+ ...(payload === undefined ? {} : { payload }),
87
+ ...(staticKey === undefined ? {} : { staticKey }),
88
+ ...(useExtended === undefined ? {} : { useExtended }),
89
+ };
90
+ }
91
+ function decodeServerHello(data) {
92
+ const reader = new ProtoReader(data);
93
+ let ephemeral;
94
+ let extendedStatic;
95
+ let payload;
96
+ let staticKey;
97
+ while (!reader.done()) {
98
+ const tag = reader.tag();
99
+ const field = tag >>> 3;
100
+ if (field === 1) {
101
+ requireBytesWireType(tag, field);
102
+ ephemeral = reader.bytes();
103
+ }
104
+ else if (field === 2) {
105
+ requireBytesWireType(tag, field);
106
+ staticKey = reader.bytes();
107
+ }
108
+ else if (field === 3) {
109
+ requireBytesWireType(tag, field);
110
+ payload = reader.bytes();
111
+ }
112
+ else if (field === 4) {
113
+ requireBytesWireType(tag, field);
114
+ extendedStatic = reader.bytes();
115
+ }
116
+ else {
117
+ reader.skip(field, tag & 7);
118
+ }
119
+ }
120
+ return {
121
+ ...(ephemeral === undefined ? {} : { ephemeral }),
122
+ ...(extendedStatic === undefined ? {} : { extendedStatic }),
123
+ ...(payload === undefined ? {} : { payload }),
124
+ ...(staticKey === undefined ? {} : { staticKey }),
125
+ };
43
126
  }
44
127
  function decodeClientFinish(data) {
45
128
  const reader = new ProtoReader(data);
129
+ let extendedCiphertext;
46
130
  let payload;
47
131
  let staticKey;
48
132
  while (!reader.done()) {
@@ -56,26 +140,78 @@ function decodeClientFinish(data) {
56
140
  requireBytesWireType(tag, field);
57
141
  payload = reader.bytes();
58
142
  }
143
+ else if (field === 3) {
144
+ requireBytesWireType(tag, field);
145
+ extendedCiphertext = reader.bytes();
146
+ }
59
147
  else {
60
- reader.skip(tag & 7);
148
+ reader.skip(field, tag & 7);
61
149
  }
62
150
  }
63
151
  return {
152
+ ...(extendedCiphertext === undefined ? {} : { extendedCiphertext }),
64
153
  ...(payload === undefined ? {} : { payload }),
65
154
  ...(staticKey === undefined ? {} : { staticKey }),
66
155
  };
67
156
  }
157
+ function encodeClientHello(clientHello) {
158
+ const writer = new ProtoWriter();
159
+ if (clientHello.ephemeral !== undefined) {
160
+ writer.bytesField(1, clientHello.ephemeral);
161
+ }
162
+ if (clientHello.staticKey !== undefined) {
163
+ writer.bytesField(2, clientHello.staticKey);
164
+ }
165
+ if (clientHello.payload !== undefined) {
166
+ writer.bytesField(3, clientHello.payload);
167
+ }
168
+ if (clientHello.useExtended !== undefined) {
169
+ writer.boolField(4, clientHello.useExtended);
170
+ }
171
+ if (clientHello.extendedCiphertext !== undefined) {
172
+ writer.bytesField(5, clientHello.extendedCiphertext);
173
+ }
174
+ return writer.finish();
175
+ }
176
+ function encodeClientFinish(clientFinish) {
177
+ const writer = new ProtoWriter();
178
+ if (clientFinish.staticKey !== undefined) {
179
+ writer.bytesField(1, clientFinish.staticKey);
180
+ }
181
+ if (clientFinish.payload !== undefined) {
182
+ writer.bytesField(2, clientFinish.payload);
183
+ }
184
+ if (clientFinish.extendedCiphertext !== undefined) {
185
+ writer.bytesField(3, clientFinish.extendedCiphertext);
186
+ }
187
+ return writer.finish();
188
+ }
68
189
  function requireBytesWireType(tag, field) {
69
190
  const wireType = tag & 7;
70
191
  if (wireType !== 2) {
71
192
  throw new Error(`Invalid WhatsApp handshake wire type ${wireType} for length-delimited field ${field}.`);
72
193
  }
73
194
  }
195
+ function requireVarintWireType(tag, field) {
196
+ const wireType = tag & 7;
197
+ if (wireType !== 0) {
198
+ throw new Error(`Invalid WhatsApp handshake wire type ${wireType} for varint field ${field}.`);
199
+ }
200
+ }
74
201
  function encodeServerHello(serverHello) {
75
202
  const writer = new ProtoWriter();
76
- writer.bytesField(1, serverHello.ephemeral);
77
- writer.bytesField(2, serverHello.staticKey);
78
- writer.bytesField(3, serverHello.payload);
203
+ if (serverHello.ephemeral !== undefined) {
204
+ writer.bytesField(1, serverHello.ephemeral);
205
+ }
206
+ if (serverHello.staticKey !== undefined) {
207
+ writer.bytesField(2, serverHello.staticKey);
208
+ }
209
+ if (serverHello.payload !== undefined) {
210
+ writer.bytesField(3, serverHello.payload);
211
+ }
212
+ if (serverHello.extendedStatic !== undefined) {
213
+ writer.bytesField(4, serverHello.extendedStatic);
214
+ }
79
215
  return writer.finish();
80
216
  }
81
217
  class ProtoReader {
@@ -94,7 +230,7 @@ class ProtoReader {
94
230
  this.#offset += length;
95
231
  return value;
96
232
  }
97
- skip(wireType) {
233
+ skip(field, wireType, groupDepth = 0) {
98
234
  if (wireType === 0) {
99
235
  this.#skipVarint();
100
236
  return;
@@ -110,6 +246,27 @@ class ProtoReader {
110
246
  this.#offset += length;
111
247
  return;
112
248
  }
249
+ if (wireType === 3) {
250
+ if (groupDepth >= MAX_PROTOBUF_GROUP_DEPTH) {
251
+ throw new Error("WhatsApp handshake protobuf group nesting exceeds the supported depth.");
252
+ }
253
+ while (!this.done()) {
254
+ const tag = this.tag();
255
+ const nestedField = tag >>> 3;
256
+ const nestedWireType = tag & 7;
257
+ if (nestedWireType === 4) {
258
+ if (nestedField !== field) {
259
+ throw new Error("Mismatched WhatsApp handshake protobuf end group.");
260
+ }
261
+ return;
262
+ }
263
+ this.skip(nestedField, nestedWireType, groupDepth + 1);
264
+ }
265
+ throw new Error("Unterminated WhatsApp handshake protobuf group.");
266
+ }
267
+ if (wireType === 4) {
268
+ throw new Error("Unexpected WhatsApp handshake protobuf end group.");
269
+ }
113
270
  if (wireType === 5) {
114
271
  this.#require(4);
115
272
  this.#offset += 4;
@@ -167,6 +324,10 @@ class ProtoReader {
167
324
  }
168
325
  class ProtoWriter {
169
326
  #parts = [];
327
+ boolField(field, value) {
328
+ this.uint32(field << 3);
329
+ this.uint32(value ? 1 : 0);
330
+ }
170
331
  bytesField(field, value) {
171
332
  this.uint32((field << 3) | 2);
172
333
  this.uint32(value.byteLength);
@@ -1 +1 @@
1
- {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/handshake.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\n\ntype BytesField = Buffer | undefined;\n\nexport type HandshakeMessage = {\n clientFinish?: {\n payload?: Buffer;\n staticKey?: Buffer;\n };\n clientHello?: {\n ephemeral?: Buffer;\n };\n serverHello?: {\n ephemeral: Uint8Array;\n payload: Uint8Array;\n staticKey: Uint8Array;\n };\n};\n\nexport function decodeHandshakeMessage(data: Uint8Array): HandshakeMessage {\n const reader = new ProtoReader(data);\n const message: HandshakeMessage = {};\n while (!reader.done()) {\n const tag = reader.tag();\n const field = tag >>> 3;\n if (field === 2) {\n requireBytesWireType(tag, field);\n message.clientHello = decodeClientHello(reader.bytes());\n } else if (field === 4) {\n requireBytesWireType(tag, field);\n message.clientFinish = decodeClientFinish(reader.bytes());\n } else {\n reader.skip(tag & 7);\n }\n }\n return message;\n}\n\nexport function encodeHandshakeMessage(message: HandshakeMessage): Buffer {\n const writer = new ProtoWriter();\n if (message.serverHello) {\n writer.bytesField(3, encodeServerHello(message.serverHello));\n }\n return writer.finish();\n}\n\nfunction decodeClientHello(data: Uint8Array): NonNullable<HandshakeMessage[\"clientHello\"]> {\n const reader = new ProtoReader(data);\n let ephemeral: BytesField;\n while (!reader.done()) {\n const tag = reader.tag();\n if (tag >>> 3 === 1) {\n requireBytesWireType(tag, 1);\n ephemeral = reader.bytes();\n } else {\n reader.skip(tag & 7);\n }\n }\n return ephemeral === undefined ? {} : { ephemeral };\n}\n\nfunction decodeClientFinish(data: Uint8Array): NonNullable<HandshakeMessage[\"clientFinish\"]> {\n const reader = new ProtoReader(data);\n let payload: BytesField;\n let staticKey: BytesField;\n while (!reader.done()) {\n const tag = reader.tag();\n const field = tag >>> 3;\n if (field === 1) {\n requireBytesWireType(tag, field);\n staticKey = reader.bytes();\n } else if (field === 2) {\n requireBytesWireType(tag, field);\n payload = reader.bytes();\n } else {\n reader.skip(tag & 7);\n }\n }\n return {\n ...(payload === undefined ? {} : { payload }),\n ...(staticKey === undefined ? {} : { staticKey }),\n };\n}\n\nfunction requireBytesWireType(tag: number, field: number): void {\n const wireType = tag & 7;\n if (wireType !== 2) {\n throw new Error(\n `Invalid WhatsApp handshake wire type ${wireType} for length-delimited field ${field}.`,\n );\n }\n}\n\nfunction encodeServerHello(serverHello: NonNullable<HandshakeMessage[\"serverHello\"]>): Buffer {\n const writer = new ProtoWriter();\n writer.bytesField(1, serverHello.ephemeral);\n writer.bytesField(2, serverHello.staticKey);\n writer.bytesField(3, serverHello.payload);\n return writer.finish();\n}\n\nclass ProtoReader {\n #offset = 0;\n readonly #buffer: Buffer;\n\n constructor(data: Uint8Array) {\n this.#buffer = Buffer.from(data);\n }\n\n done(): boolean {\n return this.#offset >= this.#buffer.length;\n }\n\n bytes(): Buffer {\n const length = this.uint32();\n this.#require(length);\n const value = this.#buffer.subarray(this.#offset, this.#offset + length);\n this.#offset += length;\n return value;\n }\n\n skip(wireType: number): void {\n if (wireType === 0) {\n this.#skipVarint();\n return;\n }\n if (wireType === 1) {\n this.#require(8);\n this.#offset += 8;\n return;\n }\n if (wireType === 2) {\n const length = this.uint32();\n this.#require(length);\n this.#offset += length;\n return;\n }\n if (wireType === 5) {\n this.#require(4);\n this.#offset += 4;\n return;\n }\n throw new Error(`Unsupported WhatsApp handshake wire type: ${wireType}.`);\n }\n\n tag(): number {\n const tag = this.uint32();\n if (tag >>> 3 === 0) {\n throw new Error(\"Invalid WhatsApp handshake protobuf field number 0.\");\n }\n return tag;\n }\n\n uint32(): number {\n let value = 0;\n let shift = 0;\n while (shift < 32) {\n this.#require(1);\n const byte = this.#buffer[this.#offset];\n this.#offset += 1;\n if (byte === undefined) {\n throw new Error(\"Unexpected end of WhatsApp handshake protobuf.\");\n }\n if (shift === 28 && byte > 0x0f) {\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n value |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return value >>> 0;\n }\n shift += 7;\n }\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n\n #skipVarint(): void {\n for (let index = 0; index < 10; index += 1) {\n this.#require(1);\n const byte = this.#buffer[this.#offset];\n this.#offset += 1;\n if (byte === undefined || (index === 9 && byte > 1)) {\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n if ((byte & 0x80) === 0) {\n return;\n }\n }\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n\n #require(length: number): void {\n if (this.#offset + length > this.#buffer.length) {\n throw new Error(\"Unexpected end of WhatsApp handshake protobuf.\");\n }\n }\n}\n\nclass ProtoWriter {\n readonly #parts: Buffer[] = [];\n\n bytesField(field: number, value: Uint8Array): void {\n this.uint32((field << 3) | 2);\n this.uint32(value.byteLength);\n this.#parts.push(Buffer.from(value));\n }\n\n finish(): Buffer {\n return Buffer.concat(this.#parts);\n }\n\n uint32(value: number): void {\n let remaining = value >>> 0;\n const bytes: number[] = [];\n while (remaining > 127) {\n bytes.push((remaining & 0x7f) | 0x80);\n remaining >>>= 7;\n }\n bytes.push(remaining);\n this.#parts.push(Buffer.from(bytes));\n }\n}\n"]}
1
+ {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/handshake.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\n\ntype BytesField = Buffer | undefined;\nconst MAX_PROTOBUF_GROUP_DEPTH = 64;\n\nexport type HandshakeMessage = {\n clientFinish?: {\n extendedCiphertext?: Buffer;\n payload?: Buffer;\n staticKey?: Buffer;\n };\n clientHello?: {\n ephemeral?: Buffer;\n extendedCiphertext?: Buffer;\n payload?: Buffer;\n staticKey?: Buffer;\n useExtended?: boolean;\n };\n serverHello?: {\n ephemeral?: Uint8Array;\n extendedStatic?: Uint8Array;\n payload?: Uint8Array;\n staticKey?: Uint8Array;\n };\n};\n\nexport function decodeHandshakeMessage(data: Uint8Array): HandshakeMessage {\n const reader = new ProtoReader(data);\n const message: HandshakeMessage = {};\n while (!reader.done()) {\n const tag = reader.tag();\n const field = tag >>> 3;\n if (field === 2) {\n requireBytesWireType(tag, field);\n message.clientHello = {\n ...message.clientHello,\n ...decodeClientHello(reader.bytes()),\n };\n } else if (field === 3) {\n requireBytesWireType(tag, field);\n message.serverHello = {\n ...message.serverHello,\n ...decodeServerHello(reader.bytes()),\n };\n } else if (field === 4) {\n requireBytesWireType(tag, field);\n message.clientFinish = {\n ...message.clientFinish,\n ...decodeClientFinish(reader.bytes()),\n };\n } else {\n reader.skip(field, tag & 7);\n }\n }\n return message;\n}\n\nexport function encodeHandshakeMessage(message: HandshakeMessage): Buffer {\n const writer = new ProtoWriter();\n if (message.clientHello) {\n writer.bytesField(2, encodeClientHello(message.clientHello));\n }\n if (message.serverHello) {\n writer.bytesField(3, encodeServerHello(message.serverHello));\n }\n if (message.clientFinish) {\n writer.bytesField(4, encodeClientFinish(message.clientFinish));\n }\n return writer.finish();\n}\n\nfunction decodeClientHello(data: Uint8Array): NonNullable<HandshakeMessage[\"clientHello\"]> {\n const reader = new ProtoReader(data);\n let ephemeral: BytesField;\n let extendedCiphertext: BytesField;\n let payload: BytesField;\n let staticKey: BytesField;\n let useExtended: boolean | undefined;\n while (!reader.done()) {\n const tag = reader.tag();\n const field = tag >>> 3;\n if (field === 1) {\n requireBytesWireType(tag, field);\n ephemeral = reader.bytes();\n } else if (field === 2) {\n requireBytesWireType(tag, field);\n staticKey = reader.bytes();\n } else if (field === 3) {\n requireBytesWireType(tag, field);\n payload = reader.bytes();\n } else if (field === 4) {\n requireVarintWireType(tag, field);\n useExtended = reader.uint32() !== 0;\n } else if (field === 5) {\n requireBytesWireType(tag, field);\n extendedCiphertext = reader.bytes();\n } else {\n reader.skip(field, tag & 7);\n }\n }\n return {\n ...(ephemeral === undefined ? {} : { ephemeral }),\n ...(extendedCiphertext === undefined ? {} : { extendedCiphertext }),\n ...(payload === undefined ? {} : { payload }),\n ...(staticKey === undefined ? {} : { staticKey }),\n ...(useExtended === undefined ? {} : { useExtended }),\n };\n}\n\nfunction decodeServerHello(data: Uint8Array): NonNullable<HandshakeMessage[\"serverHello\"]> {\n const reader = new ProtoReader(data);\n let ephemeral: BytesField;\n let extendedStatic: BytesField;\n let payload: BytesField;\n let staticKey: BytesField;\n while (!reader.done()) {\n const tag = reader.tag();\n const field = tag >>> 3;\n if (field === 1) {\n requireBytesWireType(tag, field);\n ephemeral = reader.bytes();\n } else if (field === 2) {\n requireBytesWireType(tag, field);\n staticKey = reader.bytes();\n } else if (field === 3) {\n requireBytesWireType(tag, field);\n payload = reader.bytes();\n } else if (field === 4) {\n requireBytesWireType(tag, field);\n extendedStatic = reader.bytes();\n } else {\n reader.skip(field, tag & 7);\n }\n }\n return {\n ...(ephemeral === undefined ? {} : { ephemeral }),\n ...(extendedStatic === undefined ? {} : { extendedStatic }),\n ...(payload === undefined ? {} : { payload }),\n ...(staticKey === undefined ? {} : { staticKey }),\n };\n}\n\nfunction decodeClientFinish(data: Uint8Array): NonNullable<HandshakeMessage[\"clientFinish\"]> {\n const reader = new ProtoReader(data);\n let extendedCiphertext: BytesField;\n let payload: BytesField;\n let staticKey: BytesField;\n while (!reader.done()) {\n const tag = reader.tag();\n const field = tag >>> 3;\n if (field === 1) {\n requireBytesWireType(tag, field);\n staticKey = reader.bytes();\n } else if (field === 2) {\n requireBytesWireType(tag, field);\n payload = reader.bytes();\n } else if (field === 3) {\n requireBytesWireType(tag, field);\n extendedCiphertext = reader.bytes();\n } else {\n reader.skip(field, tag & 7);\n }\n }\n return {\n ...(extendedCiphertext === undefined ? {} : { extendedCiphertext }),\n ...(payload === undefined ? {} : { payload }),\n ...(staticKey === undefined ? {} : { staticKey }),\n };\n}\n\nfunction encodeClientHello(clientHello: NonNullable<HandshakeMessage[\"clientHello\"]>): Buffer {\n const writer = new ProtoWriter();\n if (clientHello.ephemeral !== undefined) {\n writer.bytesField(1, clientHello.ephemeral);\n }\n if (clientHello.staticKey !== undefined) {\n writer.bytesField(2, clientHello.staticKey);\n }\n if (clientHello.payload !== undefined) {\n writer.bytesField(3, clientHello.payload);\n }\n if (clientHello.useExtended !== undefined) {\n writer.boolField(4, clientHello.useExtended);\n }\n if (clientHello.extendedCiphertext !== undefined) {\n writer.bytesField(5, clientHello.extendedCiphertext);\n }\n return writer.finish();\n}\n\nfunction encodeClientFinish(clientFinish: NonNullable<HandshakeMessage[\"clientFinish\"]>): Buffer {\n const writer = new ProtoWriter();\n if (clientFinish.staticKey !== undefined) {\n writer.bytesField(1, clientFinish.staticKey);\n }\n if (clientFinish.payload !== undefined) {\n writer.bytesField(2, clientFinish.payload);\n }\n if (clientFinish.extendedCiphertext !== undefined) {\n writer.bytesField(3, clientFinish.extendedCiphertext);\n }\n return writer.finish();\n}\n\nfunction requireBytesWireType(tag: number, field: number): void {\n const wireType = tag & 7;\n if (wireType !== 2) {\n throw new Error(\n `Invalid WhatsApp handshake wire type ${wireType} for length-delimited field ${field}.`,\n );\n }\n}\n\nfunction requireVarintWireType(tag: number, field: number): void {\n const wireType = tag & 7;\n if (wireType !== 0) {\n throw new Error(`Invalid WhatsApp handshake wire type ${wireType} for varint field ${field}.`);\n }\n}\n\nfunction encodeServerHello(serverHello: NonNullable<HandshakeMessage[\"serverHello\"]>): Buffer {\n const writer = new ProtoWriter();\n if (serverHello.ephemeral !== undefined) {\n writer.bytesField(1, serverHello.ephemeral);\n }\n if (serverHello.staticKey !== undefined) {\n writer.bytesField(2, serverHello.staticKey);\n }\n if (serverHello.payload !== undefined) {\n writer.bytesField(3, serverHello.payload);\n }\n if (serverHello.extendedStatic !== undefined) {\n writer.bytesField(4, serverHello.extendedStatic);\n }\n return writer.finish();\n}\n\nclass ProtoReader {\n #offset = 0;\n readonly #buffer: Buffer;\n\n constructor(data: Uint8Array) {\n this.#buffer = Buffer.from(data);\n }\n\n done(): boolean {\n return this.#offset >= this.#buffer.length;\n }\n\n bytes(): Buffer {\n const length = this.uint32();\n this.#require(length);\n const value = this.#buffer.subarray(this.#offset, this.#offset + length);\n this.#offset += length;\n return value;\n }\n\n skip(field: number, wireType: number, groupDepth = 0): void {\n if (wireType === 0) {\n this.#skipVarint();\n return;\n }\n if (wireType === 1) {\n this.#require(8);\n this.#offset += 8;\n return;\n }\n if (wireType === 2) {\n const length = this.uint32();\n this.#require(length);\n this.#offset += length;\n return;\n }\n if (wireType === 3) {\n if (groupDepth >= MAX_PROTOBUF_GROUP_DEPTH) {\n throw new Error(\"WhatsApp handshake protobuf group nesting exceeds the supported depth.\");\n }\n while (!this.done()) {\n const tag = this.tag();\n const nestedField = tag >>> 3;\n const nestedWireType = tag & 7;\n if (nestedWireType === 4) {\n if (nestedField !== field) {\n throw new Error(\"Mismatched WhatsApp handshake protobuf end group.\");\n }\n return;\n }\n this.skip(nestedField, nestedWireType, groupDepth + 1);\n }\n throw new Error(\"Unterminated WhatsApp handshake protobuf group.\");\n }\n if (wireType === 4) {\n throw new Error(\"Unexpected WhatsApp handshake protobuf end group.\");\n }\n if (wireType === 5) {\n this.#require(4);\n this.#offset += 4;\n return;\n }\n throw new Error(`Unsupported WhatsApp handshake wire type: ${wireType}.`);\n }\n\n tag(): number {\n const tag = this.uint32();\n if (tag >>> 3 === 0) {\n throw new Error(\"Invalid WhatsApp handshake protobuf field number 0.\");\n }\n return tag;\n }\n\n uint32(): number {\n let value = 0;\n let shift = 0;\n while (shift < 32) {\n this.#require(1);\n const byte = this.#buffer[this.#offset];\n this.#offset += 1;\n if (byte === undefined) {\n throw new Error(\"Unexpected end of WhatsApp handshake protobuf.\");\n }\n if (shift === 28 && byte > 0x0f) {\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n value |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return value >>> 0;\n }\n shift += 7;\n }\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n\n #skipVarint(): void {\n for (let index = 0; index < 10; index += 1) {\n this.#require(1);\n const byte = this.#buffer[this.#offset];\n this.#offset += 1;\n if (byte === undefined || (index === 9 && byte > 1)) {\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n if ((byte & 0x80) === 0) {\n return;\n }\n }\n throw new Error(\"Invalid WhatsApp handshake varint.\");\n }\n\n #require(length: number): void {\n if (this.#offset + length > this.#buffer.length) {\n throw new Error(\"Unexpected end of WhatsApp handshake protobuf.\");\n }\n }\n}\n\nclass ProtoWriter {\n readonly #parts: Buffer[] = [];\n\n boolField(field: number, value: boolean): void {\n this.uint32(field << 3);\n this.uint32(value ? 1 : 0);\n }\n\n bytesField(field: number, value: Uint8Array): void {\n this.uint32((field << 3) | 2);\n this.uint32(value.byteLength);\n this.#parts.push(Buffer.from(value));\n }\n\n finish(): Buffer {\n return Buffer.concat(this.#parts);\n }\n\n uint32(value: number): void {\n let remaining = value >>> 0;\n const bytes: number[] = [];\n while (remaining > 127) {\n bytes.push((remaining & 0x7f) | 0x80);\n remaining >>>= 7;\n }\n bytes.push(remaining);\n this.#parts.push(Buffer.from(bytes));\n }\n}\n"]}
@@ -1,10 +1,10 @@
1
- import { encodeBigEndian, KEY_BUNDLE_TYPE } from "./crypto.js";
1
+ import { encodeBigEndian, KEY_BUNDLE_TYPE, scrubSignalPublicKey, } from "./crypto.js";
2
2
  export function xmppPreKey(pair, id) {
3
3
  return {
4
4
  attrs: {},
5
5
  content: [
6
6
  { attrs: {}, content: encodeBigEndian(id, 3), tag: "id" },
7
- { attrs: {}, content: pair.public, tag: "value" },
7
+ { attrs: {}, content: scrubSignalPublicKey(pair.public), tag: "value" },
8
8
  ],
9
9
  tag: "key",
10
10
  };
@@ -14,7 +14,7 @@ export function xmppSignedPreKey(key) {
14
14
  attrs: {},
15
15
  content: [
16
16
  { attrs: {}, content: encodeBigEndian(key.keyId, 3), tag: "id" },
17
- { attrs: {}, content: key.keyPair.public, tag: "value" },
17
+ { attrs: {}, content: scrubSignalPublicKey(key.keyPair.public), tag: "value" },
18
18
  { attrs: {}, content: key.signature, tag: "signature" },
19
19
  ],
20
20
  tag: "skey",
@@ -1 +1 @@
1
- {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/signal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAoC,MAAM,aAAa,CAAC;AAEjG,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,EAAU;IAClD,OAAO;QACL,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;YACzD,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE;SAClD;QACD,GAAG,EAAE,KAAK;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAkB;IACjD,OAAO;QACL,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;YAChE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE;YACxD,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE;SACxD;QACD,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { BinaryNode } from \"./binary-node.js\";\nimport { encodeBigEndian, KEY_BUNDLE_TYPE, type KeyPair, type SignedKeyPair } from \"./crypto.js\";\n\nexport function xmppPreKey(pair: KeyPair, id: number): BinaryNode {\n return {\n attrs: {},\n content: [\n { attrs: {}, content: encodeBigEndian(id, 3), tag: \"id\" },\n { attrs: {}, content: pair.public, tag: \"value\" },\n ],\n tag: \"key\",\n };\n}\n\nexport function xmppSignedPreKey(key: SignedKeyPair): BinaryNode {\n return {\n attrs: {},\n content: [\n { attrs: {}, content: encodeBigEndian(key.keyId, 3), tag: \"id\" },\n { attrs: {}, content: key.keyPair.public, tag: \"value\" },\n { attrs: {}, content: key.signature, tag: \"signature\" },\n ],\n tag: \"skey\",\n };\n}\n\nexport { KEY_BUNDLE_TYPE };\n"]}
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/signal.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,eAAe,EACf,oBAAoB,GAGrB,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,UAAU,CAAC,IAAa,EAAE,EAAU;IAClD,OAAO;QACL,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;YACzD,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE;SACxE;QACD,GAAG,EAAE,KAAK;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAkB;IACjD,OAAO;QACL,KAAK,EAAE,EAAE;QACT,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE;YAChE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE;YAC9E,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE;SACxD;QACD,GAAG,EAAE,MAAM;KACZ,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { BinaryNode } from \"./binary-node.js\";\nimport {\n encodeBigEndian,\n KEY_BUNDLE_TYPE,\n scrubSignalPublicKey,\n type KeyPair,\n type SignedKeyPair,\n} from \"./crypto.js\";\n\nexport function xmppPreKey(pair: KeyPair, id: number): BinaryNode {\n return {\n attrs: {},\n content: [\n { attrs: {}, content: encodeBigEndian(id, 3), tag: \"id\" },\n { attrs: {}, content: scrubSignalPublicKey(pair.public), tag: \"value\" },\n ],\n tag: \"key\",\n };\n}\n\nexport function xmppSignedPreKey(key: SignedKeyPair): BinaryNode {\n return {\n attrs: {},\n content: [\n { attrs: {}, content: encodeBigEndian(key.keyId, 3), tag: \"id\" },\n { attrs: {}, content: scrubSignalPublicKey(key.keyPair.public), tag: \"value\" },\n { attrs: {}, content: key.signature, tag: \"signature\" },\n ],\n tag: \"skey\",\n };\n}\n\nexport { KEY_BUNDLE_TYPE };\n"]}
@@ -37,10 +37,17 @@ export type StartWhatsAppServerParams = {
37
37
  graphVersion?: string | undefined;
38
38
  host?: string | undefined;
39
39
  maxPendingInboundMessages?: number | undefined;
40
+ messageAcceptanceTimeoutMs?: number | undefined;
40
41
  onEvent?: ServerEventObserver | undefined;
41
42
  phoneNumberId?: string | undefined;
42
43
  port?: number | undefined;
43
44
  recorderPath?: string | undefined;
44
45
  selfJid?: string | undefined;
45
46
  };
47
+ /** @internal */
48
+ export declare function isWhatsAppMessageIdInUse(state: {
49
+ inboundMessageIds: ReadonlySet<string>;
50
+ pendingMessageIds: ReadonlySet<string>;
51
+ recentMessageIds: ReadonlyMap<string, true>;
52
+ }, id: string): boolean;
46
53
  export declare function startWhatsAppServer(params?: StartWhatsAppServerParams): Promise<StartedWhatsAppServer>;