From 6d6060d3eccbe90e5135bb11ed98f14aed9cd99a Mon Sep 17 00:00:00 2001 From: Shakker Date: Thu, 2 Apr 2026 09:01:44 +0100 Subject: [PATCH] perf: split whatsapp targets facade --- extensions/whatsapp/targets.ts | 5 ++++ scripts/lib/plugin-sdk-facades.mjs | 30 +++++++++++++++++++ .../plugin-sdk-facade-type-map.generated.ts | 26 ++++++++++++++++ src/plugin-sdk/whatsapp-targets.test.ts | 24 +++++++++++++++ src/plugin-sdk/whatsapp-targets.ts | 20 +++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 extensions/whatsapp/targets.ts create mode 100644 src/plugin-sdk/whatsapp-targets.test.ts create mode 100644 src/plugin-sdk/whatsapp-targets.ts diff --git a/extensions/whatsapp/targets.ts b/extensions/whatsapp/targets.ts new file mode 100644 index 00000000000..b2c52015fbf --- /dev/null +++ b/extensions/whatsapp/targets.ts @@ -0,0 +1,5 @@ +export { + isWhatsAppGroupJid, + isWhatsAppUserTarget, + normalizeWhatsAppTarget, +} from "./src/normalize-target.js"; diff --git a/scripts/lib/plugin-sdk-facades.mjs b/scripts/lib/plugin-sdk-facades.mjs index 3172b2e40fa..d3d97f8ec86 100644 --- a/scripts/lib/plugin-sdk-facades.mjs +++ b/scripts/lib/plugin-sdk-facades.mjs @@ -876,6 +876,36 @@ export const GENERATED_PLUGIN_SDK_FACADES = [ "ZAI_GLOBAL_BASE_URL", ], }, + { + subpath: "whatsapp-targets", + source: pluginSource("whatsapp", "targets.js"), + exports: ["isWhatsAppGroupJid", "isWhatsAppUserTarget", "normalizeWhatsAppTarget"], + }, + { + subpath: "whatsapp-surface", + source: pluginSource("whatsapp", "api.js"), + exportSources: { + DEFAULT_WEB_MEDIA_BYTES: pluginSource("whatsapp", "constants.js"), + }, + exports: [ + "DEFAULT_WEB_MEDIA_BYTES", + "hasAnyWhatsAppAuth", + "listEnabledWhatsAppAccounts", + "listWhatsAppDirectoryGroupsFromConfig", + "listWhatsAppDirectoryPeersFromConfig", + "resolveWhatsAppAccount", + "resolveWhatsAppGroupRequireMention", + "resolveWhatsAppGroupToolPolicy", + "resolveWhatsAppOutboundTarget", + "whatsappAccessControlTesting", + ], + typeExports: [ + "WebChannelStatus", + "WebInboundMessage", + "WebListenerCloseReason", + "WebMonitorTuning", + ], + }, { subpath: "zalo-setup", source: pluginSource("zalo", "api.js"), diff --git a/src/generated/plugin-sdk-facade-type-map.generated.ts b/src/generated/plugin-sdk-facade-type-map.generated.ts index 5c1ec7eaf87..2f17ab05b9d 100644 --- a/src/generated/plugin-sdk-facade-type-map.generated.ts +++ b/src/generated/plugin-sdk-facade-type-map.generated.ts @@ -557,6 +557,32 @@ export interface PluginSdkFacadeTypeMap { }; types: {}; }; + "whatsapp-targets": { + module: typeof import("@openclaw/whatsapp/targets.js"); + sourceModules: { + source1: { + module: typeof import("@openclaw/whatsapp/targets.js"); + }; + }; + types: {}; + }; + "whatsapp-surface": { + module: typeof import("@openclaw/whatsapp/api.js"); + sourceModules: { + source1: { + module: typeof import("@openclaw/whatsapp/api.js"); + }; + source2: { + module: typeof import("@openclaw/whatsapp/constants.js"); + }; + }; + types: { + WebChannelStatus: import("@openclaw/whatsapp/api.js").WebChannelStatus; + WebInboundMessage: import("@openclaw/whatsapp/api.js").WebInboundMessage; + WebListenerCloseReason: import("@openclaw/whatsapp/api.js").WebListenerCloseReason; + WebMonitorTuning: import("@openclaw/whatsapp/api.js").WebMonitorTuning; + }; + }; "zalo-setup": { module: typeof import("@openclaw/zalo/api.js"); sourceModules: { diff --git a/src/plugin-sdk/whatsapp-targets.test.ts b/src/plugin-sdk/whatsapp-targets.test.ts new file mode 100644 index 00000000000..de5410b18e3 --- /dev/null +++ b/src/plugin-sdk/whatsapp-targets.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from "vitest"; +import { + isWhatsAppGroupJid, + isWhatsAppUserTarget, + normalizeWhatsAppTarget, +} from "./whatsapp-targets.js"; + +describe("plugin-sdk whatsapp-targets", () => { + it("normalizes user targets through the public facade", () => { + expect(normalizeWhatsAppTarget("1555123@s.whatsapp.net")).toBe("+1555123"); + expect(normalizeWhatsAppTarget("whatsapp:+1555123")).toBe("+1555123"); + }); + + it("preserves valid group JIDs through the public facade", () => { + expect(isWhatsAppGroupJid("120363401234567890@g.us")).toBe(true); + expect(normalizeWhatsAppTarget("120363401234567890@g.us")).toBe("120363401234567890@g.us"); + }); + + it("detects WhatsApp user JIDs through the public facade", () => { + expect(isWhatsAppUserTarget("41796666864:0@s.whatsapp.net")).toBe(true); + expect(isWhatsAppUserTarget("123456789@lid")).toBe(true); + expect(isWhatsAppUserTarget("123456789-987654321@g.us")).toBe(false); + }); +}); diff --git a/src/plugin-sdk/whatsapp-targets.ts b/src/plugin-sdk/whatsapp-targets.ts new file mode 100644 index 00000000000..a24eee2b367 --- /dev/null +++ b/src/plugin-sdk/whatsapp-targets.ts @@ -0,0 +1,20 @@ +// Generated by scripts/generate-plugin-sdk-facades.mjs. Do not edit manually. +import type { PluginSdkFacadeTypeMap } from "../generated/plugin-sdk-facade-type-map.generated.js"; +type FacadeEntry = PluginSdkFacadeTypeMap["whatsapp-targets"]; +type FacadeModule = FacadeEntry["module"]; +import { loadBundledPluginPublicSurfaceModuleSync } from "./facade-runtime.js"; + +function loadFacadeModule(): FacadeModule { + return loadBundledPluginPublicSurfaceModuleSync({ + dirName: "whatsapp", + artifactBasename: "targets.js", + }); +} +export const isWhatsAppGroupJid: FacadeModule["isWhatsAppGroupJid"] = ((...args) => + loadFacadeModule()["isWhatsAppGroupJid"](...args)) as FacadeModule["isWhatsAppGroupJid"]; +export const isWhatsAppUserTarget: FacadeModule["isWhatsAppUserTarget"] = ((...args) => + loadFacadeModule()["isWhatsAppUserTarget"](...args)) as FacadeModule["isWhatsAppUserTarget"]; +export const normalizeWhatsAppTarget: FacadeModule["normalizeWhatsAppTarget"] = ((...args) => + loadFacadeModule()["normalizeWhatsAppTarget"]( + ...args, + )) as FacadeModule["normalizeWhatsAppTarget"];