UNPKG

@feedinbox/sdk

Version:

Secure TypeScript SDK for FeedInbox - API client for feedback collection and user engagement

3 lines 11.5 kB
/* FeedInbox SDK v1.0.0 - (c) FeedInbox - MIT License */ "use strict";var c=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var y=(a,e,i)=>e in a?c(a,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):a[e]=i;var h=(a,e)=>{for(var i in e)c(a,i,{get:e[i],enumerable:!0})},S=(a,e,i,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of w(e))!v.call(a,t)&&t!==i&&c(a,t,{get:()=>e[t],enumerable:!(s=b(e,t))||s.enumerable});return a};var P=a=>S(c({},"__esModule",{value:!0}),a);var o=(a,e,i)=>y(a,typeof e!="symbol"?e+"":e,i);var E={};h(E,{FeedInboxSDK:()=>d,default:()=>R});module.exports=P(E);var r=class{static validateApiKey(e){return!(!e||typeof e!="string"||!e.startsWith("fb_")||e.length<10)}static validateEmail(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}static sanitizeString(e){return typeof e!="string"?"":e.trim().slice(0,1e4)}static validateUrl(e){try{let i=new URL(e);return["http:","https:"].includes(i.protocol)}catch{return!1}}},l=class{constructor(e=100,i=6e4){o(this,"requests",[]);o(this,"maxRequests");o(this,"timeWindow");this.maxRequests=e,this.timeWindow=i}canMakeRequest(){let e=Date.now();return this.requests=this.requests.filter(i=>e-i<this.timeWindow),this.requests.length>=this.maxRequests?!1:(this.requests.push(e),!0)}},d=class{constructor(e={}){o(this,"apiKey");o(this,"apiUrl");o(this,"timeout");o(this,"retries");o(this,"rateLimiter");o(this,"headers");let i=e.apiKey||this.getApiKeyFromEnv();if(!i)throw new Error("API key is required. Provide it in config or set FEEDINBOX_API_KEY environment variable");if(!r.validateApiKey(i))throw new Error('Invalid API key format. Must start with "fb_" and be at least 10 characters');if(this.apiKey=i,this.apiUrl=e.customBackendUrl||e.apiUrl||this.getDefaultApiUrl(),this.timeout=e.timeout||1e4,this.retries=e.retries||2,this.rateLimiter=new l,!r.validateUrl(this.apiUrl))throw new Error("Invalid API URL provided");this.headers={"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"User-Agent":"FeedInbox-SDK/1.0.0","X-SDK-Version":"1.0.0",Origin:typeof window<"u"?window.location.origin:"http://localhost:3000"}}getApiKeyFromEnv(){if(typeof process<"u"&&process.env)return process.env.FEEDINBOX_API_KEY;if(typeof window<"u"&&window.FEEDINBOX_API_KEY)return window.FEEDINBOX_API_KEY}getDefaultApiUrl(){if(typeof window<"u"){let e=window.location.protocol,i=window.location.hostname;return`${e}//${i}${i==="localhost"?":3103":""}`}return process.env.FEEDINBOX_API_URL||"http://localhost:3103"}async makeRequest(e,i="GET",s,t=1){if(!this.rateLimiter.canMakeRequest())return{success:!1,error:"Rate limit exceeded. Please try again later."};let n=`${this.apiUrl}${e}`,p=new AbortController,m=setTimeout(()=>p.abort(),this.timeout),f={method:i,headers:this.headers,signal:p.signal};s&&["POST","PUT","DELETE","PATCH"].includes(i)&&(f.body=JSON.stringify(s));try{let u=await fetch(n,f);clearTimeout(m);let g=await u.json();return u.ok?g:t<this.retries&&(u.status>=500||u.status===429)?(await this.delay(Math.pow(2,t)*1e3),this.makeRequest(e,i,s,t+1)):{success:!1,error:g.error||`HTTP error! status: ${u.status}`}}catch(u){return clearTimeout(m),t<this.retries?(await this.delay(Math.pow(2,t)*1e3),this.makeRequest(e,i,s,t+1)):{success:!1,error:u instanceof Error?u.message:"Network error"}}}delay(e){return new Promise(i=>setTimeout(i,e))}async createFeedback(e){if(!e.userEmail||!e.message)return{success:!1,error:"userEmail and message are required"};if(!r.validateEmail(e.userEmail))return{success:!1,error:"Invalid email format"};console.log("feedback",e);let i={email:r.sanitizeString(e.userEmail),message:r.sanitizeString(e.message),subject:e.subject?r.sanitizeString(e.subject):"Widget Feedback",priority:e.priority||"medium",workspace_id:e.workspaceId,page_url:typeof window<"u"?window.location.href:void 0,user_agent:typeof navigator<"u"?navigator.userAgent:void 0,metadata:e.metadata,timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/feedback","POST",i)}async getFeedback(e){let i=new URLSearchParams;if(e?.userEmail){if(!r.validateEmail(e.userEmail))return{success:!1,error:"Invalid email format"};i.append("user_email",r.sanitizeString(e.userEmail))}e?.limit&&i.append("limit",e.limit.toString()),e?.page&&i.append("page",e.page.toString()),e?.status&&i.append("status",e.status);let s=i.toString(),t=`/api/widget/v1/feedback${s?`?${s}`:""}`;return this.makeRequest(t,"GET")}async updateFeedback(e,i){if(!e)return{success:!1,error:"feedbackId is required"};let s={feedback_id:r.sanitizeString(e),...i,timestamp:new Date().toISOString()};return this.makeRequest(`/api/widget/v1/feedback/${e}`,"PUT",s)}async deleteFeedback(e){return e?this.makeRequest(`/api/widget/v1/feedback/${e}`,"DELETE"):{success:!1,error:"feedbackId is required"}}async createSubscriber(e){if(!e.email||!Array.isArray(e.subscriptions))return{success:!1,error:"email and subscriptions array are required"};if(!r.validateEmail(e.email))return{success:!1,error:"Invalid email format"};let i={email:r.sanitizeString(e.email),subscriptions:e.subscriptions.map(s=>({id:r.sanitizeString(s.id),title:r.sanitizeString(s.title),description:r.sanitizeString(s.description)})),workspace_id:e.workspaceId,page_url:typeof window<"u"?window.location.href:void 0,consent_given:e.consent!==!1,source:"widget",metadata:e.metadata,timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/subscribers","POST",i)}async getSubscriber(e){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let i=r.sanitizeString(e);return this.makeRequest(`/api/widget/v1/subscribers?email=${encodeURIComponent(i)}`,"GET")}async updateSubscriber(e,i){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};if(!Array.isArray(i))return{success:!1,error:"subscriptions must be an array"};let s={email:r.sanitizeString(e),subscriptions:i.map(t=>({id:r.sanitizeString(t.id),title:r.sanitizeString(t.title),description:r.sanitizeString(t.description)})),timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/subscribers","PUT",s)}async deleteSubscriber(e){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let i=r.sanitizeString(e);return this.makeRequest(`/api/widget/v1/subscribers?email=${encodeURIComponent(i)}`,"DELETE")}async createContact(e){if(!e.firstName||!e.email||!e.message)return{success:!1,error:"firstName, email, and message are required"};if(!r.validateEmail(e.email))return{success:!1,error:"Invalid email format"};let i={first_name:r.sanitizeString(e.firstName),last_name:e.lastName?r.sanitizeString(e.lastName):void 0,email:r.sanitizeString(e.email),subject:e.subject?r.sanitizeString(e.subject):"Contact Form Submission",message:r.sanitizeString(e.message),workspace_id:e.workspaceId,page_url:typeof window<"u"?window.location.href:void 0,user_agent:typeof navigator<"u"?navigator.userAgent:void 0,metadata:e.metadata,timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/contact","POST",i)}async getContacts(e){let i=new URLSearchParams;if(e?.userEmail){if(!r.validateEmail(e.userEmail))return{success:!1,error:"Invalid email format"};i.append("user_email",r.sanitizeString(e.userEmail))}e?.limit&&i.append("limit",e.limit.toString()),e?.page&&i.append("page",e.page.toString());let s=i.toString(),t=`/api/widget/v1/contact${s?`?${s}`:""}`;return this.makeRequest(t,"GET")}async updateContact(e,i){if(!e)return{success:!1,error:"contactId is required"};let s={contact_id:r.sanitizeString(e),...i,timestamp:new Date().toISOString()};return this.makeRequest(`/api/widget/v1/contact/${e}`,"PUT",s)}async deleteContact(e){return e?this.makeRequest(`/api/widget/v1/contact/${e}`,"DELETE"):{success:!1,error:"contactId is required"}}async createPreferences(e,i){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};if(!Array.isArray(i.preferences))return{success:!1,error:"preferences array is required"};let s={preferences:i.preferences.map(t=>({id:r.sanitizeString(t.id),title:r.sanitizeString(t.title),description:r.sanitizeString(t.description),value:t.value})),user_email:r.sanitizeString(e),workspace_id:i.workspaceId,page_url:typeof window<"u"?window.location.href:void 0,user_agent:typeof navigator<"u"?navigator.userAgent:void 0,metadata:i.metadata,timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/preferences","POST",s)}async getPreferences(e){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let i=r.sanitizeString(e);return this.makeRequest(`/api/widget/v1/preferences?user_email=${encodeURIComponent(i)}`,"GET")}async updatePreferences(e,i){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};if(!Array.isArray(i.preferences))return{success:!1,error:"preferences array is required"};let s={preferences:i.preferences.map(t=>({id:r.sanitizeString(t.id),title:r.sanitizeString(t.title),description:r.sanitizeString(t.description),value:t.value})),user_email:r.sanitizeString(e),workspace_id:i.workspaceId,page_url:typeof window<"u"?window.location.href:void 0,user_agent:typeof navigator<"u"?navigator.userAgent:void 0,metadata:i.metadata,timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/preferences","PUT",s)}async deletePreferences(e){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let i=r.sanitizeString(e);return this.makeRequest(`/api/widget/v1/preferences?user_email=${encodeURIComponent(i)}`,"DELETE")}async getUserProfile(e,i){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let s=r.sanitizeString(e),t=new URLSearchParams;t.append("email",s);let n=i||{includePreferences:!0,includeSubscriptions:!0};return n.includePreferences&&t.append("include_preferences","true"),n.includeSubscriptions&&t.append("include_subscriptions","true"),n.includeMetadata&&t.append("include_metadata","true"),n.preferenceIds?.length&&t.append("preference_ids",n.preferenceIds.join(",")),n.subscriptionIds?.length&&t.append("subscription_ids",n.subscriptionIds.join(",")),this.makeRequest(`/api/widget/v1/users/profile?${t.toString()}`,"GET")}async hasUserData(e){if(!e)return{success:!1,error:"userEmail is required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let i=r.sanitizeString(e);return this.makeRequest(`/api/widget/v1/users/data-check?email=${encodeURIComponent(i)}`,"GET")}async toggleSubscription(e,i,s,t){if(!e||!i)return{success:!1,error:"userEmail and subscriptionId are required"};if(!r.validateEmail(e))return{success:!1,error:"Invalid email format"};let n={email:r.sanitizeString(e),subscription_id:r.sanitizeString(i),enabled:s,metadata:{action:s?"enable_subscription":"disable_subscription",...t},timestamp:new Date().toISOString()};return this.makeRequest("/api/widget/v1/subscribers/toggle","PATCH",n)}async subscribe(e){return this.createSubscriber(e)}async submitContact(e){return this.createContact(e)}},R=d;0&&(module.exports={FeedInboxSDK}); //# sourceMappingURL=index.js.map