@openclaw/crabline 0.1.9 → 0.1.10
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 +47 -22
- package/assets/crabline-banner.svg +20 -0
- package/dist/src/bin/crabline.js.map +1 -1
- package/dist/src/cli/program.d.ts +25 -1
- package/dist/src/cli/program.js +579 -82
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/config/load.js +59 -6
- package/dist/src/config/load.js.map +1 -1
- package/dist/src/config/schema.d.ts +116 -92
- package/dist/src/config/schema.js +179 -73
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/core/errors.js +9 -2
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/exit-codes.js.map +1 -1
- package/dist/src/core/matcher.js +7 -6
- package/dist/src/core/matcher.js.map +1 -1
- package/dist/src/core/message-template.js.map +1 -1
- package/dist/src/core/nonces.d.ts +1 -0
- package/dist/src/core/nonces.js +4 -2
- package/dist/src/core/nonces.js.map +1 -1
- package/dist/src/core/reporters.d.ts +1 -0
- package/dist/src/core/reporters.js +42 -4
- package/dist/src/core/reporters.js.map +1 -1
- package/dist/src/core/run.d.ts +3 -0
- package/dist/src/core/run.js +415 -107
- package/dist/src/core/run.js.map +1 -1
- package/dist/src/core/safe-regex.d.ts +3 -0
- package/dist/src/core/safe-regex.js +21 -0
- package/dist/src/core/safe-regex.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/artifact-generation.d.ts +38 -0
- package/dist/src/openclaw/artifact-generation.js +314 -0
- package/dist/src/openclaw/artifact-generation.js.map +1 -0
- package/dist/src/openclaw/bridges/matrix.js +97 -12
- package/dist/src/openclaw/bridges/matrix.js.map +1 -1
- package/dist/src/openclaw/bridges/mattermost.js +32 -10
- package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
- package/dist/src/openclaw/bridges/signal.js +55 -18
- package/dist/src/openclaw/bridges/signal.js.map +1 -1
- package/dist/src/openclaw/bridges/slack.js +85 -7
- package/dist/src/openclaw/bridges/slack.js.map +1 -1
- package/dist/src/openclaw/bridges/telegram.js +124 -30
- package/dist/src/openclaw/bridges/telegram.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +78 -17
- package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
- package/dist/src/openclaw/bridges/zalo.js +14 -5
- package/dist/src/openclaw/bridges/zalo.js.map +1 -1
- package/dist/src/openclaw/outbound-contract.d.ts +5 -0
- package/dist/src/openclaw/outbound-contract.js +40 -0
- package/dist/src/openclaw/outbound-contract.js.map +1 -0
- package/dist/src/openclaw/private-file.d.ts +26 -0
- package/dist/src/openclaw/private-file.js +411 -0
- package/dist/src/openclaw/private-file.js.map +1 -0
- package/dist/src/openclaw/shared.d.ts +21 -2
- package/dist/src/openclaw/shared.js +115 -18
- package/dist/src/openclaw/shared.js.map +1 -1
- package/dist/src/openclaw/smoke-lock.d.ts +63 -0
- package/dist/src/openclaw/smoke-lock.js +949 -0
- package/dist/src/openclaw/smoke-lock.js.map +1 -0
- package/dist/src/openclaw.d.ts +16 -8
- package/dist/src/openclaw.js +194 -52
- package/dist/src/openclaw.js.map +1 -1
- package/dist/src/providers/builtin/discord.d.ts +10 -1
- package/dist/src/providers/builtin/discord.js +144 -18
- package/dist/src/providers/builtin/discord.js.map +1 -1
- package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
- package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
- package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
- package/dist/src/providers/builtin/feishu.d.ts +19 -2
- package/dist/src/providers/builtin/feishu.js +307 -25
- package/dist/src/providers/builtin/feishu.js.map +1 -1
- package/dist/src/providers/builtin/googlechat.d.ts +20 -1
- package/dist/src/providers/builtin/googlechat.js +178 -19
- package/dist/src/providers/builtin/googlechat.js.map +1 -1
- package/dist/src/providers/builtin/imessage.d.ts +4 -0
- package/dist/src/providers/builtin/imessage.js +26 -11
- package/dist/src/providers/builtin/imessage.js.map +1 -1
- package/dist/src/providers/builtin/loopback.js +92 -30
- package/dist/src/providers/builtin/loopback.js.map +1 -1
- package/dist/src/providers/builtin/matrix.d.ts +11 -1
- package/dist/src/providers/builtin/matrix.js +53 -29
- package/dist/src/providers/builtin/matrix.js.map +1 -1
- package/dist/src/providers/builtin/mattermost.d.ts +10 -0
- package/dist/src/providers/builtin/mattermost.js +38 -15
- package/dist/src/providers/builtin/mattermost.js.map +1 -1
- package/dist/src/providers/builtin/msteams.d.ts +17 -1
- package/dist/src/providers/builtin/msteams.js +113 -14
- package/dist/src/providers/builtin/msteams.js.map +1 -1
- package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
- package/dist/src/providers/builtin/native-local-mock.js +12 -35
- package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
- package/dist/src/providers/builtin/script.d.ts +11 -15
- package/dist/src/providers/builtin/script.js +566 -104
- package/dist/src/providers/builtin/script.js.map +1 -1
- package/dist/src/providers/builtin/slack.d.ts +6 -0
- package/dist/src/providers/builtin/slack.js +99 -40
- package/dist/src/providers/builtin/slack.js.map +1 -1
- package/dist/src/providers/builtin/telegram.d.ts +6 -0
- package/dist/src/providers/builtin/telegram.js +64 -43
- package/dist/src/providers/builtin/telegram.js.map +1 -1
- package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
- package/dist/src/providers/builtin/whatsapp.js +567 -30
- package/dist/src/providers/builtin/whatsapp.js.map +1 -1
- package/dist/src/providers/builtin/zalo.js +30 -19
- package/dist/src/providers/builtin/zalo.js.map +1 -1
- package/dist/src/providers/catalog.d.ts +3 -3
- package/dist/src/providers/catalog.js +3 -3
- package/dist/src/providers/catalog.js.map +1 -1
- package/dist/src/providers/local-mock.d.ts +11 -2
- package/dist/src/providers/local-mock.js +322 -96
- package/dist/src/providers/local-mock.js.map +1 -1
- package/dist/src/providers/native-ids.d.ts +1 -0
- package/dist/src/providers/native-ids.js +6 -1
- package/dist/src/providers/native-ids.js.map +1 -1
- package/dist/src/providers/recorder.d.ts +30 -2
- package/dist/src/providers/recorder.js +539 -70
- package/dist/src/providers/recorder.js.map +1 -1
- package/dist/src/providers/registry.d.ts +25 -1
- package/dist/src/providers/registry.js +280 -40
- package/dist/src/providers/registry.js.map +1 -1
- package/dist/src/providers/signed-jwt.d.ts +29 -0
- package/dist/src/providers/signed-jwt.js +202 -0
- package/dist/src/providers/signed-jwt.js.map +1 -0
- package/dist/src/providers/slack-ids.js.map +1 -1
- package/dist/src/providers/target-normalizers.d.ts +26 -0
- package/dist/src/providers/target-normalizers.js +276 -0
- package/dist/src/providers/target-normalizers.js.map +1 -0
- package/dist/src/providers/types.d.ts +5 -0
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/providers/webhook-server.d.ts +2 -0
- package/dist/src/providers/webhook-server.js +72 -25
- package/dist/src/providers/webhook-server.js.map +1 -1
- package/dist/src/servers/http.d.ts +23 -3
- package/dist/src/servers/http.js +213 -20
- package/dist/src/servers/http.js.map +1 -1
- package/dist/src/servers/index.js +20 -21
- package/dist/src/servers/index.js.map +1 -1
- package/dist/src/servers/matrix.js +465 -51
- package/dist/src/servers/matrix.js.map +1 -1
- package/dist/src/servers/mattermost.d.ts +5 -0
- package/dist/src/servers/mattermost.js +306 -58
- package/dist/src/servers/mattermost.js.map +1 -1
- package/dist/src/servers/pending-events.d.ts +2 -0
- package/dist/src/servers/pending-events.js +11 -0
- package/dist/src/servers/pending-events.js.map +1 -0
- package/dist/src/servers/recorder.d.ts +5 -0
- package/dist/src/servers/recorder.js +46 -3
- package/dist/src/servers/recorder.js.map +1 -1
- package/dist/src/servers/signal.d.ts +2 -0
- package/dist/src/servers/signal.js +444 -56
- package/dist/src/servers/signal.js.map +1 -1
- package/dist/src/servers/slack.d.ts +5 -0
- package/dist/src/servers/slack.js +515 -49
- package/dist/src/servers/slack.js.map +1 -1
- package/dist/src/servers/telegram.d.ts +111 -0
- package/dist/src/servers/telegram.js +811 -152
- package/dist/src/servers/telegram.js.map +1 -1
- package/dist/src/servers/webhook-target.d.ts +40 -0
- package/dist/src/servers/webhook-target.js +349 -0
- package/dist/src/servers/webhook-target.js.map +1 -0
- package/dist/src/servers/websocket.d.ts +2 -0
- package/dist/src/servers/websocket.js +29 -0
- package/dist/src/servers/websocket.js.map +1 -0
- package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
- package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
- package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
- package/dist/src/servers/whatsapp-jid.d.ts +5 -0
- package/dist/src/servers/whatsapp-jid.js +32 -0
- package/dist/src/servers/whatsapp-jid.js.map +1 -0
- package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
- package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
- package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
- package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
- package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
- package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
- package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
- package/dist/src/servers/whatsapp.d.ts +12 -7
- package/dist/src/servers/whatsapp.js +269 -107
- package/dist/src/servers/whatsapp.js.map +1 -1
- package/dist/src/servers/zalo.d.ts +14 -0
- package/dist/src/servers/zalo.js +521 -88
- package/dist/src/servers/zalo.js.map +1 -1
- package/docs/channel-setup.md +197 -19
- package/fixtures/examples/crabline.example.yaml +10 -0
- package/package.json +20 -15
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { adminAuthError, hasAdminToken, jsonResponse,
|
|
3
|
+
import { adminAuthError, drainRequestBody, hasAdminToken, InvalidJsonBodyError, isJsonObject, isLoopbackHost, jsonResponse, parseUnknownRequestBody, queryRecord, readTrimmedString, RequestBodyTooLargeError, startHttpJsonServer, } from "./http.js";
|
|
4
4
|
import { recordServerEvent } from "./recorder.js";
|
|
5
|
-
import { attachWhatsAppBaileysWebSocketServer, } from "./whatsapp-baileys-websocket.js";
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
5
|
+
import { attachWhatsAppBaileysWebSocketServer, resolveMaxPendingWhatsAppInboundMessages, } from "./whatsapp-baileys-websocket.js";
|
|
6
|
+
import { canonicalizeWhatsAppChatJid, canonicalizeWhatsAppUserCorrelationJid, canonicalizeWhatsAppUserJid, isWhatsAppGroupJid, } from "./whatsapp-jid.js";
|
|
7
|
+
const WHATSAPP_CLOUD_RECIPIENT_RE = /^\d{7,15}$/u;
|
|
8
|
+
const WHATSAPP_GRAPH_VERSION_RE = /^v\d+\.\d+$/u;
|
|
9
|
+
const DEFAULT_GRAPH_VERSION = "v25.0";
|
|
10
10
|
function whatsappOk(value = {}) {
|
|
11
11
|
return jsonResponse({ ok: true, ...value });
|
|
12
12
|
}
|
|
@@ -26,7 +26,6 @@ function graphError(params) {
|
|
|
26
26
|
message: params.message,
|
|
27
27
|
type: params.type ?? "OAuthException",
|
|
28
28
|
},
|
|
29
|
-
ok: false,
|
|
30
29
|
}, params.status ?? 400);
|
|
31
30
|
}
|
|
32
31
|
function graphParameterError(message, details) {
|
|
@@ -42,22 +41,36 @@ function graphAuthError() {
|
|
|
42
41
|
async function appendEvent(state, event) {
|
|
43
42
|
await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });
|
|
44
43
|
}
|
|
45
|
-
function
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
function requireWhatsAppChatJid(value) {
|
|
45
|
+
const stringValue = readTrimmedString(value);
|
|
46
|
+
const canonical = stringValue ? canonicalizeWhatsAppChatJid(stringValue) : undefined;
|
|
47
|
+
if (!canonical) {
|
|
48
|
+
return graphParameterError("(#100) Invalid parameter: chatJid", "chatJid must be a WhatsApp user or group JID.");
|
|
49
|
+
}
|
|
50
|
+
return canonical;
|
|
50
51
|
}
|
|
51
|
-
function
|
|
52
|
+
function requireWhatsAppSenderJid(value) {
|
|
52
53
|
const stringValue = readTrimmedString(value);
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
const canonical = stringValue ? canonicalizeWhatsAppUserJid(stringValue) : undefined;
|
|
55
|
+
if (!canonical) {
|
|
56
|
+
return graphParameterError("(#100) Invalid parameter: senderJid", "senderJid must be a WhatsApp user JID.");
|
|
55
57
|
}
|
|
56
|
-
return
|
|
58
|
+
return canonical;
|
|
59
|
+
}
|
|
60
|
+
function requireCloudRecipient(value) {
|
|
61
|
+
const recipient = readTrimmedString(value);
|
|
62
|
+
if (!recipient || !WHATSAPP_CLOUD_RECIPIENT_RE.test(recipient)) {
|
|
63
|
+
return graphParameterError("(#100) Invalid parameter: to", "to must be a WhatsApp phone number in international format without punctuation.");
|
|
64
|
+
}
|
|
65
|
+
return recipient;
|
|
57
66
|
}
|
|
58
67
|
function requireAuth(request, state) {
|
|
59
68
|
const authorization = request.headers.authorization;
|
|
60
|
-
|
|
69
|
+
if (typeof authorization !== "string") {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const match = /^Bearer +(.+)$/iu.exec(authorization.trimStart());
|
|
73
|
+
return match?.[1] === state.accessToken;
|
|
61
74
|
}
|
|
62
75
|
function nextMessageId(state) {
|
|
63
76
|
return `wamid.FAKE${String(state.nextMessageId++).padStart(8, "0")}`;
|
|
@@ -65,28 +78,29 @@ function nextMessageId(state) {
|
|
|
65
78
|
function waIdFromJid(jid) {
|
|
66
79
|
return jid.split("@", 1)[0]?.split(":", 1)[0] ?? jid;
|
|
67
80
|
}
|
|
81
|
+
function directPeerIdentity(jid) {
|
|
82
|
+
return canonicalizeWhatsAppUserCorrelationJid(jid) ?? jid;
|
|
83
|
+
}
|
|
68
84
|
function requireMessagingProduct(body) {
|
|
69
85
|
const messagingProduct = readTrimmedString(body.messaging_product);
|
|
70
|
-
if (messagingProduct
|
|
86
|
+
if (messagingProduct !== "whatsapp") {
|
|
71
87
|
return graphParameterError("(#100) Invalid parameter: messaging_product", 'messaging_product must be "whatsapp".');
|
|
72
88
|
}
|
|
73
89
|
return undefined;
|
|
74
90
|
}
|
|
75
91
|
function readTextMessageBody(body) {
|
|
76
92
|
const type = readTrimmedString(body.type);
|
|
77
|
-
if (type
|
|
93
|
+
if (!type) {
|
|
94
|
+
return graphParameterError("(#100) Missing required parameter: type", 'A WhatsApp text send requires type to be "text".');
|
|
95
|
+
}
|
|
96
|
+
if (type !== "text") {
|
|
78
97
|
return graphParameterError("(#100) Unsupported message type", "This test API currently supports WhatsApp text message sends.");
|
|
79
98
|
}
|
|
80
99
|
const textPayload = body.text;
|
|
81
|
-
const
|
|
82
|
-
?
|
|
83
|
-
: readTrimmedString(textPayload);
|
|
84
|
-
const content = body.content;
|
|
85
|
-
const contentText = content && typeof content === "object"
|
|
86
|
-
? readTrimmedString(content.text)
|
|
100
|
+
const text = textPayload && typeof textPayload === "object"
|
|
101
|
+
? readMessageText(textPayload.body)
|
|
87
102
|
: undefined;
|
|
88
|
-
|
|
89
|
-
if (!text) {
|
|
103
|
+
if (text === undefined) {
|
|
90
104
|
return graphParameterError("(#100) Missing required parameter: text.body", "A WhatsApp text send requires text.body.");
|
|
91
105
|
}
|
|
92
106
|
return text;
|
|
@@ -106,12 +120,16 @@ function createWhatsAppMessage(params) {
|
|
|
106
120
|
pushName: params.pushName ?? (params.fromMe ? "Test Bot" : "Test User"),
|
|
107
121
|
};
|
|
108
122
|
}
|
|
109
|
-
|
|
123
|
+
function prepareSendMessage(params) {
|
|
110
124
|
const productError = requireMessagingProduct(params.body);
|
|
111
125
|
if (productError) {
|
|
112
126
|
return productError;
|
|
113
127
|
}
|
|
114
|
-
const
|
|
128
|
+
const recipientType = readTrimmedString(params.body.recipient_type);
|
|
129
|
+
if (recipientType && recipientType !== "individual") {
|
|
130
|
+
return graphParameterError("(#100) Invalid parameter: recipient_type", 'recipient_type must be "individual".');
|
|
131
|
+
}
|
|
132
|
+
const to = requireCloudRecipient(params.body.to);
|
|
115
133
|
if (to instanceof Response) {
|
|
116
134
|
return to;
|
|
117
135
|
}
|
|
@@ -119,39 +137,57 @@ async function handleSendMessage(params) {
|
|
|
119
137
|
if (text instanceof Response) {
|
|
120
138
|
return text;
|
|
121
139
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
return {
|
|
141
|
+
commit() {
|
|
142
|
+
const message = createWhatsAppMessage({
|
|
143
|
+
fromMe: true,
|
|
144
|
+
id: nextMessageId(params.state),
|
|
145
|
+
remoteJid: `${to}@s.whatsapp.net`,
|
|
146
|
+
text,
|
|
147
|
+
});
|
|
148
|
+
return jsonResponse({
|
|
149
|
+
contacts: [
|
|
150
|
+
{
|
|
151
|
+
input: to,
|
|
152
|
+
wa_id: to,
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
messages: [{ id: message.key.id }],
|
|
156
|
+
messaging_product: "whatsapp",
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function handleMessageStatus(body) {
|
|
162
|
+
const productError = requireMessagingProduct(body);
|
|
163
|
+
if (productError) {
|
|
164
|
+
return productError;
|
|
165
|
+
}
|
|
166
|
+
if (readTrimmedString(body.status) !== "read") {
|
|
167
|
+
return graphParameterError("(#100) Invalid parameter: status", 'status must be "read" for message status updates.');
|
|
168
|
+
}
|
|
169
|
+
if (!readTrimmedString(body.message_id)) {
|
|
170
|
+
return graphParameterError("(#100) Missing required parameter: message_id", "A message status update requires message_id.");
|
|
171
|
+
}
|
|
172
|
+
return jsonResponse({ success: true });
|
|
143
173
|
}
|
|
144
174
|
async function handleAdminInbound(params) {
|
|
145
|
-
const chatJid =
|
|
175
|
+
const chatJid = requireWhatsAppChatJid(params.body.chatJid ?? params.body.chatId);
|
|
146
176
|
if (chatJid instanceof Response) {
|
|
147
177
|
return { response: chatJid };
|
|
148
178
|
}
|
|
149
|
-
const senderJid =
|
|
179
|
+
const senderJid = requireWhatsAppSenderJid(params.body.senderJid ?? params.body.from);
|
|
150
180
|
if (senderJid instanceof Response) {
|
|
151
181
|
return { response: senderJid };
|
|
152
182
|
}
|
|
153
|
-
const
|
|
154
|
-
if (!
|
|
183
|
+
const isGroupChat = isWhatsAppGroupJid(chatJid);
|
|
184
|
+
if (!isGroupChat && directPeerIdentity(chatJid) !== directPeerIdentity(senderJid)) {
|
|
185
|
+
return {
|
|
186
|
+
response: graphParameterError("(#100) Invalid parameter: senderJid", "senderJid must identify the direct chat peer."),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const text = readMessageText(params.body.text);
|
|
190
|
+
if (text === undefined) {
|
|
155
191
|
return {
|
|
156
192
|
response: graphParameterError("(#100) Missing required parameter: text", "An inbound WhatsApp event requires text."),
|
|
157
193
|
};
|
|
@@ -161,7 +197,7 @@ async function handleAdminInbound(params) {
|
|
|
161
197
|
id: readTrimmedString(params.body.messageId) ?? nextMessageId(params.state),
|
|
162
198
|
pushName: readTrimmedString(params.body.pushName) ?? "Test User",
|
|
163
199
|
remoteJid: chatJid,
|
|
164
|
-
senderJid,
|
|
200
|
+
senderJid: isGroupChat ? senderJid : undefined,
|
|
165
201
|
text,
|
|
166
202
|
});
|
|
167
203
|
const timestamp = String(message.messageTimestamp);
|
|
@@ -200,22 +236,27 @@ async function handleAdminInbound(params) {
|
|
|
200
236
|
],
|
|
201
237
|
object: "whatsapp_business_account",
|
|
202
238
|
};
|
|
203
|
-
return { message,
|
|
239
|
+
return { message, webhook };
|
|
204
240
|
}
|
|
205
241
|
async function handleRequest(params) {
|
|
206
242
|
const url = new URL(params.request.url ?? "/", "http://127.0.0.1");
|
|
207
|
-
if (url.pathname === "/
|
|
208
|
-
return whatsappOk({ selfJid: params.state.selfJid });
|
|
209
|
-
}
|
|
210
|
-
if (url.pathname === "/crabline/whatsapp/inbound") {
|
|
243
|
+
if (url.pathname === "/_crabline/admin/whatsapp/inbound") {
|
|
211
244
|
if (params.request.method !== "POST") {
|
|
245
|
+
drainRequestBody(params.request);
|
|
212
246
|
return new Response("not found", { status: 404 });
|
|
213
247
|
}
|
|
214
248
|
if (!hasAdminToken(params.request, params.state.adminToken)) {
|
|
249
|
+
params.request.resume();
|
|
215
250
|
return adminAuthError();
|
|
216
251
|
}
|
|
217
|
-
const body = await
|
|
252
|
+
const body = await parseUnknownRequestBody(params.request);
|
|
253
|
+
if (!isJsonObject(body)) {
|
|
254
|
+
return graphParameterError("(#100) Invalid parameter: request body", "The request body must be a JSON object.");
|
|
255
|
+
}
|
|
218
256
|
const result = await handleAdminInbound({ body, state: params.state });
|
|
257
|
+
if (result.response) {
|
|
258
|
+
return result.response;
|
|
259
|
+
}
|
|
219
260
|
const event = {
|
|
220
261
|
at: new Date().toISOString(),
|
|
221
262
|
body,
|
|
@@ -224,98 +265,216 @@ async function handleRequest(params) {
|
|
|
224
265
|
query: queryRecord(url),
|
|
225
266
|
type: "admin",
|
|
226
267
|
};
|
|
268
|
+
const preparedDelivery = result.message
|
|
269
|
+
? params.state.prepareInboundMessage(result.message)
|
|
270
|
+
: undefined;
|
|
271
|
+
if (result.message && !preparedDelivery) {
|
|
272
|
+
return graphError({
|
|
273
|
+
code: 4,
|
|
274
|
+
details: "The pending WhatsApp inbound queue is full.",
|
|
275
|
+
message: "(#4) Application request limit reached.",
|
|
276
|
+
status: 503,
|
|
277
|
+
type: "OAuthException",
|
|
278
|
+
});
|
|
279
|
+
}
|
|
227
280
|
if (result.message) {
|
|
228
281
|
event.message = result.message;
|
|
229
282
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
params.state.deliverInboundMessage(result.message);
|
|
283
|
+
try {
|
|
284
|
+
await appendEvent(params.state, event);
|
|
233
285
|
}
|
|
234
|
-
|
|
286
|
+
catch (error) {
|
|
287
|
+
preparedDelivery?.cancel();
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
if (result.message && preparedDelivery) {
|
|
291
|
+
const delivery = await preparedDelivery.commit();
|
|
292
|
+
return whatsappOk({ delivery, message: result.message, webhook: result.webhook });
|
|
293
|
+
}
|
|
294
|
+
return graphParameterError("(#100) Invalid inbound WhatsApp event");
|
|
235
295
|
}
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
at: new Date().toISOString(),
|
|
239
|
-
body,
|
|
240
|
-
method: params.request.method ?? "GET",
|
|
241
|
-
path: url.pathname,
|
|
242
|
-
query: queryRecord(url),
|
|
243
|
-
type: "api",
|
|
244
|
-
});
|
|
296
|
+
const phoneNumberPath = `/${params.state.graphVersion}/${params.state.phoneNumberId}`;
|
|
297
|
+
const messagesPath = `${phoneNumberPath}/messages`;
|
|
245
298
|
if (!requireAuth(params.request, params.state)) {
|
|
299
|
+
params.request.resume();
|
|
246
300
|
return graphAuthError();
|
|
247
301
|
}
|
|
248
|
-
if (url.pathname === "
|
|
302
|
+
if (url.pathname === phoneNumberPath && params.request.method === "GET") {
|
|
303
|
+
const body = queryRecord(url);
|
|
304
|
+
await appendEvent(params.state, {
|
|
305
|
+
at: new Date().toISOString(),
|
|
306
|
+
body,
|
|
307
|
+
method: params.request.method,
|
|
308
|
+
path: url.pathname,
|
|
309
|
+
query: body,
|
|
310
|
+
type: "api",
|
|
311
|
+
});
|
|
312
|
+
return jsonResponse({
|
|
313
|
+
display_phone_number: params.state.displayPhoneNumber,
|
|
314
|
+
id: params.state.phoneNumberId,
|
|
315
|
+
quality_rating: "GREEN",
|
|
316
|
+
verified_name: "Crabline Test Bot",
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
if (url.pathname === messagesPath) {
|
|
249
320
|
if (params.request.method !== "POST") {
|
|
321
|
+
drainRequestBody(params.request);
|
|
250
322
|
return new Response("not found", { status: 404 });
|
|
251
323
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
324
|
+
const body = await parseUnknownRequestBody(params.request);
|
|
325
|
+
const event = {
|
|
326
|
+
at: new Date().toISOString(),
|
|
327
|
+
body,
|
|
328
|
+
method: params.request.method,
|
|
329
|
+
path: url.pathname,
|
|
330
|
+
query: queryRecord(url),
|
|
331
|
+
type: "api",
|
|
332
|
+
};
|
|
333
|
+
let response;
|
|
334
|
+
if (!isJsonObject(body)) {
|
|
335
|
+
response = graphParameterError("(#100) Invalid parameter: request body", "The request body must be a JSON object.");
|
|
336
|
+
}
|
|
337
|
+
else if ("status" in body || "message_id" in body) {
|
|
338
|
+
response = handleMessageStatus(body);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
const prepared = prepareSendMessage({ body, state: params.state });
|
|
342
|
+
if (!(prepared instanceof Response)) {
|
|
343
|
+
response = prepared.commit();
|
|
344
|
+
event.accepted = true;
|
|
345
|
+
await appendEvent(params.state, event);
|
|
346
|
+
return response;
|
|
347
|
+
}
|
|
348
|
+
response = prepared;
|
|
258
349
|
}
|
|
259
|
-
|
|
350
|
+
event.accepted = false;
|
|
351
|
+
await appendEvent(params.state, event);
|
|
352
|
+
return response;
|
|
260
353
|
}
|
|
354
|
+
drainRequestBody(params.request);
|
|
261
355
|
return new Response("not found", { status: 404 });
|
|
262
356
|
}
|
|
263
357
|
export async function startWhatsAppServer(params = {}) {
|
|
358
|
+
const host = params.host ?? "127.0.0.1";
|
|
359
|
+
if (params.accessToken !== undefined &&
|
|
360
|
+
(!params.accessToken.trim() || params.accessToken !== params.accessToken.trim())) {
|
|
361
|
+
throw new Error("WhatsApp accessToken must not be empty or whitespace-padded.");
|
|
362
|
+
}
|
|
363
|
+
if (params.adminToken !== undefined &&
|
|
364
|
+
(!params.adminToken.trim() || params.adminToken !== params.adminToken.trim())) {
|
|
365
|
+
throw new Error("WhatsApp adminToken must not be empty or whitespace-padded.");
|
|
366
|
+
}
|
|
367
|
+
const graphVersion = params.graphVersion ?? DEFAULT_GRAPH_VERSION;
|
|
368
|
+
if (!WHATSAPP_GRAPH_VERSION_RE.test(graphVersion)) {
|
|
369
|
+
throw new Error(`Invalid WhatsApp Graph API version: ${graphVersion}.`);
|
|
370
|
+
}
|
|
371
|
+
const phoneNumberId = params.phoneNumberId ?? "100000000000000";
|
|
372
|
+
if (!/^\d+$/u.test(phoneNumberId)) {
|
|
373
|
+
throw new Error("WhatsApp phoneNumberId must contain only digits.");
|
|
374
|
+
}
|
|
375
|
+
const maxPendingInboundMessages = resolveMaxPendingWhatsAppInboundMessages(params.maxPendingInboundMessages);
|
|
376
|
+
const selfJid = canonicalizeWhatsAppUserJid(params.selfJid ?? "15550000000@s.whatsapp.net");
|
|
377
|
+
if (!selfJid) {
|
|
378
|
+
throw new Error("WhatsApp selfJid must be a WhatsApp user JID.");
|
|
379
|
+
}
|
|
264
380
|
const state = {
|
|
265
|
-
accessToken: params.accessToken ??
|
|
381
|
+
accessToken: params.accessToken ??
|
|
382
|
+
(isLoopbackHost(host)
|
|
383
|
+
? "crabline-whatsapp-access-token"
|
|
384
|
+
: `EAA${randomBytes(24).toString("base64url")}`),
|
|
266
385
|
adminToken: params.adminToken ?? randomBytes(24).toString("hex"),
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
386
|
+
prepareInboundMessage: () => undefined,
|
|
387
|
+
displayPhoneNumber: params.displayPhoneNumber ?? "15550000000",
|
|
388
|
+
graphVersion,
|
|
270
389
|
nextMessageId: 1,
|
|
271
390
|
onEvent: params.onEvent,
|
|
272
|
-
phoneNumberId
|
|
391
|
+
phoneNumberId,
|
|
273
392
|
recorderPath: params.recorderPath ?? path.resolve(".crabline", "servers", "whatsapp.jsonl"),
|
|
274
|
-
selfJid
|
|
393
|
+
selfJid,
|
|
275
394
|
};
|
|
276
|
-
const host = params.host ?? "127.0.0.1";
|
|
277
395
|
const httpServer = await startHttpJsonServer({
|
|
278
396
|
handle: (request) => handleRequest({ request, state }),
|
|
397
|
+
handleError: (error) => {
|
|
398
|
+
if (error instanceof InvalidJsonBodyError) {
|
|
399
|
+
return graphParameterError("(#100) Invalid parameter: request body", "The request body must be valid JSON.");
|
|
400
|
+
}
|
|
401
|
+
if (error instanceof RequestBodyTooLargeError) {
|
|
402
|
+
return graphError({
|
|
403
|
+
code: 100,
|
|
404
|
+
details: "The request body exceeds the supported size limit.",
|
|
405
|
+
message: "(#100) Request body is too large.",
|
|
406
|
+
status: 413,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
return undefined;
|
|
410
|
+
},
|
|
279
411
|
host,
|
|
280
412
|
port: params.port ?? 0,
|
|
281
413
|
serverName: "WhatsApp",
|
|
282
414
|
});
|
|
283
415
|
const baseUrl = httpServer.baseUrl;
|
|
284
|
-
const apiRoot = `${baseUrl}
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
const
|
|
416
|
+
const apiRoot = `${baseUrl}/${state.graphVersion}`;
|
|
417
|
+
const phoneNumberUrl = `${apiRoot}/${state.phoneNumberId}`;
|
|
418
|
+
const messagesUrl = `${phoneNumberUrl}/messages`;
|
|
419
|
+
const baileysWebSocketUrl = `${baseUrl.replace(/^http/u, "ws")}/ws/chat?access_token=${encodeURIComponent(state.accessToken)}`;
|
|
420
|
+
const baileysWebSocketOptions = {
|
|
288
421
|
accessToken: state.accessToken,
|
|
289
422
|
appendEvent: (event) => appendEvent(state, event),
|
|
290
423
|
httpServer: httpServer.server,
|
|
291
|
-
|
|
424
|
+
maxPendingInboundMessages,
|
|
425
|
+
path: "/ws/chat",
|
|
292
426
|
selfJid: state.selfJid,
|
|
293
|
-
}
|
|
294
|
-
|
|
427
|
+
};
|
|
428
|
+
let baileysWebSocketServer;
|
|
429
|
+
try {
|
|
430
|
+
baileysWebSocketServer = attachWhatsAppBaileysWebSocketServer(baileysWebSocketOptions);
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
try {
|
|
434
|
+
await httpServer.close();
|
|
435
|
+
}
|
|
436
|
+
catch (closeError) {
|
|
437
|
+
const aggregateError = new AggregateError([error, closeError], "WhatsApp WebSocket startup failed and HTTP rollback also failed.");
|
|
438
|
+
aggregateError.cause = error;
|
|
439
|
+
throw aggregateError;
|
|
440
|
+
}
|
|
441
|
+
throw error;
|
|
442
|
+
}
|
|
443
|
+
state.prepareInboundMessage = (message) => baileysWebSocketServer.prepareInboundMessage(message);
|
|
295
444
|
return {
|
|
296
445
|
async close() {
|
|
297
|
-
await
|
|
298
|
-
|
|
446
|
+
const results = await Promise.allSettled([
|
|
447
|
+
baileysWebSocketServer.close(),
|
|
448
|
+
httpServer.close(),
|
|
449
|
+
]);
|
|
450
|
+
const errors = results.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
|
|
451
|
+
if (errors.length === 1) {
|
|
452
|
+
throw errors[0];
|
|
453
|
+
}
|
|
454
|
+
if (errors.length > 1) {
|
|
455
|
+
throw new AggregateError(errors, "WhatsApp server shutdown failed.");
|
|
456
|
+
}
|
|
299
457
|
},
|
|
300
458
|
manifest: {
|
|
301
459
|
accessToken: state.accessToken,
|
|
302
460
|
adminToken: state.adminToken,
|
|
303
461
|
baseUrl,
|
|
304
462
|
endpoints: {
|
|
305
|
-
adminInboundUrl: `${
|
|
463
|
+
adminInboundUrl: `${baseUrl}/_crabline/admin/whatsapp/inbound`,
|
|
306
464
|
apiRoot,
|
|
307
465
|
baileysWebSocketUrl,
|
|
308
|
-
messagesUrl
|
|
309
|
-
|
|
466
|
+
messagesUrl,
|
|
467
|
+
phoneNumberUrl,
|
|
468
|
+
statusUrl: messagesUrl,
|
|
310
469
|
},
|
|
311
470
|
env: {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
CRABLINE_WHATSAPP_RECORDER_PATH: state.recorderPath,
|
|
317
|
-
CRABLINE_WHATSAPP_SELF_JID: state.selfJid,
|
|
471
|
+
CLOUD_API_ACCESS_TOKEN: state.accessToken,
|
|
472
|
+
CLOUD_API_VERSION: state.graphVersion,
|
|
473
|
+
WA_BASE_URL: baseUrl,
|
|
474
|
+
WA_PHONE_NUMBER_ID: state.phoneNumberId,
|
|
318
475
|
},
|
|
476
|
+
graphVersion: state.graphVersion,
|
|
477
|
+
phoneNumberId: state.phoneNumberId,
|
|
319
478
|
provider: "whatsapp",
|
|
320
479
|
recorderPath: state.recorderPath,
|
|
321
480
|
selfJid: state.selfJid,
|
|
@@ -323,4 +482,7 @@ export async function startWhatsAppServer(params = {}) {
|
|
|
323
482
|
},
|
|
324
483
|
};
|
|
325
484
|
}
|
|
485
|
+
function readMessageText(value) {
|
|
486
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
487
|
+
}
|
|
326
488
|
//# sourceMappingURL=whatsapp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../src/servers/whatsapp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../src/servers/whatsapp.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n adminAuthError,\n drainRequestBody,\n hasAdminToken,\n InvalidJsonBodyError,\n isJsonObject,\n isLoopbackHost,\n jsonResponse,\n parseUnknownRequestBody,\n queryRecord,\n readTrimmedString,\n RequestBodyTooLargeError,\n startHttpJsonServer,\n type ServerRequestEvent,\n} from \"./http.js\";\nimport { recordServerEvent, type ServerEventObserver } from \"./recorder.js\";\nimport {\n attachWhatsAppBaileysWebSocketServer,\n resolveMaxPendingWhatsAppInboundMessages,\n type PreparedWhatsAppBaileysInboundDelivery,\n type WhatsAppBaileysInboundMessage,\n} from \"./whatsapp-baileys-websocket.js\";\nimport {\n canonicalizeWhatsAppChatJid,\n canonicalizeWhatsAppUserCorrelationJid,\n canonicalizeWhatsAppUserJid,\n isWhatsAppGroupJid,\n} from \"./whatsapp-jid.js\";\n\nconst WHATSAPP_CLOUD_RECIPIENT_RE = /^\\d{7,15}$/u;\nconst WHATSAPP_GRAPH_VERSION_RE = /^v\\d+\\.\\d+$/u;\nconst DEFAULT_GRAPH_VERSION = \"v25.0\";\n\ntype WhatsAppServerState = {\n accessToken: string;\n adminToken: string;\n displayPhoneNumber: string;\n prepareInboundMessage(\n message: WhatsAppBaileysInboundMessage,\n ): PreparedWhatsAppBaileysInboundDelivery | undefined;\n graphVersion: string;\n nextMessageId: number;\n onEvent: ServerEventObserver | undefined;\n phoneNumberId: string;\n recorderPath: string;\n selfJid: string;\n};\n\nexport type WhatsAppBaileysMessage = WhatsAppBaileysInboundMessage;\n\nexport type WhatsAppServerManifest = {\n accessToken: string;\n adminToken: string;\n baseUrl: string;\n endpoints: {\n adminInboundUrl: string;\n apiRoot: string;\n baileysWebSocketUrl: string;\n messagesUrl: string;\n phoneNumberUrl: string;\n statusUrl: string;\n };\n env: {\n CLOUD_API_ACCESS_TOKEN: string;\n CLOUD_API_VERSION: string;\n WA_BASE_URL: string;\n WA_PHONE_NUMBER_ID: string;\n };\n graphVersion: string;\n phoneNumberId: string;\n provider: \"whatsapp\";\n recorderPath: string;\n selfJid: string;\n version: 1;\n};\n\nexport type StartedWhatsAppServer = {\n close(): Promise<void>;\n manifest: WhatsAppServerManifest;\n};\n\nexport type StartWhatsAppServerParams = {\n accessToken?: string | undefined;\n adminToken?: string | undefined;\n displayPhoneNumber?: string | undefined;\n graphVersion?: string | undefined;\n host?: string | undefined;\n maxPendingInboundMessages?: number | undefined;\n onEvent?: ServerEventObserver | undefined;\n phoneNumberId?: string | undefined;\n port?: number | undefined;\n recorderPath?: string | undefined;\n selfJid?: string | undefined;\n};\n\ntype WhatsAppAdminInboundResult = {\n message?: WhatsAppBaileysMessage | undefined;\n response?: Response | undefined;\n webhook?: Record<string, unknown> | undefined;\n};\n\ntype WhatsAppRecorderEvent = ServerRequestEvent & {\n accepted?: boolean | undefined;\n message?: WhatsAppBaileysMessage | undefined;\n};\n\nfunction whatsappOk(value: Record<string, unknown> = {}): Response {\n return jsonResponse({ ok: true, ...value });\n}\n\nfunction graphError(params: {\n code?: number | undefined;\n details?: string | undefined;\n message: string;\n status?: number | undefined;\n type?: string | undefined;\n}): Response {\n return jsonResponse(\n {\n error: {\n code: params.code ?? 100,\n ...(params.details\n ? {\n error_data: {\n details: params.details,\n messaging_product: \"whatsapp\",\n },\n }\n : {}),\n fbtrace_id: \"A1B2C3D4E5F\",\n message: params.message,\n type: params.type ?? \"OAuthException\",\n },\n },\n params.status ?? 400,\n );\n}\n\nfunction graphParameterError(message: string, details?: string): Response {\n return graphError({ code: 100, details, message, status: 400 });\n}\n\nfunction graphAuthError(): Response {\n return graphError({\n code: 190,\n message: \"Invalid OAuth access token.\",\n status: 401,\n });\n}\n\nasync function appendEvent(state: WhatsAppServerState, event: ServerRequestEvent) {\n await recordServerEvent({ event, onEvent: state.onEvent, recorderPath: state.recorderPath });\n}\n\nfunction requireWhatsAppChatJid(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n const canonical = stringValue ? canonicalizeWhatsAppChatJid(stringValue) : undefined;\n if (!canonical) {\n return graphParameterError(\n \"(#100) Invalid parameter: chatJid\",\n \"chatJid must be a WhatsApp user or group JID.\",\n );\n }\n return canonical;\n}\n\nfunction requireWhatsAppSenderJid(value: unknown): string | Response {\n const stringValue = readTrimmedString(value);\n const canonical = stringValue ? canonicalizeWhatsAppUserJid(stringValue) : undefined;\n if (!canonical) {\n return graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must be a WhatsApp user JID.\",\n );\n }\n return canonical;\n}\n\nfunction requireCloudRecipient(value: unknown): string | Response {\n const recipient = readTrimmedString(value);\n if (!recipient || !WHATSAPP_CLOUD_RECIPIENT_RE.test(recipient)) {\n return graphParameterError(\n \"(#100) Invalid parameter: to\",\n \"to must be a WhatsApp phone number in international format without punctuation.\",\n );\n }\n return recipient;\n}\n\nfunction requireAuth(request: IncomingMessage, state: WhatsAppServerState): boolean {\n const authorization = request.headers.authorization;\n if (typeof authorization !== \"string\") {\n return false;\n }\n const match = /^Bearer +(.+)$/iu.exec(authorization.trimStart());\n return match?.[1] === state.accessToken;\n}\n\nfunction nextMessageId(state: WhatsAppServerState): string {\n return `wamid.FAKE${String(state.nextMessageId++).padStart(8, \"0\")}`;\n}\n\nfunction waIdFromJid(jid: string): string {\n return jid.split(\"@\", 1)[0]?.split(\":\", 1)[0] ?? jid;\n}\n\nfunction directPeerIdentity(jid: string): string {\n return canonicalizeWhatsAppUserCorrelationJid(jid) ?? jid;\n}\n\nfunction requireMessagingProduct(body: Record<string, unknown>): Response | undefined {\n const messagingProduct = readTrimmedString(body.messaging_product);\n if (messagingProduct !== \"whatsapp\") {\n return graphParameterError(\n \"(#100) Invalid parameter: messaging_product\",\n 'messaging_product must be \"whatsapp\".',\n );\n }\n return undefined;\n}\n\nfunction readTextMessageBody(body: Record<string, unknown>): string | Response {\n const type = readTrimmedString(body.type);\n if (!type) {\n return graphParameterError(\n \"(#100) Missing required parameter: type\",\n 'A WhatsApp text send requires type to be \"text\".',\n );\n }\n if (type !== \"text\") {\n return graphParameterError(\n \"(#100) Unsupported message type\",\n \"This test API currently supports WhatsApp text message sends.\",\n );\n }\n const textPayload = body.text;\n const text =\n textPayload && typeof textPayload === \"object\"\n ? readMessageText((textPayload as Record<string, unknown>).body)\n : undefined;\n if (text === undefined) {\n return graphParameterError(\n \"(#100) Missing required parameter: text.body\",\n \"A WhatsApp text send requires text.body.\",\n );\n }\n return text;\n}\n\nfunction createWhatsAppMessage(params: {\n fromMe: boolean;\n id: string;\n pushName?: string | undefined;\n remoteJid: string;\n senderJid?: string | undefined;\n text: string;\n}) {\n return {\n key: {\n fromMe: params.fromMe,\n id: params.id,\n ...(params.senderJid ? { participant: params.senderJid } : {}),\n remoteJid: params.remoteJid,\n },\n message: {\n conversation: params.text,\n },\n messageTimestamp: Math.floor(Date.now() / 1000),\n pushName: params.pushName ?? (params.fromMe ? \"Test Bot\" : \"Test User\"),\n };\n}\n\ntype PreparedWhatsAppSend = {\n commit(): Response;\n};\n\nfunction prepareSendMessage(params: {\n body: Record<string, unknown>;\n state: WhatsAppServerState;\n}): PreparedWhatsAppSend | Response {\n const productError = requireMessagingProduct(params.body);\n if (productError) {\n return productError;\n }\n const recipientType = readTrimmedString(params.body.recipient_type);\n if (recipientType && recipientType !== \"individual\") {\n return graphParameterError(\n \"(#100) Invalid parameter: recipient_type\",\n 'recipient_type must be \"individual\".',\n );\n }\n const to = requireCloudRecipient(params.body.to);\n if (to instanceof Response) {\n return to;\n }\n const text = readTextMessageBody(params.body);\n if (text instanceof Response) {\n return text;\n }\n return {\n commit() {\n const message = createWhatsAppMessage({\n fromMe: true,\n id: nextMessageId(params.state),\n remoteJid: `${to}@s.whatsapp.net`,\n text,\n });\n return jsonResponse({\n contacts: [\n {\n input: to,\n wa_id: to,\n },\n ],\n messages: [{ id: message.key.id }],\n messaging_product: \"whatsapp\",\n });\n },\n };\n}\n\nfunction handleMessageStatus(body: Record<string, unknown>): Response {\n const productError = requireMessagingProduct(body);\n if (productError) {\n return productError;\n }\n if (readTrimmedString(body.status) !== \"read\") {\n return graphParameterError(\n \"(#100) Invalid parameter: status\",\n 'status must be \"read\" for message status updates.',\n );\n }\n if (!readTrimmedString(body.message_id)) {\n return graphParameterError(\n \"(#100) Missing required parameter: message_id\",\n \"A message status update requires message_id.\",\n );\n }\n return jsonResponse({ success: true });\n}\n\nasync function handleAdminInbound(params: {\n body: Record<string, unknown>;\n state: WhatsAppServerState;\n}): Promise<WhatsAppAdminInboundResult> {\n const chatJid = requireWhatsAppChatJid(params.body.chatJid ?? params.body.chatId);\n if (chatJid instanceof Response) {\n return { response: chatJid };\n }\n const senderJid = requireWhatsAppSenderJid(params.body.senderJid ?? params.body.from);\n if (senderJid instanceof Response) {\n return { response: senderJid };\n }\n const isGroupChat = isWhatsAppGroupJid(chatJid);\n if (!isGroupChat && directPeerIdentity(chatJid) !== directPeerIdentity(senderJid)) {\n return {\n response: graphParameterError(\n \"(#100) Invalid parameter: senderJid\",\n \"senderJid must identify the direct chat peer.\",\n ),\n };\n }\n const text = readMessageText(params.body.text);\n if (text === undefined) {\n return {\n response: graphParameterError(\n \"(#100) Missing required parameter: text\",\n \"An inbound WhatsApp event requires text.\",\n ),\n };\n }\n const message = createWhatsAppMessage({\n fromMe: false,\n id: readTrimmedString(params.body.messageId) ?? nextMessageId(params.state),\n pushName: readTrimmedString(params.body.pushName) ?? \"Test User\",\n remoteJid: chatJid,\n senderJid: isGroupChat ? senderJid : undefined,\n text,\n });\n const timestamp = String(message.messageTimestamp);\n const webhook = {\n entry: [\n {\n changes: [\n {\n field: \"messages\",\n value: {\n contacts: [\n {\n profile: { name: readTrimmedString(params.body.pushName) ?? \"Test User\" },\n wa_id: waIdFromJid(senderJid),\n },\n ],\n messages: [\n {\n from: waIdFromJid(senderJid),\n id: message.key.id,\n text: { body: text },\n timestamp,\n type: \"text\",\n },\n ],\n messaging_product: \"whatsapp\",\n metadata: {\n display_phone_number: params.state.displayPhoneNumber,\n phone_number_id: params.state.phoneNumberId,\n },\n },\n },\n ],\n id: \"TEST_WABA\",\n },\n ],\n object: \"whatsapp_business_account\",\n };\n return { message, webhook };\n}\n\nasync function handleRequest(params: { request: IncomingMessage; state: WhatsAppServerState }) {\n const url = new URL(params.request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (url.pathname === \"/_crabline/admin/whatsapp/inbound\") {\n if (params.request.method !== \"POST\") {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n if (!hasAdminToken(params.request, params.state.adminToken)) {\n params.request.resume();\n return adminAuthError();\n }\n const body = await parseUnknownRequestBody(params.request);\n if (!isJsonObject(body)) {\n return graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be a JSON object.\",\n );\n }\n const result = await handleAdminInbound({ body, state: params.state });\n if (result.response) {\n return result.response;\n }\n const event: WhatsAppRecorderEvent = {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"admin\",\n };\n const preparedDelivery = result.message\n ? params.state.prepareInboundMessage(result.message)\n : undefined;\n if (result.message && !preparedDelivery) {\n return graphError({\n code: 4,\n details: \"The pending WhatsApp inbound queue is full.\",\n message: \"(#4) Application request limit reached.\",\n status: 503,\n type: \"OAuthException\",\n });\n }\n if (result.message) {\n event.message = result.message;\n }\n try {\n await appendEvent(params.state, event);\n } catch (error) {\n preparedDelivery?.cancel();\n throw error;\n }\n if (result.message && preparedDelivery) {\n const delivery = await preparedDelivery.commit();\n return whatsappOk({ delivery, message: result.message, webhook: result.webhook });\n }\n return graphParameterError(\"(#100) Invalid inbound WhatsApp event\");\n }\n\n const phoneNumberPath = `/${params.state.graphVersion}/${params.state.phoneNumberId}`;\n const messagesPath = `${phoneNumberPath}/messages`;\n if (!requireAuth(params.request, params.state)) {\n params.request.resume();\n return graphAuthError();\n }\n if (url.pathname === phoneNumberPath && params.request.method === \"GET\") {\n const body = queryRecord(url);\n await appendEvent(params.state, {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: body,\n type: \"api\",\n });\n return jsonResponse({\n display_phone_number: params.state.displayPhoneNumber,\n id: params.state.phoneNumberId,\n quality_rating: \"GREEN\",\n verified_name: \"Crabline Test Bot\",\n });\n }\n if (url.pathname === messagesPath) {\n if (params.request.method !== \"POST\") {\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n }\n const body = await parseUnknownRequestBody(params.request);\n const event: WhatsAppRecorderEvent = {\n at: new Date().toISOString(),\n body,\n method: params.request.method,\n path: url.pathname,\n query: queryRecord(url),\n type: \"api\",\n };\n let response: Response;\n if (!isJsonObject(body)) {\n response = graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be a JSON object.\",\n );\n } else if (\"status\" in body || \"message_id\" in body) {\n response = handleMessageStatus(body);\n } else {\n const prepared = prepareSendMessage({ body, state: params.state });\n if (!(prepared instanceof Response)) {\n response = prepared.commit();\n event.accepted = true;\n await appendEvent(params.state, event);\n return response;\n }\n response = prepared;\n }\n event.accepted = false;\n await appendEvent(params.state, event);\n return response;\n }\n drainRequestBody(params.request);\n return new Response(\"not found\", { status: 404 });\n}\n\nexport async function startWhatsAppServer(\n params: StartWhatsAppServerParams = {},\n): Promise<StartedWhatsAppServer> {\n const host = params.host ?? \"127.0.0.1\";\n if (\n params.accessToken !== undefined &&\n (!params.accessToken.trim() || params.accessToken !== params.accessToken.trim())\n ) {\n throw new Error(\"WhatsApp accessToken must not be empty or whitespace-padded.\");\n }\n if (\n params.adminToken !== undefined &&\n (!params.adminToken.trim() || params.adminToken !== params.adminToken.trim())\n ) {\n throw new Error(\"WhatsApp adminToken must not be empty or whitespace-padded.\");\n }\n const graphVersion = params.graphVersion ?? DEFAULT_GRAPH_VERSION;\n if (!WHATSAPP_GRAPH_VERSION_RE.test(graphVersion)) {\n throw new Error(`Invalid WhatsApp Graph API version: ${graphVersion}.`);\n }\n const phoneNumberId = params.phoneNumberId ?? \"100000000000000\";\n if (!/^\\d+$/u.test(phoneNumberId)) {\n throw new Error(\"WhatsApp phoneNumberId must contain only digits.\");\n }\n const maxPendingInboundMessages = resolveMaxPendingWhatsAppInboundMessages(\n params.maxPendingInboundMessages,\n );\n const selfJid = canonicalizeWhatsAppUserJid(params.selfJid ?? \"15550000000@s.whatsapp.net\");\n if (!selfJid) {\n throw new Error(\"WhatsApp selfJid must be a WhatsApp user JID.\");\n }\n const state: WhatsAppServerState = {\n accessToken:\n params.accessToken ??\n (isLoopbackHost(host)\n ? \"crabline-whatsapp-access-token\"\n : `EAA${randomBytes(24).toString(\"base64url\")}`),\n adminToken: params.adminToken ?? randomBytes(24).toString(\"hex\"),\n prepareInboundMessage: () => undefined,\n displayPhoneNumber: params.displayPhoneNumber ?? \"15550000000\",\n graphVersion,\n nextMessageId: 1,\n onEvent: params.onEvent,\n phoneNumberId,\n recorderPath: params.recorderPath ?? path.resolve(\".crabline\", \"servers\", \"whatsapp.jsonl\"),\n selfJid,\n };\n const httpServer = await startHttpJsonServer({\n handle: (request) => handleRequest({ request, state }),\n handleError: (error) => {\n if (error instanceof InvalidJsonBodyError) {\n return graphParameterError(\n \"(#100) Invalid parameter: request body\",\n \"The request body must be valid JSON.\",\n );\n }\n if (error instanceof RequestBodyTooLargeError) {\n return graphError({\n code: 100,\n details: \"The request body exceeds the supported size limit.\",\n message: \"(#100) Request body is too large.\",\n status: 413,\n });\n }\n return undefined;\n },\n host,\n port: params.port ?? 0,\n serverName: \"WhatsApp\",\n });\n const baseUrl = httpServer.baseUrl;\n const apiRoot = `${baseUrl}/${state.graphVersion}`;\n const phoneNumberUrl = `${apiRoot}/${state.phoneNumberId}`;\n const messagesUrl = `${phoneNumberUrl}/messages`;\n const baileysWebSocketUrl = `${baseUrl.replace(\n /^http/u,\n \"ws\",\n )}/ws/chat?access_token=${encodeURIComponent(state.accessToken)}`;\n const baileysWebSocketOptions = {\n accessToken: state.accessToken,\n appendEvent: (event: ServerRequestEvent) => appendEvent(state, event),\n httpServer: httpServer.server,\n maxPendingInboundMessages,\n path: \"/ws/chat\",\n selfJid: state.selfJid,\n };\n let baileysWebSocketServer;\n try {\n baileysWebSocketServer = attachWhatsAppBaileysWebSocketServer(baileysWebSocketOptions);\n } catch (error) {\n try {\n await httpServer.close();\n } catch (closeError) {\n const aggregateError = new AggregateError(\n [error, closeError],\n \"WhatsApp WebSocket startup failed and HTTP rollback also failed.\",\n );\n aggregateError.cause = error;\n throw aggregateError;\n }\n throw error;\n }\n state.prepareInboundMessage = (message) => baileysWebSocketServer.prepareInboundMessage(message);\n return {\n async close() {\n const results = await Promise.allSettled([\n baileysWebSocketServer.close(),\n httpServer.close(),\n ]);\n const errors = results.flatMap((result) =>\n result.status === \"rejected\" ? [result.reason] : [],\n );\n if (errors.length === 1) {\n throw errors[0];\n }\n if (errors.length > 1) {\n throw new AggregateError(errors, \"WhatsApp server shutdown failed.\");\n }\n },\n manifest: {\n accessToken: state.accessToken,\n adminToken: state.adminToken,\n baseUrl,\n endpoints: {\n adminInboundUrl: `${baseUrl}/_crabline/admin/whatsapp/inbound`,\n apiRoot,\n baileysWebSocketUrl,\n messagesUrl,\n phoneNumberUrl,\n statusUrl: messagesUrl,\n },\n env: {\n CLOUD_API_ACCESS_TOKEN: state.accessToken,\n CLOUD_API_VERSION: state.graphVersion,\n WA_BASE_URL: baseUrl,\n WA_PHONE_NUMBER_ID: state.phoneNumberId,\n },\n graphVersion: state.graphVersion,\n phoneNumberId: state.phoneNumberId,\n provider: \"whatsapp\",\n recorderPath: state.recorderPath,\n selfJid: state.selfJid,\n version: 1,\n },\n };\n}\n\nfunction readMessageText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n"]}
|