@openclaw/crabline 0.1.11 → 0.1.13
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 +137 -23
- 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 +281 -52
- 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/index.d.ts +12 -10
- package/dist/src/index.js +6 -5
- package/dist/src/index.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 +7 -6
- package/dist/src/openclaw/artifact-generation.js +385 -41
- package/dist/src/openclaw/artifact-generation.js.map +1 -1
- package/dist/src/openclaw/bridges/discord.d.ts +1 -0
- package/dist/src/openclaw/bridges/discord.js +149 -0
- package/dist/src/openclaw/bridges/discord.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +22 -5
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +14 -9
- 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 +16 -7
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +117 -24
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +46 -20
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +33 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +9 -4
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.js +3 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -1
- package/dist/src/openclaw/private-file.d.ts +38 -3
- package/dist/src/openclaw/private-file.js +2008 -87
- package/dist/src/openclaw/private-file.js.map +1 -1
- package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
- package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
- package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +10 -17
- package/dist/src/openclaw/shared.js +53 -19
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw.d.ts +3 -5
- package/dist/src/openclaw.js +245 -60
- 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 +521 -41
- 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/discord.d.ts +40 -0
- package/dist/src/servers/discord.js +842 -0
- package/dist/src/servers/discord.js.map +1 -0
- 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/index.d.ts +10 -4
- package/dist/src/servers/index.js +4 -0
- package/dist/src/servers/index.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 +1072 -69
- 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 +270 -54
- 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 +1218 -107
- 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 -1
- package/dist/src/servers/whatsapp.js +149 -25
- 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 +251 -64
- package/fixtures/examples/crabline.example.yaml +3 -2
- package/package.json +18 -10
- package/dist/src/openclaw/smoke-lock.js +0 -1004
- package/dist/src/openclaw/smoke-lock.js.map +0 -1
- 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"]}
|
|
@@ -11,7 +11,6 @@ export type WhatsAppServerManifest = {
|
|
|
11
11
|
baileysWebSocketUrl: string;
|
|
12
12
|
messagesUrl: string;
|
|
13
13
|
phoneNumberUrl: string;
|
|
14
|
-
statusUrl: string;
|
|
15
14
|
};
|
|
16
15
|
env: {
|
|
17
16
|
CLOUD_API_ACCESS_TOKEN: string;
|
|
@@ -37,10 +36,17 @@ export type StartWhatsAppServerParams = {
|
|
|
37
36
|
graphVersion?: string | undefined;
|
|
38
37
|
host?: string | undefined;
|
|
39
38
|
maxPendingInboundMessages?: number | undefined;
|
|
39
|
+
messageAcceptanceTimeoutMs?: number | undefined;
|
|
40
40
|
onEvent?: ServerEventObserver | undefined;
|
|
41
41
|
phoneNumberId?: string | undefined;
|
|
42
42
|
port?: number | undefined;
|
|
43
43
|
recorderPath?: string | undefined;
|
|
44
44
|
selfJid?: string | undefined;
|
|
45
45
|
};
|
|
46
|
+
/** @internal */
|
|
47
|
+
export declare function isWhatsAppMessageIdInUse(state: {
|
|
48
|
+
inboundMessageIds: ReadonlySet<string>;
|
|
49
|
+
pendingMessageIds: ReadonlySet<string>;
|
|
50
|
+
recentMessageIds: ReadonlyMap<string, true>;
|
|
51
|
+
}, id: string): boolean;
|
|
46
52
|
export declare function startWhatsAppServer(params?: StartWhatsAppServerParams): Promise<StartedWhatsAppServer>;
|