@great-detail/whatsapp
Version:
SDK for interfacing with WhatsApp Business Platform in Typescript or Node.js using the Cloud API, hosted by Meta.
3 lines (2 loc) • 8.02 kB
JavaScript
;var G=Object.create;var U=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var V=(o,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of j(e))!H.call(o,r)&&r!==t&&U(o,r,{get:()=>e[r],enumerable:!(s=K(e,r))||s.enumerable});return o};var u=(o,e,t)=>(t=o!=null?G(F(o)):{},V(e||!o||!o.__esModule?U(t,"default",{value:o,enumerable:!0}):t,o));var w=require("commander"),B=u(require("get-stdin"),1);var C=u(require("ky"),1),f=class{constructor(e){this._request=e}getEndpoint(e){return encodeURIComponent(e)+"/whatsapp_business_profile"}getBusinessProfile({phoneNumberID:e,fields:t,request:s}){return C.default.create({...this._request,method:"GET",searchParams:{fields:Object.keys(t??{}).join(",")}})(this.getEndpoint(e),s)}updateBusinessProfile({phoneNumberID:e,request:t,...s}){return C.default.create({...this._request,method:"POST",json:{messaging_product:"whatsapp",...s}})(this.getEndpoint(e),t)}};var g=u(require("ky"),1),O=class{constructor(e){this._request=e}getEndpoint(e){return encodeURIComponent(e)+"/media"}upload({phoneNumberID:e,file:t,filename:s,mimeType:r,request:l}){let n=new FormData;return n.set("messaging_product","whatsapp"),n.set("file",t,s),n.set("type",r),g.default.create({...this._request,method:"POST",body:n})(this.getEndpoint(e),l)}getURL({mediaID:e,phoneNumberID:t,request:s}){return g.default.create({...this._request,method:"GET",headers:{"Content-Type":"application/json"},searchParams:{...t?{phone_number_id:t}:{}}})(encodeURIComponent(e),s)}delete({mediaID:e,phoneNumberID:t,request:s}){return g.default.create({...this._request,method:"DELETE",headers:{"Content-Type":"application/json"},searchParams:{...t?{phone_number_id:t}:{}}})(encodeURIComponent(e),s)}download({mediaURL:e,request:t}){return g.default.create({method:"GET",headers:{"User-Agent":"node",Host:"lookaside.fbsbx.com"}})(e,t)}};var x=u(require("ky"),1),P=class{constructor(e){this._request=e}getEndpoint(e){return encodeURIComponent(e)+"/messages"}createStatus({phoneNumberID:e,request:t,...s}){return x.default.create({...this._request,method:"POST",json:{messaging_product:"whatsapp",...s}})(this.getEndpoint(e),t)}createMessage({to:e,phoneNumberID:t,context:s,recipientType:r="individual",request:l,...n}){return x.default.create({...this._request,method:"POST",json:{messaging_product:"whatsapp",recipient_type:r,context:s,to:e,...n}})(this.getEndpoint(t),l)}};var D=u(require("ky"),1),y=class{constructor(e){this._request=e}getEndpoint(e){return encodeURIComponent(e)+"/phone_numbers"}getPhoneNumber({phoneNumberID:e,fields:t,request:s}){return D.default.create({...this._request,method:"GET",searchParams:{fields:Object.keys(t??{}).join(",")}})(encodeURIComponent(e),s)}listPhoneNumbers({businessAccountID:e,sort:t,filtering:s,request:r}){return D.default.create({...this._request,method:"GET",searchParams:{...t?{sort:t}:{},...s?{filtering:s}:{}}})(this.getEndpoint(e),r)}};var R=u(require("ky"),1),E=class{constructor(e){this._request=e}getEndpoint(e){return encodeURIComponent(e)+"/subscribed_apps"}createSubscription({businessAccountID:e,request:t}){return R.default.create({...this._request,method:"POST"})(this.getEndpoint(e),t)}listSubscriptions({businessAccountID:e,request:t}){return R.default.create({...this._request,method:"GET"})(this.getEndpoint(e),t)}};var v=require("crypto");var i=class extends Error{};var a=class extends i{};var d=class extends i{};var c=class extends i{};var p=class extends i{};var m=class extends i{};var h=class extends i{};var _=class{errors={WebhookError:i,IncorrectMethodWebhookError:a,InvalidHubChallengeWebhookError:d,InvalidHubModeWebhookError:c,InvalidHubSignatureWebhookError:p,InvalidHubVerifyTokenWebhookError:m,MissingBodyWebhookError:h};async register(e){if(e.method.toLowerCase()!=="get")throw new a("Webhook Registration Requests must use the GET request method.");let t=e.query["hub.mode"]??void 0;if(!t||t!=="subscribe")throw new c("Webhook Registration Request must have query parameter: hub.mode=subscribe");let s=e.query["hub.challenge"]??void 0;if(!s)throw new d("Webhook Registration Request must have query parameter: hub.challenge");let r=e.query["hub.verify_token"]??void 0;if(!r)throw new m("Webhook Registration Request must have query parameter: hub.verify_token");return{verifyToken:r,challenge:s,accept:()=>s,reject:()=>{}}}async eventNotification(e){if(e.method.toLowerCase()!=="post")throw new a("Webhook Event Notification Request must use the POST request method.");let t=e.headers["x-hub-signature"]?.toString().replace("sha1=",""),s=e.headers["x-hub-signature-256"]?.toString().replace("sha256=","");if(!s)throw new p("Webhook Event Notification Request must have header: x-hub-signature-256");if(!e.body)throw new h("Webhook Event Notification Request must have a body");let r=e.body,l=JSON.parse(r),n=b=>q=>(0,v.createHmac)(b,q).update(r,"utf8").digest("hex"),M=(b,q)=>{let T=n(b);return W=>{let L=T(W);return q===L}};return{eventNotification:l,signature:{sha1:{value:t,getCalculatedSignature:n("sha1"),check:M("sha1",t)},sha256:{value:s,getCalculatedSignature:n("sha256"),check:M("sha256",s)}},checkSignature:M("sha256",s),verifySignature(b){if(!this.checkSignature(b))throw new p("Webhook Event Notification Signature doesn't match received body")},accept:()=>{}}}};var N=class{_request;businessProfile;message;phoneNumbers;subscribedApps;media;webhook;constructor({prefixUrl:e="https://graph.facebook.com",graphVersion:t="v20.0"}={}){this._request={prefixUrl:e.replace(/\/$/,"")+"/"+t},this.businessProfile=new f(this._request),this.message=new P(this._request),this.phoneNumbers=new y(this._request),this.subscribedApps=new E(this._request),this.media=new O(this._request),this.webhook=new _}};var k=process.env.WHATSAPP_ACCESS_TOKEN,A=process.env.WHATSAPP_PHONE_NUMBER_ID,S=new N;w.program.name("whatsapp").description("WhatsApp SDK CLI");var I=w.program.command("media").description("Media");I.command("download").description("Download Media").argument("<MEDIA_URL>","Media URL").requiredOption("--access-token <ACCESS_TOKEN>","WhatsApp Access Token",k).action(async o=>{let t=await(await S.media.download(o)).arrayBuffer(),s=Buffer.from(t);process.stdout.write(s)});I.command("delete").description("Delete Media").argument("<MEDIA_ID>","Media ID").option("--phone-number-id <PHONE_NUMBER_ID>","From Phone Number ID",A).requiredOption("--access-token <ACCESS_TOKEN>","WhatsApp Access Token",k).action(async(o,e)=>{let t=await S.media.delete({mediaID:o,phoneNumberID:e.phoneNumberId});console.log(await t.json())});I.command("get-url").description("Get Media URL").argument("<MEDIA_ID>","Media ID").option("--phone-number-id <PHONE_NUMBER_ID>","From Phone Number ID",A).requiredOption("--access-token <ACCESS_TOKEN>","WhatsApp Access Token",k).action(async(o,e)=>{let t=await S.media.getURL({mediaID:o,phoneNumberID:e.phoneNumberId});console.log(await t.json())});I.command("upload").description("Upload Media").option("--filename <FILENAME>","Filename").requiredOption("--mime-type <MIME_TYPE>","MIME Type").requiredOption("--phone-number-id <PHONE_NUMBER_ID>","From Phone Number ID",A).requiredOption("--access-token <ACCESS_TOKEN>","WhatsApp Access Token",k).action(async o=>{let e=await B.default.buffer(),t=new Blob([e],{type:o.mimeType}),s=await S.media.upload({file:t,phoneNumberID:o.phoneNumberId,mimeType:o.mimeType,filename:o.filename});console.log(await s.json())});var Y=w.program.command("message").description("Message");Y.command("text").description("Send a Text message").argument("<RECIPIENT>","Message recipient Phone Number or Phone Number ID").requiredOption("--body <BODY>","Message body").option("--preview-url","Enable URL previewing for the message").action(async(o,e)=>{let t=await S.message.createMessage({to:o,phoneNumberID:e.phoneNumberId,type:"text",text:{body:e.body,preview_url:e.previewUrl}});console.log(await t.json())});w.program.parseAsync();