UNPKG

meta-cloud-api

Version:
3 lines 8.85 kB
import {a as a$1,b as b$1}from'./chunk-5O5GLWIE.js';import {a}from'./chunk-VW3LGHTJ.js';import*as m from'crypto';import m__default from'crypto';function A(o){return typeof o=="object"&&o!==null}function h(o){return typeof o=="string"}var v=["data_exchange","INIT","BACK"],W=["data_exchange","INIT"];function P(o){if(!("flow_token"in o&&h(o.flow_token)&&"action"in o))return false;let{action:e,version:t,screen:r,data:n}=o,i=t==="3.0",p=v.includes(e),c=typeof r>"u"||h(r)&&r!=="SUCCESS",u=e==="data_exchange"||A(n);return i&&p&&c&&u}function _(o){if(!("flow_token"in o&&h(o.flow_token)&&"action"in o))return false;let{action:e,screen:t,data:r}=o,n=W.includes(e),i=h(t),p=A(r)&&"error_key"in r&&h(r.error)&&"error_message"in r&&h(r.error_message);return n&&i&&p}function S(o){return "action"in o&&o.action==="ping"}var C="WEBHOOK_UTILS",s=new a(C,process.env.DEBUG==="true");async function M(o,e,t){try{s.info("Processing webhook messages request");let r=await o.json();if(s.info("Webhook request body:",r),r.object!=="whatsapp_business_account"){let i="Received webhook for non-WhatsApp event";return s.warn(i,{body:r}),new Response(JSON.stringify({error:i}),{status:404})}let n=[];for(let i of r.entry)try{s.info("Processing webhook entry:",{entryId:i.id});let p=i.changes;for(let c of p)c.field==="messages"&&(s.info("Processing messages change:",{change:c}),await B(i.id,c.value,e,t));}catch(p){let c=`Error processing webhook: ${p}`;s.error(c,{entry:i,error:p}),n.push(c);}return s.info("Webhook processing complete",{errorCount:n.length}),new Response(n.length>0?JSON.stringify({errors:n}):null,{status:200})}catch(r){return s.error("Error processing webhook:",r),new Response(JSON.stringify({error:"Internal Server Error"}),{status:500})}}async function F(o,e,t,r){try{s.info("Processing flow request");let n=await o.text(),i=o.headers.get("x-hub-signature-256");if(s.info("Flow request signature:",{signature:i}),!T(n,i,e.WEBHOOK_VERIFICATION_TOKEN||""))return s.warn("Invalid request signature",{signature:i}),new Response(JSON.stringify({error:"Unauthorized"}),{status:401});let p=JSON.parse(n);s.info("Flow request data:",p);let{decryptedBody:c}=x(p,e);s.info("Decrypted flow request:",c);let u=r.get("*");if(!u)return s.warn("No handler registered for flow action:",{action:c.action}),new Response(JSON.stringify({error:"Handler not found"}),{status:404});if(S(c))return s.info("Handling flow ping request"),new Response(JSON.stringify({version:"3.0",data:{status:"active"}}),{status:200});if(_(c))return s.warn("Flow error request received:",c),new Response(null,{status:200});if(P(c)){s.info("Processing flow data exchange request");let g=await u(t,c);s.info("Flow handler result:",g);let d=D(g,Buffer.from(p.aes_key,"base64"),Buffer.from(p.initial_vector,"base64"));return s.info("Encrypted flow response generated"),new Response(JSON.stringify(d),{status:200})}return s.warn("Unknown flow request type:",c),new Response(JSON.stringify({error:"Unknown request type"}),{status:400})}catch(n){return s.error("Error handling flow request:",n),new Response(JSON.stringify({error:"Internal server error"}),{status:500})}}function T(o,e,t){if(!e)return s.warn("Missing signature in request"),false;let r=m__default.createHmac("sha256",t).update(o).digest("hex");return s.info("Signature verification:",{received:e.replace("sha256=",""),expected:r}),m__default.timingSafeEqual(Buffer.from(e.replace("sha256=","")),Buffer.from(r))}async function B(o,e,t,r){s.info("Processing messages:",{waba_id:o,value:e});let n=e.metadata,i=e.contacts,p=o,c=n?.display_phone_number||"",u=n?.phone_number_id||"",g=i?.[0]?.profile?.name||"";if(e.statuses&&e.statuses.length>0){s.info("Processing statuses:",{statusCount:e.statuses.length});let d=e.statuses;for(let a of d){let l={wabaId:p,id:a.id,from:a.recipient_id,timestamp:a.timestamp,type:"statuses",phoneNumberId:u,displayPhoneNumber:c,profileName:g,statuses:e.statuses[0],originalData:a};s.info("Processing status:",l),await E(r.messageHandlers.get("statuses"),t,l,"statuses");}return}if(e.messages&&e.messages.length>0){s.info("Processing messages:",{messageCount:e.messages.length});let d=e.messages;for(let a of d){let l=a.type;s.info("Processing message:",{messageType:l,messageId:a.id});let f={wabaId:p,id:a.id,from:a.from,timestamp:a.timestamp,type:a.type,phoneNumberId:u,displayPhoneNumber:c,profileName:g,originalData:a};switch(l){case "text":f.text=a.text;break;case "image":f.image=a.image;break;case "video":f.video=a.video;break;case "audio":f.audio=a.audio;break;case "document":f.document=a.document;break;case "sticker":f.sticker=a.sticker;break;case "location":f.location=a.location;break;case "contacts":f.contacts=a.contacts;break;case "interactive":f.interactive=a.interactive;break;case "button":f.button=a.button;break;case "order":f.order=a.order;break;case "system":f.system=a.system;break;case "reaction":f.reaction=a.reaction;break;default:s.warn("Unknown message type:",{messageType:l});break}s.info("Executing message handlers"),await E(r.preProcessHandler,t,f,"pre-process"),await E(r.messageHandlers.get(l),t,f,l),await E(r.postProcessHandler,t,f,"post-process");}}}async function E(o,e,t,r){if(o)try{s.info("Executing handler:",{handlerType:r,messageId:t.id}),await o(e,t),s.info("Handler execution complete:",{handlerType:r,messageId:t.id});}catch(n){s.error(`Error in ${r} handler:`,{error:n,messageId:t.id});}else s.info("No handler registered:",{handlerType:r});}function x(o,e){s.info("Decrypting flow request");let{encrypted_aes_key:t,encrypted_flow_data:r,initial_vector:n}=o;if(!t||!r||!n)throw s.error("Missing required encryption properties"),new Error("Missing required encryption properties");let i=e.FLOW_API_PRIVATE_PEM.replace(/\\n/g,` `),p=e.FLOW_API_PASSPHRASE,c=m__default.createPrivateKey({key:i,passphrase:p}),u;try{s.info("Decrypting AES key"),u=m__default.privateDecrypt({key:c,padding:m__default.constants.RSA_PKCS1_OAEP_PADDING,oaepHash:"sha256"},Buffer.from(t,"base64"));}catch(I){throw s.error("Failed to decrypt AES key:",I),new Error("Failed to decrypt the request. Please verify your private key.")}let g=Buffer.from(r,"base64"),d=Buffer.from(n,"base64"),l=g.subarray(0,-16),f=g.subarray(-16);s.info("Decrypting flow data");let R=m__default.createDecipheriv("aes-128-gcm",u,d);R.setAuthTag(f);let N=Buffer.concat([R.update(l),R.final()]).toString("utf-8");return s.info("Flow request decryption complete"),{decryptedBody:JSON.parse(N),aesKeyBuffer:u,initialVectorBuffer:d}}function D(o,e,t){s.info("Encrypting flow response");let r=[];for(let n of Array.from(t.entries()))r.push(~n[1]);try{let n=m__default.createCipheriv("aes-128-gcm",e,Buffer.from(r)),i=Buffer.concat([n.update(JSON.stringify(o||{}),"utf-8"),n.final(),n.getAuthTag()]).toString("base64");return s.info("Flow response encryption complete"),i}catch(n){throw s.error("Response encryption error:",n),new Error("Failed to encrypt response. Internal server error.")}}var V="WEBHOOK",y=new a(V,process.env.DEBUG==="true"),b=class{config;client;messageHandlers=new Map;preProcessHandler=void 0;postProcessHandler=void 0;flowHandlers=new Map;constructor(e){this.config=a$1(e),this.client=new b$1(e),y.log("WebhookHandler instantiated!");}async handleWebhook(e){try{if(e.method==="GET"){let t=new URL(e.url),r=t.searchParams.get("hub.mode"),n=t.searchParams.get("hub.verify_token"),i=t.searchParams.get("hub.challenge");return r==="subscribe"&&n===this.config.WEBHOOK_VERIFICATION_TOKEN?new Response(i,{status:200}):new Response(null,{status:403})}return e.method==="POST"?M(e,this.client,{messageHandlers:this.messageHandlers,preProcessHandler:this.preProcessHandler,postProcessHandler:this.postProcessHandler}):new Response(null,{status:405})}catch(t){return y.log(`Error handling webhook: ${t}`),new Response(JSON.stringify({error:"Internal Server Error"}),{status:500})}}async handleFlow(e){try{return F(e,this.config,this.client,this.flowHandlers)}catch(t){return y.log(`Error handling flow: ${t}`),new Response(JSON.stringify({error:"Internal Server Error"}),{status:500})}}verifySignature(e,t){if(!t)return false;let r=m__default.createHmac("sha256",this.config.WEBHOOK_VERIFICATION_TOKEN).update(e).digest("hex");return m__default.timingSafeEqual(Buffer.from(t.replace("sha256=","")),Buffer.from(r))}onMessage(e,t){this.messageHandlers.set(e,t),y.log(`Registered message handler for ${e}`);}onMessagePreProcess(e){this.preProcessHandler=e,y.log("Registered pre-process handler");}onMessagePostProcess(e){this.postProcessHandler=e,y.log("Registered post-process handler");}onFlow(e,t){this.flowHandlers.set(e,t),y.log(`Registered flow handler for ${e}`);}};var ae=(o,e)=>m.createHmac("sha256",e).update(o,"utf-8").digest("hex");export{P as a,_ as b,S as c,M as d,F as e,b as f,ae as g};//# sourceMappingURL=chunk-JGX3AVD7.js.map //# sourceMappingURL=chunk-JGX3AVD7.js.map