@apostlejs/whatsapp 0.0.16 → 0.0.17
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/dist/index.cjs +1 -1
- package/dist/index.d.cts +91 -44
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";function e(e){return e&&e.__esModule?e:{default:e}}var t=e(require("node:crypto")),a=Object.defineProperty,n=(e,t)=>{for(var n in t)a(e,n,{get:t[n],enumerable:!0})},r={};n(r,{WhatsappErrorCode:()=>l,endpoints:()=>c,flowsEndpoints:()=>s,messagesEndpoints:()=>o,wabaEndpoints:()=>i});var s={create:{url:"/{waba_id}/flows",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null},updateMetadata:{url:"/{flow_id}",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null},readMany:{url:"/{waba_id}/flows",method:"get",response:null},delete:{url:"/{flow_id}",method:"delete",response:null},read:{url:"/{flow_id}",method:"get",request:{query:null},response:null},updateJson:{url:"/{flow_id}/assets",method:"post",request:{body:null},response:null},getPreview:{url:"/{flow_id}?fields=preview.invalidate(false)",method:"get",response:null},publish:{url:"/{flow_id}/publish",method:"post",response:null}},o={send:{url:"/{number_id}/messages",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null},showTypingIndicator:{url:"/{number_id}/messages",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null}},i={updateEncryption:{url:"/{number_id}/whatsapp_business_encryption",method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},request:{body:null}},registerNumber:{url:"/{number_id}/register",method:"post",headers:{"Content-Type":"application/json"},request:{body:null}}},c={flows:s,messages:o,waba:i},l=(e=>(e[e.e0AuthException=0]="e0AuthException",e[e.e3ApiMethod=3]="e3ApiMethod",e[e.e10PermissionDenied=10]="e10PermissionDenied",e[e.e190AccessTokenExpired=190]="e190AccessTokenExpired",e[e.e2xxApiPermission=200]="e2xxApiPermission",e[e.e368TemporarilyBlockedForPolicyViolations=368]="e368TemporarilyBlockedForPolicyViolations",e[e.e130497BusinessAccountRestrictedByCountry=130497]="e130497BusinessAccountRestrictedByCountry",e[e.e131031AccountLocked=131031]="e131031AccountLocked",e[e.e1ApiUnknown=1]="e1ApiUnknown",e[e.e2ApiService=2]="e2ApiService",e[e.e33ParameterValueNotValid=33]="e33ParameterValueNotValid",e[e.e100InvalidParameter=100]="e100InvalidParameter",e[e.e130472UserNumberPartOfExperiment=130472]="e130472UserNumberPartOfExperiment",e[e.e131000SomethingWentWrong=131e3]="e131000SomethingWentWrong",e[e.e131005AccessDenied=131005]="e131005AccessDenied",e[e.e131008RequiredParameterMissing=131008]="e131008RequiredParameterMissing",e[e.e131009ParameterValueNotValid=131009]="e131009ParameterValueNotValid",e[e.e131016ServiceUnavailable=131016]="e131016ServiceUnavailable",e[e.e131021RecipientCannotBeSender=131021]="e131021RecipientCannotBeSender",e[e.e131026MessageUndeliverable=131026]="e131026MessageUndeliverable",e[e.e131030RecipientNotAllowedInList=131030]="e131030RecipientNotAllowedInList",e[e.e131037DisplayNameApprovalNeeded=131037]="e131037DisplayNameApprovalNeeded",e[e.e131042BusinessEligibilityPaymentIssue=131042]="e131042BusinessEligibilityPaymentIssue",e[e.e131045IncorrectCertificate=131045]="e131045IncorrectCertificate",e[e.e131047ReEngagementMessage=131047]="e131047ReEngagementMessage",e[e.e131049MetaChoseNotToDeliver=131049]="e131049MetaChoseNotToDeliver",e[e.e131050UserStoppedMarketingMessages=131050]="e131050UserStoppedMarketingMessages",e[e.e131051UnsupportedMessageType=131051]="e131051UnsupportedMessageType",e[e.e131052MediaDownloadError=131052]="e131052MediaDownloadError",e[e.e131053MediaUploadError=131053]="e131053MediaUploadError",e[e.e131057AccountInMaintenanceMode=131057]="e131057AccountInMaintenanceMode",e[e.e132000TemplateParamCountMismatch=132e3]="e132000TemplateParamCountMismatch",e[e.e132001TemplateDoesNotExist=132001]="e132001TemplateDoesNotExist",e[e.e132005TemplateHydratedTextTooLong=132005]="e132005TemplateHydratedTextTooLong",e[e.e132007TemplateFormatCharacterPolicyViolated=132007]="e132007TemplateFormatCharacterPolicyViolated",e[e.e132012TemplateParameterFormatMismatch=132012]="e132012TemplateParameterFormatMismatch",e[e.e132015TemplateIsPaused=132015]="e132015TemplateIsPaused",e[e.e132016TemplateIsDisabled=132016]="e132016TemplateIsDisabled",e[e.e132068FlowIsBlocked=132068]="e132068FlowIsBlocked",e[e.e132069FlowIsThrottled=132069]="e132069FlowIsThrottled",e[e.e133000IncompleteDeregistration=133e3]="e133000IncompleteDeregistration",e[e.e133004ServerTemporarilyUnavailable=133004]="e133004ServerTemporarilyUnavailable",e[e.e133005TwoStepVerificationPinMismatch=133005]="e133005TwoStepVerificationPinMismatch",e[e.e133006PhoneNumberReVerificationNeeded=133006]="e133006PhoneNumberReVerificationNeeded",e[e.e133008TooManyTwoStepVerificationPinGuesses=133008]="e133008TooManyTwoStepVerificationPinGuesses",e[e.e133009TwoStepVerificationPinGuessedTooFast=133009]="e133009TwoStepVerificationPinGuessedTooFast",e[e.e133010PhoneNumberNotRegistered=133010]="e133010PhoneNumberNotRegistered",e[e.e133015PhoneNumberDeletionPending=133015]="e133015PhoneNumberDeletionPending",e[e.e134011PaymentsTermsNotAccepted=134011]="e134011PaymentsTermsNotAccepted",e[e.e135000GenericUserError=135e3]="e135000GenericUserError",e[e.e2593107SynchronizationRequestLimitExceeded=2593107]="e2593107SynchronizationRequestLimitExceeded",e[e.e2593108SynchronizationRequestOutsideTimeWindow=2593108]="e2593108SynchronizationRequestOutsideTimeWindow",e[e.e4ApiTooManyCalls=4]="e4ApiTooManyCalls",e[e.e80007RateLimitIssues=80007]="e80007RateLimitIssues",e[e.e130429RateLimitHit=130429]="e130429RateLimitHit",e[e.e131048SpamRateLimitHit=131048]="e131048SpamRateLimitHit",e[e.e131056BusinessConsumerPairRateLimitHit=131056]="e131056BusinessConsumerPairRateLimitHit",e[e.e133016AccountRegisterDeregisterRateLimitExceeded=133016]="e133016AccountRegisterDeregisterRateLimitExceeded",e))(l||{}),p={};n(p,{actions:()=>x,createContactUrl:()=>O,flows:()=>S,parsers:()=>L,security:()=>H,toGraphLanguageTag:()=>I,utils:()=>k});var d={};n(d,{create:()=>_,delete:()=>b,get:()=>E,getMany:()=>v,getPreview:()=>w,publish:()=>T,updateJson:()=>g,updateMetadata:()=>h});var u={};n(u,{settings:()=>m});var f={},m={setup:e=>{Object.assign(f,e)},get:e=>{const t=f[e]??process.env[e];if(!t)throw new Error(`Missing environment variable: ${e}`);return t}};async function y(e,t,a){const n=`https://graph.facebook.com/v${m.get("GRAPH_API_VERSION")}`,r={Authorization:`Bearer ${m.get("META_APP_ACCESS_TOKEN")}`};let s=e.url;const o={...r,...e.headers,...t.headers},i=new URLSearchParams(t.query).toString();"/"===s[0]&&(s=s.slice(1)),s=`${n}/${s}`,i&&(s=`${s}?${i}`);const c={waba_id:m.get("WHATSAPP_ACCOUNT_ID"),number_id:m.get("WHATSAPP_NUMBER_ID"),...t.params};for(const e in c)s=s.replace(`{${e}}`,c[e]);const l=t.body;let p;if(l&&a?.asFormData){const e=new FormData;for(const t in l)e.append(t,l[t]);p=e}else l&&a?.asUrlEncoded?p=new URLSearchParams(l).toString():l&&(p=JSON.stringify(l));return await fetch(s,{method:e.method,headers:o,body:p}).then((e=>e.json())).then((e=>{if("error"in e)throw{response:{data:e.error}};return e})).catch((async e=>{const t=e.response.data.message,a=e.response.data.error_data?.details||"",n=t.match(/^\(#\d+\)/),r=n?n[0]:"",s=t.replace(/^\(#\d+\)\s*/,""),o=a?a?.startsWith?.(s)?`${r} ${a}`:`${t}: ${a}`:t;e.response.data.message=o;const{message:i,...c}=e.response.data;throw new Error(i,{cause:c})}))}async function _(e){const t=c.flows.create,a=e.flow_json?JSON.stringify(e.flow_json,null,2):void 0;return await y(t,{body:{name:e.name,categories:e.categories,clone_flow_id:e.clone_flow_id,endpoint_uri:e.endpoint_uri,publish:e.publish,flow_json:a}})}async function h(e,t){const a=c.flows.updateMetadata;return await y(a,{body:t,params:{flow_id:e}})}async function g(e,t){const a=c.flows.updateJson,n={name:"flow.json",asset_type:"FLOW_JSON",file:new Blob([JSON.stringify(t,null,2)],{type:"application/json"})};return await y(a,{params:{flow_id:e},body:n},{asFormData:!0}).catch((e=>{if(e.error_user_msg?.startsWith?.("Flow JSON has been saved"))return{success:!0,validation_errors:[]};throw e}))}async function w(e,t){const a=c.flows.getPreview,{preview:n}=await y(a,{params:{flow_id:e}}),r=n.preview_url.replaceAll("\\",""),s=Object.entries(t??{}).reduce(((e,[t,a])=>(e[t]="flow_action_payload"===t?encodeURIComponent(JSON.stringify(a)):a.toString(),e)),{});return`${r}&${new URLSearchParams(s).toString()}`}async function b(e){const t=c.flows.delete;return await y(t,{params:{flow_id:e}})}async function E(e,t){const a=c.flows.read;return await y(a,{params:{flow_id:e},query:{fields:t?.fields.join(",")??""}})}async function v(){const e=c.flows.readMany;return await y(e,{})}async function T(e){const t=c.flows.publish;return await y(t,{params:{flow_id:e}})}var P=e=>e.split("?")[0],S={createToken:({flow_name:e,flow_parameters:t,chatId:a})=>{const n=new URLSearchParams({chat_id:a});if(n.set("flow_identifier",crypto.randomUUID()),t)for(const[e,a]of Object.entries(t))n.set(e,a.toString());return`${e}?${decodeURIComponent(n.toString())}`},getName:P,destructureFlowToken:e=>{const t=P(e);let a=e.split("?")?.[1];"&"===a?.[0]&&(a=a.slice(1));const n=new URLSearchParams(a),r=n.get("chat_id")||n.get("chatId"),s=n.get("flow_identifier")||n.get("flowIdentifier"),o={};for(const[e,t]of n.entries())"chat_id"!==e&&"chatId"!==e&&"flow_identifier"!==e&&"flowIdentifier"!==e&&(o[e]=t);return{paramsString:a,flowName:t,chatId:r,flowIdentifier:s,flowParameters:o}}},N=(e=>(e.AR_SA="ar-SA",e.BN_BD="bn-BD",e.BN_IN="bn-IN",e.CS_CZ="cs-CZ",e.DA_DK="da-DK",e.DE_AT="de-AT",e.DE_CH="de-CH",e.DE_DE="de-DE",e.EL_GR="el-GR",e.EN_AU="en-AU",e.EN_CA="en-CA",e.EN_GB="en-GB",e.EN_IE="en-IE",e.EN_IN="en-IN",e.EN_NZ="en-NZ",e.EN_US="en-US",e.EN_ZA="en-ZA",e.ES_AR="es-AR",e.ES_CL="es-CL",e.ES_CO="es-CO",e.ES_ES="es-ES",e.ES_MX="es-MX",e.ES_US="es-US",e.FI_FI="fi-FI",e.FR_BE="fr-BE",e.FR_CA="fr-CA",e.FR_CH="fr-CH",e.FR_FR="fr-FR",e.HE_IL="he-IL",e.HI_IN="hi-IN",e.HU_HU="hu-HU",e.ID_ID="id-ID",e.IT_CH="it-CH",e.IT_IT="it-IT",e.JA_JP="ja-JP",e.KO_KR="ko-KR",e.NL_BE="nl-BE",e.NL_NL="nl-NL",e.NO_NO="no-NO",e.PL_PL="pl-PL",e.PT_BR="pt-BR",e.PT_PT="pt-PT",e.RO_RO="ro-RO",e.RU_RU="ru-RU",e.SK_SK="sk-SK",e.SV_SE="sv-SE",e.TA_IN="ta-IN",e.TA_LK="ta-LK",e.TH_TH="th-TH",e.TR_TR="tr-TR",e.ZH_CN="zh-CN",e.ZH_HK="zh-HK",e.ZH_TW="zh-TW",e))(N||{}),A={"ar-SA":"ar","bn-BD":"bn","bn-IN":"bn","cs-CZ":"cs","da-DK":"da","de-AT":"de","de-CH":"de","de-DE":"de","el-GR":"el","en-AU":"en","en-CA":"en","en-GB":"en_GB","en-IE":"en","en-IN":"en","en-NZ":"en","en-ZA":"en","en-US":"en_US","es-AR":"es_AR","es-CL":"es","es-CO":"es","es-ES":"es_ES","es-MX":"es_MX","es-US":"es","fi-FI":"fi","fr-BE":"fr","fr-CA":"fr","fr-CH":"fr","fr-FR":"fr","he-IL":"he","hi-IN":"hi","hu-HU":"hu","id-ID":"id","it-CH":"it","it-IT":"it","ja-JP":"ja","ko-KR":"ko","nl-BE":"nl","nl-NL":"nl","no-NO":"nb","pl-PL":"pl","pt-PT":"pt_PT","pt-BR":"pt_BR","ro-RO":"ro","ru-RU":"ru","sk-SK":"sk","sv-SE":"sv","ta-IN":"ta","ta-LK":"ta","th-TH":"th","tr-TR":"tr","zh-CN":"zh_CN","zh-HK":"zh_HK","zh-TW":"zh_TW"},I=e=>{const t=A[e];return void 0===t?"en":t},R=e=>{const t={to:e.to,messaging_product:"whatsapp",recipient_type:"individual"};return e.reply&&(t.context={message_id:e.reply}),e.showUrlPreviewImage&&(t.preview_url=e.showUrlPreviewImage),t},C={flow:e=>{if("flow"!==e.message.type)throw new Error("Invalid type");const{message:t,...a}=e,{flow:n,...r}=t,s=R(a);n.mode||(n.mode=m.get("WHATSAPP_FLOWS_MODE"));const o=S.createToken({chatId:s.to,flow_name:n.name,flow_parameters:n.parameters});return{type:"interactive",...s,interactive:{...r,type:"flow",action:{name:"flow",parameters:{flow_name:n.name,flow_token:o,flow_message_version:"3",flow_cta:n.button,flow_action:n.action??"navigate",mode:n.mode,...n.payload&&{flow_action_payload:{...n.payload,screen:n.payload.screen}}}}}}},text:e=>{if("text"!==e.message.type)throw new Error("Invalid type");const{message:{text:t},...a}=e,n={type:"text",text:{body:t},...R(a)};return e.message.previewUrl&&n.text&&(n.text.preview_url=e.message.previewUrl),n},list:e=>{if("list"!==e.message.type)throw new Error("Invalid type");const{message:t,...a}=e,{list:n,type:r,...s}=t;return{...R(a),type:"interactive",interactive:{...s,type:r,action:n}}},button:e=>{if("button"!==e.message.type)throw new Error("Invalid type");const{message:t,...a}=e,{buttons:n,type:r,...s}=t;return{...R(a),type:"interactive",interactive:{...s,type:r,action:{buttons:n.map((e=>({reply:{id:e.id,title:e.text},type:"reply"})))}}}},template:e=>{if("template"!==e.message.type)throw new Error("Invalid type");const{message:{type:t,...a},...n}=e,r={...R(n),type:t,template:{...a,language:{code:I(a.language)}}};return r.template&&(r.template.namespace=process.env.WHATSAPP_MESSAGE_NAMESPACE),r},media:e=>{if("media"!==e.message.type)throw new Error("Invalid type");const{message:{type:t,...a},...n}=e,r=Object.entries(a)[0],[s,{ref:o,...i}]=r,c=i,l=R(n);return Number.isNaN(Number(o))?c.link=o:c.id=o,{type:s,[s]:c,...l}},contact:e=>{if("contact"!==e.message.type)throw new Error("Invalid type");const{message:{contacts:t},...a}=e;return{type:"contacts",contacts:t,...R(a)}}};function U(e){const{encrypted_aes_key:a,encrypted_flow_data:n,initial_vector:r}=e,s=t.default.createPrivateKey({key:m.get("WHATSAPP_ACCOUNT_ENCRYPTION_PRIVATE_KEY"),passphrase:m.get("WHATSAPP_ACCOUNT_ENCRYPTION_PASSPHRASE")}),o=t.default.privateDecrypt({key:s,padding:t.default.constants.RSA_PKCS1_OAEP_PADDING,oaepHash:"sha256"},Buffer.from(a,"base64")),i=Buffer.from(n,"base64"),c=Buffer.from(r,"base64"),l=i.subarray(0,-16),p=i.subarray(-16),d=t.default.createDecipheriv("aes-128-gcm",o,c);d.setAuthTag(p);const u=Buffer.concat([d.update(l),d.final()]).toString("utf-8");return{payload:JSON.parse(u),encryptionMetadata:{aesKeyBuffer:o,initialVectorBuffer:c}}}function B(e){const t=new URL(e.url).searchParams,a=t.get("hub.verify_token"),n=t.get("hub.challenge");return!(!a||!n)&&a===m.get("WHATSAPP_WEBHOOK_KEY")&&n}async function M(e,a){const n=e.headers.get("x-hub-signature-256");if(!n)return!1;const r=n.replace("sha256=",""),s=t.default.createHmac("sha256",m.get("WHATSAPP_WEBHOOK_KEY")).update(a,"utf-8").digest("hex");return!!t.default.timingSafeEqual(Buffer.from(r),Buffer.from(s))}var L={toGraph:{sendMessage:e=>C[e.message.type](e),flowResponse:(e,t)=>{if(!t.data)throw new Error("Missing data in flow response");if(!t.screen)throw new Error("Missing screen in flow response");if("SUCCESS"===t.screen){const a=t.data??{};t.data={extension_message_response:{params:{flow_token:e,...a}}}}return t}},toSDK:{webhook:async function(e){if("GET"===e.method){const t=B(e);if(!t)throw new Error("Invalid health check hub");return{type:"healthCheck",payload:t}}const t=await e.text(),a=JSON.parse(t);if("entry"in a){if(!M(e,t))throw new Error("Invalid application webhook signature");const r=a.entry.flatMap((e=>e.changes)).filter((e=>"messages"===e.field)).flatMap((e=>e.value.messages)).filter(Boolean).map((e=>function(e){const t=e.from,a={id:e.id,type:e.type,timestamp:e.timestamp,metadata:{forwarded:e.context?.forwarded,frequentlyForwarded:e.context?.frequently_forwarded}},n=function(e){if(!(e.audio||e.document||e.video||e.image))return null;const t=e.audio?.id??e.document?.id??e.image?.id??e.video?.id,a=e.audio?.mime_type??e.document?.mime_type??e.image?.mime_type??e.video?.mime_type,n=["audio","document","image","video"].find((t=>e[t])),r=e.image?.sha256??e.document?.sha256??e.video?.sha256;return{id:t,type:n,caption:e.document?.caption??e.image?.caption??e.video?.caption??null,mime_type:a,sha256:r,filename:e.document?.filename??e.video?.filename}}(e),r=function(e){return e.text?.body??e.button?.text??e.interactive?.button_reply?.title??e.interactive?.list_reply?.title??e.document?.caption??null}(e),s=function(e){return e.interactive?{...e.interactive?.button_reply||e.button?{button:{id:e.interactive?.button_reply?.id??null,title:e.button?.text??e.interactive.button_reply?.title,payload:e.button?.payload??null}}:{},...e.interactive.list_reply?{selectedOption:{id:e.interactive.list_reply.id,title:e.interactive.list_reply.title,description:e.interactive.list_reply.description}}:{},...e.interactive.nfm_reply?{flowResponse:JSON.parse(e.interactive.nfm_reply.response_json)}:{}}:null}(e);return{...a,...s&&{interaction:s},...n&&{media:n},text:r,chatId:t}}(e)));return{type:"application",payload:{messageReceived:(n=r,n.length?n:void 0)}}}var n;if("encrypted_flow_data"in a)return{type:"flowExchange",payload:{...U(a),pingResponse:{data:{status:"active"}}}};throw new Error("Unrecognized event")}}},x={messages:{send:async function(e){const t=L.toGraph.sendMessage(e),a=c.messages.send;return await y(a,{body:t})},showTypingIndicator:async function(e){const t=c.messages.showTypingIndicator;return await y(t,{body:{messaging_product:"whatsapp",status:"read",typing_indicator:{type:"text"},message_id:e.messageId}})}},flows:{...d},waba:{registerNumber:async function({dataRegion:e,pin:t}){const a=c.waba.registerNumber,n={messaging_product:"whatsapp",pin:t};return e&&(n.data_localization_region=e),await y(a,{body:n},{asUrlEncoded:!0})},encryption:{upload:async function(e){const t=c.waba.updateEncryption,a={business_public_key:e};return await y(t,{body:a},{asUrlEncoded:!0})}}}};async function D(e){return await fetch(e).then((async e=>{const t=await e.arrayBuffer();return Buffer.from(t)}))}var H={verifyHub:B,verifySignature:M,generateWabaEncryption:async function(){const e=t.default.randomUUID(),{publicKey:a,privateKey:n}=t.default.generateKeyPairSync("rsa",{modulusLength:2048,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:e}});return{passphrase:e,publicKey:a,privateKey:n}},decryptFlowBody:U,encryptFlowResponse:function(e,a){const n=[];for(const e of Buffer.from(a.initialVectorBuffer).entries())n.push(~e[1]);const r=t.default.createCipheriv("aes-128-gcm",Buffer.from(a.aesKeyBuffer),Buffer.from(n));return Buffer.concat([r.update(JSON.stringify(e),"utf-8"),r.final(),r.getAuthTag()]).toString("base64")},decryptFlowMedia:async function(e,a="https://picsum.photos/seed/picsum/200"){let{cdn_url:n,encryption_metadata:r}=e;if("EXAMPLE_DATA__CDN_URL_WILL_COME_IN_THIS_FIELD"===n)return n=a,await D(n);const s=await D(n),{iv:o,encryption_key:i,hmac_key:c,encrypted_hash:l,plaintext_hash:p}=r,d={iv:Buffer.from(o,"base64"),encryption_key:Buffer.from(i,"base64"),hmac_key:Buffer.from(c,"base64")};if(t.default.createHash("sha256").update(s).digest("base64")!==l)throw new Error("Encrypted hash validation failed");const u=s.subarray(0,s.length-10),f=s.subarray(-10);if(!t.default.createHmac("sha256",d.hmac_key).update(Buffer.concat([d.iv,u])).digest().subarray(0,10).equals(f))throw new Error("HMAC validation failed");const m=t.default.createDecipheriv("aes-256-cbc",d.encryption_key,d.iv),y=m.update(u),_=Buffer.concat([y,m.final()]);if(t.default.createHash("sha256").update(_).digest("base64")!==p)throw new Error("Decrypted media hash validation failed");return _}},O=(e,t)=>{const a=new URL("/send","https://api.whatsapp.com/"),n=e.replace(/[()\-+ ]/g,"");return a.searchParams.append("phone",n),t&&a.searchParams.append("text",t),a.href},k={flows:S,createContactUrl:O},K=null;exports.BCP47LanguageTag=N,exports.WhatsappErrorCode=l,exports.actions=x,exports.createContactUrl=O,exports.createWhatsapp=()=>K||(K=(()=>{const{settings:e}=u,{actions:t,flows:a,parsers:n,security:s,utils:o,toGraphLanguageTag:i}=p,{endpoints:c}=r;return{settings:e,sdk:{actions:t,flows:a,parsers:n,security:s,utils:o,toGraphLanguageTag:i},graph:{endpoints:c}}})()),exports.endpoints=c,exports.flows=S,exports.flowsEndpoints=s,exports.messagesEndpoints=o,exports.parsers=L,exports.security=H,exports.toGraphLanguageTag=I,exports.utils=k,exports.wabaEndpoints=i;
|
|
1
|
+
"use strict";function e(e){return e&&e.__esModule?e:{default:e}}var t=e(require("node:crypto")),a=Object.defineProperty,r=(e,t)=>{for(var r in t)a(e,r,{get:t[r],enumerable:!0})},n={};r(n,{WhatsappErrorCode:()=>d,endpoints:()=>l,flowsEndpoints:()=>s,mediaEndpoints:()=>c,messagesEndpoints:()=>i,wabaEndpoints:()=>o});var s={create:{url:"/{waba_id}/flows",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null},updateMetadata:{url:"/{flow_id}",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null},readMany:{url:"/{waba_id}/flows",method:"get",response:null},delete:{url:"/{flow_id}",method:"delete",response:null},read:{url:"/{flow_id}",method:"get",request:{query:null},response:null},updateJson:{url:"/{flow_id}/assets",method:"post",request:{body:null},response:null},getPreview:{url:"/{flow_id}?fields=preview.invalidate(false)",method:"get",response:null},publish:{url:"/{flow_id}/publish",method:"post",response:null}},i={send:{url:"/{number_id}/messages",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null},showTypingIndicator:{url:"/{number_id}/messages",method:"post",headers:{"Content-Type":"application/json"},request:{body:null},response:null}},o={updateEncryption:{url:"/{number_id}/whatsapp_business_encryption",method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},request:{body:null}},registerNumber:{url:"/{number_id}/register",method:"post",headers:{"Content-Type":"application/json"},request:{body:null}}},c={fetch:{url:"/{media_id}",method:"get",request:{query:null},response:null}},l={flows:s,messages:i,waba:o,media:c},d=(e=>(e[e.e0AuthException=0]="e0AuthException",e[e.e3ApiMethod=3]="e3ApiMethod",e[e.e10PermissionDenied=10]="e10PermissionDenied",e[e.e190AccessTokenExpired=190]="e190AccessTokenExpired",e[e.e2xxApiPermission=200]="e2xxApiPermission",e[e.e368TemporarilyBlockedForPolicyViolations=368]="e368TemporarilyBlockedForPolicyViolations",e[e.e130497BusinessAccountRestrictedByCountry=130497]="e130497BusinessAccountRestrictedByCountry",e[e.e131031AccountLocked=131031]="e131031AccountLocked",e[e.e1ApiUnknown=1]="e1ApiUnknown",e[e.e2ApiService=2]="e2ApiService",e[e.e33ParameterValueNotValid=33]="e33ParameterValueNotValid",e[e.e100InvalidParameter=100]="e100InvalidParameter",e[e.e130472UserNumberPartOfExperiment=130472]="e130472UserNumberPartOfExperiment",e[e.e131000SomethingWentWrong=131e3]="e131000SomethingWentWrong",e[e.e131005AccessDenied=131005]="e131005AccessDenied",e[e.e131008RequiredParameterMissing=131008]="e131008RequiredParameterMissing",e[e.e131009ParameterValueNotValid=131009]="e131009ParameterValueNotValid",e[e.e131016ServiceUnavailable=131016]="e131016ServiceUnavailable",e[e.e131021RecipientCannotBeSender=131021]="e131021RecipientCannotBeSender",e[e.e131026MessageUndeliverable=131026]="e131026MessageUndeliverable",e[e.e131030RecipientNotAllowedInList=131030]="e131030RecipientNotAllowedInList",e[e.e131037DisplayNameApprovalNeeded=131037]="e131037DisplayNameApprovalNeeded",e[e.e131042BusinessEligibilityPaymentIssue=131042]="e131042BusinessEligibilityPaymentIssue",e[e.e131045IncorrectCertificate=131045]="e131045IncorrectCertificate",e[e.e131047ReEngagementMessage=131047]="e131047ReEngagementMessage",e[e.e131049MetaChoseNotToDeliver=131049]="e131049MetaChoseNotToDeliver",e[e.e131050UserStoppedMarketingMessages=131050]="e131050UserStoppedMarketingMessages",e[e.e131051UnsupportedMessageType=131051]="e131051UnsupportedMessageType",e[e.e131052MediaDownloadError=131052]="e131052MediaDownloadError",e[e.e131053MediaUploadError=131053]="e131053MediaUploadError",e[e.e131057AccountInMaintenanceMode=131057]="e131057AccountInMaintenanceMode",e[e.e132000TemplateParamCountMismatch=132e3]="e132000TemplateParamCountMismatch",e[e.e132001TemplateDoesNotExist=132001]="e132001TemplateDoesNotExist",e[e.e132005TemplateHydratedTextTooLong=132005]="e132005TemplateHydratedTextTooLong",e[e.e132007TemplateFormatCharacterPolicyViolated=132007]="e132007TemplateFormatCharacterPolicyViolated",e[e.e132012TemplateParameterFormatMismatch=132012]="e132012TemplateParameterFormatMismatch",e[e.e132015TemplateIsPaused=132015]="e132015TemplateIsPaused",e[e.e132016TemplateIsDisabled=132016]="e132016TemplateIsDisabled",e[e.e132068FlowIsBlocked=132068]="e132068FlowIsBlocked",e[e.e132069FlowIsThrottled=132069]="e132069FlowIsThrottled",e[e.e133000IncompleteDeregistration=133e3]="e133000IncompleteDeregistration",e[e.e133004ServerTemporarilyUnavailable=133004]="e133004ServerTemporarilyUnavailable",e[e.e133005TwoStepVerificationPinMismatch=133005]="e133005TwoStepVerificationPinMismatch",e[e.e133006PhoneNumberReVerificationNeeded=133006]="e133006PhoneNumberReVerificationNeeded",e[e.e133008TooManyTwoStepVerificationPinGuesses=133008]="e133008TooManyTwoStepVerificationPinGuesses",e[e.e133009TwoStepVerificationPinGuessedTooFast=133009]="e133009TwoStepVerificationPinGuessedTooFast",e[e.e133010PhoneNumberNotRegistered=133010]="e133010PhoneNumberNotRegistered",e[e.e133015PhoneNumberDeletionPending=133015]="e133015PhoneNumberDeletionPending",e[e.e134011PaymentsTermsNotAccepted=134011]="e134011PaymentsTermsNotAccepted",e[e.e135000GenericUserError=135e3]="e135000GenericUserError",e[e.e2593107SynchronizationRequestLimitExceeded=2593107]="e2593107SynchronizationRequestLimitExceeded",e[e.e2593108SynchronizationRequestOutsideTimeWindow=2593108]="e2593108SynchronizationRequestOutsideTimeWindow",e[e.e4ApiTooManyCalls=4]="e4ApiTooManyCalls",e[e.e80007RateLimitIssues=80007]="e80007RateLimitIssues",e[e.e130429RateLimitHit=130429]="e130429RateLimitHit",e[e.e131048SpamRateLimitHit=131048]="e131048SpamRateLimitHit",e[e.e131056BusinessConsumerPairRateLimitHit=131056]="e131056BusinessConsumerPairRateLimitHit",e[e.e133016AccountRegisterDeregisterRateLimitExceeded=133016]="e133016AccountRegisterDeregisterRateLimitExceeded",e))(d||{}),p={};r(p,{actions:()=>D,createContactUrl:()=>k,flows:()=>A,parsers:()=>L,security:()=>O,toGraphLanguageTag:()=>R,utils:()=>K});var u={};r(u,{create:()=>h,delete:()=>b,get:()=>v,getMany:()=>T,getPreview:()=>E,publish:()=>P,updateJson:()=>g,updateMetadata:()=>w});var m={};r(m,{settings:()=>y});var f={},y={setup:e=>{Object.assign(f,e)},get:e=>{const t=f[e]??process.env[e];if(!t)throw new Error(`Missing environment variable: ${e}`);return t}};async function _(e,t,a){const r=`https://graph.facebook.com/v${y.get("GRAPH_API_VERSION")}`,n={Authorization:`Bearer ${y.get("META_APP_ACCESS_TOKEN")}`};let s=e.url;const i={...n,...e.headers,...t.headers},o=Object.fromEntries(Object.entries(t.query??{}).filter((([,e])=>null!=e))),c=new URLSearchParams(o).toString();"/"===s[0]&&(s=s.slice(1)),s=`${r}/${s}`,c&&(s=`${s}?${c}`);const l={waba_id:y.get("WHATSAPP_ACCOUNT_ID"),number_id:y.get("WHATSAPP_NUMBER_ID"),...t.params};for(const e in l)s=s.replace(`{${e}}`,l[e]);const d=t.body;let p;if(d&&a?.asFormData){const e=new FormData;for(const t in d)e.append(t,d[t]);p=e}else d&&a?.asUrlEncoded?p=new URLSearchParams(d).toString():d&&(p=JSON.stringify(d));return await fetch(s,{method:e.method,headers:i,body:p}).then((e=>e.json())).then((e=>{if("error"in e)throw{response:{data:e.error}};return e})).catch((async t=>{if(!t.response)throw new Error(t.message,{cause:{method:e.method,url:s,body:p}});const a=t.response.data.message,r=t.response.data.error_data?.details||"",n=a.match(/^\(#\d+\)/),i=n?n[0]:"",o=a.replace(/^\(#\d+\)\s*/,""),c=r?r?.startsWith?.(o)?`${i} ${r}`:`${a}: ${r}`:a;t.response.data.message=c;const{message:l,...d}=t.response.data;throw new Error(l,{cause:d})}))}async function h(e){const t=l.flows.create,a=e.flow_json?JSON.stringify(e.flow_json,null,2):void 0;return await _(t,{body:{name:e.name,categories:e.categories,clone_flow_id:e.clone_flow_id,endpoint_uri:e.endpoint_uri,publish:e.publish,flow_json:a}})}async function w(e,t){const a=l.flows.updateMetadata;return await _(a,{body:t,params:{flow_id:e}})}async function g(e,t){const a=l.flows.updateJson,r={name:"flow.json",asset_type:"FLOW_JSON",file:new Blob([JSON.stringify(t,null,2)],{type:"application/json"})};return await _(a,{params:{flow_id:e},body:r},{asFormData:!0}).catch((e=>{if(e.error_user_msg?.startsWith?.("Flow JSON has been saved"))return{success:!0,validation_errors:[]};throw e}))}async function E(e,t){const a=l.flows.getPreview,{preview:r}=await _(a,{params:{flow_id:e}}),n=r.preview_url.replaceAll("\\",""),s=Object.entries(t??{}).reduce(((e,[t,a])=>(e[t]="flow_action_payload"===t?encodeURIComponent(JSON.stringify(a)):a.toString(),e)),{});return`${n}&${new URLSearchParams(s).toString()}`}async function b(e){const t=l.flows.delete;return await _(t,{params:{flow_id:e}})}async function v(e,t){const a=l.flows.read;return await _(a,{params:{flow_id:e},query:{fields:t?.fields.join(",")??""}})}async function T(){const e=l.flows.readMany;return await _(e,{})}async function P(e){const t=l.flows.publish;return await _(t,{params:{flow_id:e}})}var S=e=>e.split("?")[0],A={createToken:({chatId:e,flow_name:t,flow_parameters:a,flow_identifier:r})=>{const n=new URLSearchParams({chat_id:e});if(n.set("flow_identifier",r??crypto.randomUUID()),a)for(const[e,t]of Object.entries(a))n.set(e,t.toString());return`${t}?${decodeURIComponent(n.toString())}`},getName:S,destructureFlowToken:e=>{const t=S(e);let a=e.split("?")?.[1];"&"===a?.[0]&&(a=a.slice(1));const r=new URLSearchParams(a),n=r.get("chat_id")||r.get("chatId"),s=r.get("flow_identifier")||r.get("flowIdentifier"),i={};for(const[e,t]of r.entries())"chat_id"!==e&&"chatId"!==e&&"flow_identifier"!==e&&"flowIdentifier"!==e&&(i[e]=t);return{paramsString:a,flowName:t,chatId:n,flowIdentifier:s,flowParameters:i}}},N=(e=>(e.AR_SA="ar-SA",e.BN_BD="bn-BD",e.BN_IN="bn-IN",e.CS_CZ="cs-CZ",e.DA_DK="da-DK",e.DE_AT="de-AT",e.DE_CH="de-CH",e.DE_DE="de-DE",e.EL_GR="el-GR",e.EN_AU="en-AU",e.EN_CA="en-CA",e.EN_GB="en-GB",e.EN_IE="en-IE",e.EN_IN="en-IN",e.EN_NZ="en-NZ",e.EN_US="en-US",e.EN_ZA="en-ZA",e.ES_AR="es-AR",e.ES_CL="es-CL",e.ES_CO="es-CO",e.ES_ES="es-ES",e.ES_MX="es-MX",e.ES_US="es-US",e.FI_FI="fi-FI",e.FR_BE="fr-BE",e.FR_CA="fr-CA",e.FR_CH="fr-CH",e.FR_FR="fr-FR",e.HE_IL="he-IL",e.HI_IN="hi-IN",e.HU_HU="hu-HU",e.ID_ID="id-ID",e.IT_CH="it-CH",e.IT_IT="it-IT",e.JA_JP="ja-JP",e.KO_KR="ko-KR",e.NL_BE="nl-BE",e.NL_NL="nl-NL",e.NO_NO="no-NO",e.PL_PL="pl-PL",e.PT_BR="pt-BR",e.PT_PT="pt-PT",e.RO_RO="ro-RO",e.RU_RU="ru-RU",e.SK_SK="sk-SK",e.SV_SE="sv-SE",e.TA_IN="ta-IN",e.TA_LK="ta-LK",e.TH_TH="th-TH",e.TR_TR="tr-TR",e.ZH_CN="zh-CN",e.ZH_HK="zh-HK",e.ZH_TW="zh-TW",e))(N||{}),I={"ar-SA":"ar","bn-BD":"bn","bn-IN":"bn","cs-CZ":"cs","da-DK":"da","de-AT":"de","de-CH":"de","de-DE":"de","el-GR":"el","en-AU":"en","en-CA":"en","en-GB":"en_GB","en-IE":"en","en-IN":"en","en-NZ":"en","en-ZA":"en","en-US":"en_US","es-AR":"es_AR","es-CL":"es","es-CO":"es","es-ES":"es_ES","es-MX":"es_MX","es-US":"es","fi-FI":"fi","fr-BE":"fr","fr-CA":"fr","fr-CH":"fr","fr-FR":"fr","he-IL":"he","hi-IN":"hi","hu-HU":"hu","id-ID":"id","it-CH":"it","it-IT":"it","ja-JP":"ja","ko-KR":"ko","nl-BE":"nl","nl-NL":"nl","no-NO":"nb","pl-PL":"pl","pt-PT":"pt_PT","pt-BR":"pt_BR","ro-RO":"ro","ru-RU":"ru","sk-SK":"sk","sv-SE":"sv","ta-IN":"ta","ta-LK":"ta","th-TH":"th","tr-TR":"tr","zh-CN":"zh_CN","zh-HK":"zh_HK","zh-TW":"zh_TW"},R=e=>{const t=I[e];return void 0===t?"en":t},C=e=>{const t={to:e.to,messaging_product:"whatsapp",recipient_type:"individual"};return e.reply&&(t.context={message_id:e.reply}),e.showUrlPreviewImage&&(t.preview_url=e.showUrlPreviewImage),t},U={flow:e=>{if("flow"!==e.message.type)throw new Error("Invalid type");const{message:t,...a}=e,{flow:r,...n}=t,s=C(a);r.mode||(r.mode=y.get("WHATSAPP_FLOWS_MODE"));const i=A.createToken({chatId:s.to,flow_name:r.name,flow_parameters:r.parameters,flow_identifier:r.identifier});return{type:"interactive",...s,interactive:{...n,type:"flow",action:{name:"flow",parameters:{flow_name:r.name,flow_token:i,flow_message_version:"3",flow_cta:r.button,flow_action:r.action??"navigate",mode:r.mode,...r.payload&&{flow_action_payload:{...r.payload,screen:r.payload.screen}}}}}}},text:e=>{if("text"!==e.message.type)throw new Error("Invalid type");const{message:{text:t},...a}=e,r={type:"text",text:{body:t},...C(a)};return e.message.previewUrl&&r.text&&(r.text.preview_url=e.message.previewUrl),r},list:e=>{if("list"!==e.message.type)throw new Error("Invalid type");const{message:t,...a}=e,{list:r,type:n,...s}=t;return{...C(a),type:"interactive",interactive:{...s,type:n,action:r}}},button:e=>{if("button"!==e.message.type)throw new Error("Invalid type");const{message:t,...a}=e,{buttons:r,type:n,...s}=t;return{...C(a),type:"interactive",interactive:{...s,type:n,action:{buttons:r.map((e=>({reply:{id:e.id,title:e.text},type:"reply"})))}}}},template:e=>{if("template"!==e.message.type)throw new Error("Invalid type");const{message:{type:t,...a},...r}=e,n={...C(r),type:t,template:{...a,language:{code:R(a.language)}}};return n.template&&(n.template.namespace=process.env.WHATSAPP_MESSAGE_NAMESPACE),n},media:e=>{if("media"!==e.message.type)throw new Error("Invalid type");const{message:{type:t,...a},...r}=e,n=Object.entries(a)[0],[s,{ref:i,...o}]=n,c=o,l=C(r);return Number.isNaN(Number(i))?c.link=i:c.id=i,{type:s,[s]:c,...l}},contact:e=>{if("contact"!==e.message.type)throw new Error("Invalid type");const{message:{contacts:t},...a}=e;return{type:"contacts",contacts:t,...C(a)}}};function B(e){const{encrypted_aes_key:a,encrypted_flow_data:r,initial_vector:n}=e,s=t.default.createPrivateKey({key:y.get("WHATSAPP_ACCOUNT_ENCRYPTION_PRIVATE_KEY"),passphrase:y.get("WHATSAPP_ACCOUNT_ENCRYPTION_PASSPHRASE")}),i=t.default.privateDecrypt({key:s,padding:t.default.constants.RSA_PKCS1_OAEP_PADDING,oaepHash:"sha256"},Buffer.from(a,"base64")),o=Buffer.from(r,"base64"),c=Buffer.from(n,"base64"),l=o.subarray(0,-16),d=o.subarray(-16),p=t.default.createDecipheriv("aes-128-gcm",i,c);p.setAuthTag(d);const u=Buffer.concat([p.update(l),p.final()]).toString("utf-8");return{payload:JSON.parse(u),encryptionMetadata:{aesKeyBuffer:i,initialVectorBuffer:c}}}function M(e){const t=new URL(e.url).searchParams,a=t.get("hub.verify_token"),r=t.get("hub.challenge");return!(!a||!r)&&a===y.get("WHATSAPP_WEBHOOK_KEY")&&r}async function x(e,a){const r=e.headers.get("x-hub-signature-256");if(!r)return!1;const n=r.replace("sha256=",""),s=t.default.createHmac("sha256",y.get("WHATSAPP_WEBHOOK_KEY")).update(a,"utf-8").digest("hex");return!!t.default.timingSafeEqual(Buffer.from(n),Buffer.from(s))}var L={toGraph:{sendMessage:e=>U[e.message.type](e),flowResponse:(e,t)=>{if(!t.data)throw new Error("Missing data in flow response");if(!t.screen)throw new Error("Missing screen in flow response");if("SUCCESS"===t.screen){const a=t.data??{};t.data={extension_message_response:{params:{flow_token:e,...a}}}}return t}},toSDK:{webhook:async function(e){if("GET"===e.method){const t=M(e);if(!t)throw new Error("Invalid health check hub");return{type:"healthCheck",payload:t}}const t=await e.text(),a=JSON.parse(t);if("entry"in a){if(!x(e,t))throw new Error("Invalid application webhook signature");const n=a.entry.flatMap((e=>e.changes)).filter((e=>"messages"===e.field)).flatMap((e=>e.value.messages)).filter(Boolean).map((e=>function(e){const t=e.from,a={id:e.id,type:e.type,timestamp:e.timestamp,metadata:{forwarded:e.context?.forwarded,frequentlyForwarded:e.context?.frequently_forwarded}},r=function(e){if(!(e.audio||e.document||e.video||e.image))return null;const t=e.audio?.id??e.document?.id??e.image?.id??e.video?.id,a=e.audio?.mime_type??e.document?.mime_type??e.image?.mime_type??e.video?.mime_type,r=["audio","document","image","video"].find((t=>e[t])),n=e.image?.sha256??e.document?.sha256??e.video?.sha256;return{id:t,type:r,caption:e.document?.caption??e.image?.caption??e.video?.caption??null,mime_type:a,sha256:n,filename:e.document?.filename??e.video?.filename}}(e),n=function(e){return e.text?.body??e.button?.text??e.interactive?.button_reply?.title??e.interactive?.list_reply?.title??e.document?.caption??null}(e),s=function(e){return e.interactive?{...e.interactive?.button_reply||e.button?{button:{id:e.interactive?.button_reply?.id??null,title:e.button?.text??e.interactive.button_reply?.title,payload:e.button?.payload??null}}:{},...e.interactive.list_reply?{selectedOption:{id:e.interactive.list_reply.id,title:e.interactive.list_reply.title,description:e.interactive.list_reply.description}}:{},...e.interactive.nfm_reply?{flowResponse:JSON.parse(e.interactive.nfm_reply.response_json)}:{}}:null}(e);return{...a,...s&&{interaction:s},...r&&{media:r},text:n,chatId:t}}(e)));return{type:"application",payload:{messageReceived:(r=n,r.length?r:void 0)}}}var r;if("encrypted_flow_data"in a)return{type:"flowExchange",payload:{...B(a),pingResponse:{data:{status:"active"}}}};throw new Error("Unrecognized event")}}},D={messages:{send:async function(e){const t=L.toGraph.sendMessage(e),a=l.messages.send;return await _(a,{body:t})},showTypingIndicator:async function(e){const t=l.messages.showTypingIndicator;return await _(t,{body:{messaging_product:"whatsapp",status:"read",typing_indicator:{type:"text"},message_id:e.messageId}})}},media:{retrieve:async function({id:e}){const t=l.media.fetch;return await _(t,{query:{phone_number_id:y.get("WHATSAPP_NUMBER_ID")},params:{media_id:e}})}},flows:{...u},waba:{registerNumber:async function({dataRegion:e,pin:t}){const a=l.waba.registerNumber,r={messaging_product:"whatsapp",pin:t};return e&&(r.data_localization_region=e),await _(a,{body:r},{asUrlEncoded:!0})},encryption:{upload:async function(e){const t=l.waba.updateEncryption,a={business_public_key:e};return await _(t,{body:a},{asUrlEncoded:!0})}}}};async function H(e){return await fetch(e).then((async e=>{const t=await e.arrayBuffer();return Buffer.from(t)}))}var O={verifyHub:M,verifySignature:x,generateWabaEncryption:async function(){const e=t.default.randomUUID(),{publicKey:a,privateKey:r}=t.default.generateKeyPairSync("rsa",{modulusLength:2048,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem",cipher:"aes-256-cbc",passphrase:e}});return{passphrase:e,publicKey:a,privateKey:r}},decryptFlowBody:B,encryptFlowResponse:function(e,a){const r=[];for(const e of Buffer.from(a.initialVectorBuffer).entries())r.push(~e[1]);const n=t.default.createCipheriv("aes-128-gcm",Buffer.from(a.aesKeyBuffer),Buffer.from(r));return Buffer.concat([n.update(JSON.stringify(e),"utf-8"),n.final(),n.getAuthTag()]).toString("base64")},decryptFlowMedia:async function(e,a="https://picsum.photos/seed/picsum/200"){let{cdn_url:r,encryption_metadata:n}=e;if("EXAMPLE_DATA__CDN_URL_WILL_COME_IN_THIS_FIELD"===r)return r=a,await H(r);const s=await H(r),{iv:i,encryption_key:o,hmac_key:c,encrypted_hash:l,plaintext_hash:d}=n,p={iv:Buffer.from(i,"base64"),encryption_key:Buffer.from(o,"base64"),hmac_key:Buffer.from(c,"base64")};if(t.default.createHash("sha256").update(s).digest("base64")!==l)throw new Error("Encrypted hash validation failed");const u=s.subarray(0,s.length-10),m=s.subarray(-10);if(!t.default.createHmac("sha256",p.hmac_key).update(Buffer.concat([p.iv,u])).digest().subarray(0,10).equals(m))throw new Error("HMAC validation failed");const f=t.default.createDecipheriv("aes-256-cbc",p.encryption_key,p.iv),y=f.update(u),_=Buffer.concat([y,f.final()]);if(t.default.createHash("sha256").update(_).digest("base64")!==d)throw new Error("Decrypted media hash validation failed");return _}},k=(e,t)=>{const a=new URL("/send","https://api.whatsapp.com/"),r=e.replace(/[()\-+ ]/g,"");return a.searchParams.append("phone",r),t&&a.searchParams.append("text",t),a.href},K={flows:A,createContactUrl:k},F=null;exports.BCP47LanguageTag=N,exports.WhatsappErrorCode=d,exports.actions=D,exports.createContactUrl=k,exports.createWhatsapp=()=>F||(F=(()=>{const{settings:e}=m,{actions:t,flows:a,parsers:r,security:s,utils:i,toGraphLanguageTag:o}=p,{endpoints:c}=n;return{settings:e,sdk:{actions:t,flows:a,parsers:r,security:s,utils:i,toGraphLanguageTag:o},graph:{endpoints:c}}})()),exports.endpoints=l,exports.flows=A,exports.flowsEndpoints=s,exports.mediaEndpoints=c,exports.messagesEndpoints=i,exports.parsers=L,exports.security=O,exports.toGraphLanguageTag=R,exports.utils=K,exports.wabaEndpoints=o;
|
package/dist/index.d.cts
CHANGED
|
@@ -108,6 +108,13 @@ declare const endpoints: {
|
|
|
108
108
|
body: WhatsappRegisterPhoneNumberRequestBody;
|
|
109
109
|
}, unknown>;
|
|
110
110
|
};
|
|
111
|
+
media: {
|
|
112
|
+
fetch: Endpoint<"/{media_id}", "get", {
|
|
113
|
+
query: {
|
|
114
|
+
phone_number_id?: string;
|
|
115
|
+
};
|
|
116
|
+
}, WhatsappMediaRetrieveRequestResponse>;
|
|
117
|
+
};
|
|
111
118
|
};
|
|
112
119
|
|
|
113
120
|
type FlowCategory = "SIGN_UP" | "SIGN_IN" | "APPOINTMENT_BOOKING" | "LEAD_GENERATION" | "CONTACT_US" | "CUSTOMER_SUPPORT" | "SURVEY" | "OTHER";
|
|
@@ -141,22 +148,6 @@ interface FlowValidationError {
|
|
|
141
148
|
column_end: number;
|
|
142
149
|
}
|
|
143
150
|
|
|
144
|
-
type WhatsappGetManyFlowsRequestResponse = {
|
|
145
|
-
data: Array<{
|
|
146
|
-
id: string;
|
|
147
|
-
name: string;
|
|
148
|
-
status: FlowStatus;
|
|
149
|
-
categories: FlowCategory[];
|
|
150
|
-
validation_errors: FlowValidationError[];
|
|
151
|
-
}>;
|
|
152
|
-
paging: {
|
|
153
|
-
cursors: {
|
|
154
|
-
before: string;
|
|
155
|
-
after: string;
|
|
156
|
-
};
|
|
157
|
-
};
|
|
158
|
-
};
|
|
159
|
-
|
|
160
151
|
type WhatsappGetFlowWebPreviewPageRequestQuery = {
|
|
161
152
|
flow_token: string;
|
|
162
153
|
flow_action: "data_exchange" | "navigate";
|
|
@@ -195,6 +186,22 @@ type WhatsappGetFlowsRequestResponse = {
|
|
|
195
186
|
};
|
|
196
187
|
};
|
|
197
188
|
|
|
189
|
+
type WhatsappGetManyFlowsRequestResponse = {
|
|
190
|
+
data: Array<{
|
|
191
|
+
id: string;
|
|
192
|
+
name: string;
|
|
193
|
+
status: FlowStatus;
|
|
194
|
+
categories: FlowCategory[];
|
|
195
|
+
validation_errors: FlowValidationError[];
|
|
196
|
+
}>;
|
|
197
|
+
paging: {
|
|
198
|
+
cursors: {
|
|
199
|
+
before: string;
|
|
200
|
+
after: string;
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
|
|
198
205
|
type WhatsappPublishFlowResponse = {
|
|
199
206
|
success: boolean;
|
|
200
207
|
};
|
|
@@ -238,14 +245,30 @@ declare const flowsEndpoints: {
|
|
|
238
245
|
publish: Endpoint<"/{flow_id}/publish", "post", IRequest, WhatsappPublishFlowResponse>;
|
|
239
246
|
};
|
|
240
247
|
|
|
241
|
-
type
|
|
248
|
+
type WhatsappMediaRetrieveRequestResponse = {
|
|
249
|
+
messaging_product: "whatsapp";
|
|
250
|
+
url: string;
|
|
251
|
+
mime_type: string;
|
|
252
|
+
sha256: string;
|
|
253
|
+
file_size: number;
|
|
254
|
+
id: string;
|
|
255
|
+
};
|
|
242
256
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
257
|
+
declare const mediaEndpoints: {
|
|
258
|
+
fetch: Endpoint<"/{media_id}", "get", {
|
|
259
|
+
query: {
|
|
260
|
+
phone_number_id?: string;
|
|
261
|
+
};
|
|
262
|
+
}, WhatsappMediaRetrieveRequestResponse>;
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
interface WaIncomingContactObject {
|
|
266
|
+
wa_id: string;
|
|
267
|
+
profile: {
|
|
268
|
+
name: string;
|
|
269
|
+
};
|
|
248
270
|
}
|
|
271
|
+
type WaIncomingContacts = Array<WaIncomingContactObject>;
|
|
249
272
|
|
|
250
273
|
type WaOutgoingContactsMessage = Array<{
|
|
251
274
|
addresses?: Array<Partial<{
|
|
@@ -452,14 +475,6 @@ interface WaOutgoingMessage {
|
|
|
452
475
|
}
|
|
453
476
|
type WaMessageType = keyof WaOutgoingMessage;
|
|
454
477
|
|
|
455
|
-
interface WaIncomingContactObject {
|
|
456
|
-
wa_id: string;
|
|
457
|
-
profile: {
|
|
458
|
-
name: string;
|
|
459
|
-
};
|
|
460
|
-
}
|
|
461
|
-
type WaIncomingContacts = Array<WaIncomingContactObject>;
|
|
462
|
-
|
|
463
478
|
type WhatsappSendMessageRequestConfig = {
|
|
464
479
|
to: string;
|
|
465
480
|
preview_url?: boolean;
|
|
@@ -502,12 +517,12 @@ declare const messagesEndpoints: {
|
|
|
502
517
|
}, WhatsappShowTypingIndicatorRequestResponse>;
|
|
503
518
|
};
|
|
504
519
|
|
|
505
|
-
type
|
|
520
|
+
type WhatsappISOCountryCode = "AU" | "ID" | "IN" | "JP" | "SG" | "KR" | "DE" | "CH" | "GB" | "BR" | "BH" | "ZA" | "AE" | "CA";
|
|
506
521
|
|
|
507
522
|
type WhatsappRegisterPhoneNumberRequestBody = {
|
|
508
523
|
messaging_product: "whatsapp";
|
|
509
524
|
pin: string;
|
|
510
|
-
data_localization_region?:
|
|
525
|
+
data_localization_region?: WhatsappISOCountryCode;
|
|
511
526
|
};
|
|
512
527
|
|
|
513
528
|
type WhatsappWabaUploadEncryptionRequestBody = {
|
|
@@ -726,6 +741,15 @@ type WhatsappApplicationWebhookBody = {
|
|
|
726
741
|
}>;
|
|
727
742
|
};
|
|
728
743
|
|
|
744
|
+
type FlowData<K extends string = string> = Record<K, AnyType>;
|
|
745
|
+
|
|
746
|
+
interface FlowMetadata {
|
|
747
|
+
name: string;
|
|
748
|
+
categories: FlowCategory[];
|
|
749
|
+
application_id?: string;
|
|
750
|
+
endpoint_uri?: string;
|
|
751
|
+
}
|
|
752
|
+
|
|
729
753
|
/**
|
|
730
754
|
* Cloud API Error Codes
|
|
731
755
|
*
|
|
@@ -1765,14 +1789,19 @@ declare function webhook(request: Request): Promise<WaSDKEvent<"healthCheck"> |
|
|
|
1765
1789
|
|
|
1766
1790
|
declare function uploadWabaEncryption(publicKey: string): Promise<unknown>;
|
|
1767
1791
|
|
|
1768
|
-
interface
|
|
1792
|
+
interface RegisterNumberPayload {
|
|
1769
1793
|
pin: string;
|
|
1770
|
-
dataRegion?:
|
|
1794
|
+
dataRegion?: WhatsappISOCountryCode;
|
|
1771
1795
|
}
|
|
1772
|
-
declare function registerNumber({ dataRegion, pin }:
|
|
1796
|
+
declare function registerNumber({ dataRegion, pin, }: RegisterNumberPayload): Promise<unknown>;
|
|
1773
1797
|
|
|
1774
1798
|
declare function _delete(flow_id: string): Promise<WhatsappDeleteFlowResponse>;
|
|
1775
1799
|
|
|
1800
|
+
interface RetrieveMediaPayload {
|
|
1801
|
+
id: string;
|
|
1802
|
+
}
|
|
1803
|
+
declare function retrieveMedia({ id }: RetrieveMediaPayload): Promise<WhatsappMediaRetrieveRequestResponse>;
|
|
1804
|
+
|
|
1776
1805
|
type WhatsappSDKShowTypingIndicatorParams = {
|
|
1777
1806
|
messageId: string;
|
|
1778
1807
|
};
|
|
@@ -1801,6 +1830,7 @@ interface BaseFlowConfig {
|
|
|
1801
1830
|
button: string;
|
|
1802
1831
|
parameters?: Record<string, string | number>;
|
|
1803
1832
|
mode?: "draft" | "published";
|
|
1833
|
+
identifier?: string;
|
|
1804
1834
|
}
|
|
1805
1835
|
interface NavigateFlowConfig extends BaseFlowConfig {
|
|
1806
1836
|
action?: "navigate";
|
|
@@ -1951,6 +1981,9 @@ declare const actions: {
|
|
|
1951
1981
|
send: typeof send;
|
|
1952
1982
|
showTypingIndicator: typeof showTypingIndicator;
|
|
1953
1983
|
};
|
|
1984
|
+
media: {
|
|
1985
|
+
retrieve: typeof retrieveMedia;
|
|
1986
|
+
};
|
|
1954
1987
|
flows: {
|
|
1955
1988
|
create(body: Omit<WhatsappCreateFlowRequestBody, "flow_json"> & {
|
|
1956
1989
|
flow_json?: Record<string, AnyType>;
|
|
@@ -2015,10 +2048,11 @@ type FlowParameters = Record<string, string | number>;
|
|
|
2015
2048
|
declare const createContactUrl: (phone: string, prefilled?: string) => string;
|
|
2016
2049
|
|
|
2017
2050
|
declare const flows: {
|
|
2018
|
-
createToken: ({ flow_name, flow_parameters,
|
|
2051
|
+
createToken: ({ chatId, flow_name, flow_parameters, flow_identifier, }: {
|
|
2052
|
+
chatId: string;
|
|
2019
2053
|
flow_name: string;
|
|
2020
2054
|
flow_parameters?: Record<string, string | number>;
|
|
2021
|
-
|
|
2055
|
+
flow_identifier?: string;
|
|
2022
2056
|
}) => string;
|
|
2023
2057
|
getName: (token: string) => string;
|
|
2024
2058
|
destructureFlowToken: (token: string) => {
|
|
@@ -2032,10 +2066,11 @@ declare const flows: {
|
|
|
2032
2066
|
|
|
2033
2067
|
declare const utils: {
|
|
2034
2068
|
flows: {
|
|
2035
|
-
createToken: ({ flow_name, flow_parameters,
|
|
2069
|
+
createToken: ({ chatId, flow_name, flow_parameters, flow_identifier, }: {
|
|
2070
|
+
chatId: string;
|
|
2036
2071
|
flow_name: string;
|
|
2037
2072
|
flow_parameters?: Record<string, string | number>;
|
|
2038
|
-
|
|
2073
|
+
flow_identifier?: string;
|
|
2039
2074
|
}) => string;
|
|
2040
2075
|
getName: (token: string) => string;
|
|
2041
2076
|
destructureFlowToken: (token: string) => {
|
|
@@ -2075,6 +2110,9 @@ declare const createWhatsapp: () => {
|
|
|
2075
2110
|
send: typeof send;
|
|
2076
2111
|
showTypingIndicator: typeof showTypingIndicator;
|
|
2077
2112
|
};
|
|
2113
|
+
media: {
|
|
2114
|
+
retrieve: typeof retrieveMedia;
|
|
2115
|
+
};
|
|
2078
2116
|
flows: {
|
|
2079
2117
|
create(body: Omit<WhatsappCreateFlowRequestBody, "flow_json"> & {
|
|
2080
2118
|
flow_json?: Record<string, AnyType>;
|
|
@@ -2100,10 +2138,11 @@ declare const createWhatsapp: () => {
|
|
|
2100
2138
|
};
|
|
2101
2139
|
};
|
|
2102
2140
|
flows: {
|
|
2103
|
-
createToken: ({ flow_name, flow_parameters,
|
|
2141
|
+
createToken: ({ chatId, flow_name, flow_parameters, flow_identifier, }: {
|
|
2142
|
+
chatId: string;
|
|
2104
2143
|
flow_name: string;
|
|
2105
2144
|
flow_parameters?: Record<string, string | number>;
|
|
2106
|
-
|
|
2145
|
+
flow_identifier?: string;
|
|
2107
2146
|
}) => string;
|
|
2108
2147
|
getName: (token: string) => string;
|
|
2109
2148
|
destructureFlowToken: (token: string) => {
|
|
@@ -2133,10 +2172,11 @@ declare const createWhatsapp: () => {
|
|
|
2133
2172
|
};
|
|
2134
2173
|
utils: {
|
|
2135
2174
|
flows: {
|
|
2136
|
-
createToken: ({ flow_name, flow_parameters,
|
|
2175
|
+
createToken: ({ chatId, flow_name, flow_parameters, flow_identifier, }: {
|
|
2176
|
+
chatId: string;
|
|
2137
2177
|
flow_name: string;
|
|
2138
2178
|
flow_parameters?: Record<string, string | number>;
|
|
2139
|
-
|
|
2179
|
+
flow_identifier?: string;
|
|
2140
2180
|
}) => string;
|
|
2141
2181
|
getName: (token: string) => string;
|
|
2142
2182
|
destructureFlowToken: (token: string) => {
|
|
@@ -2187,8 +2227,15 @@ declare const createWhatsapp: () => {
|
|
|
2187
2227
|
body: WhatsappRegisterPhoneNumberRequestBody;
|
|
2188
2228
|
}, unknown>;
|
|
2189
2229
|
};
|
|
2230
|
+
media: {
|
|
2231
|
+
fetch: Endpoint<"/{media_id}", "get", {
|
|
2232
|
+
query: {
|
|
2233
|
+
phone_number_id?: string;
|
|
2234
|
+
};
|
|
2235
|
+
}, WhatsappMediaRetrieveRequestResponse>;
|
|
2236
|
+
};
|
|
2190
2237
|
};
|
|
2191
2238
|
};
|
|
2192
2239
|
};
|
|
2193
2240
|
|
|
2194
|
-
export { BCP47LanguageTag, type BaseMessageReceivedEventPayload, type ConversationType, type DataExchangeFlowConfig, type FlowAction, type FlowCanSendMessageStatus, type FlowCategory, type FlowConfig, type FlowData, type FlowMediaData, type FlowMetadata, type FlowParameters, type FlowScreen, type FlowStatus, type FlowUpdateEventPayload, type FlowValidationError, type
|
|
2241
|
+
export { BCP47LanguageTag, type BaseMessageReceivedEventPayload, type ConversationType, type DataExchangeFlowConfig, type FlowAction, type FlowCanSendMessageStatus, type FlowCategory, type FlowConfig, type FlowData, type FlowMediaData, type FlowMetadata, type FlowParameters, type FlowScreen, type FlowStatus, type FlowUpdateEventPayload, type FlowValidationError, type MediaTypes, type MessageField, type MessageReceivedEvent, type MessageReceivedEventPayload, type MessageStatusUpdateEvent, type MetadataObject, type NavigateFlowConfig, type RegisterNumberPayload, type RetrieveMediaPayload, type WaIncomingAudioObject, type WaIncomingButtonObject, type WaIncomingContactObject, type WaIncomingContacts, type WaIncomingContextObject, type WaIncomingDocumentObject, type WaIncomingErrorObject, type WaIncomingErrors, type WaIncomingIdentityObject, type WaIncomingImageObject, type WaIncomingInteractiveObject, type WaIncomingMessageStatus, type WaIncomingMessageStatuses, type WaIncomingMessageType, type WaIncomingMessages, type WaIncomingOrderObject, type WaIncomingReferralObject, type WaIncomingStickerObject, type WaIncomingSystemObject, type WaIncomingTextObject, type WaIncomingVideoObject, type WaInteractiveAction, type WaInteractiveActionType, type WaInteractiveBase, type WaInteractiveBody, type WaInteractiveFooter, type WaInteractiveHeader, type WaMessageType, type WaOutgoingAudioMessage, type WaOutgoingContactsMessage, type WaOutgoingDocumentMessage, type WaOutgoingImageMessage, type WaOutgoingInteractiveMessage, type WaOutgoingLocationMessage, type WaOutgoingMessage, type WaOutgoingReactionMessage, type WaOutgoingStickerMessage, type WaOutgoingTemplateMessage, type WaOutgoingTextMessage, type WaOutgoingVideoMessage, type WaSDKButtonMessage, type WaSDKEvent, type WaSDKEventPayload, type WaSDKEventType, type WaSDKFlowDecryptedWebhookBody, type WaSDKFlowExchangeEventPayload, type WaSDKFlowPayload, type WaSDKGetFlowWebPreviewPageRequestQuery, type WaSDKOutgoingContactMessage, type WaSDKOutgoingFlowMessage, type WaSDKOutgoingListMessage, type WaSDKOutgoingMediaMessage, type WaSDKOutgoingTemplateMessage, type WaSDKOutgoingTextMessage, type WaSDKSendMessageBody, type WaSDKSendMessageConfig, type WaSDKSendMessageData, type WebhookSignatureChallengeArguments, type WhatsappApplicationWebhookBody, type WhatsappCreateFlowRequestBody, type WhatsappCreateFlowResponse, type WhatsappDeleteFlowResponse, WhatsappErrorCode, type WhatsappFlowDecryptedWebhookBody, type WhatsappFlowEncryptedWebhookBody, type WhatsappFlowEncryptionData, type WhatsappFlowErrorMessages, type WhatsappFlowInfo, type WhatsappFlowPingResponse, type WhatsappFlowResponse, type WhatsappFlowUpdateMetadataRequestBody, type WhatsappFlowUpdateMetadataResponse, type WhatsappGetFlowWebPreviewPageRequestQuery, type WhatsappGetFlowWebPreviewURLResponse, type WhatsappGetFlowsRequestQuery, type WhatsappGetFlowsRequestResponse, type WhatsappGetManyFlowsRequestResponse, type WhatsappISOCountryCode, type WhatsappLanguageTag, type WhatsappMediaRetrieveRequestResponse, type WhatsappPublishFlowResponse, type WhatsappRegisterPhoneNumberRequestBody, type WhatsappSDKShowTypingIndicatorParams, type WhatsappSendMessageRequestBody, type WhatsappSendMessageRequestConfig, type WhatsappSendMessageResponse, type WhatsappShowTypingIndicatorRequestBody, type WhatsappShowTypingIndicatorRequestResponse, type WhatsappUpdateFlowJsonRequestBody, type WhatsappUpdateFlowJsonResponse, type WhatsappWabaUploadEncryptionRequestBody, actions, createContactUrl, createWhatsapp, endpoints, flows, flowsEndpoints, mediaEndpoints, messagesEndpoints, parsers, security, toGraphLanguageTag, utils, wabaEndpoints };
|