UNPKG

@go-waitly/waitly-sdk

Version:

Waitly SDK - Your waitlist as code

3 lines 3.31 kB
'use strict';var l=class{constructor(t){this.abortControllers=new Map;if(!t.waitlistId)throw new Error("waitlistId is required");if(!t.apiKey)throw new Error("apiKey is required");this.config={waitlistId:t.waitlistId,apiKey:t.apiKey,apiUrl:t.apiUrl||"https://www.gowaitly.com",timeout:t.timeout||1e4,retryAttempts:t.retryAttempts||3,headers:t.headers||{}};}async createWaitlyEntry(t){if(!t.email)throw new Error("Email is required");if(!this.isValidEmail(t.email))throw new Error("Invalid email format");let e=`/api/waitlists/${this.config.waitlistId}/entries`;try{return await this.request("POST",e,{email:t.email.toLowerCase().trim(),referredByCode:t.referredByCode,utm:t.utm,metadata:t.metadata})}catch(i){throw this.handleError(i)}}async getWaitlyEntriesCount(){let t=`/api/waitlists/${this.config.waitlistId}/count`;try{let e=await this.request("GET",t);return "totalEntries"in e?e.totalEntries:e.count}catch(e){throw this.handleError(e)}}async checkEmailExists(t){if(!this.isValidEmail(t))throw new Error("Invalid email format");let e=`/api/waitlists/${this.config.waitlistId}/check`;try{return (await this.request("POST",e,{email:t.toLowerCase().trim()})).exists}catch(i){throw this.handleError(i)}}cancelAllRequests(){this.abortControllers.forEach(t=>t.abort()),this.abortControllers.clear();}async request(t,e,i){let h=`${this.config.apiUrl}${e}`,a=`${t}-${e}-${Date.now()}`,o=new AbortController;this.abortControllers.set(a,o);let d=setTimeout(()=>{o.abort();},this.config.timeout),c={method:t,headers:{"Content-Type":"application/json","X-API-Key":this.config.apiKey,"X-SDK-Version":"1.0.0","X-Waitlist-ID":this.config.waitlistId,...this.config.headers},signal:o.signal};i&&t!=="GET"&&(c.body=JSON.stringify(i));let n;for(let r=0;r<this.config.retryAttempts;r++)try{let s=await fetch(h,c);if(clearTimeout(d),this.abortControllers.delete(a),!s.ok){let m=await s.json().catch(()=>({message:`HTTP ${s.status}: ${s.statusText}`}));if(s.status>=400&&s.status<500)throw {statusCode:s.status,...m};if(n={statusCode:s.status,...m},r<this.config.retryAttempts-1){await this.delay(Math.pow(2,r)*1e3);continue}}return await s.json()}catch(s){if(clearTimeout(d),this.abortControllers.delete(a),s.name==="AbortError")throw new Error("Request timeout");if(n=s,r<this.config.retryAttempts-1&&!s.statusCode){await this.delay(Math.pow(2,r)*1e3);continue}}throw n}handleError(t){return t.statusCode===400?{code:"VALIDATION_ERROR",message:t.message||"Invalid request data",details:t.details,statusCode:400}:t.statusCode===401?{code:"UNAUTHORIZED",message:"Invalid API key",statusCode:401}:t.statusCode===404?{code:"NOT_FOUND",message:"Waitlist not found",statusCode:404}:t.statusCode===409?{code:"DUPLICATE_ENTRY",message:t.message||"Email already registered",statusCode:409}:t.statusCode===429?{code:"RATE_LIMIT",message:"Too many requests",statusCode:429}:t.message==="Request timeout"?{code:"TIMEOUT",message:"Request timeout",statusCode:0}:{code:"UNKNOWN_ERROR",message:t.message||"An unexpected error occurred",details:t,statusCode:t.statusCode||0}}isValidEmail(t){return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}delay(t){return new Promise(e=>setTimeout(e,t))}};function p(u){return new l(u)} exports.WaitlyClient=l;exports.createWaitlyClient=p;//# sourceMappingURL=index.js.map //# sourceMappingURL=index.js.map