@openclaw/crabline 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/README.md +47 -22
  2. package/assets/crabline-banner.svg +20 -0
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +25 -1
  5. package/dist/src/cli/program.js +579 -82
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +59 -6
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +116 -92
  10. package/dist/src/config/schema.js +179 -73
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.js +9 -2
  13. package/dist/src/core/errors.js.map +1 -1
  14. package/dist/src/core/exit-codes.js.map +1 -1
  15. package/dist/src/core/matcher.js +7 -6
  16. package/dist/src/core/matcher.js.map +1 -1
  17. package/dist/src/core/message-template.js.map +1 -1
  18. package/dist/src/core/nonces.d.ts +1 -0
  19. package/dist/src/core/nonces.js +4 -2
  20. package/dist/src/core/nonces.js.map +1 -1
  21. package/dist/src/core/reporters.d.ts +1 -0
  22. package/dist/src/core/reporters.js +42 -4
  23. package/dist/src/core/reporters.js.map +1 -1
  24. package/dist/src/core/run.d.ts +3 -0
  25. package/dist/src/core/run.js +415 -107
  26. package/dist/src/core/run.js.map +1 -1
  27. package/dist/src/core/safe-regex.d.ts +3 -0
  28. package/dist/src/core/safe-regex.js +21 -0
  29. package/dist/src/core/safe-regex.js.map +1 -0
  30. package/dist/src/index.d.ts +2 -2
  31. package/dist/src/index.js +1 -1
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/openclaw/artifact-generation.d.ts +43 -0
  34. package/dist/src/openclaw/artifact-generation.js +363 -0
  35. package/dist/src/openclaw/artifact-generation.js.map +1 -0
  36. package/dist/src/openclaw/bridges/matrix.js +97 -12
  37. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  38. package/dist/src/openclaw/bridges/mattermost.js +32 -10
  39. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  40. package/dist/src/openclaw/bridges/signal.js +55 -18
  41. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  42. package/dist/src/openclaw/bridges/slack.js +85 -7
  43. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  44. package/dist/src/openclaw/bridges/telegram.js +124 -30
  45. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  46. package/dist/src/openclaw/bridges/whatsapp.js +78 -17
  47. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  48. package/dist/src/openclaw/bridges/zalo.js +14 -5
  49. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  50. package/dist/src/openclaw/outbound-contract.d.ts +5 -0
  51. package/dist/src/openclaw/outbound-contract.js +40 -0
  52. package/dist/src/openclaw/outbound-contract.js.map +1 -0
  53. package/dist/src/openclaw/private-file.d.ts +28 -0
  54. package/dist/src/openclaw/private-file.js +465 -0
  55. package/dist/src/openclaw/private-file.js.map +1 -0
  56. package/dist/src/openclaw/shared.d.ts +21 -2
  57. package/dist/src/openclaw/shared.js +115 -18
  58. package/dist/src/openclaw/shared.js.map +1 -1
  59. package/dist/src/openclaw/smoke-lock.d.ts +63 -0
  60. package/dist/src/openclaw/smoke-lock.js +1004 -0
  61. package/dist/src/openclaw/smoke-lock.js.map +1 -0
  62. package/dist/src/openclaw.d.ts +16 -8
  63. package/dist/src/openclaw.js +334 -52
  64. package/dist/src/openclaw.js.map +1 -1
  65. package/dist/src/providers/builtin/discord.d.ts +10 -1
  66. package/dist/src/providers/builtin/discord.js +144 -18
  67. package/dist/src/providers/builtin/discord.js.map +1 -1
  68. package/dist/src/providers/builtin/external-webhook-auth.d.ts +11 -0
  69. package/dist/src/providers/builtin/external-webhook-auth.js +10 -0
  70. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -0
  71. package/dist/src/providers/builtin/feishu.d.ts +19 -2
  72. package/dist/src/providers/builtin/feishu.js +307 -25
  73. package/dist/src/providers/builtin/feishu.js.map +1 -1
  74. package/dist/src/providers/builtin/googlechat.d.ts +20 -1
  75. package/dist/src/providers/builtin/googlechat.js +178 -19
  76. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  77. package/dist/src/providers/builtin/imessage.d.ts +4 -0
  78. package/dist/src/providers/builtin/imessage.js +26 -11
  79. package/dist/src/providers/builtin/imessage.js.map +1 -1
  80. package/dist/src/providers/builtin/loopback.js +92 -30
  81. package/dist/src/providers/builtin/loopback.js.map +1 -1
  82. package/dist/src/providers/builtin/matrix.d.ts +11 -1
  83. package/dist/src/providers/builtin/matrix.js +53 -29
  84. package/dist/src/providers/builtin/matrix.js.map +1 -1
  85. package/dist/src/providers/builtin/mattermost.d.ts +10 -0
  86. package/dist/src/providers/builtin/mattermost.js +38 -15
  87. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  88. package/dist/src/providers/builtin/msteams.d.ts +17 -1
  89. package/dist/src/providers/builtin/msteams.js +113 -14
  90. package/dist/src/providers/builtin/msteams.js.map +1 -1
  91. package/dist/src/providers/builtin/native-local-mock.d.ts +2 -9
  92. package/dist/src/providers/builtin/native-local-mock.js +12 -35
  93. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  94. package/dist/src/providers/builtin/script.d.ts +11 -15
  95. package/dist/src/providers/builtin/script.js +566 -104
  96. package/dist/src/providers/builtin/script.js.map +1 -1
  97. package/dist/src/providers/builtin/slack.d.ts +6 -0
  98. package/dist/src/providers/builtin/slack.js +99 -40
  99. package/dist/src/providers/builtin/slack.js.map +1 -1
  100. package/dist/src/providers/builtin/telegram.d.ts +6 -0
  101. package/dist/src/providers/builtin/telegram.js +64 -43
  102. package/dist/src/providers/builtin/telegram.js.map +1 -1
  103. package/dist/src/providers/builtin/whatsapp.d.ts +28 -8
  104. package/dist/src/providers/builtin/whatsapp.js +567 -30
  105. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  106. package/dist/src/providers/builtin/zalo.js +30 -19
  107. package/dist/src/providers/builtin/zalo.js.map +1 -1
  108. package/dist/src/providers/catalog.d.ts +3 -3
  109. package/dist/src/providers/catalog.js +3 -3
  110. package/dist/src/providers/catalog.js.map +1 -1
  111. package/dist/src/providers/local-mock.d.ts +11 -2
  112. package/dist/src/providers/local-mock.js +322 -96
  113. package/dist/src/providers/local-mock.js.map +1 -1
  114. package/dist/src/providers/native-ids.d.ts +1 -0
  115. package/dist/src/providers/native-ids.js +6 -1
  116. package/dist/src/providers/native-ids.js.map +1 -1
  117. package/dist/src/providers/recorder.d.ts +30 -2
  118. package/dist/src/providers/recorder.js +549 -70
  119. package/dist/src/providers/recorder.js.map +1 -1
  120. package/dist/src/providers/registry.d.ts +25 -1
  121. package/dist/src/providers/registry.js +280 -40
  122. package/dist/src/providers/registry.js.map +1 -1
  123. package/dist/src/providers/signed-jwt.d.ts +29 -0
  124. package/dist/src/providers/signed-jwt.js +202 -0
  125. package/dist/src/providers/signed-jwt.js.map +1 -0
  126. package/dist/src/providers/slack-ids.js.map +1 -1
  127. package/dist/src/providers/target-normalizers.d.ts +26 -0
  128. package/dist/src/providers/target-normalizers.js +276 -0
  129. package/dist/src/providers/target-normalizers.js.map +1 -0
  130. package/dist/src/providers/types.d.ts +5 -0
  131. package/dist/src/providers/types.js.map +1 -1
  132. package/dist/src/providers/webhook-server.d.ts +2 -0
  133. package/dist/src/providers/webhook-server.js +72 -25
  134. package/dist/src/providers/webhook-server.js.map +1 -1
  135. package/dist/src/servers/http.d.ts +23 -3
  136. package/dist/src/servers/http.js +213 -20
  137. package/dist/src/servers/http.js.map +1 -1
  138. package/dist/src/servers/index.js +20 -21
  139. package/dist/src/servers/index.js.map +1 -1
  140. package/dist/src/servers/matrix.js +465 -51
  141. package/dist/src/servers/matrix.js.map +1 -1
  142. package/dist/src/servers/mattermost.d.ts +5 -0
  143. package/dist/src/servers/mattermost.js +306 -58
  144. package/dist/src/servers/mattermost.js.map +1 -1
  145. package/dist/src/servers/pending-events.d.ts +2 -0
  146. package/dist/src/servers/pending-events.js +11 -0
  147. package/dist/src/servers/pending-events.js.map +1 -0
  148. package/dist/src/servers/recorder.d.ts +5 -0
  149. package/dist/src/servers/recorder.js +262 -3
  150. package/dist/src/servers/recorder.js.map +1 -1
  151. package/dist/src/servers/signal.d.ts +2 -0
  152. package/dist/src/servers/signal.js +444 -56
  153. package/dist/src/servers/signal.js.map +1 -1
  154. package/dist/src/servers/slack.d.ts +5 -0
  155. package/dist/src/servers/slack.js +515 -49
  156. package/dist/src/servers/slack.js.map +1 -1
  157. package/dist/src/servers/telegram.d.ts +111 -0
  158. package/dist/src/servers/telegram.js +830 -158
  159. package/dist/src/servers/telegram.js.map +1 -1
  160. package/dist/src/servers/webhook-target.d.ts +40 -0
  161. package/dist/src/servers/webhook-target.js +349 -0
  162. package/dist/src/servers/webhook-target.js.map +1 -0
  163. package/dist/src/servers/websocket.d.ts +2 -0
  164. package/dist/src/servers/websocket.js +29 -0
  165. package/dist/src/servers/websocket.js.map +1 -0
  166. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +65 -1
  167. package/dist/src/servers/whatsapp-baileys-websocket.js +723 -99
  168. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  169. package/dist/src/servers/whatsapp-jid.d.ts +5 -0
  170. package/dist/src/servers/whatsapp-jid.js +32 -0
  171. package/dist/src/servers/whatsapp-jid.js.map +1 -0
  172. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +5 -0
  173. package/dist/src/servers/whatsapp-wire/binary-node.js +87 -20
  174. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  175. package/dist/src/servers/whatsapp-wire/crypto.d.ts +6 -1
  176. package/dist/src/servers/whatsapp-wire/crypto.js +99 -45
  177. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  178. package/dist/src/servers/whatsapp-wire/handshake.js +39 -4
  179. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  180. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  181. package/dist/src/servers/whatsapp.d.ts +12 -7
  182. package/dist/src/servers/whatsapp.js +269 -107
  183. package/dist/src/servers/whatsapp.js.map +1 -1
  184. package/dist/src/servers/zalo.d.ts +14 -0
  185. package/dist/src/servers/zalo.js +521 -88
  186. package/dist/src/servers/zalo.js.map +1 -1
  187. package/docs/channel-setup.md +197 -19
  188. package/fixtures/examples/crabline.example.yaml +10 -0
  189. package/package.json +20 -15
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-target.js","sourceRoot":"","sources":["../../../src/servers/webhook-target.ts"],"names":[],"mappings":"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","sourcesContent":["import { lookup } from \"node:dns/promises\";\nimport { request as requestHttp, type ClientRequest, type IncomingMessage } from \"node:http\";\nimport { request as requestHttps } from \"node:https\";\nimport { BlockList, isIP } from \"node:net\";\nimport { isLoopbackHost } from \"./http.js\";\n\nexport type WebhookAddress = {\n address: string;\n family: 4 | 6;\n};\n\nexport type WebhookTargetError = \"https-required\" | \"private-address\" | \"unresolvable\";\n\nexport type ValidatedWebhookTarget =\n | { addresses: WebhookAddress[] | undefined }\n | { error: WebhookTargetError };\n\nexport const MAX_CONCURRENT_WEBHOOK_DNS_LOOKUPS = 8;\n\nconst BLOCKED_IPV4_ADDRESSES = createBlockedIpv4Addresses();\nconst BLOCKED_IPV6_ADDRESSES = createBlockedIpv6Addresses();\nconst GLOBAL_IPV4_EXCEPTIONS = createGlobalIpv4Exceptions();\nconst GLOBAL_IPV6_EXCEPTIONS = createGlobalIpv6Exceptions();\nconst ALLOCATED_GLOBAL_IPV6_RANGES = createAllocatedGlobalIpv6Ranges();\n\ntype WebhookDnsLookupResult = ReadonlyArray<{ address: string; family: number }>;\ntype WebhookDnsLookup = (hostname: string) => Promise<WebhookDnsLookupResult>;\n\ntype PendingWebhookDnsLookup = {\n hostname: string;\n onAbort: () => void;\n reject(error: unknown): void;\n resolve(addresses: WebhookDnsLookupResult): void;\n settled: boolean;\n signal: AbortSignal | undefined;\n started: boolean;\n};\n\nexport class WebhookDnsLookupPool {\n readonly #pending: PendingWebhookDnsLookup[] = [];\n #active = 0;\n\n constructor(\n private readonly maxConcurrent: number,\n private readonly lookupHostname: WebhookDnsLookup = async (hostname) =>\n await lookup(hostname, { all: true, verbatim: true }),\n ) {\n if (!Number.isSafeInteger(maxConcurrent) || maxConcurrent < 1) {\n throw new Error(\"Webhook DNS lookup concurrency must be a positive safe integer.\");\n }\n }\n\n resolve(hostname: string, signal?: AbortSignal): Promise<WebhookDnsLookupResult> {\n return new Promise<WebhookDnsLookupResult>((resolve, reject) => {\n const pending: PendingWebhookDnsLookup = {\n hostname,\n onAbort: () => {\n if (pending.settled) {\n return;\n }\n pending.settled = true;\n if (!pending.started) {\n const index = this.#pending.indexOf(pending);\n if (index >= 0) {\n this.#pending.splice(index, 1);\n }\n }\n signal?.removeEventListener(\"abort\", pending.onAbort);\n reject(abortSignalError(signal));\n this.#pump();\n },\n reject,\n resolve,\n settled: false,\n signal,\n started: false,\n };\n if (signal?.aborted) {\n pending.onAbort();\n return;\n }\n signal?.addEventListener(\"abort\", pending.onAbort, { once: true });\n this.#pending.push(pending);\n this.#pump();\n });\n }\n\n #pump(): void {\n while (this.#active < this.maxConcurrent) {\n const pending = this.#pending.shift();\n if (!pending) {\n return;\n }\n if (pending.settled) {\n continue;\n }\n pending.started = true;\n this.#active += 1;\n void this.lookupHostname(pending.hostname)\n .then(\n (addresses) => {\n if (!pending.settled) {\n pending.settled = true;\n pending.resolve(addresses);\n }\n },\n (error: unknown) => {\n if (!pending.settled) {\n pending.settled = true;\n pending.reject(error);\n }\n },\n )\n .finally(() => {\n pending.signal?.removeEventListener(\"abort\", pending.onAbort);\n this.#active -= 1;\n this.#pump();\n });\n }\n }\n}\n\nconst webhookDnsLookupPool = new WebhookDnsLookupPool(MAX_CONCURRENT_WEBHOOK_DNS_LOOKUPS);\n\nfunction abortSignalError(signal: AbortSignal | undefined): Error {\n return signal?.reason instanceof Error\n ? signal.reason\n : new DOMException(\"Webhook DNS lookup aborted\", \"AbortError\");\n}\n\nfunction createBlockedIpv4Addresses(): BlockList {\n const blockList = new BlockList();\n for (const [address, prefix] of [\n [\"0.0.0.0\", 8],\n [\"10.0.0.0\", 8],\n [\"100.64.0.0\", 10],\n [\"127.0.0.0\", 8],\n [\"169.254.0.0\", 16],\n [\"172.16.0.0\", 12],\n [\"192.0.0.0\", 24],\n [\"192.0.2.0\", 24],\n [\"192.88.99.0\", 24],\n [\"192.168.0.0\", 16],\n [\"198.18.0.0\", 15],\n [\"198.51.100.0\", 24],\n [\"203.0.113.0\", 24],\n [\"224.0.0.0\", 4],\n [\"240.0.0.0\", 4],\n ] as const) {\n blockList.addSubnet(address, prefix, \"ipv4\");\n }\n return blockList;\n}\n\nfunction createBlockedIpv6Addresses(): BlockList {\n const blockList = new BlockList();\n for (const [address, prefix] of [\n [\"::\", 96],\n [\"::ffff:0:0\", 96],\n [\"64:ff9b:1::\", 48],\n [\"100::\", 64],\n [\"100:0:0:1::\", 64],\n [\"2001::\", 23],\n [\"2001:db8::\", 32],\n [\"2002::\", 16],\n [\"3fff::\", 20],\n [\"5f00::\", 16],\n [\"fc00::\", 7],\n [\"fe80::\", 10],\n [\"ff00::\", 8],\n ] as const) {\n blockList.addSubnet(address, prefix, \"ipv6\");\n }\n return blockList;\n}\n\nfunction createGlobalIpv4Exceptions(): BlockList {\n const blockList = new BlockList();\n // These are globally reachable assignments inside 192.0.0.0/24.\n for (const address of [\"192.0.0.9\", \"192.0.0.10\"] as const) {\n blockList.addAddress(address, \"ipv4\");\n }\n return blockList;\n}\n\nfunction createGlobalIpv6Exceptions(): BlockList {\n const blockList = new BlockList();\n // These are globally reachable assignments inside 2001::/23.\n for (const [address, prefix] of [\n [\"2001:1::1\", 128],\n [\"2001:1::2\", 128],\n [\"2001:1::3\", 128],\n [\"2001:3::\", 32],\n [\"2001:4:112::\", 48],\n [\"2001:20::\", 28],\n [\"2001:30::\", 28],\n ] as const) {\n blockList.addSubnet(address, prefix, \"ipv6\");\n }\n return blockList;\n}\n\nfunction createAllocatedGlobalIpv6Ranges(): BlockList {\n const blockList = new BlockList();\n // IANA reserves unlisted portions of 2000::/3 for future allocation.\n for (const [address, prefix] of [\n [\"2001:200::\", 23],\n [\"2001:400::\", 23],\n [\"2001:600::\", 23],\n [\"2001:800::\", 22],\n [\"2001:c00::\", 23],\n [\"2001:e00::\", 23],\n [\"2001:1200::\", 23],\n [\"2001:1400::\", 22],\n [\"2001:1800::\", 23],\n [\"2001:1a00::\", 23],\n [\"2001:1c00::\", 22],\n [\"2001:2000::\", 19],\n [\"2001:4000::\", 23],\n [\"2001:4200::\", 23],\n [\"2001:4400::\", 23],\n [\"2001:4600::\", 23],\n [\"2001:4800::\", 23],\n [\"2001:4a00::\", 23],\n [\"2001:4c00::\", 23],\n [\"2001:5000::\", 20],\n [\"2001:8000::\", 19],\n [\"2001:a000::\", 20],\n [\"2001:b000::\", 20],\n [\"2003::\", 18],\n [\"2400::\", 12],\n [\"2410::\", 12],\n [\"2600::\", 12],\n [\"2610::\", 23],\n [\"2620::\", 23],\n [\"2630::\", 12],\n [\"2800::\", 12],\n [\"2a00::\", 12],\n [\"2a10::\", 12],\n [\"2c00::\", 12],\n ] as const) {\n blockList.addSubnet(address, prefix, \"ipv6\");\n }\n blockList.addSubnet(\"64:ff9b::\", 96, \"ipv6\");\n return blockList;\n}\n\nfunction normalizeHostname(hostname: string): string {\n return hostname.replace(/^\\[(.*)\\]$/u, \"$1\").replace(/%25/gu, \"%\");\n}\n\nfunction parseIpv6Hextets(address: string): number[] | undefined {\n const sections = address.split(\"::\");\n if (sections.length > 2) {\n return undefined;\n }\n const parseSection = (section: string): number[] =>\n section\n ? section.split(\":\").flatMap((value) => {\n if (!value.includes(\".\")) {\n return [Number.parseInt(value, 16)];\n }\n const octets = value.split(\".\").map(Number);\n return [(octets[0]! << 8) | octets[1]!, (octets[2]! << 8) | octets[3]!];\n })\n : [];\n const leading = parseSection(sections[0]!);\n const trailing = parseSection(sections[1] ?? \"\");\n const omitted = sections.length === 2 ? 8 - leading.length - trailing.length : 0;\n const hextets = [...leading, ...Array.from({ length: omitted }, () => 0), ...trailing];\n return hextets.length === 8 ? hextets : undefined;\n}\n\nfunction embeddedNat64Ipv4(address: string): string | undefined {\n const hextets = parseIpv6Hextets(address);\n if (\n !hextets ||\n hextets[0] !== 0x64 ||\n hextets[1] !== 0xff9b ||\n hextets.slice(2, 6).some((value) => value !== 0)\n ) {\n return undefined;\n }\n return [hextets[6]! >> 8, hextets[6]! & 0xff, hextets[7]! >> 8, hextets[7]! & 0xff].join(\".\");\n}\n\nfunction isBlockedWebhookAddress(address: string): boolean {\n const normalized = normalizeHostname(address);\n const family = isIP(normalized);\n if (family === 4) {\n return (\n !GLOBAL_IPV4_EXCEPTIONS.check(normalized, \"ipv4\") &&\n BLOCKED_IPV4_ADDRESSES.check(normalized, \"ipv4\")\n );\n }\n if (family === 6) {\n const embeddedIpv4 = embeddedNat64Ipv4(normalized);\n if (embeddedIpv4 && isBlockedWebhookAddress(embeddedIpv4)) {\n return true;\n }\n if (GLOBAL_IPV6_EXCEPTIONS.check(normalized, \"ipv6\")) {\n return false;\n }\n return (\n BLOCKED_IPV6_ADDRESSES.check(normalized, \"ipv6\") ||\n !ALLOCATED_GLOBAL_IPV6_RANGES.check(normalized, \"ipv6\")\n );\n }\n return false;\n}\n\nasync function resolveWebhookAddresses(\n hostname: string,\n signal?: AbortSignal,\n): Promise<WebhookAddress[]> {\n const normalized = normalizeHostname(hostname);\n const family = isIP(normalized);\n if (family === 4 || family === 6) {\n return [{ address: normalized, family }];\n }\n return (await webhookDnsLookupPool.resolve(normalized, signal)).flatMap((entry) =>\n entry.family === 4 || entry.family === 6\n ? [{ address: entry.address, family: entry.family }]\n : [],\n );\n}\n\nexport async function validateWebhookTarget(params: {\n allowLoopbackHttp: boolean;\n restrictPrivateAddresses: boolean;\n signal?: AbortSignal | undefined;\n url: URL;\n}): Promise<ValidatedWebhookTarget> {\n const allowThisLoopbackHttp =\n params.url.protocol === \"http:\" &&\n params.allowLoopbackHttp &&\n isLoopbackHost(params.url.hostname);\n if (params.url.protocol !== \"https:\" && !allowThisLoopbackHttp) {\n return { error: \"https-required\" };\n }\n if (allowThisLoopbackHttp) {\n return { addresses: undefined };\n }\n if (!params.restrictPrivateAddresses) {\n return { addresses: undefined };\n }\n\n let addresses: WebhookAddress[];\n try {\n addresses = await resolveWebhookAddresses(params.url.hostname, params.signal);\n } catch (error) {\n if (params.signal?.aborted) {\n throw error;\n }\n return { error: \"unresolvable\" };\n }\n if (addresses.length === 0) {\n return { error: \"unresolvable\" };\n }\n if (addresses.some((entry) => isBlockedWebhookAddress(entry.address))) {\n return { error: \"private-address\" };\n }\n return { addresses };\n}\n\nexport async function postWebhookRequest(params: {\n activeRequests?: Set<ClientRequest> | undefined;\n address?: WebhookAddress | undefined;\n body: string;\n headerEntries?: ReadonlyArray<readonly [string, string]> | undefined;\n signal?: AbortSignal | undefined;\n timeoutMs: number;\n url: URL;\n}): Promise<number> {\n return await new Promise<number>((resolve, reject) => {\n const address = params.address;\n let settled = false;\n let response: IncomingMessage | undefined;\n let deadline: NodeJS.Timeout;\n const finish = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(deadline);\n params.activeRequests?.delete(request);\n callback();\n };\n const send = params.url.protocol === \"https:\" ? requestHttps : requestHttp;\n const request = send(\n params.url,\n {\n agent: false,\n ...(address ? { family: address.family } : {}),\n headers: {\n \"content-length\": String(Buffer.byteLength(params.body)),\n \"content-type\": \"application/json\",\n ...Object.fromEntries(params.headerEntries ?? []),\n },\n ...(address\n ? {\n lookup: (_hostname, _options, callback) =>\n callback(null, address.address, address.family),\n }\n : {}),\n method: \"POST\",\n signal: params.signal,\n },\n (incoming) => {\n response = incoming;\n incoming.resume();\n incoming.once(\"error\", (error) => finish(() => reject(error)));\n incoming.once(\"end\", () => finish(() => resolve(incoming.statusCode ?? 0)));\n },\n );\n params.activeRequests?.add(request);\n deadline = setTimeout(() => {\n const error = new DOMException(\n `Webhook delivery timed out after ${params.timeoutMs}ms`,\n \"TimeoutError\",\n );\n response?.destroy(error);\n request.destroy(error);\n }, params.timeoutMs);\n deadline.unref();\n request.once(\"error\", (error) => finish(() => reject(error)));\n request.end(params.body);\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { type WebSocketServer } from "ws";
2
+ export declare function closeWebSocketServer(server: WebSocketServer, graceMs?: number): Promise<void>;
@@ -0,0 +1,29 @@
1
+ import { WebSocket } from "ws";
2
+ import { DEFAULT_SERVER_SHUTDOWN_GRACE_MS } from "./http.js";
3
+ export async function closeWebSocketServer(server, graceMs = DEFAULT_SERVER_SHUTDOWN_GRACE_MS) {
4
+ await new Promise((resolve, reject) => {
5
+ const forceCloseTimer = setTimeout(() => {
6
+ for (const client of server.clients) {
7
+ client.terminate();
8
+ }
9
+ }, graceMs);
10
+ forceCloseTimer.unref();
11
+ server.close((error) => {
12
+ clearTimeout(forceCloseTimer);
13
+ if (error) {
14
+ reject(error);
15
+ return;
16
+ }
17
+ resolve();
18
+ });
19
+ for (const client of server.clients) {
20
+ if (client.readyState === WebSocket.OPEN) {
21
+ client.close(1001, "Server shutting down");
22
+ }
23
+ else if (client.readyState !== WebSocket.CLOSED) {
24
+ client.terminate();
25
+ }
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/servers/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAwB,MAAM,IAAI,CAAC;AACrD,OAAO,EAAE,gCAAgC,EAAE,MAAM,WAAW,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAuB,EACvB,OAAO,GAAG,gCAAgC;IAE1C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;YACtC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,eAAe,CAAC,KAAK,EAAE,CAAC;QAExB,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACrB,YAAY,CAAC,eAAe,CAAC,CAAC;YAC9B,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACzC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;gBAClD,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { WebSocket, type WebSocketServer } from \"ws\";\nimport { DEFAULT_SERVER_SHUTDOWN_GRACE_MS } from \"./http.js\";\n\nexport async function closeWebSocketServer(\n server: WebSocketServer,\n graceMs = DEFAULT_SERVER_SHUTDOWN_GRACE_MS,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const forceCloseTimer = setTimeout(() => {\n for (const client of server.clients) {\n client.terminate();\n }\n }, graceMs);\n forceCloseTimer.unref();\n\n server.close((error) => {\n clearTimeout(forceCloseTimer);\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n\n for (const client of server.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.close(1001, \"Server shutting down\");\n } else if (client.readyState !== WebSocket.CLOSED) {\n client.terminate();\n }\n }\n });\n}\n"]}
@@ -1,16 +1,40 @@
1
+ import { Buffer } from "node:buffer";
1
2
  import type { Server } from "node:http";
3
+ import { type KeyPair, type SignedKeyPair } from "./whatsapp-wire/crypto.js";
2
4
  import type { ServerRequestEvent } from "./http.js";
5
+ export declare const MAX_WHATSAPP_NOISE_FRAME_BYTES: number;
6
+ export declare const MAX_WHATSAPP_WEBSOCKET_BUFFERED_BYTES: number;
7
+ export declare const MAX_WHATSAPP_WEBSOCKET_MESSAGE_BYTES: number;
8
+ export declare const MAX_WHATSAPP_NOISE_BUFFER_CHUNKS = 1024;
9
+ export declare const MAX_WHATSAPP_NOISE_FRAMES_PER_MESSAGE = 1024;
10
+ export declare const WHATSAPP_WEBSOCKET_SEND_TIMEOUT_MS = 5000;
11
+ export declare const MAX_WHATSAPP_WEBSOCKET_FRAGMENTS = 1024;
12
+ export declare const MAX_WHATSAPP_SIGNAL_BUNDLES = 1024;
13
+ export declare const MAX_WHATSAPP_WEBSOCKET_CLOSE_REASON_BYTES = 123;
14
+ type NodeBuffer = Buffer<ArrayBufferLike>;
15
+ type WhatsAppWebSocketRawData = NodeBuffer | ArrayBuffer | NodeBuffer[];
16
+ type WhatsAppWebSocketSendTarget = {
17
+ bufferedAmount: number;
18
+ readyState: number;
19
+ send(data: Uint8Array, callback: (error?: Error) => void): void;
20
+ terminate(): void;
21
+ };
3
22
  export type WhatsAppBaileysWebSocketServer = {
4
23
  close(): Promise<void>;
5
- deliverInboundMessage(message: WhatsAppBaileysInboundMessage): void;
24
+ prepareInboundMessage(message: WhatsAppBaileysInboundMessage): PreparedWhatsAppBaileysInboundDelivery | undefined;
6
25
  };
7
26
  export type WhatsAppBaileysWebSocketServerParams = {
8
27
  accessToken: string;
9
28
  appendEvent(event: ServerRequestEvent): Promise<void>;
10
29
  httpServer: Server;
30
+ maxPendingInboundMessages?: number | undefined;
11
31
  path: string;
12
32
  selfJid: string;
13
33
  };
34
+ export type PreparedWhatsAppBaileysInboundDelivery = {
35
+ cancel(): void;
36
+ commit(): Promise<"delivered" | "queued">;
37
+ };
14
38
  export type WhatsAppBaileysInboundMessage = {
15
39
  key: {
16
40
  fromMe: boolean;
@@ -24,4 +48,44 @@ export type WhatsAppBaileysInboundMessage = {
24
48
  messageTimestamp: number;
25
49
  pushName?: string | undefined;
26
50
  };
51
+ export declare function resolveMaxPendingWhatsAppInboundMessages(value: number | undefined): number;
52
+ export type MockSignalBundle = {
53
+ identityKey: KeyPair;
54
+ preKey: KeyPair;
55
+ preKeyId: number;
56
+ registrationId: number;
57
+ signedPreKey: SignedKeyPair;
58
+ };
59
+ export declare class WhatsAppSignalBundleStore {
60
+ #private;
61
+ private readonly maxBundles;
62
+ constructor(maxBundles?: number);
63
+ get size(): number;
64
+ associateLid(phoneNumberJid: string, lidJid: string): void;
65
+ resolveMany(jids: string[]): MockSignalBundle[];
66
+ decryptDirectMessage(params: {
67
+ ciphertext: Uint8Array;
68
+ recipientJid: string;
69
+ remoteJid: string;
70
+ type: "msg" | "pkmsg";
71
+ }): Promise<Buffer | undefined>;
72
+ }
73
+ export declare function createSerializedMessageHandler<T>(processMessage: (message: T) => Promise<void>, onError: (error: unknown) => void, options?: {
74
+ maxPendingBytes?: number | undefined;
75
+ maxPendingMessages?: number | undefined;
76
+ sizeOf?: ((message: T) => number) | undefined;
77
+ }): (message: T) => Promise<void>;
78
+ export declare class WhatsAppNoiseFrameDecoder {
79
+ #private;
80
+ get bufferedBytes(): number;
81
+ decodeFrames(data: WhatsAppWebSocketRawData): NodeBuffer[];
82
+ }
83
+ export declare function sendWhatsAppWebSocketPayload(socket: WhatsAppWebSocketSendTarget, payload: Uint8Array): Promise<void>;
84
+ export declare function resolveWhatsAppWebSocketClose(error: unknown): {
85
+ code: 1002 | 1009 | 1011;
86
+ reason: string;
87
+ };
27
88
  export declare function attachWhatsAppBaileysWebSocketServer(params: WhatsAppBaileysWebSocketServerParams): WhatsAppBaileysWebSocketServer;
89
+ export declare function parseWhatsAppWebSocketUpgradeUrl(requestTarget: string | undefined): URL | undefined;
90
+ export declare function signalBundleIdentityKey(jid: string): string;
91
+ export {};