@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.
- package/README.md +99 -12
- package/dist/src/bin/crabline.js +3 -1
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +5 -1
- package/dist/src/cli/program.js +264 -50
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +39 -3
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +20 -0
- package/dist/src/config/schema.js +163 -35
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.d.ts +1 -0
- package/dist/src/core/errors.js +6 -3
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/http-path.d.ts +1 -0
- package/dist/src/core/http-path.js +14 -0
- package/dist/src/core/http-path.js.map +1 -0
- package/dist/src/core/matcher.d.ts +3 -1
- package/dist/src/core/matcher.js +58 -2
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/nonces.d.ts +2 -0
- package/dist/src/core/nonces.js +11 -1
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +5 -0
- package/dist/src/core/reporters.js +26 -2
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -1
- package/dist/src/core/run.js +178 -66
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/matrix-ids.d.ts +5 -0
- package/dist/src/matrix-ids.js +83 -0
- package/dist/src/matrix-ids.js.map +1 -0
- package/dist/src/openclaw/artifact-generation.d.ts +12 -2
- package/dist/src/openclaw/artifact-generation.js +436 -15
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/matrix.js +21 -4
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +13 -8
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
- package/dist/src/openclaw/bridges/probe-response.js +5 -0
- package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
- package/dist/src/openclaw/bridges/signal.js +15 -6
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +116 -23
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +45 -19
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +32 -16
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +8 -3
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/private-file.d.ts +40 -3
- package/dist/src/openclaw/private-file.js +2070 -95
- package/dist/src/openclaw/private-file.js.map +1 -1
- package/dist/src/openclaw/shared.d.ts +1 -0
- package/dist/src/openclaw/shared.js +48 -13
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +9 -0
- package/dist/src/openclaw/smoke-lock.js +696 -187
- package/dist/src/openclaw/smoke-lock.js.map +1 -1
- package/dist/src/openclaw.js +352 -29
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/platform/process-owned-lock.d.ts +11 -0
- package/dist/src/platform/process-owned-lock.js +1698 -0
- package/dist/src/platform/process-owned-lock.js.map +1 -0
- package/dist/src/platform/recorder-directory.d.ts +1 -0
- package/dist/src/platform/recorder-directory.js +14 -0
- package/dist/src/platform/recorder-directory.js.map +1 -0
- package/dist/src/platform/windows-acl.d.ts +18 -0
- package/dist/src/platform/windows-acl.js +1367 -0
- package/dist/src/platform/windows-acl.js.map +1 -0
- package/dist/src/platform/windows-lock-root.d.ts +13 -0
- package/dist/src/platform/windows-lock-root.js +98 -0
- package/dist/src/platform/windows-lock-root.js.map +1 -0
- package/dist/src/providers/builtin/discord.d.ts +4 -0
- package/dist/src/providers/builtin/discord.js +52 -9
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
- package/dist/src/providers/builtin/feishu.d.ts +1 -0
- package/dist/src/providers/builtin/feishu.js +96 -26
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +1 -0
- package/dist/src/providers/builtin/googlechat.js +95 -26
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.js +60 -17
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +88 -35
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +2 -2
- package/dist/src/providers/builtin/matrix.js +78 -21
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +11 -7
- package/dist/src/providers/builtin/mattermost.js +138 -24
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +1 -0
- package/dist/src/providers/builtin/msteams.js +118 -38
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.js +4 -4
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.js +1057 -146
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +8 -1
- package/dist/src/providers/builtin/slack.js +327 -24
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +1 -1
- package/dist/src/providers/builtin/telegram.js +55 -14
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
- package/dist/src/providers/builtin/whatsapp.js +157 -29
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.d.ts +5 -2
- package/dist/src/providers/builtin/zalo.js +31 -7
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +1 -1
- package/dist/src/providers/catalog.js +1 -1
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +4 -0
- package/dist/src/providers/local-mock.js +162 -35
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +2 -0
- package/dist/src/providers/native-ids.js +3 -0
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +14 -3
- package/dist/src/providers/recorder.js +532 -42
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +1 -0
- package/dist/src/providers/registry.js +65 -20
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +6 -1
- package/dist/src/providers/signed-jwt.js +241 -50
- package/dist/src/providers/signed-jwt.js.map +1 -1
- package/dist/src/providers/slack-ids.d.ts +1 -0
- package/dist/src/providers/slack-ids.js +5 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +9 -1
- package/dist/src/providers/target-normalizers.js +177 -58
- package/dist/src/providers/target-normalizers.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +3 -0
- package/dist/src/providers/webhook-server.js +268 -47
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +14 -2
- package/dist/src/servers/http.js +229 -58
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/matrix.d.ts +3 -0
- package/dist/src/servers/matrix.js +268 -110
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +389 -91
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/recorder.d.ts +11 -0
- package/dist/src/servers/recorder.js +1241 -22
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +1 -0
- package/dist/src/servers/signal.js +279 -44
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +15 -0
- package/dist/src/servers/slack.js +259 -51
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram-identity.d.ts +6 -0
- package/dist/src/servers/telegram-identity.js +27 -0
- package/dist/src/servers/telegram-identity.js.map +1 -0
- package/dist/src/servers/telegram.d.ts +17 -6
- package/dist/src/servers/telegram.js +1193 -118
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +12 -4
- package/dist/src/servers/webhook-target.js +226 -28
- package/dist/src/servers/webhook-target.js.map +1 -1
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +1 -0
- package/dist/src/servers/whatsapp-jid.js +9 -5
- package/dist/src/servers/whatsapp-jid.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
- package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
- package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js +3 -3
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +7 -0
- package/dist/src/servers/whatsapp.js +149 -24
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +1 -0
- package/dist/src/servers/zalo.js +193 -82
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +185 -43
- package/fixtures/examples/crabline.example.yaml +3 -2
- package/package.json +18 -10
- 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 =
|
|
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 =
|
|
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
|
-
|
|
35
|
-
|
|
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
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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,
|
|
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>;
|