UNPKG

meta-cloud-api

Version:
14 lines (11 loc) 15 kB
import{inspect as e}from"node:util";import t from"node:crypto";function n(e){if(!e)return``;let t=``;return t=Array.isArray(e)?e.join(`,`):typeof e==`string`?e:Object.entries(e).filter(([e,t])=>t).map(([e])=>e).join(`,`),t?`?fields=${t}`:``}function r(e){let t=[[`App ID`,e.M4D_APP_ID||`Not Set`],[`Phone Number ID`,e.WA_PHONE_NUMBER_ID?.toString()||`Not Set`],[`Business Account ID`,e.WA_BUSINESS_ACCOUNT_ID||`Not Set`],[`API Version`,e.CLOUD_API_VERSION||`Not Set`],[`Access Token`,e.CLOUD_API_ACCESS_TOKEN?`${e.CLOUD_API_ACCESS_TOKEN.substring(0,20)}...`:`Not Set`],[`Webhook Endpoint`,e.WEBHOOK_ENDPOINT||`Not Set`],[`Webhook Verification Token`,e.WEBHOOK_VERIFICATION_TOKEN?`${e.WEBHOOK_VERIFICATION_TOKEN.substring(0,10)}...`:`Not Set`],[`Listener Port`,e.LISTENER_PORT?.toString()||`Not Set`],[`Debug Mode`,e.DEBUG?`Enabled`:`Disabled`],[`Max Retries`,e.MAX_RETRIES_AFTER_WAIT?.toString()||`Not Set`],[`Request Timeout`,e.REQUEST_TIMEOUT?`${e.REQUEST_TIMEOUT}ms`:`Not Set`],[`Private PEM`,e.FLOW_API_PRIVATE_PEM?`Configured`:`Not Set`],[`Passphrase`,e.FLOW_API_PASSPHRASE?`Configured`:`Not Set`]],n=Math.max(...t.map(([e])=>e?.length||0)),r=Math.max(...t.map(([,e])=>e?.length||0)),i=Math.max(n,20),a=Math.max(r,30),o=`┌${`─`.repeat(i+2)}${`─`.repeat(a+2)}┐`,s=`├${`─`.repeat(i+2)}${`─`.repeat(a+2)}┤`,c=`└${`─`.repeat(i+2)}${`─`.repeat(a+2)}┘`;return[o,`│ ${`Configuration`.padEnd(i)}${`Value`.padEnd(a)} │`,s,...t.map(([e,t])=>`│ ${e?.padEnd(i)}${t?.padEnd(a)} │`),c].join(` `)}const i=[0,1,2,3,4,10,33,100,190,200,299,368,613,80007,130429,130472,130497,131e3,131005,131008,131009,131016,131020,131021,131026,131030,131031,131037,131041,131042,131044,131045,131047,131048,131049,131050,131051,131052,131053,131055,131056,131057,131059,131201,131202,131203,131204,131207,131208,131209,131210,131211,131212,131213,131214,131215,132e3,132001,132005,132007,132008,132012,132015,132016,132068,132069,133e3,133004,133005,133006,133008,133009,133010,133015,133016,134011,134100,134101,134102,135e3,137e3,138e3,138001,138002,138003,138004,138005,138006,138007,138009,138012,138013,138018,139e3,139001,139002,139003,139004,139100,139101,139102,139103,200005,200006,200007,1752041,2388001,2388012,2388019,2388040,2388047,2388072,2388073,2388091,2388093,2388103,2388293,2388299,2494100,2593079,2593085,2593107,2593108],a=new Set(i),o=[0,3,10,190],s=[4,80007,130429,131048,131056],c=[368,130497,131031],l=[130472,131e3,131005,131008,131009,131016,131021,131026,131030,131042,131044,131045,131047,131050,131051,131052,131053,131056,131057,131048,132e3,132001,132005,132007,132008,132012,132015,132016,132068,132069,135e3,137e3],u=[139e3,139001,139002,139003,139004],d=[139100,139101,139102,139103],f=[138e3,138001,138002,138003,138004,138005,138006,138007,138009,138012,138013,138018,613],p=[131020,131041,131059,131201,131202,131203,131204,131207,131208,131209,131210,131211,131212,131213,131214,131215],m=new Set(o),h=new Set(s),g=new Set(c),_=new Set(l),ee=new Set(u),te=new Set(d),ne=new Set(f),v=new Set(p);function y(e){return b(e)?!0:a.has(e)}function b(e){return e>=200&&e<300}function x(e){return b(e)||m.has(e)}function S(e){return h.has(e)}function C(e){return g.has(e)}function w(e){return _.has(e)}function T(e){return ee.has(e)}function E(e){return te.has(e)}function D(e){return ne.has(e)}function O(e){return v.has(e)}var k=class extends Error{constructor(e){super(e),this.name=`WhatsAppError`}},A=class extends k{error;statusCode;constructor(e,t,n){super(e),this.name=`WhatsAppApiError`,this.error=t,this.statusCode=n}},j=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppAuthorizationError`}},M=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppThrottlingError`}},N=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppIntegrityError`}},P=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppSendMessageError`}},F=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppFlowError`}},I=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppBlockUserError`}},L=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppCallingError`}},R=class extends A{constructor(e,t,n){super(e,t,n),this.name=`WhatsAppGroupError`}};function z(e,t){let n=e.code;return x(n)?new j(e.message,e,t):S(n)?new M(e.message,e,t):C(n)?new N(e.message,e,t):w(n)?new P(e.message,e,t):T(n)?new F(e.message,e,t):E(n)?new I(e.message,e,t):D(n)?new L(e.message,e,t):O(n)?new R(e.message,e,t):new A(e.message,e,t)}var re=class extends k{cause;constructor(e,t){super(e),this.name=`WhatsAppNetworkError`,this.cause=t}},B=class extends k{cause;constructor(e,t){super(e),this.name=`WhatsAppUnknownError`,this.cause=t}},V=class extends Error{constructor(e){super(e),this.name=`WhatsAppValidationError`}};function H(e){if(typeof e!=`object`||!e||!(`error`in e)||typeof e.error!=`object`||e.error==null)return!1;let t=e.error;if(typeof t.message!=`string`||typeof t.type!=`string`||typeof t.code!=`number`||typeof t.fbtrace_id!=`string`)return!1;if(`error_data`in t&&t.error_data!=null){if(typeof t.error_data!=`object`)return!1;let e=t.error_data;if(`messaging_product`in e&&e.messaging_product!==`whatsapp`||`details`in e&&typeof e.details!=`string`)return!1}return!(`error_subcode`in t&&typeof t.error_subcode!=`number`)}function U(e){return H(e)&&y(e.error.code)}function W(e){return e instanceof j}function G(e){return e instanceof M}function K(e){return e instanceof N}function q(e){return e instanceof P}function J(e){return e instanceof F}function Y(e){return e instanceof I}function ie(e){return e instanceof L}function ae(e){return e instanceof R}function oe(e,t){if(H(e))return e;let n=`Unknown error occurred`;if(e&&typeof e==`object`&&`message`in e){let t=e.message;typeof t==`string`&&(n=t)}return{name:`MetaError`,message:n,error:{message:n,type:`UnknownError`,code:typeof t==`number`?t:500,fbtrace_id:``}}}var X=class{name;debug;constructor(e,t=!1){this.name=e,this.debug=t}formatData(t){return t.map(t=>typeof t==`object`?e(t,{depth:null,colors:!0}):t).join(` `)}log(...e){if(this.debug){let t=`[ ${Date.now()} ]`;this.name&&(t+=` - ${this.name}`),console.log(t,`: `,this.formatData(e))}}error(...e){let t=`[ ${Date.now()} ] - ERROR`;this.name&&(t+=` - ${this.name}`),console.error(t,`: `,this.formatData(e))}warn(...e){if(this.debug){let t=`[ ${Date.now()} ] - WARN`;this.name&&(t+=` - ${this.name}`),console.warn(t,`: `,this.formatData(e))}}info(...e){if(this.debug){let t=`[ ${Date.now()} ] - INFO`;this.name&&(t+=` - ${this.name}`),console.info(t,`: `,this.formatData(e))}}};const se=e=>{if(!e||Object.keys(e).length===0)return``;let t=[];for(let[n,r]of Object.entries(e))if(r!==void 0){let e=encodeURIComponent(n),i=encodeURIComponent(String(r));t.push(`${e}=${i}`)}return t.length>0?`?${t.join(`&`)}`:``},Z=new X(`FLOW_ENCRYPTION_UTILS`,process.env.DEBUG===`true`);function ce(){if(!t||typeof t.generateKeyPairSync!=`function`){let e=Error(`This utility requires Node.js environment with crypto module. It cannot be used in browser or edge runtime environments.`);throw Z.error(`Environment validation failed:`,e),e}if(typeof window<`u`){let e=Error(`This utility cannot run in a browser environment. Please use it in a Node.js server environment only.`);throw Z.error(`Browser environment detected:`,e),e}if(process.versions?.node){let e=process.versions.node.split(`.`).map(Number),t=e[0]??0,n=e[1]??0;if(t<10||t===10&&n<12){let e=Error(`Node.js version ${process.versions.node} is not supported. Please upgrade to Node.js 10.12.0 or higher.`);throw Z.error(`Node.js version check failed:`,e),e}}}function le(e){Z.info(`[generateEncryption] Starting key pair generation`),ce();let n=e||process.env.FLOW_API_PASSPHRASE;if(!n||n.trim().length===0){let e=Error(`Passphrase is empty. Please provide a passphrase as parameter or set FLOW_API_PASSPHRASE environment variable.`);throw Z.error(`[generateEncryption] Passphrase validation failed:`,e),e}n.length<8&&Z.warn(`[generateEncryption] Passphrase is shorter than 8 characters. Consider using a longer passphrase for better security.`);try{Z.info(`[generateEncryption] Generating 2048-bit RSA key pair`);let e=t.generateKeyPairSync(`rsa`,{modulusLength:2048,publicKeyEncoding:{type:`spki`,format:`pem`},privateKeyEncoding:{type:`pkcs8`,format:`pem`,cipher:`aes-256-cbc`,passphrase:n}});return Z.info(`[generateEncryption] Key pair generated successfully`),{passphrase:n,privateKey:e.privateKey,publicKey:e.publicKey}}catch(e){let t=e instanceof Error?e.message:String(e),n=Error(`Failed to generate key pair: ${t}`);throw Z.error(`[generateEncryption] Key generation failed:`,n),n}}function ue(e,n){if(Z.info(`[decryptFlowRequest] Starting Flow request decryption`),!n.FLOW_API_PRIVATE_PEM||n.FLOW_API_PRIVATE_PEM.trim()===``){let e=Error(`Missing FLOW_API_PRIVATE_PEM. Please set the FLOW_API_PRIVATE_PEM environment variable or pass privatePem via config.`);throw Z.error(`[decryptFlowRequest] Configuration error:`,e),e}if(!n.FLOW_API_PASSPHRASE||n.FLOW_API_PASSPHRASE.trim()===``){let e=Error(`Missing FLOW_API_PASSPHRASE. Please set the FLOW_API_PASSPHRASE environment variable or pass passphrase via config.`);throw Z.error(`[decryptFlowRequest] Configuration error:`,e),e}Z.info(`[decryptFlowRequest] Configuration validated`);let{encrypted_aes_key:r,encrypted_flow_data:i,initial_vector:a}=e;if(!r||!i||!a)throw Z.error(`[decryptFlowRequest] Missing required encryption properties in request body`),Error(`Missing required encryption properties`);Z.info(`[decryptFlowRequest] Request body validated`);let o=n.FLOW_API_PRIVATE_PEM;o.includes(`\\n`)&&(o=o.replace(/\\n/g,` `));let s=n.FLOW_API_PASSPHRASE,c=o.includes(`-----BEGIN RSA PRIVATE KEY-----`),l=o.includes(`-----BEGIN PRIVATE KEY-----`)||o.includes(`-----BEGIN ENCRYPTED PRIVATE KEY-----`);Z.info(`[decryptFlowRequest] Loading private key`,{format:l?`PKCS#8`:c?`PKCS#1`:`Unknown`});let u;try{u=s?t.createPrivateKey({key:o,format:`pem`,passphrase:s}):t.createPrivateKey(o),Z.info(`[decryptFlowRequest] Private key loaded successfully`)}catch(e){if(Z.error(`[decryptFlowRequest] Failed to load private key (first attempt):`,{error:e instanceof Error?e.message:e,hasPassphrase:!!s,format:l?`PKCS#8`:c?`PKCS#1`:`Unknown`}),c&&s)try{Z.info(`[decryptFlowRequest] Attempting to convert PKCS#1 to PKCS#8 format`);let e=t.createPrivateKey({key:o,format:`pem`,passphrase:s}).export({type:`pkcs8`,format:`pem`,cipher:`aes-256-cbc`,passphrase:s});u=t.createPrivateKey({key:e,format:`pem`,passphrase:s}),Z.info(`[decryptFlowRequest] Successfully converted PKCS#1 to PKCS#8 and loaded private key`)}catch(t){Z.error(`[decryptFlowRequest] Failed to convert PKCS#1 to PKCS#8:`,{error:t instanceof Error?t.message:t});let n=`Failed to parse private key. Error: ${e instanceof Error?e.message:e}`;throw n+=` Your key is in PKCS#1 format with unsupported encryption (DES-EDE3-CBC).`,n+=` Please convert it to PKCS#8 format using:`,n+=` openssl pkcs8 -topk8 -inform PEM -outform PEM -in old_key.pem -out new_key.pem`,Error(n)}else{let t=`Failed to parse private key. Error: ${e instanceof Error?e.message:e}`;throw c?(t+=` Your key is in PKCS#1 format (-----BEGIN RSA PRIVATE KEY-----).`,t+=` Please convert it to PKCS#8 format using:`,t+=` openssl pkcs8 -topk8 -inform PEM -outform PEM -in old_key.pem -out new_key.pem`):l||(t+=` Your key format is not recognized. Please ensure it is in PKCS#8 format.`),Error(t)}}let d;try{Z.info(`[decryptFlowRequest] Decrypting AES key with RSA private key`),d=t.privateDecrypt({key:u,padding:t.constants.RSA_PKCS1_OAEP_PADDING,oaepHash:`sha256`},Buffer.from(r,`base64`)),Z.info(`[decryptFlowRequest] AES key decrypted successfully`)}catch(e){throw Z.error(`[decryptFlowRequest] Failed to decrypt AES key:`,e),Error(`Failed to decrypt the request. Please verify your private key.`)}let f=Buffer.from(i,`base64`),p=Buffer.from(a,`base64`),m=f.subarray(0,-16),h=f.subarray(-16);Z.info(`[decryptFlowRequest] Decrypting flow data with AES-128-GCM`);let g=t.createDecipheriv(`aes-128-gcm`,d,p);g.setAuthTag(h);let _=Buffer.concat([g.update(m),g.final()]).toString(`utf-8`);return Z.info(`[decryptFlowRequest] Flow request decrypted successfully`),{decryptedBody:JSON.parse(_),aesKeyBuffer:d,initialVectorBuffer:p}}function de(e,n,r){Z.info(`[encryptFlowResponse] Starting Flow response encryption`);let i=[];for(let e of Array.from(r.entries()))i.push(~e[1]);try{Z.info(`[encryptFlowResponse] Encrypting response with AES-128-GCM`);let r=t.createCipheriv(`aes-128-gcm`,n,Buffer.from(i)),a=Buffer.concat([r.update(JSON.stringify(e||{}),`utf-8`),r.final(),r.getAuthTag()]).toString(`base64`);return Z.info(`[encryptFlowResponse] Flow response encrypted successfully`),a}catch(e){throw Z.error(`[encryptFlowResponse] Response encryption failed:`,e),Error(`Failed to encrypt response. Internal server error.`)}}function Q(e){return typeof e==`object`&&!!e}function $(e){return typeof e==`string`}const fe=[`data_exchange`,`INIT`,`BACK`],pe=[`data_exchange`,`INIT`];function me(e){if(!(`flow_token`in e&&$(e.flow_token)&&`action`in e))return!1;let{action:t,version:n,screen:r,data:i}=e,a=n===`3.0`,o=fe.includes(t),s=r===void 0||$(r)&&r!==`SUCCESS`,c=t===`data_exchange`||Q(i);return a&&o&&s&&c}function he(e){if(!(`flow_token`in e&&$(e.flow_token)&&`action`in e))return!1;let{action:t,screen:n,data:r}=e,i=pe.includes(t),a=$(n),o=Q(r)&&`error_key`in r&&$(r.error)&&`error_message`in r&&$(r.error_message);return i&&a&&o}function ge(e){return`action`in e&&e.action===`ping`}export{o as AUTHORIZATION_ERROR_CODES,d as BLOCK_USER_ERROR_CODES,f as CALLING_ERROR_CODES,u as FLOW_ERROR_CODES,p as GROUP_ERROR_CODES,c as INTEGRITY_ERROR_CODES,X as Logger,l as SEND_MESSAGE_ERROR_CODES,s as THROTTLING_ERROR_CODES,i as WHATSAPP_ERROR_CODES,A as WhatsAppApiError,j as WhatsAppAuthorizationError,I as WhatsAppBlockUserError,L as WhatsAppCallingError,k as WhatsAppError,F as WhatsAppFlowError,R as WhatsAppGroupError,N as WhatsAppIntegrityError,re as WhatsAppNetworkError,P as WhatsAppSendMessageError,M as WhatsAppThrottlingError,B as WhatsAppUnknownError,V as WhatsAppValidationError,n as buildFieldsQueryString,z as createWhatsAppApiError,ue as decryptFlowRequest,de as encryptFlowResponse,r as formatConfigTable,le as generateEncryption,b as isApiPermissionErrorCode,x as isAuthorizationErrorCode,E as isBlockUserErrorCode,D as isCallingErrorCode,me as isFlowDataExchangeRequest,T as isFlowErrorCode,he as isFlowErrorRequest,ge as isFlowPingRequest,O as isGroupErrorCode,C as isIntegrityErrorCode,H as isMetaError,w as isSendMessageErrorCode,S as isThrottlingErrorCode,U as isWhatsAppApiErrorResponse,W as isWhatsAppAuthorizationError,Y as isWhatsAppBlockUserError,ie as isWhatsAppCallingError,y as isWhatsAppErrorCode,J as isWhatsAppFlowError,ae as isWhatsAppGroupError,K as isWhatsAppIntegrityError,q as isWhatsAppSendMessageError,G as isWhatsAppThrottlingError,oe as normalizeMetaError,se as objectToQueryString}; //# sourceMappingURL=index.js.map