@robinpath/whatsapp
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const WhatsappModule: ModuleAdapter; | ||
| export default WhatsappModule; | ||
| export { WhatsappModule }; | ||
| export { WhatsappFunctions, WhatsappFunctionMetadata, WhatsappModuleMetadata, WhatsappCredentialTypes, } from "./whatsapp.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,cAAc,EAAE,aAQrB,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} |
| import { WhatsappFunctions, WhatsappFunctionMetadata, WhatsappModuleMetadata, WhatsappCredentialTypes, configureWhatsapp, } from "./whatsapp.js"; | ||
| const WhatsappModule = { | ||
| name: "whatsapp", | ||
| functions: WhatsappFunctions, | ||
| functionMetadata: WhatsappFunctionMetadata, | ||
| moduleMetadata: WhatsappModuleMetadata, | ||
| credentialTypes: WhatsappCredentialTypes, | ||
| configure: configureWhatsapp, | ||
| global: false, | ||
| }; | ||
| export default WhatsappModule; | ||
| export { WhatsappModule }; | ||
| export { WhatsappFunctions, WhatsappFunctionMetadata, WhatsappModuleMetadata, WhatsappCredentialTypes, } from "./whatsapp.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,MAAM,cAAc,GAAkB;IACpC,IAAI,EAAE,UAAU;IAChB,SAAS,EAAE,iBAAiB;IAC5B,gBAAgB,EAAE,wBAAwB;IAC1C,cAAc,EAAE,sBAAsB;IACtC,eAAe,EAAE,uBAAuB;IACxC,SAAS,EAAE,iBAAiB;IAC5B,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,cAAc,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC"} |
| /** | ||
| * RobinPath WhatsApp Module (Node port) | ||
| * | ||
| * Meta WhatsApp Business Cloud API (Graph v18.0) integration — send text, | ||
| * template, media and document messages through a Business phone number, | ||
| * mark inbound messages as read, and download media bodies. Mirrors the | ||
| * canonical adapter shape (Airtable/Shopify/GitHub) so the visual editor | ||
| * can render it identically to other credential-vault modules. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes | ||
| * a credential slug as its first argument; the module resolves the stored | ||
| * `access_token` + `phone_number_id` at call time via the injected | ||
| * ModuleHost. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - whatsapp : { access_token, phone_number_id, business_account_id? } | ||
| * → Bearer auth on graph.facebook.com | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureWhatsapp(h: ModuleHost): void; | ||
| export declare const WhatsappFunctions: Record<string, BuiltinHandler>; | ||
| export declare const WhatsappCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const WhatsappFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const WhatsappModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=whatsapp.d.ts.map |
| {"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../src/whatsapp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAezB,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAErD;AAwWD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAO5D,CAAC;AAIF,eAAO,MAAM,uBAAuB,EAAE,oBAAoB,EAqCzD,CAAC;AAqDF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAuQrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cA6BpC,CAAC"} |
+656
| /** | ||
| * RobinPath WhatsApp Module (Node port) | ||
| * | ||
| * Meta WhatsApp Business Cloud API (Graph v18.0) integration — send text, | ||
| * template, media and document messages through a Business phone number, | ||
| * mark inbound messages as read, and download media bodies. Mirrors the | ||
| * canonical adapter shape (Airtable/Shopify/GitHub) so the visual editor | ||
| * can render it identically to other credential-vault modules. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every handler takes | ||
| * a credential slug as its first argument; the module resolves the stored | ||
| * `access_token` + `phone_number_id` at call time via the injected | ||
| * ModuleHost. | ||
| * | ||
| * Credential type declared by this module: | ||
| * - whatsapp : { access_token, phone_number_id, business_account_id? } | ||
| * → Bearer auth on graph.facebook.com | ||
| */ | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("WhatsApp module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureWhatsapp(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://graph.facebook.com/v18.0/"; | ||
| const CREDENTIAL_TYPE = "whatsapp"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| function isErr(x) { | ||
| return (typeof x === "object" && | ||
| x !== null && | ||
| "error" in x && | ||
| "code" in x); | ||
| } | ||
| async function resolveCreds(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const token = String(fields.access_token ?? ""); | ||
| const phoneNumberId = String(fields.phone_number_id ?? ""); | ||
| const businessAccountId = String(fields.business_account_id ?? ""); | ||
| if (!token) { | ||
| return errorReturn("Credential has no `access_token` field.", "access_token_missing"); | ||
| } | ||
| if (!phoneNumberId) { | ||
| return errorReturn("Credential has no `phone_number_id` field.", "phone_number_id_missing"); | ||
| } | ||
| return { token, phoneNumberId, businessAccountId }; | ||
| } | ||
| // ── HTTP helper (normalized envelope, never throws for API errors) ───── | ||
| async function http(token, method, pathAndQuery, body) { | ||
| const init = { | ||
| method, | ||
| headers: { | ||
| Authorization: `Bearer ${token}`, | ||
| ...(body !== undefined && body !== null | ||
| ? { "Content-Type": "application/json" } | ||
| : {}), | ||
| }, | ||
| }; | ||
| if (body !== undefined && body !== null) | ||
| init.body = JSON.stringify(body); | ||
| let response; | ||
| try { | ||
| response = await fetch(API_BASE + pathAndQuery.replace(/^\/+/, ""), init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = { raw }; | ||
| } | ||
| if (response.status >= 200 && response.status < 300) { | ||
| return decoded ?? { ok: true }; | ||
| } | ||
| // Graph errors look like: { error: { message, type, code, error_subcode, fbtrace_id } } | ||
| const errObj = decoded && typeof decoded === "object" && "error" in decoded | ||
| ? decoded.error | ||
| : decoded; | ||
| let message = `WhatsApp returned HTTP ${response.status}.`; | ||
| if (errObj && typeof errObj === "object" && "message" in errObj) { | ||
| message = String(errObj.message); | ||
| } | ||
| else if (typeof errObj === "string") { | ||
| message = errObj; | ||
| } | ||
| let code = "whatsapp_error"; | ||
| if (response.status === 429) | ||
| code = "rate_limited"; | ||
| else if (response.status === 404) | ||
| code = "not_found"; | ||
| else if (response.status === 401 || response.status === 403) { | ||
| code = "unauthorized"; | ||
| } | ||
| return errorReturn(message, code, { | ||
| status: response.status, | ||
| whatsapp_error: decoded, | ||
| }); | ||
| } | ||
| // ── Helpers ──────────────────────────────────────────────────────────── | ||
| function asString(v) { | ||
| if (v === undefined || v === null) | ||
| return ""; | ||
| return String(v); | ||
| } | ||
| function asOpts(v) { | ||
| return v && typeof v === "object" && !Array.isArray(v) | ||
| ? v | ||
| : {}; | ||
| } | ||
| /** | ||
| * Build a media sub-object. Accepts either `{id}` (already-uploaded media) | ||
| * or `{link}` (public URL). Attaches optional `caption` / `filename`. | ||
| */ | ||
| function buildMediaPayload(mediaIdOrUrl, opts) { | ||
| const out = {}; | ||
| const isUrl = /^https?:\/\//i.test(mediaIdOrUrl); | ||
| if (isUrl) { | ||
| out.link = mediaIdOrUrl; | ||
| } | ||
| else { | ||
| out.id = mediaIdOrUrl; | ||
| } | ||
| if (opts.caption !== undefined && opts.caption !== null && opts.caption !== "") { | ||
| out.caption = String(opts.caption); | ||
| } | ||
| if (opts.filename !== undefined && opts.filename !== null && opts.filename !== "") { | ||
| out.filename = String(opts.filename); | ||
| } | ||
| return out; | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const sendText = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const to = asString(args[1]); | ||
| const message = asString(args[2]); | ||
| const opts = asOpts(args[3]); | ||
| if (!to) | ||
| return errorReturn("`to` is required.", "to_missing"); | ||
| if (!message) { | ||
| return errorReturn("`message` is required.", "message_missing"); | ||
| } | ||
| const resolved = await resolveCreds(cred); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| const text = { body: message }; | ||
| if (opts.preview_url !== undefined) { | ||
| text.preview_url = Boolean(opts.preview_url); | ||
| } | ||
| return (await http(resolved.token, "POST", `${resolved.phoneNumberId}/messages`, { | ||
| messaging_product: "whatsapp", | ||
| recipient_type: "individual", | ||
| to, | ||
| type: "text", | ||
| text, | ||
| })); | ||
| }; | ||
| const sendTemplate = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const to = asString(args[1]); | ||
| const templateName = asString(args[2]); | ||
| const languageCode = args[3] !== undefined && args[3] !== null && args[3] !== "" | ||
| ? asString(args[3]) | ||
| : "en_US"; | ||
| const components = args[4]; | ||
| if (!to) | ||
| return errorReturn("`to` is required.", "to_missing"); | ||
| if (!templateName) { | ||
| return errorReturn("`templateName` is required.", "template_name_missing"); | ||
| } | ||
| const resolved = await resolveCreds(cred); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| const template = { | ||
| name: templateName, | ||
| language: { code: languageCode }, | ||
| }; | ||
| if (Array.isArray(components) && components.length > 0) { | ||
| template.components = components; | ||
| } | ||
| return (await http(resolved.token, "POST", `${resolved.phoneNumberId}/messages`, { | ||
| messaging_product: "whatsapp", | ||
| to, | ||
| type: "template", | ||
| template, | ||
| })); | ||
| }; | ||
| /** | ||
| * Send an image/audio/video/sticker. `mediaKind` picks the message type — | ||
| * defaults to `image` when omitted. `mediaIdOrUrl` is either a media ID | ||
| * (from a prior upload) or an https:// public URL. | ||
| */ | ||
| const sendMedia = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const to = asString(args[1]); | ||
| const mediaIdOrUrl = asString(args[2]); | ||
| const opts = asOpts(args[3]); | ||
| const mediaKind = opts.type !== undefined && opts.type !== null && opts.type !== "" | ||
| ? String(opts.type).toLowerCase() | ||
| : "image"; | ||
| if (!to) | ||
| return errorReturn("`to` is required.", "to_missing"); | ||
| if (!mediaIdOrUrl) { | ||
| return errorReturn("`mediaIdOrUrl` is required.", "media_missing"); | ||
| } | ||
| if (!["image", "audio", "video", "sticker"].includes(mediaKind)) { | ||
| return errorReturn("`type` must be one of: image, audio, video, sticker.", "invalid_media_type"); | ||
| } | ||
| const resolved = await resolveCreds(cred); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| const body = { | ||
| messaging_product: "whatsapp", | ||
| recipient_type: "individual", | ||
| to, | ||
| type: mediaKind, | ||
| [mediaKind]: buildMediaPayload(mediaIdOrUrl, opts), | ||
| }; | ||
| return (await http(resolved.token, "POST", `${resolved.phoneNumberId}/messages`, body)); | ||
| }; | ||
| const sendDocument = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const to = asString(args[1]); | ||
| const documentIdOrUrl = asString(args[2]); | ||
| const opts = asOpts(args[3]); | ||
| if (!to) | ||
| return errorReturn("`to` is required.", "to_missing"); | ||
| if (!documentIdOrUrl) { | ||
| return errorReturn("`documentIdOrUrl` is required.", "document_missing"); | ||
| } | ||
| const resolved = await resolveCreds(cred); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| const document = buildMediaPayload(documentIdOrUrl, opts); | ||
| return (await http(resolved.token, "POST", `${resolved.phoneNumberId}/messages`, { | ||
| messaging_product: "whatsapp", | ||
| recipient_type: "individual", | ||
| to, | ||
| type: "document", | ||
| document, | ||
| })); | ||
| }; | ||
| const markAsRead = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const messageId = asString(args[1]); | ||
| if (!messageId) { | ||
| return errorReturn("`messageId` is required.", "message_id_missing"); | ||
| } | ||
| const resolved = await resolveCreds(cred); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| return (await http(resolved.token, "POST", `${resolved.phoneNumberId}/messages`, { | ||
| messaging_product: "whatsapp", | ||
| status: "read", | ||
| message_id: messageId, | ||
| })); | ||
| }; | ||
| /** | ||
| * Fetch media metadata by media ID. Returns `{url, mime_type, sha256, file_size, id, …}`. | ||
| * The `url` requires the same access token to actually download the bytes — | ||
| * script authors must call `http.get` with the `Authorization: Bearer …` header | ||
| * to retrieve the binary. | ||
| */ | ||
| const getMedia = async (args) => { | ||
| const cred = asString(args[0]); | ||
| const mediaId = asString(args[1]); | ||
| if (!mediaId) { | ||
| return errorReturn("`mediaId` is required.", "media_id_missing"); | ||
| } | ||
| const resolved = await resolveCreds(cred); | ||
| if (isErr(resolved)) | ||
| return resolved; | ||
| return (await http(resolved.token, "GET", encodeURIComponent(mediaId))); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const WhatsappFunctions = { | ||
| sendText, | ||
| sendTemplate, | ||
| sendMedia, | ||
| sendDocument, | ||
| markAsRead, | ||
| getMedia, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const WhatsappCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "WhatsApp Business Cloud API", | ||
| icon: "message-circle", | ||
| fields: [ | ||
| { | ||
| name: "access_token", | ||
| title: "Access Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "EAAB…", | ||
| description: "System user permanent access token with `whatsapp_business_messaging` + `whatsapp_business_management` scopes. Create at developers.facebook.com → Business settings → Users → System users.", | ||
| }, | ||
| { | ||
| name: "phone_number_id", | ||
| title: "Phone Number ID", | ||
| type: "text", | ||
| required: true, | ||
| placeholder: "1234567890123456", | ||
| description: "Numeric ID of the WhatsApp Business phone number. Find it in Meta Business Suite → WhatsApp → API Setup.", | ||
| pattern: "^\\d+$", | ||
| }, | ||
| { | ||
| name: "business_account_id", | ||
| title: "WhatsApp Business Account ID", | ||
| type: "text", | ||
| required: false, | ||
| placeholder: "9876543210987654", | ||
| description: "Optional. Only needed for management endpoints (template CRUD, account config). Not used by the message-sending handlers.", | ||
| pattern: "^\\d+$", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Exports: metadata ────────────────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `whatsapp` credential.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_whatsapp", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const toParam = { | ||
| name: "to", | ||
| title: "Recipient", | ||
| description: "Recipient phone number in E.164 format (no leading `+`, e.g. `14155552671`). Must already have opted in or received an approved template message.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "14155552671", | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| access_token_missing: "The credential exists but has no `access_token` field.", | ||
| phone_number_id_missing: "The credential exists but has no `phone_number_id` field.", | ||
| to_missing: "Recipient phone number is required.", | ||
| message_missing: "Message body is required.", | ||
| template_name_missing: "Template name is required.", | ||
| media_missing: "Media ID or public HTTPS URL is required.", | ||
| document_missing: "Document ID or public HTTPS URL is required.", | ||
| message_id_missing: "Message ID is required.", | ||
| media_id_missing: "Media ID is required.", | ||
| invalid_media_type: "`type` must be one of image, audio, video, sticker.", | ||
| transport: "Network failure calling graph.facebook.com.", | ||
| whatsapp_error: "WhatsApp returned an error — see `whatsapp_error.error`.", | ||
| rate_limited: "Graph rate limited the request.", | ||
| not_found: "Resource not found.", | ||
| unauthorized: "Access token rejected (401/403). Re-check scopes and expiry.", | ||
| }; | ||
| export const WhatsappFunctionMetadata = { | ||
| sendText: { | ||
| title: "Send text message", | ||
| summary: "Send a plain-text WhatsApp message", | ||
| description: "Calls `POST /{phone_number_id}/messages` with `type: text`. The recipient must have messaged your business within the last 24 hours, or you must send an approved template first.", | ||
| group: "messages", | ||
| action: "write", | ||
| icon: "send", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "sends_message"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["whatsapp", "message", "text"], | ||
| parameters: [ | ||
| credentialParam, | ||
| toParam, | ||
| { | ||
| name: "message", | ||
| title: "Message", | ||
| description: "Message body (max 4096 chars).", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| rows: 4, | ||
| placeholder: "Hello from RobinPath!", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n preview_url : bool — render a link preview for the first URL in the body", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ messaging_product: 'whatsapp', contacts: [{wa_id}], messages: [{id}] }", | ||
| errors: commonErrors, | ||
| example: 'whatsapp.sendText "my_whatsapp" "14155552671" "Hello from RobinPath!"', | ||
| }, | ||
| sendTemplate: { | ||
| title: "Send template message", | ||
| summary: "Send a pre-approved template (the only way to start a conversation)", | ||
| description: "Calls `POST /{phone_number_id}/messages` with `type: template`. Template must be approved in Meta Business Manager first. Use this to initiate conversations outside the 24-hour customer service window.", | ||
| group: "messages", | ||
| action: "write", | ||
| icon: "file-text", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "sends_message"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["whatsapp", "template", "message"], | ||
| parameters: [ | ||
| credentialParam, | ||
| toParam, | ||
| { | ||
| name: "templateName", | ||
| title: "Template name", | ||
| description: "Name of the approved template (e.g. `hello_world`, `order_confirmation`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "hello_world", | ||
| }, | ||
| { | ||
| name: "languageCode", | ||
| title: "Language code", | ||
| description: "BCP-47 language tag (default `en_US`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| allowExpression: true, | ||
| placeholder: "en_US", | ||
| }, | ||
| { | ||
| name: "components", | ||
| title: "Components", | ||
| description: "Array of component objects (header/body/button). Pass `null`/omit for a zero-variable template.\n\nExample:\n [{\n type: 'body',\n parameters: [{type: 'text', text: 'Ada'}]\n }]", | ||
| dataType: "array", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| errors: commonErrors, | ||
| example: 'whatsapp.sendTemplate "my_whatsapp" "14155552671" "hello_world" "en_US"', | ||
| }, | ||
| sendMedia: { | ||
| title: "Send media message", | ||
| summary: "Send an image, audio, video, or sticker", | ||
| description: "Calls `POST /{phone_number_id}/messages`. Pass either a **media ID** (returned from a prior upload) or a **public HTTPS URL** — the module auto-detects by `^https?://` prefix.\n\nUse the `type` option to pick the message kind (default `image`).", | ||
| group: "messages", | ||
| action: "write", | ||
| icon: "image", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "sends_message"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["whatsapp", "media", "image", "video", "audio", "sticker"], | ||
| parameters: [ | ||
| credentialParam, | ||
| toParam, | ||
| { | ||
| name: "mediaIdOrUrl", | ||
| title: "Media ID or URL", | ||
| description: "Either a Graph media ID (from a prior `POST /{phone_number_id}/media` upload) or a public `https://…` URL that Meta can fetch.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://example.com/photo.jpg", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n type : 'image' (default) | 'audio' | 'video' | 'sticker'\n caption : string — optional caption (image/video only)", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| errors: commonErrors, | ||
| example: 'whatsapp.sendMedia "my_whatsapp" "14155552671" "https://example.com/photo.jpg" {type: "image", caption: "Check this out"}', | ||
| }, | ||
| sendDocument: { | ||
| title: "Send document message", | ||
| summary: "Send a PDF/DOCX/XLSX/etc. attachment", | ||
| description: "Calls `POST /{phone_number_id}/messages` with `type: document`. Pass a media ID or HTTPS URL; optionally supply `filename` and `caption`.", | ||
| group: "messages", | ||
| action: "write", | ||
| icon: "file", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call", "sends_message"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["whatsapp", "document", "pdf"], | ||
| parameters: [ | ||
| credentialParam, | ||
| toParam, | ||
| { | ||
| name: "documentIdOrUrl", | ||
| title: "Document ID or URL", | ||
| description: "Either a Graph media ID or a public `https://…` URL pointing at the document.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://example.com/report.pdf", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n filename : string — display name in the chat\n caption : string — optional caption", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 3, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| errors: commonErrors, | ||
| example: 'whatsapp.sendDocument "my_whatsapp" "14155552671" "https://example.com/report.pdf" {filename: "report.pdf"}', | ||
| }, | ||
| markAsRead: { | ||
| title: "Mark message as read", | ||
| summary: "Send a read receipt for an inbound message", | ||
| description: "Calls `POST /{phone_number_id}/messages` with `status: read` and the inbound `message_id`. Shows blue ticks to the sender.", | ||
| group: "messages", | ||
| action: "write", | ||
| icon: "check-check", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["whatsapp", "read", "status"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "messageId", | ||
| title: "Message ID", | ||
| description: "Inbound message ID (`wamid.…`) from the webhook payload.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "wamid.HBgLMTQxNTU1NTI2NzEVAgARGBIyQUYz…", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ success: true }", | ||
| errors: commonErrors, | ||
| example: 'whatsapp.markAsRead "my_whatsapp" "wamid.HBgLMTQxNTU1NTI2NzEV…"', | ||
| }, | ||
| getMedia: { | ||
| title: "Get media metadata", | ||
| summary: "Resolve a media ID to a short-lived download URL", | ||
| description: "Calls `GET /{media_id}`. Returns `{url, mime_type, sha256, file_size, id, messaging_product}`. The `url` is short-lived (~5 minutes) and requires the same Bearer token to download — chain with `http.get` and pass the token in an Authorization header.", | ||
| group: "media", | ||
| action: "read", | ||
| icon: "download", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["whatsapp", "media", "download"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "mediaId", | ||
| title: "Media ID", | ||
| description: "Media ID from an inbound message (webhook) or from a prior upload.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "1234567890123456", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ url, mime_type, sha256, file_size, id, messaging_product }", | ||
| errors: commonErrors, | ||
| example: 'whatsapp.getMedia "my_whatsapp" "1234567890123456"', | ||
| }, | ||
| }; | ||
| export const WhatsappModuleMetadata = { | ||
| slug: "whatsapp", | ||
| title: "WhatsApp", | ||
| summary: "Send WhatsApp messages, templates, media and documents via the Meta Cloud API", | ||
| description: "WhatsApp Business Cloud API (Graph v18.0) — send text, template, media and document messages from your Business phone number, mark inbound messages as read, and resolve media IDs to download URLs.\n\nAuth is a **permanent system-user access token** plus the **phone number ID** you want to send from; store them together as a `whatsapp` credential. Inbound messages arrive via webhook — wire `POST /wp-json/robinpath-wp/v1/webhook/whatsapp` (or the desktop equivalent) to your Meta app's webhook URL and the `messages` field will trigger.", | ||
| category: "messaging", | ||
| icon: "icon.svg", | ||
| color: "#25D366", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/whatsapp", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| messages: { | ||
| title: "Messages", | ||
| description: "Outbound text, template, media, document and read receipts.", | ||
| order: 1, | ||
| }, | ||
| media: { | ||
| title: "Media", | ||
| description: "Resolve and download media IDs.", | ||
| order: 2, | ||
| }, | ||
| }, | ||
| methods: Object.keys(WhatsappFunctions), | ||
| }; | ||
| //# sourceMappingURL=whatsapp.js.map |
| {"version":3,"file":"whatsapp.js","sourceRoot":"","sources":["../src/whatsapp.ts"],"names":[],"mappings":"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"} |
+15
-8
| { | ||
| "name": "@robinpath/whatsapp", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,9 +23,9 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "WhatsApp module for RobinPath.", | ||
| "description": "Meta WhatsApp Business Cloud API — send text, template, media and document messages, mark messages as read, and resolve media IDs. Uses the encrypted credential vault.", | ||
| "keywords": [ | ||
@@ -38,7 +38,14 @@ "whatsapp", | ||
| "category": "messaging", | ||
| "type": "integration", | ||
| "auth": "api-key", | ||
| "functionCount": 10, | ||
| "baseUrl": "https://graph.facebook.com" | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "credentialType": "whatsapp", | ||
| "functionCount": 6, | ||
| "baseUrl": "https://graph.facebook.com/v18.0", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/whatsapp | ||
| ```bash | ||
| npm install @robinpath/whatsapp | ||
| robinpath add @robinpath/whatsapp | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
51179
1232.09%10
400%698
Infinity%2
100%