@opencx/widget 2.4.1 → 2.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var T=Object.defineProperty;var O=t=>{throw TypeError(t)};var I=(t,e,r)=>e in t?T(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var y=(t,e,r)=>I(t,typeof e!="symbol"?e+"":e,r),C=(t,e,r)=>e.has(t)||O("Cannot "+r);var d=(t,e,r)=>(C(t,e,"read from private field"),r?r.call(t):e.get(t)),b=(t,e,r)=>e.has(t)?O("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),E=(t,e,r,s)=>(C(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("./schemas-wky4fpbc.cjs");var g;class f{constructor(e){y(this,"subscribers",new Set);b(this,g);y(this,"initialState");E(this,g,e),this.initialState=e}subscribe(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}getState(){return d(this,g)}setState(e){d(this,g)!==e&&(E(this,g,e),this.subscribers.forEach(r=>r(e)))}setStatePartial(e){const r={...d(this,g),...e};this.setState(r)}clear(){this.subscribers.clear()}reset(){this.setState(this.initialState)}getSnapshot(){return d(this,g)}get state(){return d(this,g)}}g=new WeakMap;function U(t){return new f(t)}const v=1e4,A=5e3;function k(t){var e,r,s;return t.sender.kind==="user"?{id:t.publicId||h.genId(),type:"FROM_USER",content:t.content.text||"",deliveredAt:((e=t.sentAt)==null?void 0:e.toISOString())||null,attachments:t.attachments||void 0,timestamp:(r=t.sentAt)==null?void 0:r.toISOString()}:{id:t.publicId||h.genId(),type:"FROM_BOT",component:t.type,data:{text:t.content.text},timestamp:(s=t.sentAt)==null?void 0:s.toISOString(),attachments:t.attachments||void 0}}function M(t,e,r){const s=[];return s.push(setInterval(async()=>{const n=e.getState();if(n!=null&&n.id)try{const a=await t.getSession(n.id);a&&e.setState(a)}catch(a){console.error("Error polling session:",a)}},v)),s.push(setInterval(async()=>{const n=e.getState();if(n!=null&&n.id)try{const a=await t.getSessionHistory(n.id);if(a){const l=a.map(k);r.setStatePartial({messages:l,lastUpdated:Date.now()})}}catch(a){console.error("Error polling messages:",a)}},A)),()=>s.forEach(clearInterval)}function D(t){const e=new f({lastUpdated:null,messages:[],keyboard:null}),r=new f(null);let s=null;async function n(){const o=await t.api.createSession();return r.setState(o),s||(s=M(t.api,r,e)),o}async function a(){var i;const o=r.getState();if(o!=null&&o.id)try{s&&(s(),s=null),r.setState(null),e.setState({lastUpdated:null,messages:[],keyboard:null}),(i=t.onSessionDestroy)==null||i.call(t)}catch(u){throw console.error("Error clearing session:",u),u}}function l(){s&&(s(),s=null),e.setState({lastUpdated:null,messages:[],keyboard:null}),r.setState(null),e.clear(),r.clear()}return{chatState:e,sessionState:r,sendMessage:async o=>{const i=r.getState();if(!(i!=null&&i.id))throw new Error("No active session");const u={...o,session_id:i.id};try{e.setStatePartial({messages:[...e.getState().messages,{id:o.id||h.genId(),type:"FROM_USER",content:o.content.text,deliveredAt:new Date().toISOString(),attachments:o.attachments,timestamp:new Date().toISOString()}]}),await t.api.handleMessage(u)}catch(S){throw console.error("Error sending message:",S),S}},createSession:n,clearSession:a,cleanup:l}}function F(t){var l;const e=`${t.botToken}:contact:${(l=t.user)==null?void 0:l.external_id}`;let r=null;if(t.platform.storage){const c=t.platform.storage.getItem(e);if(c)try{r=JSON.parse(c)}catch(o){console.error("Error parsing stored contact:",o)}}const s=new f(r);t.platform.storage&&s.subscribe(c=>{var o,i;c?(o=t.platform.storage)==null||o.setItem(e,JSON.stringify(c)):(i=t.platform.storage)==null||i.removeItem(e)});function n(){const c=s.getState();return!(c!=null&&c.id)&&t.collectUserData?{should:!0,reason:"No contact id and collectUserData is true"}:{should:!1}}function a(){s.clear(),s.setState(null)}return{shouldCollectData:n,cleanup:a,contactState:s}}function N(t={}){const e=[],r=[],s=[],n=async(a,l={})=>{let c={...t,...l,headers:{...t.headers,...l.headers}};try{for(const S of e)c=await S(c);const o=c.params?"?"+new URLSearchParams(c.params).toString():"",i=c.baseURL?`${c.baseURL}${a}${o}`.replace(/([^:]\/)\/+/g,"$1"):`${a}${o}`;let u=await fetch(i,c);for(const S of r)u=await S(u);return u}catch(o){let i=o;for(const u of s)i=await u(i);throw i}};return n.interceptors={request:{use:a=>(e.push(a),e.length-1),eject:a=>{e.splice(a,1)}},response:{use:(a,l)=>(r.push(a),l&&s.push(l),r.length-1),eject:a=>{r.splice(a,1),s.splice(a,1)}}},n}var m;class ${constructor(e){b(this,m);this.options=e;const r=this.options.coreOptions.user,s={claim:"",value:""};r!=null&&r.email?(s.claim="email",s.value=r.email):r!=null&&r.phone&&(s.claim="phone",s.value=r.phone);const n={"X-Bot-Token":this.options.token,"X-Consumer-Id":`${s.claim}:${s.value}`};this.options.coreOptions.contactToken&&(n.Authorization=`Bearer ${this.options.coreOptions.contactToken}`),E(this,m,N({baseURL:`${this.options.apiUrl}/widget/v2`,headers:n}))}async me(){return(await d(this,m).call(this,"/me")).json()}async widgetPrelude(){return(await d(this,m).call(this,"/prelude")).json()}async handleMessage(e){return(await d(this,m).call(this,"/chat/send",{method:"POST",body:JSON.stringify(e)})).json()}async getSessionHistory(e,r){const s=new URLSearchParams({lastMessageTimestamp:r||""}),n=`/session/history/${e}?${s.toString()}`;return(await d(this,m).call(this,n,{method:"GET"})).json()}async createSession(){return(await d(this,m).call(this,"/create-session",{method:"POST"})).json()}async getSession(e){return(await d(this,m).call(this,`/session/${e}`,{method:"GET"})).json()}async createContact(e){return(await d(this,m).call(this,"/contact/upsert",{method:"POST",body:JSON.stringify(e)})).json()}}m=new WeakMap;class p extends Error{constructor(e){super(e),this.name="OpenCXError"}}class x extends p{constructor(e="Connection failed"){super(e),this.name="ConnectionError"}}class L extends p{constructor(e="Authentication failed"){super(e),this.name="AuthenticationError"}}class P extends p{constructor(e="Session error occurred"){super(e),this.name="SessionError"}}class _ extends P{constructor(e="Session not defined"){super(e),this.name="SessionNotDefinedError"}}class R extends p{constructor(e="Transport error occurred"){super(e),this.name="TransportError"}}class j extends p{constructor(e="File upload failed"){super(e),this.name="FileUploadError"}}function q(){return{env:{platform:typeof window<"u"?"browser":"server"},date:{now:()=>Date.now(),toISOString:e=>new Date(e).toISOString()}}}const H={messageArrived:"https://cloud.opencopilot.so/sfx/notification3.mp3"},w={headerStyle:"basic",primaryColor:"hsl(211,65%,59%)",triggerOffset:"20px"};function B(t){var r,s,n,a,l,c,o,i,u,S;const e={...t,apiUrl:t.apiUrl??"https://api-v2.opencopilot.so/backend",socketUrl:t.socketUrl??"https://api-v2.opencopilot.so",transport:t.transport??"socket",pollingInterval:t.pollingInterval??3e3,headers:{...t.headers??{},"X-Bot-Token":t.token},queryParams:t.queryParams??{},pathParams:t.pathParams??{},bot:{name:((r=t.bot)==null?void 0:r.name)??"Bot",avatarUrl:(s=t.bot)==null?void 0:s.avatarUrl,id:((n=t.bot)==null?void 0:n.id)??null,is_ai:((a=t.bot)==null?void 0:a.is_ai)??!0},contactToken:t.contactToken,debug:t.debug??!1,language:t.language??"en",user:t.user??{},soundEffectFiles:{messageArrived:((l=t.soundEffectFiles)==null?void 0:l.messageArrived)??H.messageArrived},theme:{headerStyle:((c=t.theme)==null?void 0:c.headerStyle)??w.headerStyle,primaryColor:((o=t.theme)==null?void 0:o.primaryColor)??w.primaryColor,triggerOffset:((i=t.theme)==null?void 0:i.triggerOffset)??w.triggerOffset},settings:{persistSession:((u=t.settings)==null?void 0:u.persistSession)??!1,useSoundEffects:((S=t.settings)==null?void 0:S.useSoundEffects)??!1}};return{getConfig:()=>e,getApiConfig:()=>({apiUrl:e.apiUrl,token:e.token,headers:e.headers,queryParams:e.queryParams,pathParams:e.pathParams}),getBotConfig:()=>e.bot,getThemeConfig:()=>e.theme,getSettings:()=>e.settings,getSoundEffects:()=>e.soundEffectFiles,getUser:()=>e.user,getLanguage:()=>e.language,getDebugMode:()=>e.debug}}exports.AIClosureType=h.AIClosureType;exports.MessageTypeEnum=h.MessageTypeEnum;exports.SentimentEnum=h.SentimentEnum;exports.SessionChannel=h.SessionChannel;exports.SessionStatus=h.SessionStatus;exports.chatAttachmentSchema=h.chatAttachmentSchema;exports.chatHistoryMessageSchema=h.chatHistoryMessageSchema;exports.chatSessionSchema=h.chatSessionSchema;exports.consumerSchema=h.consumerSchema;exports.structuredSocketMessageSchema=h.structuredSocketMessageSchema;exports.ApiCaller=$;exports.AuthenticationError=L;exports.ConnectionError=x;exports.FileUploadError=j;exports.OpenCXError=p;exports.PubSub=f;exports.SessionError=P;exports.SessionNotDefinedError=_;exports.TransportError=R;exports.createChat=D;exports.createConfig=B;exports.createContact=F;exports.createDefaultPlatform=q;exports.createPubSub=U;
1
+ "use strict";var T=Object.defineProperty;var w=t=>{throw TypeError(t)};var I=(t,e,s)=>e in t?T(t,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):t[e]=s;var b=(t,e,s)=>I(t,typeof e!="symbol"?e+"":e,s),O=(t,e,s)=>e.has(t)||w("Cannot "+s);var d=(t,e,s)=>(O(t,e,"read from private field"),s?s.call(t):e.get(t)),y=(t,e,s)=>e.has(t)?w("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,s),E=(t,e,s,r)=>(O(t,e,"write to private field"),r?r.call(t,s):e.set(t,s),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("./schemas-wky4fpbc.cjs");var g;class f{constructor(e){b(this,"subscribers",new Set);y(this,g);b(this,"initialState");E(this,g,e),this.initialState=e}subscribe(e){return this.subscribers.add(e),()=>{this.subscribers.delete(e)}}getState(){return d(this,g)}setState(e){d(this,g)!==e&&(E(this,g,e),this.subscribers.forEach(s=>s(e)))}setStatePartial(e){const s={...d(this,g),...e};this.setState(s)}clear(){this.subscribers.clear()}reset(){this.setState(this.initialState)}getSnapshot(){return d(this,g)}get state(){return d(this,g)}}g=new WeakMap;function U(t){return new f(t)}const v=1e4,A=5e3;function k(t){var e,s,r;return t.sender.kind==="user"?{id:t.publicId||h.genId(),type:"FROM_USER",content:t.content.text||"",deliveredAt:((e=t.sentAt)==null?void 0:e.toISOString())||null,attachments:t.attachments||void 0,timestamp:(s=t.sentAt)==null?void 0:s.toISOString()}:{id:t.publicId||h.genId(),type:"FROM_BOT",component:t.type,data:{text:t.content.text},timestamp:(r=t.sentAt)==null?void 0:r.toISOString(),attachments:t.attachments||void 0}}function M(t,e,s){const r=[];return r.push(setInterval(async()=>{const a=e.getState();if(a!=null&&a.id)try{const n=await t.getSession(a.id);n&&e.setState(n)}catch(n){console.error("Error polling session:",n)}},v)),r.push(setInterval(async()=>{const a=e.getState();if(a!=null&&a.id)try{const n=await t.getSessionHistory(a.id);if(n){const l=n.map(k);s.setStatePartial({messages:l,lastUpdated:Date.now()})}}catch(n){console.error("Error polling messages:",n)}},A)),()=>r.forEach(clearInterval)}function D(t){const e=new f({lastUpdated:null,messages:[],keyboard:null}),s=new f(null);let r=null;async function a(){const o=await t.api.createSession();return s.setState(o),r||(r=M(t.api,s,e)),o}async function n(){var i;const o=s.getState();if(o!=null&&o.id)try{r&&(r(),r=null),s.setState(null),e.setState({lastUpdated:null,messages:[],keyboard:null}),(i=t.onSessionDestroy)==null||i.call(t)}catch(u){throw console.error("Error clearing session:",u),u}}function l(){r&&(r(),r=null),e.setState({lastUpdated:null,messages:[],keyboard:null}),s.setState(null),e.clear(),s.clear()}return{chatState:e,sessionState:s,sendMessage:async o=>{const i=s.getState();if(!(i!=null&&i.id))throw new Error("No active session");const u={...o,session_id:i.id};try{e.setStatePartial({messages:[...e.getState().messages,{id:o.id||h.genId(),type:"FROM_USER",content:o.content.text,deliveredAt:new Date().toISOString(),attachments:o.attachments,timestamp:new Date().toISOString()}]}),await t.api.handleMessage(u)}catch(S){throw console.error("Error sending message:",S),S}},createSession:a,clearSession:n,cleanup:l}}function F(t){var l;const e=`${t.botToken}:contact:${(l=t.user)==null?void 0:l.external_id}`;let s=null;if(t.platform.storage){const c=t.platform.storage.getItem(e);if(c)try{s=JSON.parse(c)}catch(o){console.error("Error parsing stored contact:",o)}}const r=new f(s);t.platform.storage&&r.subscribe(c=>{var o,i;c?(o=t.platform.storage)==null||o.setItem(e,JSON.stringify(c)):(i=t.platform.storage)==null||i.removeItem(e)});function a(){const c=r.getState();return!(c!=null&&c.id)&&t.collectUserData?{should:!0,reason:"No contact id and collectUserData is true"}:{should:!1}}function n(){r.clear(),r.setState(null)}return{shouldCollectData:a,cleanup:n,contactState:r}}function N(t={}){const e=[],s=[],r=[],a=async(n,l={})=>{let c={...t,...l,headers:{...t.headers,...l.headers}};try{for(const S of e)c=await S(c);const o=c.params?"?"+new URLSearchParams(c.params).toString():"",i=c.baseURL?`${c.baseURL}${n}${o}`.replace(/([^:]\/)\/+/g,"$1"):`${n}${o}`;let u=await fetch(i,c);for(const S of s)u=await S(u);return u}catch(o){let i=o;for(const u of r)i=await u(i);throw i}};return a.interceptors={request:{use:n=>(e.push(n),e.length-1),eject:n=>{e.splice(n,1)}},response:{use:(n,l)=>(s.push(n),l&&r.push(l),s.length-1),eject:n=>{s.splice(n,1),r.splice(n,1)}}},a}var m;class ${constructor(e){y(this,m);this.options=e;const s=this.options.coreOptions.user,r={claim:"",value:""};s!=null&&s.email?(r.claim="email",r.value=s.email):s!=null&&s.phone&&(r.claim="phone",r.value=s.phone);const a={"X-Bot-Token":this.options.token,"X-Consumer-Id":`${r.claim}:${r.value}`};this.options.coreOptions.contactToken&&(a.Authorization=`Bearer ${this.options.coreOptions.contactToken}`),E(this,m,N({baseURL:`${this.options.apiUrl}/widget/v2`,headers:a}))}async me(){return(await d(this,m).call(this,"/me")).json()}async widgetPrelude(){return(await d(this,m).call(this,"/prelude")).json()}async handleMessage(e){return(await d(this,m).call(this,"/chat/send",{method:"POST",body:JSON.stringify(e)})).json()}async getSessionHistory(e,s){const r=new URLSearchParams({lastMessageTimestamp:s||""}),a=`/session/history/${e}?${r.toString()}`;return(await d(this,m).call(this,a,{method:"GET"})).json()}async createSession(){return(await d(this,m).call(this,"/create-session",{method:"POST"})).json()}async getSession(e){return(await d(this,m).call(this,`/session/${e}`,{method:"GET"})).json()}async createContact(e){return(await d(this,m).call(this,"/contact/upsert",{method:"POST",body:JSON.stringify(e)})).json()}}m=new WeakMap;class p extends Error{constructor(e){super(e),this.name="OpenCXError"}}class x extends p{constructor(e="Connection failed"){super(e),this.name="ConnectionError"}}class L extends p{constructor(e="Authentication failed"){super(e),this.name="AuthenticationError"}}class P extends p{constructor(e="Session error occurred"){super(e),this.name="SessionError"}}class _ extends P{constructor(e="Session not defined"){super(e),this.name="SessionNotDefinedError"}}class R extends p{constructor(e="Transport error occurred"){super(e),this.name="TransportError"}}class j extends p{constructor(e="File upload failed"){super(e),this.name="FileUploadError"}}function q(){return{env:{platform:typeof window<"u"?"browser":"server"},date:{now:()=>Date.now(),toISOString:e=>new Date(e).toISOString()}}}const H={messageArrived:"https://cloud.opencopilot.so/sfx/notification3.mp3"},C={primaryColor:"hsl(211,65%,59%)",triggerOffset:"20px"};function B(t){var s,r,a,n,l,c,o,i,u;const e={...t,apiUrl:t.apiUrl??"https://api-v2.opencopilot.so/backend",socketUrl:t.socketUrl??"https://api-v2.opencopilot.so",transport:t.transport??"socket",pollingInterval:t.pollingInterval??3e3,headers:{...t.headers??{},"X-Bot-Token":t.token},queryParams:t.queryParams??{},pathParams:t.pathParams??{},bot:{name:((s=t.bot)==null?void 0:s.name)??"Bot",avatarUrl:(r=t.bot)==null?void 0:r.avatarUrl,id:((a=t.bot)==null?void 0:a.id)??null,is_ai:((n=t.bot)==null?void 0:n.is_ai)??!0},contactToken:t.contactToken,debug:t.debug??!1,language:t.language??"en",user:t.user??{},soundEffectFiles:{messageArrived:((l=t.soundEffectFiles)==null?void 0:l.messageArrived)??H.messageArrived},theme:{primaryColor:((c=t.theme)==null?void 0:c.primaryColor)??C.primaryColor,triggerOffset:((o=t.theme)==null?void 0:o.triggerOffset)??C.triggerOffset},settings:{persistSession:((i=t.settings)==null?void 0:i.persistSession)??!1,useSoundEffects:((u=t.settings)==null?void 0:u.useSoundEffects)??!1}};return{getConfig:()=>e,getApiConfig:()=>({apiUrl:e.apiUrl,token:e.token,headers:e.headers,queryParams:e.queryParams,pathParams:e.pathParams}),getBotConfig:()=>e.bot,getThemeConfig:()=>e.theme,getSettings:()=>e.settings,getSoundEffects:()=>e.soundEffectFiles,getUser:()=>e.user,getLanguage:()=>e.language,getDebugMode:()=>e.debug}}exports.AIClosureType=h.AIClosureType;exports.MessageTypeEnum=h.MessageTypeEnum;exports.SentimentEnum=h.SentimentEnum;exports.SessionChannel=h.SessionChannel;exports.SessionStatus=h.SessionStatus;exports.chatAttachmentSchema=h.chatAttachmentSchema;exports.chatHistoryMessageSchema=h.chatHistoryMessageSchema;exports.chatSessionSchema=h.chatSessionSchema;exports.consumerSchema=h.consumerSchema;exports.structuredSocketMessageSchema=h.structuredSocketMessageSchema;exports.ApiCaller=$;exports.AuthenticationError=L;exports.ConnectionError=x;exports.FileUploadError=j;exports.OpenCXError=p;exports.PubSub=f;exports.SessionError=P;exports.SessionNotDefinedError=_;exports.TransportError=R;exports.createChat=D;exports.createConfig=B;exports.createContact=F;exports.createDefaultPlatform=q;exports.createPubSub=U;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../core/types/pub-sub.ts","../core/client/chat.ts","../core/client/contact.ts","../core/utils/create-fetch.ts","../core/client/api.ts","../core/errors/index.ts","../core/platform/index.ts","../core/client/config.ts"],"sourcesContent":["export type Subscriber<T> = (data: T) => void\n\nexport class PubSub<S> {\n private subscribers = new Set<Subscriber<S>>();\n #state: S;\n private initialState: S;\n\n constructor(state: S) {\n this.#state = state;\n this.initialState = state;\n }\n\n /**\n * Subscribe to state changes\n * @param callback Function to call when state changes\n * @returns Unsubscribe function\n */\n subscribe(callback: Subscriber<S>): () => void {\n this.subscribers.add(callback);\n\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Get the current state\n */\n getState(): S {\n return this.#state;\n }\n\n /**\n * Set the state and notify subscribers if the state changes\n * @param newState The new state to set\n */\n setState(newState: S): void {\n if (this.#state !== newState) {\n this.#state = newState;\n this.subscribers.forEach(callback => callback(newState));\n }\n }\n\n setStatePartial(_s: Partial<S>): void {\n const newState = { ...this.#state, ..._s };\n this.setState(newState);\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n\n reset(): void {\n this.setState(this.initialState);\n }\n\n getSnapshot(): S {\n return this.#state;\n }\n\n get state(): S {\n return this.#state;\n }\n}\n\nexport function createPubSub<S>(state: S): PubSub<S> {\n return new PubSub<S>(state);\n}","import { PubSub } from \"../types/pub-sub\";\nimport { MessageType, UserMessageType, SendMessageInput } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { genId } from \"../utils/genId\";\nimport { WidgetHistorySchema, WidgetSessionSchema } from \"../types/schemas-v2\";\n\nconst SESSION_POLLING_INTERVAL = 10000; // every 10 seconds\nconst MESSAGE_POLLING_INTERVAL = 5000; // every 5 seconds\n\ntype ChatState = {\n lastUpdated: number | null;\n messages: MessageType[];\n keyboard: { options: string[] } | null;\n};\n\ntype ChatOptions = {\n api: ApiCaller;\n persistSession?: boolean;\n useSoundEffects?: boolean;\n onSessionDestroy?: () => void;\n};\n\n\nfunction mapHistoryToMessage(history: WidgetHistorySchema): MessageType {\n if (history.sender.kind === 'user') {\n return {\n id: history.publicId || genId(),\n type: \"FROM_USER\",\n content: history.content.text || \"\",\n deliveredAt: history.sentAt?.toISOString() || null,\n attachments: history.attachments || undefined,\n timestamp: history.sentAt?.toISOString()\n };\n }\n\n return {\n id: history.publicId || genId(),\n type: \"FROM_BOT\",\n component: history.type,\n data: {\n text: history.content.text\n },\n timestamp: history.sentAt?.toISOString(),\n attachments: history.attachments || undefined\n };\n}\n\nfunction startPolling(\n api: ApiCaller,\n sessionState: PubSub<WidgetSessionSchema | null>,\n state: PubSub<ChatState>\n) {\n const intervals: NodeJS.Timeout[] = [];\n\n // Poll session\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSession(session.id);\n if (response) {\n sessionState.setState(response);\n }\n } catch (error) {\n console.error(\"Error polling session:\", error);\n }\n }, SESSION_POLLING_INTERVAL)\n );\n\n // Poll messages\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSessionHistory(session.id);\n if (response) {\n const messages = response.map(mapHistoryToMessage);\n state.setStatePartial({\n messages,\n lastUpdated: Date.now()\n });\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n }\n }, MESSAGE_POLLING_INTERVAL)\n );\n\n return () => intervals.forEach(clearInterval);\n}\n\nexport function createChat(options: ChatOptions) {\n const state = new PubSub<ChatState>({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n\n const sessionState = new PubSub<WidgetSessionSchema | null>(null);\n let stopPolling: (() => void) | null = null;\n\n async function createSession() {\n const session = await options.api.createSession();\n sessionState.setState(session);\n if (!stopPolling) {\n stopPolling = startPolling(options.api, sessionState, state);\n }\n return session;\n }\n\n async function clearSession() {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n sessionState.setState(null);\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n options.onSessionDestroy?.();\n } catch (error) {\n console.error(\"Error clearing session:\", error);\n throw error;\n }\n }\n\n function cleanup() {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n sessionState.setState(null);\n state.clear();\n sessionState.clear();\n }\n\n const sendMessage = async (input: {\n content: { text: string };\n attachments?: any[];\n id?: string;\n language?: string;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n }) => {\n const session = sessionState.getState();\n if (!session?.id) {\n throw new Error(\"No active session\");\n }\n\n const message: SendMessageInput = {\n ...input,\n session_id: session.id\n };\n\n try {\n // Add message to local state first\n state.setStatePartial({\n messages: [\n ...state.getState().messages,\n {\n id: input.id || genId(),\n type: \"FROM_USER\",\n content: input.content.text,\n deliveredAt: new Date().toISOString(),\n attachments: input.attachments,\n timestamp: new Date().toISOString()\n }\n ]\n });\n\n // Send message\n await options.api.handleMessage(message);\n } catch (error) {\n console.error(\"Error sending message:\", error);\n throw error;\n }\n };\n\n return {\n chatState: state,\n sessionState,\n sendMessage,\n createSession,\n clearSession,\n cleanup\n };\n} ","import { PubSub } from \"../types/pub-sub\";\nimport { ConsumerType } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { Platform } from \"../platform\";\n\ntype ContactOptions = {\n api: ApiCaller;\n botToken: string;\n platform: Platform;\n collectUserData?: boolean;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n};\n\nexport function createContact(options: ContactOptions) {\n const storageKey = `${options.botToken}:contact:${options.user?.external_id}`;\n\n // Initialize state from storage if available\n let initialState: ConsumerType | null = null;\n if (options.platform.storage) {\n const stored = options.platform.storage.getItem(storageKey);\n if (stored) {\n try {\n initialState = JSON.parse(stored);\n } catch (e) {\n console.error(\"Error parsing stored contact:\", e);\n }\n }\n }\n\n const state = new PubSub<ConsumerType | null>(initialState);\n\n // Subscribe to state changes to persist\n if (options.platform.storage) {\n state.subscribe((contact) => {\n if (contact) {\n options.platform.storage?.setItem(storageKey, JSON.stringify(contact));\n } else {\n options.platform.storage?.removeItem(storageKey);\n }\n });\n }\n\n function shouldCollectData(): { should: boolean; reason?: string } {\n const contact = state.getState();\n\n if (!contact?.id && options.collectUserData) {\n return {\n should: true,\n reason: \"No contact id and collectUserData is true\"\n };\n }\n\n return {\n should: false\n };\n }\n\n function cleanup() {\n state.clear();\n state.setState(null);\n }\n\n return {\n shouldCollectData,\n cleanup,\n contactState: state,\n };\n} ","type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;\ntype ResponseInterceptor = (response: Response) => Response | Promise<Response>;\ntype ErrorInterceptor = (error: any) => any;\n\ninterface RequestConfig extends RequestInit {\n baseURL?: string;\n headers?: HeadersInit;\n params?: Record<string, string>;\n}\n\nexport interface CustomFetch {\n (url: string, config?: RequestConfig): Promise<Response>;\n interceptors: {\n request: {\n use: (interceptor: RequestInterceptor) => number;\n eject: (id: number) => void;\n };\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => number;\n eject: (id: number) => void;\n };\n };\n}\n\nexport function createFetch(defaultConfig: RequestConfig = {}): CustomFetch {\n const requestInterceptors: RequestInterceptor[] = [];\n const responseInterceptors: ResponseInterceptor[] = [];\n const errorInterceptors: ErrorInterceptor[] = [];\n\n const customFetch: CustomFetch = async (url: string, config: RequestConfig = {}) => {\n // Merge configs\n let mergedConfig: RequestConfig = {\n ...defaultConfig,\n ...config,\n headers: {\n ...defaultConfig.headers,\n ...config.headers,\n },\n };\n\n try {\n // Apply request interceptors\n for (const interceptor of requestInterceptors) {\n mergedConfig = await interceptor(mergedConfig);\n }\n\n // Handle URL params\n const queryParams = mergedConfig.params\n ? '?' + new URLSearchParams(mergedConfig.params).toString()\n : '';\n\n // Construct full URL\n const fullUrl = mergedConfig.baseURL\n ? `${mergedConfig.baseURL}${url}${queryParams}`.replace(/([^:]\\/)\\/+/g, '$1')\n : `${url}${queryParams}`;\n\n // Make the fetch call\n let response = await fetch(fullUrl, mergedConfig);\n\n // Apply response interceptors\n for (const interceptor of responseInterceptors) {\n response = await interceptor(response);\n }\n\n return response;\n } catch (error) {\n // Apply error interceptors\n let processedError = error;\n for (const interceptor of errorInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n };\n\n // Add interceptors management\n customFetch.interceptors = {\n request: {\n use: (interceptor: RequestInterceptor) => {\n requestInterceptors.push(interceptor);\n return requestInterceptors.length - 1;\n },\n eject: (id: number) => {\n requestInterceptors.splice(id, 1);\n },\n },\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => {\n responseInterceptors.push(interceptor);\n if (errorInterceptor) {\n errorInterceptors.push(errorInterceptor);\n }\n return responseInterceptors.length - 1;\n },\n eject: (id: number) => {\n responseInterceptors.splice(id, 1);\n errorInterceptors.splice(id, 1);\n },\n },\n };\n\n return customFetch;\n}\n\n// Helper method to handle JSON responses\nexport async function handleJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n}\n\n// Usage example:\n/*\nconst api = createFetch({\n baseURL: 'https://api.example.com',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\n// Add request interceptor\napi.interceptors.request.use((config) => {\n config.headers = {\n ...config.headers,\n 'Authorization': `Bearer ${getToken()}`,\n };\n return config;\n});\n\n// Add response interceptor\napi.interceptors.response.use(\n async (response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response;\n },\n (error) => {\n console.error('Request failed:', error);\n throw error;\n }\n);\n*/\n","import { createFetch, CustomFetch } from \"../utils/create-fetch\";\nimport { HandleContactMessageOutputSchema, WidgetHistorySchema, WidgetPreludeSchema, WidgetSessionSchema } from \"../types/schemas-v2\";\nimport { CoreOptions, SendMessageInput, ConsumerType } from \"../types\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n coreOptions: CoreOptions;\n}\n\nexport class ApiCaller {\n #fetch: CustomFetch\n constructor(private readonly options: ApiCallerOptions) {\n const user = this.options.coreOptions.user;\n const consumerHeader = {\n claim: '',\n value: ''\n }\n\n if (user?.email) {\n consumerHeader.claim = 'email';\n consumerHeader.value = user.email;\n }\n\n else if (user?.phone) {\n consumerHeader.claim = 'phone';\n consumerHeader.value = user.phone;\n }\n\n const headers: Record<string, string> = {\n 'X-Bot-Token': this.options.token,\n 'X-Consumer-Id': `${consumerHeader.claim}:${consumerHeader.value}`\n }\n\n // Only add Authorization header if contactToken exists\n if (this.options.coreOptions.contactToken) {\n headers['Authorization'] = `Bearer ${this.options.coreOptions.contactToken}`\n }\n\n this.#fetch = createFetch({\n baseURL: `${this.options.apiUrl}/widget/v2`,\n headers\n })\n }\n\n async me(): Promise<{\n contactId: string;\n contactName: string;\n }> {\n // GET /me\n const response = await this.#fetch('/me')\n return response.json()\n }\n\n async widgetPrelude(): Promise<WidgetPreludeSchema> {\n // GET /prelude\n const response = await this.#fetch('/prelude')\n return response.json()\n }\n\n async handleMessage(message: SendMessageInput): Promise<HandleContactMessageOutputSchema> {\n // POST /chat/send\n const response = await this.#fetch('/chat/send', {\n method: \"POST\",\n body: JSON.stringify(message)\n })\n return response.json()\n }\n\n async getSessionHistory(sessionId: string, lastMessageTimestamp?: string): Promise<WidgetHistorySchema[]> {\n // session/history/:sessionId\n const queryParams = new URLSearchParams({\n lastMessageTimestamp: lastMessageTimestamp || ''\n })\n\n const url = `/session/history/${sessionId}?${queryParams.toString()}`\n\n const response = await this.#fetch(url, {\n method: 'GET'\n })\n\n return response.json()\n }\n\n async createSession(): Promise<WidgetSessionSchema> {\n // POST /create-session\n const response = await this.#fetch('/create-session', {\n method: 'POST'\n })\n return response.json()\n }\n\n async getSession(sessionId: string): Promise<WidgetSessionSchema> {\n // GET /session/:sessionId\n const response = await this.#fetch(`/session/${sessionId}`, {\n method: 'GET'\n })\n return response.json()\n }\n\n async createContact(user: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n }): Promise<ConsumerType> {\n const response = await this.#fetch('/contact/upsert', {\n method: 'POST',\n body: JSON.stringify(user)\n });\n return response.json();\n }\n}\n","export class OpenCXError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenCXError\";\n }\n}\n\nexport class ConnectionError extends OpenCXError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n\nexport class AuthenticationError extends OpenCXError {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class SessionError extends OpenCXError {\n constructor(message = \"Session error occurred\") {\n super(message);\n this.name = \"SessionError\";\n }\n}\n\nexport class SessionNotDefinedError extends SessionError {\n constructor(message = \"Session not defined\") {\n super(message);\n this.name = \"SessionNotDefinedError\";\n }\n}\n\nexport class TransportError extends OpenCXError {\n constructor(message = \"Transport error occurred\") {\n super(message);\n this.name = \"TransportError\";\n }\n}\n\nexport class FileUploadError extends OpenCXError {\n constructor(message = \"File upload failed\") {\n super(message);\n this.name = \"FileUploadError\";\n }\n}\n","export interface Platform {\n storage?: Storage;\n env: {\n platform: string;\n };\n date: {\n now(): number;\n toISOString(date: number): string;\n };\n}\n\nexport function createDefaultPlatform(): Platform {\n const detectPlatform = () => {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n };\n\n return {\n env: {\n platform: detectPlatform()\n },\n date: {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString()\n }\n };\n}\n","import { CoreOptions } from \"../types\";\n\nconst DEFAULT_SOUND_EFFECTS = {\n messageArrived: \"https://cloud.opencopilot.so/sfx/notification3.mp3\"\n};\n\nconst DEFAULT_THEME = {\n headerStyle: \"basic\" as const,\n primaryColor: \"hsl(211,65%,59%)\",\n triggerOffset: \"20px\"\n};\n\ntype NormalizedConfig = Required<Omit<CoreOptions, 'contactToken'>> & {\n contactToken: string | undefined | null;\n soundEffectFiles: {\n messageArrived: string;\n };\n theme: {\n headerStyle: \"compact\" | \"basic\";\n primaryColor: string;\n triggerOffset: string;\n };\n settings: {\n persistSession: boolean;\n useSoundEffects: boolean;\n };\n};\n\ntype ConfigInstance = {\n getConfig: () => NormalizedConfig;\n getApiConfig: () => {\n apiUrl: string;\n token: string;\n headers: Record<string, string>;\n queryParams: Record<string, string>;\n pathParams: Record<string, string>;\n };\n getBotConfig: () => NormalizedConfig['bot'];\n getThemeConfig: () => NormalizedConfig['theme'];\n getSettings: () => NormalizedConfig['settings'];\n getSoundEffects: () => NormalizedConfig['soundEffectFiles'];\n getUser: () => NormalizedConfig['user'];\n getLanguage: () => string;\n getDebugMode: () => boolean;\n};\n\nexport function createConfig(options: CoreOptions): ConfigInstance {\n const normalizedConfig: NormalizedConfig = {\n ...options,\n apiUrl: options.apiUrl ?? \"https://api-v2.opencopilot.so/backend\",\n socketUrl: options.socketUrl ?? \"https://api-v2.opencopilot.so\",\n transport: options.transport ?? 'socket',\n pollingInterval: options.pollingInterval ?? 3000,\n headers: {\n ...(options.headers ?? {}),\n \"X-Bot-Token\": options.token,\n },\n queryParams: options.queryParams ?? {},\n pathParams: options.pathParams ?? {},\n bot: {\n name: options.bot?.name ?? \"Bot\",\n avatarUrl: options.bot?.avatarUrl,\n id: options.bot?.id ?? null,\n is_ai: options.bot?.is_ai ?? true\n },\n contactToken: options.contactToken,\n debug: options.debug ?? false,\n language: options.language ?? \"en\",\n user: options.user ?? {},\n soundEffectFiles: {\n messageArrived: options.soundEffectFiles?.messageArrived ?? DEFAULT_SOUND_EFFECTS.messageArrived\n },\n theme: {\n headerStyle: options.theme?.headerStyle ?? DEFAULT_THEME.headerStyle,\n primaryColor: options.theme?.primaryColor ?? DEFAULT_THEME.primaryColor,\n triggerOffset: options.theme?.triggerOffset ?? DEFAULT_THEME.triggerOffset\n },\n settings: {\n persistSession: options.settings?.persistSession ?? false,\n useSoundEffects: options.settings?.useSoundEffects ?? false\n }\n };\n\n return {\n getConfig: () => normalizedConfig,\n getApiConfig: () => ({\n apiUrl: normalizedConfig.apiUrl,\n token: normalizedConfig.token,\n headers: normalizedConfig.headers,\n queryParams: normalizedConfig.queryParams,\n pathParams: normalizedConfig.pathParams\n }),\n getBotConfig: () => normalizedConfig.bot,\n getThemeConfig: () => normalizedConfig.theme,\n getSettings: () => normalizedConfig.settings,\n getSoundEffects: () => normalizedConfig.soundEffectFiles,\n getUser: () => normalizedConfig.user,\n getLanguage: () => normalizedConfig.language,\n getDebugMode: () => normalizedConfig.debug\n };\n} "],"names":["PubSub","state","__publicField","__privateAdd","_state","__privateSet","callback","__privateGet","newState","_s","createPubSub","SESSION_POLLING_INTERVAL","MESSAGE_POLLING_INTERVAL","mapHistoryToMessage","history","genId","_a","_b","_c","startPolling","api","sessionState","intervals","session","response","error","messages","createChat","options","stopPolling","createSession","clearSession","cleanup","input","message","createContact","storageKey","initialState","stored","e","contact","shouldCollectData","createFetch","defaultConfig","requestInterceptors","responseInterceptors","errorInterceptors","customFetch","url","config","mergedConfig","interceptor","queryParams","fullUrl","processedError","id","errorInterceptor","ApiCaller","_fetch","user","consumerHeader","headers","sessionId","lastMessageTimestamp","OpenCXError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError","createDefaultPlatform","date","DEFAULT_SOUND_EFFECTS","DEFAULT_THEME","createConfig","normalizedConfig","_d","_e","_f","_g","_h","_i","_j"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../core/types/pub-sub.ts","../core/client/chat.ts","../core/client/contact.ts","../core/utils/create-fetch.ts","../core/client/api.ts","../core/errors/index.ts","../core/platform/index.ts","../core/client/config.ts"],"sourcesContent":["export type Subscriber<T> = (data: T) => void\n\nexport class PubSub<S> {\n private subscribers = new Set<Subscriber<S>>();\n #state: S;\n private initialState: S;\n\n constructor(state: S) {\n this.#state = state;\n this.initialState = state;\n }\n\n /**\n * Subscribe to state changes\n * @param callback Function to call when state changes\n * @returns Unsubscribe function\n */\n subscribe(callback: Subscriber<S>): () => void {\n this.subscribers.add(callback);\n\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Get the current state\n */\n getState(): S {\n return this.#state;\n }\n\n /**\n * Set the state and notify subscribers if the state changes\n * @param newState The new state to set\n */\n setState(newState: S): void {\n if (this.#state !== newState) {\n this.#state = newState;\n this.subscribers.forEach(callback => callback(newState));\n }\n }\n\n setStatePartial(_s: Partial<S>): void {\n const newState = { ...this.#state, ..._s };\n this.setState(newState);\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n\n reset(): void {\n this.setState(this.initialState);\n }\n\n getSnapshot(): S {\n return this.#state;\n }\n\n get state(): S {\n return this.#state;\n }\n}\n\nexport function createPubSub<S>(state: S): PubSub<S> {\n return new PubSub<S>(state);\n}","import { PubSub } from \"../types/pub-sub\";\nimport { MessageType, UserMessageType, SendMessageInput } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { genId } from \"../utils/genId\";\nimport { WidgetHistorySchema, WidgetSessionSchema } from \"../types/schemas-v2\";\n\nconst SESSION_POLLING_INTERVAL = 10000; // every 10 seconds\nconst MESSAGE_POLLING_INTERVAL = 5000; // every 5 seconds\n\ntype ChatState = {\n lastUpdated: number | null;\n messages: MessageType[];\n keyboard: { options: string[] } | null;\n};\n\ntype ChatOptions = {\n api: ApiCaller;\n persistSession?: boolean;\n useSoundEffects?: boolean;\n onSessionDestroy?: () => void;\n};\n\n\nfunction mapHistoryToMessage(history: WidgetHistorySchema): MessageType {\n if (history.sender.kind === 'user') {\n return {\n id: history.publicId || genId(),\n type: \"FROM_USER\",\n content: history.content.text || \"\",\n deliveredAt: history.sentAt?.toISOString() || null,\n attachments: history.attachments || undefined,\n timestamp: history.sentAt?.toISOString()\n };\n }\n\n return {\n id: history.publicId || genId(),\n type: \"FROM_BOT\",\n component: history.type,\n data: {\n text: history.content.text\n },\n timestamp: history.sentAt?.toISOString(),\n attachments: history.attachments || undefined\n };\n}\n\nfunction startPolling(\n api: ApiCaller,\n sessionState: PubSub<WidgetSessionSchema | null>,\n state: PubSub<ChatState>\n) {\n const intervals: NodeJS.Timeout[] = [];\n\n // Poll session\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSession(session.id);\n if (response) {\n sessionState.setState(response);\n }\n } catch (error) {\n console.error(\"Error polling session:\", error);\n }\n }, SESSION_POLLING_INTERVAL)\n );\n\n // Poll messages\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSessionHistory(session.id);\n if (response) {\n const messages = response.map(mapHistoryToMessage);\n state.setStatePartial({\n messages,\n lastUpdated: Date.now()\n });\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n }\n }, MESSAGE_POLLING_INTERVAL)\n );\n\n return () => intervals.forEach(clearInterval);\n}\n\nexport function createChat(options: ChatOptions) {\n const state = new PubSub<ChatState>({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n\n const sessionState = new PubSub<WidgetSessionSchema | null>(null);\n let stopPolling: (() => void) | null = null;\n\n async function createSession() {\n const session = await options.api.createSession();\n sessionState.setState(session);\n if (!stopPolling) {\n stopPolling = startPolling(options.api, sessionState, state);\n }\n return session;\n }\n\n async function clearSession() {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n sessionState.setState(null);\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n options.onSessionDestroy?.();\n } catch (error) {\n console.error(\"Error clearing session:\", error);\n throw error;\n }\n }\n\n function cleanup() {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n sessionState.setState(null);\n state.clear();\n sessionState.clear();\n }\n\n const sendMessage = async (input: {\n content: { text: string };\n attachments?: any[];\n id?: string;\n language?: string;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n }) => {\n const session = sessionState.getState();\n if (!session?.id) {\n throw new Error(\"No active session\");\n }\n\n const message: SendMessageInput = {\n ...input,\n session_id: session.id\n };\n\n try {\n // Add message to local state first\n state.setStatePartial({\n messages: [\n ...state.getState().messages,\n {\n id: input.id || genId(),\n type: \"FROM_USER\",\n content: input.content.text,\n deliveredAt: new Date().toISOString(),\n attachments: input.attachments,\n timestamp: new Date().toISOString()\n }\n ]\n });\n\n // Send message\n await options.api.handleMessage(message);\n } catch (error) {\n console.error(\"Error sending message:\", error);\n throw error;\n }\n };\n\n return {\n chatState: state,\n sessionState,\n sendMessage,\n createSession,\n clearSession,\n cleanup\n };\n} ","import { PubSub } from \"../types/pub-sub\";\nimport { ConsumerType } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { Platform } from \"../platform\";\n\ntype ContactOptions = {\n api: ApiCaller;\n botToken: string;\n platform: Platform;\n collectUserData?: boolean;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n};\n\nexport function createContact(options: ContactOptions) {\n const storageKey = `${options.botToken}:contact:${options.user?.external_id}`;\n\n // Initialize state from storage if available\n let initialState: ConsumerType | null = null;\n if (options.platform.storage) {\n const stored = options.platform.storage.getItem(storageKey);\n if (stored) {\n try {\n initialState = JSON.parse(stored);\n } catch (e) {\n console.error(\"Error parsing stored contact:\", e);\n }\n }\n }\n\n const state = new PubSub<ConsumerType | null>(initialState);\n\n // Subscribe to state changes to persist\n if (options.platform.storage) {\n state.subscribe((contact) => {\n if (contact) {\n options.platform.storage?.setItem(storageKey, JSON.stringify(contact));\n } else {\n options.platform.storage?.removeItem(storageKey);\n }\n });\n }\n\n function shouldCollectData(): { should: boolean; reason?: string } {\n const contact = state.getState();\n\n if (!contact?.id && options.collectUserData) {\n return {\n should: true,\n reason: \"No contact id and collectUserData is true\"\n };\n }\n\n return {\n should: false\n };\n }\n\n function cleanup() {\n state.clear();\n state.setState(null);\n }\n\n return {\n shouldCollectData,\n cleanup,\n contactState: state,\n };\n} ","type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;\ntype ResponseInterceptor = (response: Response) => Response | Promise<Response>;\ntype ErrorInterceptor = (error: any) => any;\n\ninterface RequestConfig extends RequestInit {\n baseURL?: string;\n headers?: HeadersInit;\n params?: Record<string, string>;\n}\n\nexport interface CustomFetch {\n (url: string, config?: RequestConfig): Promise<Response>;\n interceptors: {\n request: {\n use: (interceptor: RequestInterceptor) => number;\n eject: (id: number) => void;\n };\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => number;\n eject: (id: number) => void;\n };\n };\n}\n\nexport function createFetch(defaultConfig: RequestConfig = {}): CustomFetch {\n const requestInterceptors: RequestInterceptor[] = [];\n const responseInterceptors: ResponseInterceptor[] = [];\n const errorInterceptors: ErrorInterceptor[] = [];\n\n const customFetch: CustomFetch = async (url: string, config: RequestConfig = {}) => {\n // Merge configs\n let mergedConfig: RequestConfig = {\n ...defaultConfig,\n ...config,\n headers: {\n ...defaultConfig.headers,\n ...config.headers,\n },\n };\n\n try {\n // Apply request interceptors\n for (const interceptor of requestInterceptors) {\n mergedConfig = await interceptor(mergedConfig);\n }\n\n // Handle URL params\n const queryParams = mergedConfig.params\n ? '?' + new URLSearchParams(mergedConfig.params).toString()\n : '';\n\n // Construct full URL\n const fullUrl = mergedConfig.baseURL\n ? `${mergedConfig.baseURL}${url}${queryParams}`.replace(/([^:]\\/)\\/+/g, '$1')\n : `${url}${queryParams}`;\n\n // Make the fetch call\n let response = await fetch(fullUrl, mergedConfig);\n\n // Apply response interceptors\n for (const interceptor of responseInterceptors) {\n response = await interceptor(response);\n }\n\n return response;\n } catch (error) {\n // Apply error interceptors\n let processedError = error;\n for (const interceptor of errorInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n };\n\n // Add interceptors management\n customFetch.interceptors = {\n request: {\n use: (interceptor: RequestInterceptor) => {\n requestInterceptors.push(interceptor);\n return requestInterceptors.length - 1;\n },\n eject: (id: number) => {\n requestInterceptors.splice(id, 1);\n },\n },\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => {\n responseInterceptors.push(interceptor);\n if (errorInterceptor) {\n errorInterceptors.push(errorInterceptor);\n }\n return responseInterceptors.length - 1;\n },\n eject: (id: number) => {\n responseInterceptors.splice(id, 1);\n errorInterceptors.splice(id, 1);\n },\n },\n };\n\n return customFetch;\n}\n\n// Helper method to handle JSON responses\nexport async function handleJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n}\n\n// Usage example:\n/*\nconst api = createFetch({\n baseURL: 'https://api.example.com',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\n// Add request interceptor\napi.interceptors.request.use((config) => {\n config.headers = {\n ...config.headers,\n 'Authorization': `Bearer ${getToken()}`,\n };\n return config;\n});\n\n// Add response interceptor\napi.interceptors.response.use(\n async (response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response;\n },\n (error) => {\n console.error('Request failed:', error);\n throw error;\n }\n);\n*/\n","import { createFetch, CustomFetch } from \"../utils/create-fetch\";\nimport { HandleContactMessageOutputSchema, WidgetHistorySchema, WidgetPreludeSchema, WidgetSessionSchema } from \"../types/schemas-v2\";\nimport { CoreOptions, SendMessageInput, ConsumerType } from \"../types\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n coreOptions: CoreOptions;\n}\n\nexport class ApiCaller {\n #fetch: CustomFetch\n constructor(private readonly options: ApiCallerOptions) {\n const user = this.options.coreOptions.user;\n const consumerHeader = {\n claim: '',\n value: ''\n }\n\n if (user?.email) {\n consumerHeader.claim = 'email';\n consumerHeader.value = user.email;\n }\n\n else if (user?.phone) {\n consumerHeader.claim = 'phone';\n consumerHeader.value = user.phone;\n }\n\n const headers: Record<string, string> = {\n 'X-Bot-Token': this.options.token,\n 'X-Consumer-Id': `${consumerHeader.claim}:${consumerHeader.value}`\n }\n\n // Only add Authorization header if contactToken exists\n if (this.options.coreOptions.contactToken) {\n headers['Authorization'] = `Bearer ${this.options.coreOptions.contactToken}`\n }\n\n this.#fetch = createFetch({\n baseURL: `${this.options.apiUrl}/widget/v2`,\n headers\n })\n }\n\n async me(): Promise<{\n contactId: string;\n contactName: string;\n }> {\n // GET /me\n const response = await this.#fetch('/me')\n return response.json()\n }\n\n async widgetPrelude(): Promise<WidgetPreludeSchema> {\n // GET /prelude\n const response = await this.#fetch('/prelude')\n return response.json()\n }\n\n async handleMessage(message: SendMessageInput): Promise<HandleContactMessageOutputSchema> {\n // POST /chat/send\n const response = await this.#fetch('/chat/send', {\n method: \"POST\",\n body: JSON.stringify(message)\n })\n return response.json()\n }\n\n async getSessionHistory(sessionId: string, lastMessageTimestamp?: string): Promise<WidgetHistorySchema[]> {\n // session/history/:sessionId\n const queryParams = new URLSearchParams({\n lastMessageTimestamp: lastMessageTimestamp || ''\n })\n\n const url = `/session/history/${sessionId}?${queryParams.toString()}`\n\n const response = await this.#fetch(url, {\n method: 'GET'\n })\n\n return response.json()\n }\n\n async createSession(): Promise<WidgetSessionSchema> {\n // POST /create-session\n const response = await this.#fetch('/create-session', {\n method: 'POST'\n })\n return response.json()\n }\n\n async getSession(sessionId: string): Promise<WidgetSessionSchema> {\n // GET /session/:sessionId\n const response = await this.#fetch(`/session/${sessionId}`, {\n method: 'GET'\n })\n return response.json()\n }\n\n async createContact(user: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n }): Promise<ConsumerType> {\n const response = await this.#fetch('/contact/upsert', {\n method: 'POST',\n body: JSON.stringify(user)\n });\n return response.json();\n }\n}\n","export class OpenCXError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenCXError\";\n }\n}\n\nexport class ConnectionError extends OpenCXError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n\nexport class AuthenticationError extends OpenCXError {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class SessionError extends OpenCXError {\n constructor(message = \"Session error occurred\") {\n super(message);\n this.name = \"SessionError\";\n }\n}\n\nexport class SessionNotDefinedError extends SessionError {\n constructor(message = \"Session not defined\") {\n super(message);\n this.name = \"SessionNotDefinedError\";\n }\n}\n\nexport class TransportError extends OpenCXError {\n constructor(message = \"Transport error occurred\") {\n super(message);\n this.name = \"TransportError\";\n }\n}\n\nexport class FileUploadError extends OpenCXError {\n constructor(message = \"File upload failed\") {\n super(message);\n this.name = \"FileUploadError\";\n }\n}\n","export interface Platform {\n storage?: Storage;\n env: {\n platform: string;\n };\n date: {\n now(): number;\n toISOString(date: number): string;\n };\n}\n\nexport function createDefaultPlatform(): Platform {\n const detectPlatform = () => {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n };\n\n return {\n env: {\n platform: detectPlatform()\n },\n date: {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString()\n }\n };\n}\n","import { CoreOptions } from \"../types\";\n\nconst DEFAULT_SOUND_EFFECTS = {\n messageArrived: \"https://cloud.opencopilot.so/sfx/notification3.mp3\"\n};\n\nconst DEFAULT_THEME = {\n primaryColor: \"hsl(211,65%,59%)\",\n triggerOffset: \"20px\"\n};\n\ntype NormalizedConfig = Required<Omit<CoreOptions, 'contactToken'>> & {\n contactToken: string | undefined | null;\n soundEffectFiles: {\n messageArrived: string;\n };\n theme: {\n primaryColor: string;\n triggerOffset: string;\n };\n settings: {\n persistSession: boolean;\n useSoundEffects: boolean;\n };\n};\n\ntype ConfigInstance = {\n getConfig: () => NormalizedConfig;\n getApiConfig: () => {\n apiUrl: string;\n token: string;\n headers: Record<string, string>;\n queryParams: Record<string, string>;\n pathParams: Record<string, string>;\n };\n getBotConfig: () => NormalizedConfig['bot'];\n getThemeConfig: () => NormalizedConfig['theme'];\n getSettings: () => NormalizedConfig['settings'];\n getSoundEffects: () => NormalizedConfig['soundEffectFiles'];\n getUser: () => NormalizedConfig['user'];\n getLanguage: () => string;\n getDebugMode: () => boolean;\n};\n\nexport function createConfig(options: CoreOptions): ConfigInstance {\n const normalizedConfig: NormalizedConfig = {\n ...options,\n apiUrl: options.apiUrl ?? \"https://api-v2.opencopilot.so/backend\",\n socketUrl: options.socketUrl ?? \"https://api-v2.opencopilot.so\",\n transport: options.transport ?? 'socket',\n pollingInterval: options.pollingInterval ?? 3000,\n headers: {\n ...(options.headers ?? {}),\n \"X-Bot-Token\": options.token,\n },\n queryParams: options.queryParams ?? {},\n pathParams: options.pathParams ?? {},\n bot: {\n name: options.bot?.name ?? \"Bot\",\n avatarUrl: options.bot?.avatarUrl,\n id: options.bot?.id ?? null,\n is_ai: options.bot?.is_ai ?? true\n },\n contactToken: options.contactToken,\n debug: options.debug ?? false,\n language: options.language ?? \"en\",\n user: options.user ?? {},\n soundEffectFiles: {\n messageArrived: options.soundEffectFiles?.messageArrived ?? DEFAULT_SOUND_EFFECTS.messageArrived\n },\n theme: {\n primaryColor: options.theme?.primaryColor ?? DEFAULT_THEME.primaryColor,\n triggerOffset: options.theme?.triggerOffset ?? DEFAULT_THEME.triggerOffset\n },\n settings: {\n persistSession: options.settings?.persistSession ?? false,\n useSoundEffects: options.settings?.useSoundEffects ?? false\n }\n };\n\n return {\n getConfig: () => normalizedConfig,\n getApiConfig: () => ({\n apiUrl: normalizedConfig.apiUrl,\n token: normalizedConfig.token,\n headers: normalizedConfig.headers,\n queryParams: normalizedConfig.queryParams,\n pathParams: normalizedConfig.pathParams\n }),\n getBotConfig: () => normalizedConfig.bot,\n getThemeConfig: () => normalizedConfig.theme,\n getSettings: () => normalizedConfig.settings,\n getSoundEffects: () => normalizedConfig.soundEffectFiles,\n getUser: () => normalizedConfig.user,\n getLanguage: () => normalizedConfig.language,\n getDebugMode: () => normalizedConfig.debug\n };\n} "],"names":["PubSub","state","__publicField","__privateAdd","_state","__privateSet","callback","__privateGet","newState","_s","createPubSub","SESSION_POLLING_INTERVAL","MESSAGE_POLLING_INTERVAL","mapHistoryToMessage","history","genId","_a","_b","_c","startPolling","api","sessionState","intervals","session","response","error","messages","createChat","options","stopPolling","createSession","clearSession","cleanup","input","message","createContact","storageKey","initialState","stored","e","contact","shouldCollectData","createFetch","defaultConfig","requestInterceptors","responseInterceptors","errorInterceptors","customFetch","url","config","mergedConfig","interceptor","queryParams","fullUrl","processedError","id","errorInterceptor","ApiCaller","_fetch","user","consumerHeader","headers","sessionId","lastMessageTimestamp","OpenCXError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError","createDefaultPlatform","date","DEFAULT_SOUND_EFFECTS","DEFAULT_THEME","createConfig","normalizedConfig","_d","_e","_f","_g","_h","_i"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,19 +1,19 @@
1
1
  var P = Object.defineProperty;
2
- var O = (t) => {
2
+ var w = (t) => {
3
3
  throw TypeError(t);
4
4
  };
5
5
  var v = (t, e, s) => e in t ? P(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;
6
- var E = (t, e, s) => v(t, typeof e != "symbol" ? e + "" : e, s), U = (t, e, s) => e.has(t) || O("Cannot " + s);
7
- var d = (t, e, s) => (U(t, e, "read from private field"), s ? s.call(t) : e.get(t)), y = (t, e, s) => e.has(t) ? O("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, s), f = (t, e, s, r) => (U(t, e, "write to private field"), r ? r.call(t, s) : e.set(t, s), s);
8
- import { g as w } from "./schemas-BBAV6Sd_.js";
6
+ var E = (t, e, s) => v(t, typeof e != "symbol" ? e + "" : e, s), O = (t, e, s) => e.has(t) || w("Cannot " + s);
7
+ var d = (t, e, s) => (O(t, e, "read from private field"), s ? s.call(t) : e.get(t)), b = (t, e, s) => e.has(t) ? w("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(t) : e.set(t, s), f = (t, e, s, r) => (O(t, e, "write to private field"), r ? r.call(t, s) : e.set(t, s), s);
8
+ import { g as y } from "./schemas-BBAV6Sd_.js";
9
9
  import { A as V, M as K, b as Q, a as W, S as Y, d as Z, e as ee, c as te, f as se, s as re } from "./schemas-BBAV6Sd_.js";
10
- var g;
10
+ var h;
11
11
  class S {
12
12
  constructor(e) {
13
13
  E(this, "subscribers", /* @__PURE__ */ new Set());
14
- y(this, g);
14
+ b(this, h);
15
15
  E(this, "initialState");
16
- f(this, g, e), this.initialState = e;
16
+ f(this, h, e), this.initialState = e;
17
17
  }
18
18
  /**
19
19
  * Subscribe to state changes
@@ -29,17 +29,17 @@ class S {
29
29
  * Get the current state
30
30
  */
31
31
  getState() {
32
- return d(this, g);
32
+ return d(this, h);
33
33
  }
34
34
  /**
35
35
  * Set the state and notify subscribers if the state changes
36
36
  * @param newState The new state to set
37
37
  */
38
38
  setState(e) {
39
- d(this, g) !== e && (f(this, g, e), this.subscribers.forEach((s) => s(e)));
39
+ d(this, h) !== e && (f(this, h, e), this.subscribers.forEach((s) => s(e)));
40
40
  }
41
41
  setStatePartial(e) {
42
- const s = { ...d(this, g), ...e };
42
+ const s = { ...d(this, h), ...e };
43
43
  this.setState(s);
44
44
  }
45
45
  /**
@@ -52,13 +52,13 @@ class S {
52
52
  this.setState(this.initialState);
53
53
  }
54
54
  getSnapshot() {
55
- return d(this, g);
55
+ return d(this, h);
56
56
  }
57
57
  get state() {
58
- return d(this, g);
58
+ return d(this, h);
59
59
  }
60
60
  }
61
- g = new WeakMap();
61
+ h = new WeakMap();
62
62
  function $(t) {
63
63
  return new S(t);
64
64
  }
@@ -66,14 +66,14 @@ const I = 1e4, T = 5e3;
66
66
  function C(t) {
67
67
  var e, s, r;
68
68
  return t.sender.kind === "user" ? {
69
- id: t.publicId || w(),
69
+ id: t.publicId || y(),
70
70
  type: "FROM_USER",
71
71
  content: t.content.text || "",
72
72
  deliveredAt: ((e = t.sentAt) == null ? void 0 : e.toISOString()) || null,
73
73
  attachments: t.attachments || void 0,
74
74
  timestamp: (s = t.sentAt) == null ? void 0 : s.toISOString()
75
75
  } : {
76
- id: t.publicId || w(),
76
+ id: t.publicId || y(),
77
77
  type: "FROM_BOT",
78
78
  component: t.type,
79
79
  data: {
@@ -163,7 +163,7 @@ function L(t) {
163
163
  messages: [
164
164
  ...e.getState().messages,
165
165
  {
166
- id: o.id || w(),
166
+ id: o.id || y(),
167
167
  type: "FROM_USER",
168
168
  content: o.content.text,
169
169
  deliveredAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -257,10 +257,10 @@ function k(t = {}) {
257
257
  }
258
258
  }, n;
259
259
  }
260
- var h;
260
+ var g;
261
261
  class _ {
262
262
  constructor(e) {
263
- y(this, h);
263
+ b(this, g);
264
264
  this.options = e;
265
265
  const s = this.options.coreOptions.user, r = {
266
266
  claim: "",
@@ -271,19 +271,19 @@ class _ {
271
271
  "X-Bot-Token": this.options.token,
272
272
  "X-Consumer-Id": `${r.claim}:${r.value}`
273
273
  };
274
- this.options.coreOptions.contactToken && (n.Authorization = `Bearer ${this.options.coreOptions.contactToken}`), f(this, h, k({
274
+ this.options.coreOptions.contactToken && (n.Authorization = `Bearer ${this.options.coreOptions.contactToken}`), f(this, g, k({
275
275
  baseURL: `${this.options.apiUrl}/widget/v2`,
276
276
  headers: n
277
277
  }));
278
278
  }
279
279
  async me() {
280
- return (await d(this, h).call(this, "/me")).json();
280
+ return (await d(this, g).call(this, "/me")).json();
281
281
  }
282
282
  async widgetPrelude() {
283
- return (await d(this, h).call(this, "/prelude")).json();
283
+ return (await d(this, g).call(this, "/prelude")).json();
284
284
  }
285
285
  async handleMessage(e) {
286
- return (await d(this, h).call(this, "/chat/send", {
286
+ return (await d(this, g).call(this, "/chat/send", {
287
287
  method: "POST",
288
288
  body: JSON.stringify(e)
289
289
  })).json();
@@ -292,28 +292,28 @@ class _ {
292
292
  const r = new URLSearchParams({
293
293
  lastMessageTimestamp: s || ""
294
294
  }), n = `/session/history/${e}?${r.toString()}`;
295
- return (await d(this, h).call(this, n, {
295
+ return (await d(this, g).call(this, n, {
296
296
  method: "GET"
297
297
  })).json();
298
298
  }
299
299
  async createSession() {
300
- return (await d(this, h).call(this, "/create-session", {
300
+ return (await d(this, g).call(this, "/create-session", {
301
301
  method: "POST"
302
302
  })).json();
303
303
  }
304
304
  async getSession(e) {
305
- return (await d(this, h).call(this, `/session/${e}`, {
305
+ return (await d(this, g).call(this, `/session/${e}`, {
306
306
  method: "GET"
307
307
  })).json();
308
308
  }
309
309
  async createContact(e) {
310
- return (await d(this, h).call(this, "/contact/upsert", {
310
+ return (await d(this, g).call(this, "/contact/upsert", {
311
311
  method: "POST",
312
312
  body: JSON.stringify(e)
313
313
  })).json();
314
314
  }
315
315
  }
316
- h = new WeakMap();
316
+ g = new WeakMap();
317
317
  class p extends Error {
318
318
  constructor(e) {
319
319
  super(e), this.name = "OpenCXError";
@@ -362,13 +362,12 @@ function G() {
362
362
  }
363
363
  const D = {
364
364
  messageArrived: "https://cloud.opencopilot.so/sfx/notification3.mp3"
365
- }, b = {
366
- headerStyle: "basic",
365
+ }, U = {
367
366
  primaryColor: "hsl(211,65%,59%)",
368
367
  triggerOffset: "20px"
369
368
  };
370
369
  function X(t) {
371
- var s, r, n, a, l, c, o, i, u, m;
370
+ var s, r, n, a, l, c, o, i, u;
372
371
  const e = {
373
372
  ...t,
374
373
  apiUrl: t.apiUrl ?? "https://api-v2.opencopilot.so/backend",
@@ -395,13 +394,12 @@ function X(t) {
395
394
  messageArrived: ((l = t.soundEffectFiles) == null ? void 0 : l.messageArrived) ?? D.messageArrived
396
395
  },
397
396
  theme: {
398
- headerStyle: ((c = t.theme) == null ? void 0 : c.headerStyle) ?? b.headerStyle,
399
- primaryColor: ((o = t.theme) == null ? void 0 : o.primaryColor) ?? b.primaryColor,
400
- triggerOffset: ((i = t.theme) == null ? void 0 : i.triggerOffset) ?? b.triggerOffset
397
+ primaryColor: ((c = t.theme) == null ? void 0 : c.primaryColor) ?? U.primaryColor,
398
+ triggerOffset: ((o = t.theme) == null ? void 0 : o.triggerOffset) ?? U.triggerOffset
401
399
  },
402
400
  settings: {
403
- persistSession: ((u = t.settings) == null ? void 0 : u.persistSession) ?? !1,
404
- useSoundEffects: ((m = t.settings) == null ? void 0 : m.useSoundEffects) ?? !1
401
+ persistSession: ((i = t.settings) == null ? void 0 : i.persistSession) ?? !1,
402
+ useSoundEffects: ((u = t.settings) == null ? void 0 : u.useSoundEffects) ?? !1
405
403
  }
406
404
  };
407
405
  return {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../core/types/pub-sub.ts","../core/client/chat.ts","../core/client/contact.ts","../core/utils/create-fetch.ts","../core/client/api.ts","../core/errors/index.ts","../core/platform/index.ts","../core/client/config.ts"],"sourcesContent":["export type Subscriber<T> = (data: T) => void\n\nexport class PubSub<S> {\n private subscribers = new Set<Subscriber<S>>();\n #state: S;\n private initialState: S;\n\n constructor(state: S) {\n this.#state = state;\n this.initialState = state;\n }\n\n /**\n * Subscribe to state changes\n * @param callback Function to call when state changes\n * @returns Unsubscribe function\n */\n subscribe(callback: Subscriber<S>): () => void {\n this.subscribers.add(callback);\n\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Get the current state\n */\n getState(): S {\n return this.#state;\n }\n\n /**\n * Set the state and notify subscribers if the state changes\n * @param newState The new state to set\n */\n setState(newState: S): void {\n if (this.#state !== newState) {\n this.#state = newState;\n this.subscribers.forEach(callback => callback(newState));\n }\n }\n\n setStatePartial(_s: Partial<S>): void {\n const newState = { ...this.#state, ..._s };\n this.setState(newState);\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n\n reset(): void {\n this.setState(this.initialState);\n }\n\n getSnapshot(): S {\n return this.#state;\n }\n\n get state(): S {\n return this.#state;\n }\n}\n\nexport function createPubSub<S>(state: S): PubSub<S> {\n return new PubSub<S>(state);\n}","import { PubSub } from \"../types/pub-sub\";\nimport { MessageType, UserMessageType, SendMessageInput } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { genId } from \"../utils/genId\";\nimport { WidgetHistorySchema, WidgetSessionSchema } from \"../types/schemas-v2\";\n\nconst SESSION_POLLING_INTERVAL = 10000; // every 10 seconds\nconst MESSAGE_POLLING_INTERVAL = 5000; // every 5 seconds\n\ntype ChatState = {\n lastUpdated: number | null;\n messages: MessageType[];\n keyboard: { options: string[] } | null;\n};\n\ntype ChatOptions = {\n api: ApiCaller;\n persistSession?: boolean;\n useSoundEffects?: boolean;\n onSessionDestroy?: () => void;\n};\n\n\nfunction mapHistoryToMessage(history: WidgetHistorySchema): MessageType {\n if (history.sender.kind === 'user') {\n return {\n id: history.publicId || genId(),\n type: \"FROM_USER\",\n content: history.content.text || \"\",\n deliveredAt: history.sentAt?.toISOString() || null,\n attachments: history.attachments || undefined,\n timestamp: history.sentAt?.toISOString()\n };\n }\n\n return {\n id: history.publicId || genId(),\n type: \"FROM_BOT\",\n component: history.type,\n data: {\n text: history.content.text\n },\n timestamp: history.sentAt?.toISOString(),\n attachments: history.attachments || undefined\n };\n}\n\nfunction startPolling(\n api: ApiCaller,\n sessionState: PubSub<WidgetSessionSchema | null>,\n state: PubSub<ChatState>\n) {\n const intervals: NodeJS.Timeout[] = [];\n\n // Poll session\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSession(session.id);\n if (response) {\n sessionState.setState(response);\n }\n } catch (error) {\n console.error(\"Error polling session:\", error);\n }\n }, SESSION_POLLING_INTERVAL)\n );\n\n // Poll messages\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSessionHistory(session.id);\n if (response) {\n const messages = response.map(mapHistoryToMessage);\n state.setStatePartial({\n messages,\n lastUpdated: Date.now()\n });\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n }\n }, MESSAGE_POLLING_INTERVAL)\n );\n\n return () => intervals.forEach(clearInterval);\n}\n\nexport function createChat(options: ChatOptions) {\n const state = new PubSub<ChatState>({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n\n const sessionState = new PubSub<WidgetSessionSchema | null>(null);\n let stopPolling: (() => void) | null = null;\n\n async function createSession() {\n const session = await options.api.createSession();\n sessionState.setState(session);\n if (!stopPolling) {\n stopPolling = startPolling(options.api, sessionState, state);\n }\n return session;\n }\n\n async function clearSession() {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n sessionState.setState(null);\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n options.onSessionDestroy?.();\n } catch (error) {\n console.error(\"Error clearing session:\", error);\n throw error;\n }\n }\n\n function cleanup() {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n sessionState.setState(null);\n state.clear();\n sessionState.clear();\n }\n\n const sendMessage = async (input: {\n content: { text: string };\n attachments?: any[];\n id?: string;\n language?: string;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n }) => {\n const session = sessionState.getState();\n if (!session?.id) {\n throw new Error(\"No active session\");\n }\n\n const message: SendMessageInput = {\n ...input,\n session_id: session.id\n };\n\n try {\n // Add message to local state first\n state.setStatePartial({\n messages: [\n ...state.getState().messages,\n {\n id: input.id || genId(),\n type: \"FROM_USER\",\n content: input.content.text,\n deliveredAt: new Date().toISOString(),\n attachments: input.attachments,\n timestamp: new Date().toISOString()\n }\n ]\n });\n\n // Send message\n await options.api.handleMessage(message);\n } catch (error) {\n console.error(\"Error sending message:\", error);\n throw error;\n }\n };\n\n return {\n chatState: state,\n sessionState,\n sendMessage,\n createSession,\n clearSession,\n cleanup\n };\n} ","import { PubSub } from \"../types/pub-sub\";\nimport { ConsumerType } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { Platform } from \"../platform\";\n\ntype ContactOptions = {\n api: ApiCaller;\n botToken: string;\n platform: Platform;\n collectUserData?: boolean;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n};\n\nexport function createContact(options: ContactOptions) {\n const storageKey = `${options.botToken}:contact:${options.user?.external_id}`;\n\n // Initialize state from storage if available\n let initialState: ConsumerType | null = null;\n if (options.platform.storage) {\n const stored = options.platform.storage.getItem(storageKey);\n if (stored) {\n try {\n initialState = JSON.parse(stored);\n } catch (e) {\n console.error(\"Error parsing stored contact:\", e);\n }\n }\n }\n\n const state = new PubSub<ConsumerType | null>(initialState);\n\n // Subscribe to state changes to persist\n if (options.platform.storage) {\n state.subscribe((contact) => {\n if (contact) {\n options.platform.storage?.setItem(storageKey, JSON.stringify(contact));\n } else {\n options.platform.storage?.removeItem(storageKey);\n }\n });\n }\n\n function shouldCollectData(): { should: boolean; reason?: string } {\n const contact = state.getState();\n\n if (!contact?.id && options.collectUserData) {\n return {\n should: true,\n reason: \"No contact id and collectUserData is true\"\n };\n }\n\n return {\n should: false\n };\n }\n\n function cleanup() {\n state.clear();\n state.setState(null);\n }\n\n return {\n shouldCollectData,\n cleanup,\n contactState: state,\n };\n} ","type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;\ntype ResponseInterceptor = (response: Response) => Response | Promise<Response>;\ntype ErrorInterceptor = (error: any) => any;\n\ninterface RequestConfig extends RequestInit {\n baseURL?: string;\n headers?: HeadersInit;\n params?: Record<string, string>;\n}\n\nexport interface CustomFetch {\n (url: string, config?: RequestConfig): Promise<Response>;\n interceptors: {\n request: {\n use: (interceptor: RequestInterceptor) => number;\n eject: (id: number) => void;\n };\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => number;\n eject: (id: number) => void;\n };\n };\n}\n\nexport function createFetch(defaultConfig: RequestConfig = {}): CustomFetch {\n const requestInterceptors: RequestInterceptor[] = [];\n const responseInterceptors: ResponseInterceptor[] = [];\n const errorInterceptors: ErrorInterceptor[] = [];\n\n const customFetch: CustomFetch = async (url: string, config: RequestConfig = {}) => {\n // Merge configs\n let mergedConfig: RequestConfig = {\n ...defaultConfig,\n ...config,\n headers: {\n ...defaultConfig.headers,\n ...config.headers,\n },\n };\n\n try {\n // Apply request interceptors\n for (const interceptor of requestInterceptors) {\n mergedConfig = await interceptor(mergedConfig);\n }\n\n // Handle URL params\n const queryParams = mergedConfig.params\n ? '?' + new URLSearchParams(mergedConfig.params).toString()\n : '';\n\n // Construct full URL\n const fullUrl = mergedConfig.baseURL\n ? `${mergedConfig.baseURL}${url}${queryParams}`.replace(/([^:]\\/)\\/+/g, '$1')\n : `${url}${queryParams}`;\n\n // Make the fetch call\n let response = await fetch(fullUrl, mergedConfig);\n\n // Apply response interceptors\n for (const interceptor of responseInterceptors) {\n response = await interceptor(response);\n }\n\n return response;\n } catch (error) {\n // Apply error interceptors\n let processedError = error;\n for (const interceptor of errorInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n };\n\n // Add interceptors management\n customFetch.interceptors = {\n request: {\n use: (interceptor: RequestInterceptor) => {\n requestInterceptors.push(interceptor);\n return requestInterceptors.length - 1;\n },\n eject: (id: number) => {\n requestInterceptors.splice(id, 1);\n },\n },\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => {\n responseInterceptors.push(interceptor);\n if (errorInterceptor) {\n errorInterceptors.push(errorInterceptor);\n }\n return responseInterceptors.length - 1;\n },\n eject: (id: number) => {\n responseInterceptors.splice(id, 1);\n errorInterceptors.splice(id, 1);\n },\n },\n };\n\n return customFetch;\n}\n\n// Helper method to handle JSON responses\nexport async function handleJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n}\n\n// Usage example:\n/*\nconst api = createFetch({\n baseURL: 'https://api.example.com',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\n// Add request interceptor\napi.interceptors.request.use((config) => {\n config.headers = {\n ...config.headers,\n 'Authorization': `Bearer ${getToken()}`,\n };\n return config;\n});\n\n// Add response interceptor\napi.interceptors.response.use(\n async (response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response;\n },\n (error) => {\n console.error('Request failed:', error);\n throw error;\n }\n);\n*/\n","import { createFetch, CustomFetch } from \"../utils/create-fetch\";\nimport { HandleContactMessageOutputSchema, WidgetHistorySchema, WidgetPreludeSchema, WidgetSessionSchema } from \"../types/schemas-v2\";\nimport { CoreOptions, SendMessageInput, ConsumerType } from \"../types\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n coreOptions: CoreOptions;\n}\n\nexport class ApiCaller {\n #fetch: CustomFetch\n constructor(private readonly options: ApiCallerOptions) {\n const user = this.options.coreOptions.user;\n const consumerHeader = {\n claim: '',\n value: ''\n }\n\n if (user?.email) {\n consumerHeader.claim = 'email';\n consumerHeader.value = user.email;\n }\n\n else if (user?.phone) {\n consumerHeader.claim = 'phone';\n consumerHeader.value = user.phone;\n }\n\n const headers: Record<string, string> = {\n 'X-Bot-Token': this.options.token,\n 'X-Consumer-Id': `${consumerHeader.claim}:${consumerHeader.value}`\n }\n\n // Only add Authorization header if contactToken exists\n if (this.options.coreOptions.contactToken) {\n headers['Authorization'] = `Bearer ${this.options.coreOptions.contactToken}`\n }\n\n this.#fetch = createFetch({\n baseURL: `${this.options.apiUrl}/widget/v2`,\n headers\n })\n }\n\n async me(): Promise<{\n contactId: string;\n contactName: string;\n }> {\n // GET /me\n const response = await this.#fetch('/me')\n return response.json()\n }\n\n async widgetPrelude(): Promise<WidgetPreludeSchema> {\n // GET /prelude\n const response = await this.#fetch('/prelude')\n return response.json()\n }\n\n async handleMessage(message: SendMessageInput): Promise<HandleContactMessageOutputSchema> {\n // POST /chat/send\n const response = await this.#fetch('/chat/send', {\n method: \"POST\",\n body: JSON.stringify(message)\n })\n return response.json()\n }\n\n async getSessionHistory(sessionId: string, lastMessageTimestamp?: string): Promise<WidgetHistorySchema[]> {\n // session/history/:sessionId\n const queryParams = new URLSearchParams({\n lastMessageTimestamp: lastMessageTimestamp || ''\n })\n\n const url = `/session/history/${sessionId}?${queryParams.toString()}`\n\n const response = await this.#fetch(url, {\n method: 'GET'\n })\n\n return response.json()\n }\n\n async createSession(): Promise<WidgetSessionSchema> {\n // POST /create-session\n const response = await this.#fetch('/create-session', {\n method: 'POST'\n })\n return response.json()\n }\n\n async getSession(sessionId: string): Promise<WidgetSessionSchema> {\n // GET /session/:sessionId\n const response = await this.#fetch(`/session/${sessionId}`, {\n method: 'GET'\n })\n return response.json()\n }\n\n async createContact(user: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n }): Promise<ConsumerType> {\n const response = await this.#fetch('/contact/upsert', {\n method: 'POST',\n body: JSON.stringify(user)\n });\n return response.json();\n }\n}\n","export class OpenCXError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenCXError\";\n }\n}\n\nexport class ConnectionError extends OpenCXError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n\nexport class AuthenticationError extends OpenCXError {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class SessionError extends OpenCXError {\n constructor(message = \"Session error occurred\") {\n super(message);\n this.name = \"SessionError\";\n }\n}\n\nexport class SessionNotDefinedError extends SessionError {\n constructor(message = \"Session not defined\") {\n super(message);\n this.name = \"SessionNotDefinedError\";\n }\n}\n\nexport class TransportError extends OpenCXError {\n constructor(message = \"Transport error occurred\") {\n super(message);\n this.name = \"TransportError\";\n }\n}\n\nexport class FileUploadError extends OpenCXError {\n constructor(message = \"File upload failed\") {\n super(message);\n this.name = \"FileUploadError\";\n }\n}\n","export interface Platform {\n storage?: Storage;\n env: {\n platform: string;\n };\n date: {\n now(): number;\n toISOString(date: number): string;\n };\n}\n\nexport function createDefaultPlatform(): Platform {\n const detectPlatform = () => {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n };\n\n return {\n env: {\n platform: detectPlatform()\n },\n date: {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString()\n }\n };\n}\n","import { CoreOptions } from \"../types\";\n\nconst DEFAULT_SOUND_EFFECTS = {\n messageArrived: \"https://cloud.opencopilot.so/sfx/notification3.mp3\"\n};\n\nconst DEFAULT_THEME = {\n headerStyle: \"basic\" as const,\n primaryColor: \"hsl(211,65%,59%)\",\n triggerOffset: \"20px\"\n};\n\ntype NormalizedConfig = Required<Omit<CoreOptions, 'contactToken'>> & {\n contactToken: string | undefined | null;\n soundEffectFiles: {\n messageArrived: string;\n };\n theme: {\n headerStyle: \"compact\" | \"basic\";\n primaryColor: string;\n triggerOffset: string;\n };\n settings: {\n persistSession: boolean;\n useSoundEffects: boolean;\n };\n};\n\ntype ConfigInstance = {\n getConfig: () => NormalizedConfig;\n getApiConfig: () => {\n apiUrl: string;\n token: string;\n headers: Record<string, string>;\n queryParams: Record<string, string>;\n pathParams: Record<string, string>;\n };\n getBotConfig: () => NormalizedConfig['bot'];\n getThemeConfig: () => NormalizedConfig['theme'];\n getSettings: () => NormalizedConfig['settings'];\n getSoundEffects: () => NormalizedConfig['soundEffectFiles'];\n getUser: () => NormalizedConfig['user'];\n getLanguage: () => string;\n getDebugMode: () => boolean;\n};\n\nexport function createConfig(options: CoreOptions): ConfigInstance {\n const normalizedConfig: NormalizedConfig = {\n ...options,\n apiUrl: options.apiUrl ?? \"https://api-v2.opencopilot.so/backend\",\n socketUrl: options.socketUrl ?? \"https://api-v2.opencopilot.so\",\n transport: options.transport ?? 'socket',\n pollingInterval: options.pollingInterval ?? 3000,\n headers: {\n ...(options.headers ?? {}),\n \"X-Bot-Token\": options.token,\n },\n queryParams: options.queryParams ?? {},\n pathParams: options.pathParams ?? {},\n bot: {\n name: options.bot?.name ?? \"Bot\",\n avatarUrl: options.bot?.avatarUrl,\n id: options.bot?.id ?? null,\n is_ai: options.bot?.is_ai ?? true\n },\n contactToken: options.contactToken,\n debug: options.debug ?? false,\n language: options.language ?? \"en\",\n user: options.user ?? {},\n soundEffectFiles: {\n messageArrived: options.soundEffectFiles?.messageArrived ?? DEFAULT_SOUND_EFFECTS.messageArrived\n },\n theme: {\n headerStyle: options.theme?.headerStyle ?? DEFAULT_THEME.headerStyle,\n primaryColor: options.theme?.primaryColor ?? DEFAULT_THEME.primaryColor,\n triggerOffset: options.theme?.triggerOffset ?? DEFAULT_THEME.triggerOffset\n },\n settings: {\n persistSession: options.settings?.persistSession ?? false,\n useSoundEffects: options.settings?.useSoundEffects ?? false\n }\n };\n\n return {\n getConfig: () => normalizedConfig,\n getApiConfig: () => ({\n apiUrl: normalizedConfig.apiUrl,\n token: normalizedConfig.token,\n headers: normalizedConfig.headers,\n queryParams: normalizedConfig.queryParams,\n pathParams: normalizedConfig.pathParams\n }),\n getBotConfig: () => normalizedConfig.bot,\n getThemeConfig: () => normalizedConfig.theme,\n getSettings: () => normalizedConfig.settings,\n getSoundEffects: () => normalizedConfig.soundEffectFiles,\n getUser: () => normalizedConfig.user,\n getLanguage: () => normalizedConfig.language,\n getDebugMode: () => normalizedConfig.debug\n };\n} "],"names":["PubSub","state","__publicField","__privateAdd","_state","__privateSet","callback","__privateGet","newState","_s","createPubSub","SESSION_POLLING_INTERVAL","MESSAGE_POLLING_INTERVAL","mapHistoryToMessage","history","genId","_a","_b","_c","startPolling","api","sessionState","intervals","session","response","error","messages","createChat","options","stopPolling","createSession","clearSession","cleanup","input","message","createContact","storageKey","initialState","stored","e","contact","shouldCollectData","createFetch","defaultConfig","requestInterceptors","responseInterceptors","errorInterceptors","customFetch","url","config","mergedConfig","interceptor","queryParams","fullUrl","processedError","id","errorInterceptor","ApiCaller","_fetch","user","consumerHeader","headers","sessionId","lastMessageTimestamp","OpenCXError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError","createDefaultPlatform","date","DEFAULT_SOUND_EFFECTS","DEFAULT_THEME","createConfig","normalizedConfig","_d","_e","_f","_g","_h","_i","_j"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../core/types/pub-sub.ts","../core/client/chat.ts","../core/client/contact.ts","../core/utils/create-fetch.ts","../core/client/api.ts","../core/errors/index.ts","../core/platform/index.ts","../core/client/config.ts"],"sourcesContent":["export type Subscriber<T> = (data: T) => void\n\nexport class PubSub<S> {\n private subscribers = new Set<Subscriber<S>>();\n #state: S;\n private initialState: S;\n\n constructor(state: S) {\n this.#state = state;\n this.initialState = state;\n }\n\n /**\n * Subscribe to state changes\n * @param callback Function to call when state changes\n * @returns Unsubscribe function\n */\n subscribe(callback: Subscriber<S>): () => void {\n this.subscribers.add(callback);\n\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Get the current state\n */\n getState(): S {\n return this.#state;\n }\n\n /**\n * Set the state and notify subscribers if the state changes\n * @param newState The new state to set\n */\n setState(newState: S): void {\n if (this.#state !== newState) {\n this.#state = newState;\n this.subscribers.forEach(callback => callback(newState));\n }\n }\n\n setStatePartial(_s: Partial<S>): void {\n const newState = { ...this.#state, ..._s };\n this.setState(newState);\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n\n reset(): void {\n this.setState(this.initialState);\n }\n\n getSnapshot(): S {\n return this.#state;\n }\n\n get state(): S {\n return this.#state;\n }\n}\n\nexport function createPubSub<S>(state: S): PubSub<S> {\n return new PubSub<S>(state);\n}","import { PubSub } from \"../types/pub-sub\";\nimport { MessageType, UserMessageType, SendMessageInput } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { genId } from \"../utils/genId\";\nimport { WidgetHistorySchema, WidgetSessionSchema } from \"../types/schemas-v2\";\n\nconst SESSION_POLLING_INTERVAL = 10000; // every 10 seconds\nconst MESSAGE_POLLING_INTERVAL = 5000; // every 5 seconds\n\ntype ChatState = {\n lastUpdated: number | null;\n messages: MessageType[];\n keyboard: { options: string[] } | null;\n};\n\ntype ChatOptions = {\n api: ApiCaller;\n persistSession?: boolean;\n useSoundEffects?: boolean;\n onSessionDestroy?: () => void;\n};\n\n\nfunction mapHistoryToMessage(history: WidgetHistorySchema): MessageType {\n if (history.sender.kind === 'user') {\n return {\n id: history.publicId || genId(),\n type: \"FROM_USER\",\n content: history.content.text || \"\",\n deliveredAt: history.sentAt?.toISOString() || null,\n attachments: history.attachments || undefined,\n timestamp: history.sentAt?.toISOString()\n };\n }\n\n return {\n id: history.publicId || genId(),\n type: \"FROM_BOT\",\n component: history.type,\n data: {\n text: history.content.text\n },\n timestamp: history.sentAt?.toISOString(),\n attachments: history.attachments || undefined\n };\n}\n\nfunction startPolling(\n api: ApiCaller,\n sessionState: PubSub<WidgetSessionSchema | null>,\n state: PubSub<ChatState>\n) {\n const intervals: NodeJS.Timeout[] = [];\n\n // Poll session\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSession(session.id);\n if (response) {\n sessionState.setState(response);\n }\n } catch (error) {\n console.error(\"Error polling session:\", error);\n }\n }, SESSION_POLLING_INTERVAL)\n );\n\n // Poll messages\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n const response = await api.getSessionHistory(session.id);\n if (response) {\n const messages = response.map(mapHistoryToMessage);\n state.setStatePartial({\n messages,\n lastUpdated: Date.now()\n });\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n }\n }, MESSAGE_POLLING_INTERVAL)\n );\n\n return () => intervals.forEach(clearInterval);\n}\n\nexport function createChat(options: ChatOptions) {\n const state = new PubSub<ChatState>({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n\n const sessionState = new PubSub<WidgetSessionSchema | null>(null);\n let stopPolling: (() => void) | null = null;\n\n async function createSession() {\n const session = await options.api.createSession();\n sessionState.setState(session);\n if (!stopPolling) {\n stopPolling = startPolling(options.api, sessionState, state);\n }\n return session;\n }\n\n async function clearSession() {\n const session = sessionState.getState();\n if (!session?.id) return;\n\n try {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n sessionState.setState(null);\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n options.onSessionDestroy?.();\n } catch (error) {\n console.error(\"Error clearing session:\", error);\n throw error;\n }\n }\n\n function cleanup() {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n state.setState({\n lastUpdated: null,\n messages: [],\n keyboard: null\n });\n sessionState.setState(null);\n state.clear();\n sessionState.clear();\n }\n\n const sendMessage = async (input: {\n content: { text: string };\n attachments?: any[];\n id?: string;\n language?: string;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n }) => {\n const session = sessionState.getState();\n if (!session?.id) {\n throw new Error(\"No active session\");\n }\n\n const message: SendMessageInput = {\n ...input,\n session_id: session.id\n };\n\n try {\n // Add message to local state first\n state.setStatePartial({\n messages: [\n ...state.getState().messages,\n {\n id: input.id || genId(),\n type: \"FROM_USER\",\n content: input.content.text,\n deliveredAt: new Date().toISOString(),\n attachments: input.attachments,\n timestamp: new Date().toISOString()\n }\n ]\n });\n\n // Send message\n await options.api.handleMessage(message);\n } catch (error) {\n console.error(\"Error sending message:\", error);\n throw error;\n }\n };\n\n return {\n chatState: state,\n sessionState,\n sendMessage,\n createSession,\n clearSession,\n cleanup\n };\n} ","import { PubSub } from \"../types/pub-sub\";\nimport { ConsumerType } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { Platform } from \"../platform\";\n\ntype ContactOptions = {\n api: ApiCaller;\n botToken: string;\n platform: Platform;\n collectUserData?: boolean;\n user?: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n };\n};\n\nexport function createContact(options: ContactOptions) {\n const storageKey = `${options.botToken}:contact:${options.user?.external_id}`;\n\n // Initialize state from storage if available\n let initialState: ConsumerType | null = null;\n if (options.platform.storage) {\n const stored = options.platform.storage.getItem(storageKey);\n if (stored) {\n try {\n initialState = JSON.parse(stored);\n } catch (e) {\n console.error(\"Error parsing stored contact:\", e);\n }\n }\n }\n\n const state = new PubSub<ConsumerType | null>(initialState);\n\n // Subscribe to state changes to persist\n if (options.platform.storage) {\n state.subscribe((contact) => {\n if (contact) {\n options.platform.storage?.setItem(storageKey, JSON.stringify(contact));\n } else {\n options.platform.storage?.removeItem(storageKey);\n }\n });\n }\n\n function shouldCollectData(): { should: boolean; reason?: string } {\n const contact = state.getState();\n\n if (!contact?.id && options.collectUserData) {\n return {\n should: true,\n reason: \"No contact id and collectUserData is true\"\n };\n }\n\n return {\n should: false\n };\n }\n\n function cleanup() {\n state.clear();\n state.setState(null);\n }\n\n return {\n shouldCollectData,\n cleanup,\n contactState: state,\n };\n} ","type RequestInterceptor = (config: RequestConfig) => RequestConfig | Promise<RequestConfig>;\ntype ResponseInterceptor = (response: Response) => Response | Promise<Response>;\ntype ErrorInterceptor = (error: any) => any;\n\ninterface RequestConfig extends RequestInit {\n baseURL?: string;\n headers?: HeadersInit;\n params?: Record<string, string>;\n}\n\nexport interface CustomFetch {\n (url: string, config?: RequestConfig): Promise<Response>;\n interceptors: {\n request: {\n use: (interceptor: RequestInterceptor) => number;\n eject: (id: number) => void;\n };\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => number;\n eject: (id: number) => void;\n };\n };\n}\n\nexport function createFetch(defaultConfig: RequestConfig = {}): CustomFetch {\n const requestInterceptors: RequestInterceptor[] = [];\n const responseInterceptors: ResponseInterceptor[] = [];\n const errorInterceptors: ErrorInterceptor[] = [];\n\n const customFetch: CustomFetch = async (url: string, config: RequestConfig = {}) => {\n // Merge configs\n let mergedConfig: RequestConfig = {\n ...defaultConfig,\n ...config,\n headers: {\n ...defaultConfig.headers,\n ...config.headers,\n },\n };\n\n try {\n // Apply request interceptors\n for (const interceptor of requestInterceptors) {\n mergedConfig = await interceptor(mergedConfig);\n }\n\n // Handle URL params\n const queryParams = mergedConfig.params\n ? '?' + new URLSearchParams(mergedConfig.params).toString()\n : '';\n\n // Construct full URL\n const fullUrl = mergedConfig.baseURL\n ? `${mergedConfig.baseURL}${url}${queryParams}`.replace(/([^:]\\/)\\/+/g, '$1')\n : `${url}${queryParams}`;\n\n // Make the fetch call\n let response = await fetch(fullUrl, mergedConfig);\n\n // Apply response interceptors\n for (const interceptor of responseInterceptors) {\n response = await interceptor(response);\n }\n\n return response;\n } catch (error) {\n // Apply error interceptors\n let processedError = error;\n for (const interceptor of errorInterceptors) {\n processedError = await interceptor(processedError);\n }\n throw processedError;\n }\n };\n\n // Add interceptors management\n customFetch.interceptors = {\n request: {\n use: (interceptor: RequestInterceptor) => {\n requestInterceptors.push(interceptor);\n return requestInterceptors.length - 1;\n },\n eject: (id: number) => {\n requestInterceptors.splice(id, 1);\n },\n },\n response: {\n use: (interceptor: ResponseInterceptor, errorInterceptor?: ErrorInterceptor) => {\n responseInterceptors.push(interceptor);\n if (errorInterceptor) {\n errorInterceptors.push(errorInterceptor);\n }\n return responseInterceptors.length - 1;\n },\n eject: (id: number) => {\n responseInterceptors.splice(id, 1);\n errorInterceptors.splice(id, 1);\n },\n },\n };\n\n return customFetch;\n}\n\n// Helper method to handle JSON responses\nexport async function handleJsonResponse<T>(response: Response): Promise<T> {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response.json();\n}\n\n// Usage example:\n/*\nconst api = createFetch({\n baseURL: 'https://api.example.com',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\n// Add request interceptor\napi.interceptors.request.use((config) => {\n config.headers = {\n ...config.headers,\n 'Authorization': `Bearer ${getToken()}`,\n };\n return config;\n});\n\n// Add response interceptor\napi.interceptors.response.use(\n async (response) => {\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n return response;\n },\n (error) => {\n console.error('Request failed:', error);\n throw error;\n }\n);\n*/\n","import { createFetch, CustomFetch } from \"../utils/create-fetch\";\nimport { HandleContactMessageOutputSchema, WidgetHistorySchema, WidgetPreludeSchema, WidgetSessionSchema } from \"../types/schemas-v2\";\nimport { CoreOptions, SendMessageInput, ConsumerType } from \"../types\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n coreOptions: CoreOptions;\n}\n\nexport class ApiCaller {\n #fetch: CustomFetch\n constructor(private readonly options: ApiCallerOptions) {\n const user = this.options.coreOptions.user;\n const consumerHeader = {\n claim: '',\n value: ''\n }\n\n if (user?.email) {\n consumerHeader.claim = 'email';\n consumerHeader.value = user.email;\n }\n\n else if (user?.phone) {\n consumerHeader.claim = 'phone';\n consumerHeader.value = user.phone;\n }\n\n const headers: Record<string, string> = {\n 'X-Bot-Token': this.options.token,\n 'X-Consumer-Id': `${consumerHeader.claim}:${consumerHeader.value}`\n }\n\n // Only add Authorization header if contactToken exists\n if (this.options.coreOptions.contactToken) {\n headers['Authorization'] = `Bearer ${this.options.coreOptions.contactToken}`\n }\n\n this.#fetch = createFetch({\n baseURL: `${this.options.apiUrl}/widget/v2`,\n headers\n })\n }\n\n async me(): Promise<{\n contactId: string;\n contactName: string;\n }> {\n // GET /me\n const response = await this.#fetch('/me')\n return response.json()\n }\n\n async widgetPrelude(): Promise<WidgetPreludeSchema> {\n // GET /prelude\n const response = await this.#fetch('/prelude')\n return response.json()\n }\n\n async handleMessage(message: SendMessageInput): Promise<HandleContactMessageOutputSchema> {\n // POST /chat/send\n const response = await this.#fetch('/chat/send', {\n method: \"POST\",\n body: JSON.stringify(message)\n })\n return response.json()\n }\n\n async getSessionHistory(sessionId: string, lastMessageTimestamp?: string): Promise<WidgetHistorySchema[]> {\n // session/history/:sessionId\n const queryParams = new URLSearchParams({\n lastMessageTimestamp: lastMessageTimestamp || ''\n })\n\n const url = `/session/history/${sessionId}?${queryParams.toString()}`\n\n const response = await this.#fetch(url, {\n method: 'GET'\n })\n\n return response.json()\n }\n\n async createSession(): Promise<WidgetSessionSchema> {\n // POST /create-session\n const response = await this.#fetch('/create-session', {\n method: 'POST'\n })\n return response.json()\n }\n\n async getSession(sessionId: string): Promise<WidgetSessionSchema> {\n // GET /session/:sessionId\n const response = await this.#fetch(`/session/${sessionId}`, {\n method: 'GET'\n })\n return response.json()\n }\n\n async createContact(user: {\n external_id?: string;\n name?: string;\n email?: string;\n phone?: string;\n customData?: Record<string, string>;\n avatarUrl?: string;\n }): Promise<ConsumerType> {\n const response = await this.#fetch('/contact/upsert', {\n method: 'POST',\n body: JSON.stringify(user)\n });\n return response.json();\n }\n}\n","export class OpenCXError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenCXError\";\n }\n}\n\nexport class ConnectionError extends OpenCXError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n\nexport class AuthenticationError extends OpenCXError {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class SessionError extends OpenCXError {\n constructor(message = \"Session error occurred\") {\n super(message);\n this.name = \"SessionError\";\n }\n}\n\nexport class SessionNotDefinedError extends SessionError {\n constructor(message = \"Session not defined\") {\n super(message);\n this.name = \"SessionNotDefinedError\";\n }\n}\n\nexport class TransportError extends OpenCXError {\n constructor(message = \"Transport error occurred\") {\n super(message);\n this.name = \"TransportError\";\n }\n}\n\nexport class FileUploadError extends OpenCXError {\n constructor(message = \"File upload failed\") {\n super(message);\n this.name = \"FileUploadError\";\n }\n}\n","export interface Platform {\n storage?: Storage;\n env: {\n platform: string;\n };\n date: {\n now(): number;\n toISOString(date: number): string;\n };\n}\n\nexport function createDefaultPlatform(): Platform {\n const detectPlatform = () => {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n };\n\n return {\n env: {\n platform: detectPlatform()\n },\n date: {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString()\n }\n };\n}\n","import { CoreOptions } from \"../types\";\n\nconst DEFAULT_SOUND_EFFECTS = {\n messageArrived: \"https://cloud.opencopilot.so/sfx/notification3.mp3\"\n};\n\nconst DEFAULT_THEME = {\n primaryColor: \"hsl(211,65%,59%)\",\n triggerOffset: \"20px\"\n};\n\ntype NormalizedConfig = Required<Omit<CoreOptions, 'contactToken'>> & {\n contactToken: string | undefined | null;\n soundEffectFiles: {\n messageArrived: string;\n };\n theme: {\n primaryColor: string;\n triggerOffset: string;\n };\n settings: {\n persistSession: boolean;\n useSoundEffects: boolean;\n };\n};\n\ntype ConfigInstance = {\n getConfig: () => NormalizedConfig;\n getApiConfig: () => {\n apiUrl: string;\n token: string;\n headers: Record<string, string>;\n queryParams: Record<string, string>;\n pathParams: Record<string, string>;\n };\n getBotConfig: () => NormalizedConfig['bot'];\n getThemeConfig: () => NormalizedConfig['theme'];\n getSettings: () => NormalizedConfig['settings'];\n getSoundEffects: () => NormalizedConfig['soundEffectFiles'];\n getUser: () => NormalizedConfig['user'];\n getLanguage: () => string;\n getDebugMode: () => boolean;\n};\n\nexport function createConfig(options: CoreOptions): ConfigInstance {\n const normalizedConfig: NormalizedConfig = {\n ...options,\n apiUrl: options.apiUrl ?? \"https://api-v2.opencopilot.so/backend\",\n socketUrl: options.socketUrl ?? \"https://api-v2.opencopilot.so\",\n transport: options.transport ?? 'socket',\n pollingInterval: options.pollingInterval ?? 3000,\n headers: {\n ...(options.headers ?? {}),\n \"X-Bot-Token\": options.token,\n },\n queryParams: options.queryParams ?? {},\n pathParams: options.pathParams ?? {},\n bot: {\n name: options.bot?.name ?? \"Bot\",\n avatarUrl: options.bot?.avatarUrl,\n id: options.bot?.id ?? null,\n is_ai: options.bot?.is_ai ?? true\n },\n contactToken: options.contactToken,\n debug: options.debug ?? false,\n language: options.language ?? \"en\",\n user: options.user ?? {},\n soundEffectFiles: {\n messageArrived: options.soundEffectFiles?.messageArrived ?? DEFAULT_SOUND_EFFECTS.messageArrived\n },\n theme: {\n primaryColor: options.theme?.primaryColor ?? DEFAULT_THEME.primaryColor,\n triggerOffset: options.theme?.triggerOffset ?? DEFAULT_THEME.triggerOffset\n },\n settings: {\n persistSession: options.settings?.persistSession ?? false,\n useSoundEffects: options.settings?.useSoundEffects ?? false\n }\n };\n\n return {\n getConfig: () => normalizedConfig,\n getApiConfig: () => ({\n apiUrl: normalizedConfig.apiUrl,\n token: normalizedConfig.token,\n headers: normalizedConfig.headers,\n queryParams: normalizedConfig.queryParams,\n pathParams: normalizedConfig.pathParams\n }),\n getBotConfig: () => normalizedConfig.bot,\n getThemeConfig: () => normalizedConfig.theme,\n getSettings: () => normalizedConfig.settings,\n getSoundEffects: () => normalizedConfig.soundEffectFiles,\n getUser: () => normalizedConfig.user,\n getLanguage: () => normalizedConfig.language,\n getDebugMode: () => normalizedConfig.debug\n };\n} "],"names":["PubSub","state","__publicField","__privateAdd","_state","__privateSet","callback","__privateGet","newState","_s","createPubSub","SESSION_POLLING_INTERVAL","MESSAGE_POLLING_INTERVAL","mapHistoryToMessage","history","genId","_a","_b","_c","startPolling","api","sessionState","intervals","session","response","error","messages","createChat","options","stopPolling","createSession","clearSession","cleanup","input","message","createContact","storageKey","initialState","stored","e","contact","shouldCollectData","createFetch","defaultConfig","requestInterceptors","responseInterceptors","errorInterceptors","customFetch","url","config","mergedConfig","interceptor","queryParams","fullUrl","processedError","id","errorInterceptor","ApiCaller","_fetch","user","consumerHeader","headers","sessionId","lastMessageTimestamp","OpenCXError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError","createDefaultPlatform","date","DEFAULT_SOUND_EFFECTS","DEFAULT_THEME","createConfig","normalizedConfig","_d","_e","_f","_g","_h","_i"],"mappings":"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"}
@@ -14,7 +14,6 @@ export declare const useChat: () => {
14
14
  messageArrived: string;
15
15
  };
16
16
  theme: {
17
- headerStyle: "compact" | "basic";
18
17
  primaryColor: string;
19
18
  triggerOffset: string;
20
19
  };
@@ -37,11 +36,9 @@ export declare const useChat: () => {
37
36
  is_ai?: boolean;
38
37
  };
39
38
  getThemeConfig: () => {
40
- headerStyle?: "compact" | "basic";
41
39
  primaryColor?: string;
42
40
  triggerOffset?: string;
43
41
  } & {
44
- headerStyle: "compact" | "basic";
45
42
  primaryColor: string;
46
43
  triggerOffset: string;
47
44
  };