@openclaw/crabline 0.1.3 → 0.1.4
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 +22 -22
- package/dist/src/cli/program.js +1 -0
- package/dist/src/cli/program.js.map +1 -1
- package/dist/src/fake-servers/http.d.ts +1 -0
- package/dist/src/fake-servers/http.js +1 -0
- package/dist/src/fake-servers/http.js.map +1 -1
- package/dist/src/fake-servers/whatsapp-baileys-websocket.d.ts +27 -0
- package/dist/src/fake-servers/whatsapp-baileys-websocket.js +555 -0
- package/dist/src/fake-servers/whatsapp-baileys-websocket.js.map +1 -0
- package/dist/src/fake-servers/whatsapp-wire/binary-node.d.ts +9 -0
- package/dist/src/fake-servers/whatsapp-wire/binary-node.js +427 -0
- package/dist/src/fake-servers/whatsapp-wire/binary-node.js.map +1 -0
- package/dist/src/fake-servers/whatsapp-wire/crypto.d.ts +27 -0
- package/dist/src/fake-servers/whatsapp-wire/crypto.js +108 -0
- package/dist/src/fake-servers/whatsapp-wire/crypto.js.map +1 -0
- package/dist/src/fake-servers/whatsapp-wire/handshake.d.ts +17 -0
- package/dist/src/fake-servers/whatsapp-wire/handshake.js +154 -0
- package/dist/src/fake-servers/whatsapp-wire/handshake.js.map +1 -0
- package/dist/src/fake-servers/whatsapp-wire/signal.d.ts +5 -0
- package/dist/src/fake-servers/whatsapp-wire/signal.js +24 -0
- package/dist/src/fake-servers/whatsapp-wire/signal.js.map +1 -0
- package/dist/src/fake-servers/whatsapp.d.ts +4 -61
- package/dist/src/fake-servers/whatsapp.js +15 -163
- package/dist/src/fake-servers/whatsapp.js.map +1 -1
- package/dist/src/index.d.ts +2 -4
- package/dist/src/index.js +1 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/openclaw/bridges/whatsapp.js +1 -2
- package/dist/src/openclaw/bridges/whatsapp.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/docs/channel-setup.md +22 -20
- package/package.json +5 -5
- package/dist/src/fake-servers/whatsapp-socket-factory.d.ts +0 -34
- package/dist/src/fake-servers/whatsapp-socket-factory.js +0 -225
- package/dist/src/fake-servers/whatsapp-socket-factory.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/whatsapp.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,oCAAoC,EACpC,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,MAAM,eAAe,GACnB,qFAAqF,CAAC;AAExF,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAa;IACtD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,0CAA0C,GAAG,oCAAoC,CAAC;IAC7F,QAAQ,EAAE,UAAU;IACpB,aAAa,CAAC,QAAQ;QACpB,OAAO;YACL,KAAK,CAAC,KAAK;gBACT,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,SAAS,CAAC,CAAC;gBACrE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,mDAAmD,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzF,CAAC;gBACD,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,CAAC;YACD,aAAa;gBACX,OAAO;oBACL,SAAS,EAAE,kBAAkB;oBAC7B,OAAO,EAAE,UAAU;oBACnB,2BAA2B,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACrC,GAAG,GAAG;wBACN,6BAA6B,EAAE,QAAQ,CAAC,UAAU;wBAClD,
|
|
1
|
+
{"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../../../../src/openclaw/bridges/whatsapp.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,7 +57,7 @@ export declare const OPENCLAW_SUPPORT_CATALOG: readonly [{
|
|
|
57
57
|
readonly status: "ready";
|
|
58
58
|
readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
|
|
59
59
|
}, CatalogEntry, CatalogEntry, CatalogEntry, {
|
|
60
|
-
readonly notes: "Built-in local WhatsApp mock with Business webhook
|
|
60
|
+
readonly notes: "Built-in local WhatsApp mock with Business webhook and Baileys WebSocket shapes.";
|
|
61
61
|
readonly platform: "whatsapp";
|
|
62
62
|
readonly status: "ready";
|
|
63
63
|
readonly supports: readonly ["probe", "send", "roundtrip", "agent"];
|
|
@@ -79,7 +79,7 @@ export const OPENCLAW_SUPPORT_CATALOG = [
|
|
|
79
79
|
createBridgeEntry("twitch", "OpenClaw plugin channel via script bridge."),
|
|
80
80
|
createBridgeEntry("webchat", "OpenClaw web channel via script bridge."),
|
|
81
81
|
{
|
|
82
|
-
notes: "Built-in local WhatsApp mock with Business webhook
|
|
82
|
+
notes: "Built-in local WhatsApp mock with Business webhook and Baileys WebSocket shapes.",
|
|
83
83
|
platform: "whatsapp",
|
|
84
84
|
status: "ready",
|
|
85
85
|
supports: COMMON_BRIDGE_SUPPORT,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/providers/catalog.ts"],"names":[],"mappings":"AAUA,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAU,CAAC;AAE/E,SAAS,iBAAiB,CAAC,QAA0B,EAAE,KAAa;IAClE,OAAO;QACL,KAAK;QACL,QAAQ;QACR,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,qBAAqB;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,KAAK,EAAE,0DAA0D;QACjE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CACf,aAAa,EACb,gEAAgE,CACjE;IACD;QACE,KAAK,EAAE,8DAA8D;QACrE,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,KAAK,EAAE,qCAAqC,CAAC;IAC/D,iBAAiB,CAAC,MAAM,EAAE,4CAA4C,CAAC;IACvE;QACE,KAAK,EAAE,6BAA6B;QACpC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,iCAAiC;QACxC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,eAAe,EAAE,4CAA4C,CAAC;IAChF,iBAAiB,CAAC,OAAO,EAAE,4CAA4C,CAAC;IACxE,iBAAiB,CAAC,QAAQ,EAAE,qCAAqC,CAAC;IAClE;QACE,KAAK,EAAE,sDAAsD;QAC7D,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,cAAc,EAAE,4CAA4C,CAAC;IAC/E;QACE,KAAK,EAAE,gEAAgE;QACvE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,MAAM,EAAE,4CAA4C,CAAC;IACvE,iBAAiB,CAAC,QAAQ,EAAE,4CAA4C,CAAC;IACzE,iBAAiB,CAAC,SAAS,EAAE,yCAAyC,CAAC;IACvE;QACE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/providers/catalog.ts"],"names":[],"mappings":"AAUA,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAU,CAAC;AAE/E,SAAS,iBAAiB,CAAC,QAA0B,EAAE,KAAa;IAClE,OAAO;QACL,KAAK;QACL,QAAQ;QACR,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,qBAAqB;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC;QACE,KAAK,EAAE,0DAA0D;QACjE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CACf,aAAa,EACb,gEAAgE,CACjE;IACD;QACE,KAAK,EAAE,8DAA8D;QACrE,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,kCAAkC;QACzC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,+BAA+B;QACtC,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,KAAK,EAAE,qCAAqC,CAAC;IAC/D,iBAAiB,CAAC,MAAM,EAAE,4CAA4C,CAAC;IACvE;QACE,KAAK,EAAE,6BAA6B;QACpC,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,iCAAiC;QACxC,QAAQ,EAAE,YAAY;QACtB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,eAAe,EAAE,4CAA4C,CAAC;IAChF,iBAAiB,CAAC,OAAO,EAAE,4CAA4C,CAAC;IACxE,iBAAiB,CAAC,QAAQ,EAAE,qCAAqC,CAAC;IAClE;QACE,KAAK,EAAE,sDAAsD;QAC7D,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,cAAc,EAAE,4CAA4C,CAAC;IAC/E;QACE,KAAK,EAAE,gEAAgE;QACvE,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,MAAM,EAAE,4CAA4C,CAAC;IACvE,iBAAiB,CAAC,QAAQ,EAAE,4CAA4C,CAAC;IACzE,iBAAiB,CAAC,SAAS,EAAE,yCAAyC,CAAC;IACvE;QACE,KAAK,EAAE,kFAAkF;QACzF,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD;QACE,KAAK,EAAE,2BAA2B;QAClC,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,qBAAqB;KAChC;IACD,iBAAiB,CAAC,UAAU,EAAE,6DAA6D,CAAC;CAClD,CAAC"}
|
package/docs/channel-setup.md
CHANGED
|
@@ -146,33 +146,35 @@ crabline --json serve whatsapp --ready-file .crabline/whatsapp-server.json
|
|
|
146
146
|
Manifest fields:
|
|
147
147
|
|
|
148
148
|
- `endpoints.apiRoot`: Crabline WhatsApp fake provider API root
|
|
149
|
+
- `endpoints.baileysWebSocketUrl`: Baileys-compatible WebSocket URL for
|
|
150
|
+
`waWebSocketUrl`, including the fake provider access token query parameter
|
|
149
151
|
- `accessToken`: bearer token for fake provider requests
|
|
150
152
|
- `adminToken`: value for the `X-Crabline-Admin-Token` header on admin ingress
|
|
151
153
|
- `selfJid`: fake authenticated WhatsApp user JID
|
|
152
|
-
- `env.CRABLINE_WHATSAPP_ACCESS_TOKEN`:
|
|
153
|
-
|
|
154
|
-
- `env.
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
154
|
+
- `env.CRABLINE_WHATSAPP_ACCESS_TOKEN`: same value as `accessToken`
|
|
155
|
+
- `env.CRABLINE_WHATSAPP_API_ROOT`: same value as `endpoints.apiRoot`
|
|
156
|
+
- `env.CRABLINE_WHATSAPP_BAILEYS_WEB_SOCKET_URL`: same value as
|
|
157
|
+
`endpoints.baileysWebSocketUrl`
|
|
158
|
+
- `env.CRABLINE_WHATSAPP_RECORDER_PATH`: recorder file for HTTP traffic and
|
|
159
|
+
Baileys WebSocket stanzas
|
|
160
|
+
- `env.CRABLINE_WHATSAPP_SELF_JID`: fake authenticated WhatsApp user JID
|
|
159
161
|
- `endpoints.adminInboundUrl`: authenticated admin ingress for test user
|
|
160
|
-
messages
|
|
161
|
-
- `endpoints.messagesUrl`: text send endpoint
|
|
162
|
-
- `endpoints.presenceUrl`: presence endpoint
|
|
163
|
-
- `recorderPath`: JSONL provider traffic recorder
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
162
|
+
messages using the WhatsApp Business webhook payload shape
|
|
163
|
+
- `endpoints.messagesUrl`: text send endpoint for Graph-style callers
|
|
164
|
+
- `endpoints.presenceUrl`: presence endpoint for Graph-style callers
|
|
165
|
+
- `recorderPath`: JSONL provider traffic recorder for HTTP traffic and Baileys
|
|
166
|
+
WebSocket stanzas
|
|
167
|
+
|
|
168
|
+
Pass `endpoints.baileysWebSocketUrl` to Baileys as `waWebSocketUrl` when a
|
|
169
|
+
runtime needs to connect through the fake provider. The fake server completes
|
|
170
|
+
the Baileys Noise handshake, serves bootstrap/device/prekey queries, and records
|
|
171
|
+
encrypted outbound WebSocket stanzas. The WebSocket endpoint rejects clients
|
|
172
|
+
that do not present the access token embedded in the manifest URL. The admin
|
|
173
|
+
token is generated randomly unless `--admin-token <token>` is provided.
|
|
171
174
|
|
|
172
175
|
OpenClaw bridge callers should post injected user messages with the
|
|
173
176
|
`providerUrl`, `providerHeaders`, and `providerBody` returned by
|
|
174
|
-
`createOpenClawCrablineInbound()`.
|
|
175
|
-
server also exposes `createBaileysMockSocket()`.
|
|
177
|
+
`createOpenClawCrablineInbound()`.
|
|
176
178
|
The admin ingress accepts JSON like:
|
|
177
179
|
|
|
178
180
|
```json
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/crabline",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Standalone CLI for deterministic messaging provider E2E tests",
|
|
5
5
|
"homepage": "https://github.com/openclaw/crabline#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -27,10 +27,6 @@
|
|
|
27
27
|
".": {
|
|
28
28
|
"types": "./dist/src/index.d.ts",
|
|
29
29
|
"import": "./dist/src/index.js"
|
|
30
|
-
},
|
|
31
|
-
"./whatsapp-socket-factory": {
|
|
32
|
-
"types": "./dist/src/fake-servers/whatsapp-socket-factory.d.ts",
|
|
33
|
-
"import": "./dist/src/fake-servers/whatsapp-socket-factory.js"
|
|
34
30
|
}
|
|
35
31
|
},
|
|
36
32
|
"scripts": {
|
|
@@ -54,14 +50,18 @@
|
|
|
54
50
|
},
|
|
55
51
|
"dependencies": {
|
|
56
52
|
"commander": "^14.0.3",
|
|
53
|
+
"curve25519-js": "^0.0.4",
|
|
57
54
|
"picocolors": "^1.1.1",
|
|
55
|
+
"ws": "^8.21.0",
|
|
58
56
|
"yaml": "^2.9.0",
|
|
59
57
|
"zod": "^4.4.3"
|
|
60
58
|
},
|
|
61
59
|
"devDependencies": {
|
|
62
60
|
"@types/node": "^25.9.2",
|
|
61
|
+
"@types/ws": "^8.18.1",
|
|
63
62
|
"@typescript/native-preview": "7.0.0-dev.20260503.1",
|
|
64
63
|
"@vitest/coverage-v8": "^4.1.8",
|
|
64
|
+
"baileys": "7.0.0-rc13",
|
|
65
65
|
"oxfmt": "^0.47.0",
|
|
66
66
|
"oxlint": "^1.69.0",
|
|
67
67
|
"oxlint-tsgolint": "^0.22.1",
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { type WhatsAppBaileysMockConfig, type WhatsAppBaileysMockSocket } from "./whatsapp.js";
|
|
2
|
-
export declare const CRABLINE_WHATSAPP_ACCESS_TOKEN_ENV = "CRABLINE_WHATSAPP_ACCESS_TOKEN";
|
|
3
|
-
export declare const CRABLINE_WHATSAPP_API_ROOT_ENV = "CRABLINE_WHATSAPP_API_ROOT";
|
|
4
|
-
export declare const CRABLINE_WHATSAPP_RECORDER_PATH_ENV = "CRABLINE_WHATSAPP_RECORDER_PATH";
|
|
5
|
-
export declare const CRABLINE_WHATSAPP_SELF_JID_ENV = "CRABLINE_WHATSAPP_SELF_JID";
|
|
6
|
-
export type WhatsAppBaileysRuntimeGroupMetadata = {
|
|
7
|
-
id: string;
|
|
8
|
-
participants: unknown[];
|
|
9
|
-
subject: string;
|
|
10
|
-
};
|
|
11
|
-
export type WhatsAppBaileysRuntimeMockSocket = WhatsAppBaileysMockSocket & {
|
|
12
|
-
end(error?: Error | undefined): void;
|
|
13
|
-
groupFetchAllParticipating(): Promise<Record<string, WhatsAppBaileysRuntimeGroupMetadata>>;
|
|
14
|
-
groupMetadata(jid: string): Promise<WhatsAppBaileysRuntimeGroupMetadata>;
|
|
15
|
-
readMessages(keys?: unknown[] | undefined): Promise<void>;
|
|
16
|
-
};
|
|
17
|
-
export type WhatsAppBaileysRuntimeMockConfig = WhatsAppBaileysMockConfig & {
|
|
18
|
-
emitConnectionOpen?: boolean | undefined;
|
|
19
|
-
recorderPath?: string | undefined;
|
|
20
|
-
recorderPollMs?: number | undefined;
|
|
21
|
-
};
|
|
22
|
-
export type WhatsAppSocketFactoryOptions = {
|
|
23
|
-
fetch?: typeof fetch | undefined;
|
|
24
|
-
selfJid?: string | undefined;
|
|
25
|
-
};
|
|
26
|
-
export declare function startWhatsAppBaileysRecorderBridge(params: {
|
|
27
|
-
recorderPath: string;
|
|
28
|
-
recorderPollMs?: number | undefined;
|
|
29
|
-
socket: WhatsAppBaileysMockSocket;
|
|
30
|
-
}): () => void;
|
|
31
|
-
export declare function createWhatsAppBaileysRuntimeMockSocket(config: WhatsAppBaileysRuntimeMockConfig): WhatsAppBaileysRuntimeMockSocket;
|
|
32
|
-
export declare function createWhatsAppBaileysRuntimeMockSocketFromEnv(env?: NodeJS.ProcessEnv, options?: WhatsAppSocketFactoryOptions): WhatsAppBaileysRuntimeMockSocket;
|
|
33
|
-
export declare function createWhatsAppSocket(_printQr?: boolean, _verbose?: boolean, options?: WhatsAppSocketFactoryOptions): Promise<WhatsAppBaileysRuntimeMockSocket>;
|
|
34
|
-
export default createWhatsAppSocket;
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import fsPromises from "node:fs/promises";
|
|
3
|
-
import { createWhatsAppBaileysMockSocket, } from "./whatsapp.js";
|
|
4
|
-
export const CRABLINE_WHATSAPP_ACCESS_TOKEN_ENV = "CRABLINE_WHATSAPP_ACCESS_TOKEN";
|
|
5
|
-
export const CRABLINE_WHATSAPP_API_ROOT_ENV = "CRABLINE_WHATSAPP_API_ROOT";
|
|
6
|
-
export const CRABLINE_WHATSAPP_RECORDER_PATH_ENV = "CRABLINE_WHATSAPP_RECORDER_PATH";
|
|
7
|
-
export const CRABLINE_WHATSAPP_SELF_JID_ENV = "CRABLINE_WHATSAPP_SELF_JID";
|
|
8
|
-
const DEFAULT_RECORDER_POLL_MS = 50;
|
|
9
|
-
const RECORDER_BRIDGE_STATE_KEY = Symbol.for("crabline.whatsapp.baileysRecorderBridge");
|
|
10
|
-
function readNonEmptyString(value) {
|
|
11
|
-
const trimmed = typeof value === "string" ? value.trim() : "";
|
|
12
|
-
return trimmed || undefined;
|
|
13
|
-
}
|
|
14
|
-
function readRequiredEnv(env, key) {
|
|
15
|
-
const value = readNonEmptyString(env[key]);
|
|
16
|
-
if (!value) {
|
|
17
|
-
throw new Error(`${key} is required to create a WhatsApp Baileys mock socket.`);
|
|
18
|
-
}
|
|
19
|
-
return value;
|
|
20
|
-
}
|
|
21
|
-
function readOptionalEnv(env, key) {
|
|
22
|
-
return readNonEmptyString(env[key]);
|
|
23
|
-
}
|
|
24
|
-
function isRecord(value) {
|
|
25
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
26
|
-
}
|
|
27
|
-
function readRecordedInboundMessage(value) {
|
|
28
|
-
if (!isRecord(value) || !isRecord(value.key) || !isRecord(value.message)) {
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
const id = readNonEmptyString(value.key.id);
|
|
32
|
-
const remoteJid = readNonEmptyString(value.key.remoteJid);
|
|
33
|
-
if (!id || !remoteJid || value.key.fromMe !== false) {
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
return value;
|
|
37
|
-
}
|
|
38
|
-
function getRecorderBridgeState(recorderPath) {
|
|
39
|
-
const globalState = globalThis;
|
|
40
|
-
const states = globalState[RECORDER_BRIDGE_STATE_KEY] ?? new Map();
|
|
41
|
-
globalState[RECORDER_BRIDGE_STATE_KEY] = states;
|
|
42
|
-
const state = states.get(recorderPath) ?? {
|
|
43
|
-
cursor: readRecorderLineCountSync(recorderPath),
|
|
44
|
-
interval: null,
|
|
45
|
-
sockets: new Set(),
|
|
46
|
-
syncPromise: null,
|
|
47
|
-
};
|
|
48
|
-
states.set(recorderPath, state);
|
|
49
|
-
return state;
|
|
50
|
-
}
|
|
51
|
-
function parseRecorderLine(line) {
|
|
52
|
-
try {
|
|
53
|
-
return JSON.parse(line);
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function createInboundMessageFromRecorderEvent(event, lineIndex) {
|
|
60
|
-
if (!isRecord(event) || event.type !== "admin" || typeof event.path !== "string") {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
if (!event.path.endsWith("/crabline/whatsapp/inbound")) {
|
|
64
|
-
return null;
|
|
65
|
-
}
|
|
66
|
-
const recordedMessage = readRecordedInboundMessage(event.message);
|
|
67
|
-
if (recordedMessage) {
|
|
68
|
-
return recordedMessage;
|
|
69
|
-
}
|
|
70
|
-
if (!isRecord(event.body)) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
const chatJid = readNonEmptyString(event.body.chatJid ?? event.body.chatId);
|
|
74
|
-
const senderJid = readNonEmptyString(event.body.senderJid ?? event.body.from);
|
|
75
|
-
const text = readNonEmptyString(event.body.text);
|
|
76
|
-
if (!chatJid || !senderJid || !text) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
const messageId = readNonEmptyString(event.body.messageId) ??
|
|
80
|
-
`wamid.FAKEQA${String(lineIndex + 1).padStart(8, "0")}`;
|
|
81
|
-
return {
|
|
82
|
-
key: {
|
|
83
|
-
fromMe: false,
|
|
84
|
-
id: messageId,
|
|
85
|
-
...(chatJid.endsWith("@g.us") ? { participant: senderJid } : {}),
|
|
86
|
-
remoteJid: chatJid,
|
|
87
|
-
},
|
|
88
|
-
message: {
|
|
89
|
-
conversation: text,
|
|
90
|
-
},
|
|
91
|
-
messageTimestamp: Math.floor(Date.now() / 1000),
|
|
92
|
-
pushName: readNonEmptyString(event.body.pushName) ?? "Test User",
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
async function readRecorderLines(recorderPath) {
|
|
96
|
-
const text = await fsPromises.readFile(recorderPath, "utf8").catch((error) => {
|
|
97
|
-
if (isRecord(error) && error.code === "ENOENT") {
|
|
98
|
-
return "";
|
|
99
|
-
}
|
|
100
|
-
throw error;
|
|
101
|
-
});
|
|
102
|
-
return text.split(/\r?\n/u).filter((line) => line.trim().length > 0);
|
|
103
|
-
}
|
|
104
|
-
function readRecorderLineCountSync(recorderPath) {
|
|
105
|
-
try {
|
|
106
|
-
return fs
|
|
107
|
-
.readFileSync(recorderPath, "utf8")
|
|
108
|
-
.split(/\r?\n/u)
|
|
109
|
-
.filter((line) => line.trim().length > 0).length;
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
if (isRecord(error) && error.code === "ENOENT") {
|
|
113
|
-
return 0;
|
|
114
|
-
}
|
|
115
|
-
throw error;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
export function startWhatsAppBaileysRecorderBridge(params) {
|
|
119
|
-
const state = getRecorderBridgeState(params.recorderPath);
|
|
120
|
-
state.sockets.add(params.socket);
|
|
121
|
-
const sync = async () => {
|
|
122
|
-
if (state.syncPromise) {
|
|
123
|
-
await state.syncPromise;
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
state.syncPromise = (async () => {
|
|
127
|
-
const lines = await readRecorderLines(params.recorderPath);
|
|
128
|
-
if (lines.length < state.cursor) {
|
|
129
|
-
state.cursor = 0;
|
|
130
|
-
}
|
|
131
|
-
for (let lineIndex = state.cursor; lineIndex < lines.length; lineIndex += 1) {
|
|
132
|
-
const event = parseRecorderLine(lines[lineIndex] ?? "");
|
|
133
|
-
const message = createInboundMessageFromRecorderEvent(event, lineIndex);
|
|
134
|
-
if (message) {
|
|
135
|
-
const payload = { messages: [message], type: "notify" };
|
|
136
|
-
for (const socket of state.sockets) {
|
|
137
|
-
socket.ev.emit("messages.upsert", payload);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
state.cursor = lines.length;
|
|
142
|
-
})();
|
|
143
|
-
try {
|
|
144
|
-
await state.syncPromise;
|
|
145
|
-
}
|
|
146
|
-
finally {
|
|
147
|
-
state.syncPromise = null;
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
if (!state.interval) {
|
|
151
|
-
state.interval = setInterval(() => {
|
|
152
|
-
void sync().catch(() => undefined);
|
|
153
|
-
}, params.recorderPollMs ?? DEFAULT_RECORDER_POLL_MS);
|
|
154
|
-
state.interval.unref?.();
|
|
155
|
-
}
|
|
156
|
-
void sync().catch(() => undefined);
|
|
157
|
-
return () => {
|
|
158
|
-
state.sockets.delete(params.socket);
|
|
159
|
-
if (state.sockets.size === 0 && state.interval) {
|
|
160
|
-
clearInterval(state.interval);
|
|
161
|
-
state.interval = null;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
export function createWhatsAppBaileysRuntimeMockSocket(config) {
|
|
166
|
-
const socket = createWhatsAppBaileysMockSocket(config);
|
|
167
|
-
const stopRecorderBridge = config.recorderPath
|
|
168
|
-
? startWhatsAppBaileysRecorderBridge({
|
|
169
|
-
recorderPath: config.recorderPath,
|
|
170
|
-
recorderPollMs: config.recorderPollMs,
|
|
171
|
-
socket,
|
|
172
|
-
})
|
|
173
|
-
: () => { };
|
|
174
|
-
const openTimer = config.emitConnectionOpen === false
|
|
175
|
-
? null
|
|
176
|
-
: setTimeout(() => {
|
|
177
|
-
socket.ev.emit("connection.update", { connection: "open" });
|
|
178
|
-
}, 0);
|
|
179
|
-
openTimer?.unref?.();
|
|
180
|
-
let closed = false;
|
|
181
|
-
return {
|
|
182
|
-
...socket,
|
|
183
|
-
end(error) {
|
|
184
|
-
if (closed) {
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
closed = true;
|
|
188
|
-
if (openTimer) {
|
|
189
|
-
clearTimeout(openTimer);
|
|
190
|
-
}
|
|
191
|
-
stopRecorderBridge();
|
|
192
|
-
socket.ev.emit("connection.update", {
|
|
193
|
-
connection: "close",
|
|
194
|
-
lastDisconnect: error ? { error } : undefined,
|
|
195
|
-
});
|
|
196
|
-
},
|
|
197
|
-
async groupFetchAllParticipating() {
|
|
198
|
-
return {};
|
|
199
|
-
},
|
|
200
|
-
async groupMetadata(jid) {
|
|
201
|
-
return {
|
|
202
|
-
id: jid,
|
|
203
|
-
participants: [],
|
|
204
|
-
subject: "Test Group",
|
|
205
|
-
};
|
|
206
|
-
},
|
|
207
|
-
async readMessages() {
|
|
208
|
-
return undefined;
|
|
209
|
-
},
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
export function createWhatsAppBaileysRuntimeMockSocketFromEnv(env = process.env, options = {}) {
|
|
213
|
-
return createWhatsAppBaileysRuntimeMockSocket({
|
|
214
|
-
accessToken: readRequiredEnv(env, CRABLINE_WHATSAPP_ACCESS_TOKEN_ENV),
|
|
215
|
-
apiRoot: readRequiredEnv(env, CRABLINE_WHATSAPP_API_ROOT_ENV),
|
|
216
|
-
fetch: options.fetch,
|
|
217
|
-
recorderPath: readOptionalEnv(env, CRABLINE_WHATSAPP_RECORDER_PATH_ENV),
|
|
218
|
-
selfJid: readOptionalEnv(env, CRABLINE_WHATSAPP_SELF_JID_ENV) ?? options.selfJid,
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
export async function createWhatsAppSocket(_printQr, _verbose, options = {}) {
|
|
222
|
-
return createWhatsAppBaileysRuntimeMockSocketFromEnv(process.env, options);
|
|
223
|
-
}
|
|
224
|
-
export default createWhatsAppSocket;
|
|
225
|
-
//# sourceMappingURL=whatsapp-socket-factory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp-socket-factory.js","sourceRoot":"","sources":["../../../src/fake-servers/whatsapp-socket-factory.ts"],"names":[],"mappings":"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"}
|