@opencx/widget 2.6.1 → 2.6.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/api-BEtFfKMB.cjs +2 -0
- package/dist/api-BEtFfKMB.cjs.map +1 -0
- package/dist/api-Cez5T-se.js +1393 -0
- package/dist/api-Cez5T-se.js.map +1 -0
- package/dist/basic.cjs +39 -39
- package/dist/basic.cjs.map +1 -1
- package/dist/basic.js +1214 -1213
- package/dist/basic.js.map +1 -1
- package/dist/core/client/api.d.ts +49 -3
- package/dist/core/client/chat.d.ts +10 -4
- package/dist/core/client/contact.d.ts +9 -3
- package/dist/core/client/index.d.ts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/types/contact.d.ts +2 -0
- package/dist/core/types/helpers.d.ts +2 -2
- package/dist/{index-B5YLfjom.cjs → index-BzidnDPX.cjs} +4 -4
- package/dist/index-BzidnDPX.cjs.map +1 -0
- package/dist/{index-EZN9_jan.js → index-DUlnC30_.js} +26 -26
- package/dist/index-DUlnC30_.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +6 -6
- package/dist/react-web/core-integration/ChatProvider.d.ts +11 -5
- package/dist/react-web/core-integration/hooks/useChatMessages.d.ts +10 -4
- package/dist/react-web/core-integration/hooks/useChatSession.d.ts +10 -4
- package/dist/react-web/core-integration/hooks/useContact.d.ts +10 -4
- package/dist/react-web/core-integration/hooks/usePreludeData.d.ts +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.js +1 -1
- package/dist-embed/script.js +30 -30
- package/dist-embed/script.js.map +1 -1
- package/package.json +2 -2
- package/dist/api-BwKgAJ6p.cjs +0 -2
- package/dist/api-BwKgAJ6p.cjs.map +0 -1
- package/dist/api-DRZ9vPwy.js +0 -1360
- package/dist/api-DRZ9vPwy.js.map +0 -1
- package/dist/index-B5YLfjom.cjs.map +0 -1
- package/dist/index-EZN9_jan.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var ue=Object.defineProperty;var V=t=>{throw TypeError(t)};var fe=(t,e,r)=>e in t?ue(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var S=(t,e,r)=>fe(t,typeof e!="symbol"?e+"":e,r),Y=(t,e,r)=>e.has(t)||V("Cannot "+r);var b=(t,e,r)=>(Y(t,e,"read from private field"),r?r.call(t):e.get(t)),B=(t,e,r)=>e.has(t)?V("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),F=(t,e,r,s)=>(Y(t,e,"write to private field"),s?s.call(t,r):e.set(t,r),r);const de=require("lodash.isequal"),ge=require("uuid");class _ extends Error{constructor(e){super(e),this.name="OpenCXError"}}class me extends _{constructor(e="Connection failed"){super(e),this.name="ConnectionError"}}class Se extends _{constructor(e="Authentication failed"){super(e),this.name="AuthenticationError"}}class te extends _{constructor(e="Session error occurred"){super(e),this.name="SessionError"}}class he extends te{constructor(e="Session not defined"){super(e),this.name="SessionNotDefinedError"}}class Ee extends _{constructor(e="Transport error occurred"){super(e),this.name="TransportError"}}class pe extends _{constructor(e="File upload failed"){super(e),this.name="FileUploadError"}}class re extends _{constructor(e="Storage is not available"){super(e),this.name="StorageNotAvailableError"}}class be extends _{constructor(e="External ID is not defined"){super(e),this.name="ExternalIdNotDefinedError"}}var se=(t=>(t.INIT="init",t.STATE_CHANGE="stateChange",t.BEFORE_UPDATE="beforeUpdate",t.AFTER_UPDATE="afterUpdate",t.DESTROY="destroy",t.ERROR="error",t))(se||{}),U,k;class q{constructor(e){S(this,"subscribers",new Set);B(this,U);S(this,"initialState");B(this,k);S(this,"lifecycleListeners",new Map);S(this,"emitLifecycle",(e,r)=>{const s=this.lifecycleListeners.get(e);if(s){const a={type:e,timestamp:Date.now(),data:r};s.forEach(l=>{try{l(a)}catch{}})}});S(this,"notifySubscribers",e=>{Array.from(this.subscribers).forEach(s=>{try{s(e)}catch(a){this.emitLifecycle("error",{error:a})}})});S(this,"subscribe",e=>(this.subscribers.add(e),()=>{this.subscribers.delete(e)}));S(this,"onLifecycle",(e,r)=>{this.lifecycleListeners.has(e)||this.lifecycleListeners.set(e,new Set);const s=this.lifecycleListeners.get(e);return s.add(r),()=>{s.delete(r),s.size===0&&this.lifecycleListeners.delete(e)}});S(this,"getState",()=>b(this,U));S(this,"setState",e=>{this.emitLifecycle("beforeUpdate",{previousState:b(this,U),nextState:e}),de(b(this,U),e)||(F(this,U,e),F(this,k,Date.now()),this.emitLifecycle("stateChange",{state:e}),this.notifySubscribers(e)),this.emitLifecycle("afterUpdate",{state:e})});S(this,"setStatePartial",e=>{if(e==null)return;const r={...b(this,U),...e};this.setState(r)});S(this,"clear",()=>{this.emitLifecycle("destroy"),this.subscribers=new Set,this.lifecycleListeners=new Map});S(this,"reset",()=>{this.setState(this.initialState)});S(this,"lastUpdated",()=>b(this,k));F(this,U,e),this.initialState=e,F(this,k,Date.now()),this.emitLifecycle("init",{initialState:b(this,U)})}}U=new WeakMap,k=new WeakMap;function ye(t){return new q(t)}function L(t){if(!t)return!1;try{return typeof t.isAvailable=="function"?t.isAvailable():!0}catch{return!1}}async function Q(t,e){try{return{success:!0,result:await t(),error:null}}catch(r){return{success:!1,result:null,error:{message:r instanceof Error?r.message||"Unknown error":(r==null?void 0:r.toString())||"Unknown error",code:"STORAGE_OPERATION_FAILED",context:e}}}}function we(t={}){const{level:e="info",prefix:r="[openCx]",enabled:s=!0}=t;let a=e;const l={debug:0,info:1,warn:2,error:3};function c(i){return s&&l[i]>=l[a]}function n(i){return`${r} ${i}`}function d(i){return i.map(o=>{if(o instanceof Error)return{name:o.name,message:o.message,stack:o.stack};if(typeof o=="object")try{return JSON.stringify(o,null,2)}catch{return o}return o})}return{debug(i,...o){c("debug")&&console.debug(n(i),...d(o))},info(i,...o){c("info")&&console.info(n(i),...d(o))},warn(i,...o){c("warn")&&console.warn(n(i),...d(o))},error(i,...o){c("error")&&console.error(n(i),...d(o))},setLevel(i){a=i}}}function ne(t){if(!t)return!1;try{return typeof t.isAvailable=="function"?t.isAvailable():!0}catch{return!1}}async function ae(t,e){try{return await t(),{success:!0,error:null}}catch(r){return{success:!1,error:{message:r instanceof Error?r.message||"Unknown error":(r==null?void 0:r.toString())||"Unknown error",code:"AUDIO_OPERATION_FAILED",context:e}}}}function J(){return ge.v4()}function ie({config:t,api:e},r){const s=new q({contact:null,loading:{isLoading:!1,reason:null},error:{hasError:!1}});function a(){var d;return!((d=s.getState().contact)!=null&&d.contactId)&&t.getConfig().collectUserData?{should:!0,reason:"No contact id and collectUserData is true"}:{should:!1}}async function l(){try{s.setStatePartial({loading:{isLoading:!0,reason:"cleaning_up"},error:{hasError:!1}}),s.setState({contact:null,loading:{isLoading:!1,reason:null},error:{hasError:!1}}),s.clear()}catch(n){s.setStatePartial({error:{hasError:!0,message:n instanceof Error?n.message:"Failed to cleanup contact data",code:"CONTACT_CLEANUP_FAILED"}})}finally{s.setStatePartial({loading:{isLoading:!1,reason:null}})}}async function c(n){s.setStatePartial({loading:{isLoading:!0,reason:"creating_unauthenticated_contact"},error:{hasError:!1}});const{data:d,error:i}=await e.createContact(n);return d!=null&&d.contactId?(s.setStatePartial({contact:{authenticationStatus:{is:!1},contactId:d.contactId,contactName:d.contactName}}),e.setUser({email:n.email,name:n.name}),d):(i&&s.setStatePartial({loading:{isLoading:!1,reason:null},error:{hasError:!0,message:i==null?void 0:i.message,code:"CONTACT_CREATION_FAILED"}}),null)}return{contactState:s,shouldCollectData:a,cleanup:l,createUnauthenticatedContact:c}}const X={SESSION:1e4,MESSAGES:5e3};function Pe(t){const e={id:t.publicId,timestamp:t.sentAt||"",attachments:t.attachments||void 0};return t.sender.kind==="user"?{...e,type:"FROM_USER",content:t.content.text||"",deliveredAt:t.sentAt||""}:t.sender.kind==="agent"?{id:t.publicId,type:"FROM_AGENT",component:"agent_message",data:{message:t.content.text||""},timestamp:t.sentAt||"",attachments:t.attachments||void 0}:{...e,type:"FROM_BOT",component:"bot_message",agent:{id:null,name:t.sender.name||"",isAi:t.sender.kind==="ai",avatar:t.sender.avatar||null},data:{message:t.content.text}}}function Ae(t,e,r,s,a){async function l(i){var y;const o=e.getState().messages,m=(y=e.getState().messages.at(-1))==null?void 0:y.timestamp,{data:f}=await t.getSessionHistory(i.id,m);if(f&&f.length>0){const w=f.map(Pe).filter(R=>!o.some(I=>I.id===R.id));w.length>0&&(r==null||r.debug("Adding new messages to state",{count:w.length,messageIds:w.map(I=>I.id),messageTypes:w.map(I=>I.type)}),s!=null&&s.getConfig().settings.useSoundEffects&&(a!=null&&a.audio)&&ne(a.audio)&&w.filter(E=>E.type==="FROM_BOT").length>0&&await ae(()=>a.audio.playNotification(),"Failed to play notification sound for new messages"),e.setStatePartial({messages:[...o,...w]}))}}function c(i,o){return{id:J(),type:"FROM_USER",content:i,deliveredAt:new Date().toISOString(),attachments:o,timestamp:new Date().toISOString()}}function n(i){if(i.success&&i.autopilotResponse)return{type:"FROM_BOT",id:i.autopilotResponse.id||J(),timestamp:new Date().toISOString(),component:"bot_message",data:{message:i.autopilotResponse.value.content}};if(i.success&&i.uiResponse){const o=i.uiResponse.value;return{type:"FROM_BOT",id:J(),timestamp:new Date().toISOString(),component:o.name,data:o.request_response}}return null}function d(i){return{type:"FROM_BOT",id:J(),timestamp:new Date().toISOString(),component:"TEXT",data:{message:i,variant:"error"}}}return{fetchHistoryMessages:l,toUserMessage:c,toBotMessage:n,addErrorMessage:d}}function Te(t,e,r,s,a,l){var x,v;let c=null;const n=(x=l.platform)==null?void 0:x.logger,d=(v=l.platform)==null?void 0:v.storage,i=()=>a.getConfig().settings.persistSession;if(i()&&!L(d))throw new re;i()&&!a.getConfig().user.external_id&&(n==null||n.error("session persistence is enabled but external id is not defined"));const{token:o,user:m}=a.getConfig(),f=`${m.external_id??m.email??"unknown"}:${o}:session`;async function y(){n==null||n.debug("Restoring session from storage",{sessionStorageKey:f,stroageAvailable:L(d)}),L(d)&&Q(async()=>{n==null||n.debug("Attempting to restore session from storage");const u=await d.getItem(f);if(u){const g=JSON.parse(u);n==null||n.info("Session restored from storage",{sessionId:g.id}),e.setState(g),await s.fetchHistoryMessages(g),R()}},"Error restoring session from storage")}function w(){n==null||n.debug("Setting up session persistence",{sessionStorageKey:f,stroageAvailable:L(d)}),L(d)&&e.subscribe(async u=>{try{u?(await d.setItem(f,JSON.stringify(u)),n==null||n.debug("Session persisted to storage",{sessionId:u.id})):(await d.removeItem(f),n==null||n.debug("Session removed from storage"))}catch(g){n==null||n.error("Error persisting session:",g),r.setStatePartial({error:{hasError:!0,message:g instanceof Error?g.message:"Failed to persist session",code:"SESSION_PERSISTENCE_FAILED"}})}})}function R(){if(c)return;n==null||n.debug("Starting polling");const u=[];u.push(setInterval(async()=>{const g=e.getState();if(g!=null&&g.id)try{const h=new Date;r.setStatePartial({polling:{...r.getState().polling,session:{isPolling:!0,lastPollTime:h.toISOString(),nextPollTime:new Date(h.getTime()+X.SESSION).toISOString(),error:{hasError:!1}}}});const{data:$}=await t.getSession(g.id);$&&e.setState($),r.setStatePartial({polling:{...r.getState().polling,session:{...r.getState().polling.session,isPolling:!1}}})}catch(h){n==null||n.error("Error polling session:",h),r.setStatePartial({polling:{...r.getState().polling,session:{...r.getState().polling.session,isPolling:!1,error:{hasError:!0,message:h instanceof Error?h.message:"Failed to poll session",code:"SESSION_POLLING_FAILED"}}}})}},X.SESSION)),u.push(setInterval(async()=>{const g=e.getState();if(g!=null&&g.id)try{const h=new Date;r.setStatePartial({polling:{...r.getState().polling,messages:{isPolling:!0,lastPollTime:h.toISOString(),nextPollTime:new Date(h.getTime()+X.MESSAGES).toISOString(),error:{hasError:!1}}}}),await s.fetchHistoryMessages(g),r.setStatePartial({polling:{...r.getState().polling,messages:{...r.getState().polling.messages,isPolling:!1}}})}catch(h){n==null||n.error("Error polling messages:",h),r.setStatePartial({polling:{...r.getState().polling,messages:{...r.getState().polling.messages,isPolling:!1,error:{hasError:!0,message:h instanceof Error?h.message:"Failed to poll messages",code:"MESSAGES_POLLING_FAILED"}}}})}},X.MESSAGES)),c=()=>{n==null||n.debug("Stopping polling"),u.forEach(clearInterval),r.setStatePartial({polling:{session:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}},messages:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}}}})}}async function I(){n==null||n.info("Creating new session"),r.setStatePartial({loading:{isLoading:!0,reason:"creating_session"},error:{hasError:!1}});const{data:u,error:g}=await t.createSession();if(u)return n==null||n.info("Session created successfully",{sessionId:u.id}),e.setState(u),r.setStatePartial({loading:{isLoading:!1,reason:null}}),R(),u;n==null||n.error("Failed to create session:",g);const h={hasError:!0,message:g instanceof Error?g.message:"Failed to create session",code:"SESSION_CREATION_FAILED"};return r.setStatePartial({error:h,loading:{isLoading:!1,reason:null}}),null}async function E(){var g;const u=e.getState();if(u!=null&&u.id)try{c&&(c(),c=null),e.setState(null),i()&&d&&await d.removeItem(f),r.setState({messages:[],keyboard:null,loading:{isLoading:!1,reason:null},error:{hasError:!1},polling:{session:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}},messages:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}}}}),(g=l.onSessionDestroy)==null||g.call(l)}catch(h){r.setStatePartial({error:{hasError:!0,message:h instanceof Error?h.message:"Failed to clear session",code:"SESSION_CLEAR_FAILED"}})}}function C(u=!1){try{c&&(c(),c=null),u&&i()&&L(d)&&(console.log("removing session data",f),Q(()=>d.removeItem(f),"Error removing session data")),r.setState({messages:[],keyboard:null,loading:{isLoading:!1,reason:null},error:{hasError:!1},polling:{session:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}},messages:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}}}}),e.setState(null),r.clear(),e.clear()}catch(g){r.setStatePartial({error:{hasError:!0,message:g instanceof Error?g.message:"Failed to cleanup",code:"SESSION_CLEAR_FAILED"}})}}async function D(u){return t.getSession(u)}async function O(){const u=e.getState();if(!(u!=null&&u.id))return;const{data:g}=await D(u.id);return g&&e.setState(g),g}return i()&&L(d)&&(n==null||n.debug("Initializing session persistence",{sessionStorageKey:f,stroageAvailable:L(d)}),y(),w()),{createSession:I,clearSession:E,cleanup:C,startPolling:R,fetchSession:D,refetchSession:O,sessionStorageKey:f}}function Ie(t){var w;const e=(w=t.platform)==null?void 0:w.logger,r={messages:[],keyboard:null,loading:{isLoading:!1,reason:null},error:{hasError:!1},polling:{session:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}},messages:{isPolling:!1,lastPollTime:null,nextPollTime:null,error:{hasError:!1}}}},s=new q(r),{contactState:a,cleanup:l,shouldCollectData:c,createUnauthenticatedContact:n}=ie({config:t.config,api:t.api},t.platform),d=new q(null),i=Ae(t.api,s,e,t.config,t.platform),o=Te(t.api,d,s,i,t.config,t);async function m(R,I){var D;let E=d.getState(),C=!1;if(!(E!=null&&E.id)){if(e==null||e.debug("No active session, creating new session"),E=await o.createSession(),!E)return{success:!1,createdSession:C};C=!0}E.assignee.kind==="ai"&&(E=await o.refetchSession()??E);try{e==null||e.debug("Sending message",{sessionId:E.id}),E.assignee.kind==="ai"?s.setStatePartial({loading:{isLoading:!0,reason:"sending_message_to_bot"},error:{hasError:!1}}):s.setStatePartial({loading:{isLoading:!0,reason:"sending_message_to_agent"},error:{hasError:!1}});const O=i.toUserMessage(R.content,R.attachments||void 0),x=s.getState().messages;s.setStatePartial({messages:[...x,O]});const v=t.config.getConfig(),{data:u}=await t.api.handleMessage({uuid:O.id,bot_token:v.token,headers:v.headers,query_params:v.queryParams,session_id:E.id,user:v.user,...R},I);if(u!=null&&u.success){e==null||e.debug("Message sent successfully");const g=i.toBotMessage(u);if(g){const h=s.getState().messages;s.setStatePartial({messages:[...h,g]})}return{success:!0,createdSession:C,botMessage:g}}else{e==null||e.warn("Message send failed",u==null?void 0:u.error);const g=i.addErrorMessage(((D=u==null?void 0:u.error)==null?void 0:D.message)||"Unknown error occurred"),h=s.getState().messages;return s.setStatePartial({messages:[...h,g]}),{success:!1,createdSession:C,error:u==null?void 0:u.error}}}catch(O){return e==null||e.error("Error sending message:",O),s.setStatePartial({error:{hasError:!0,message:O instanceof Error?O.message:"Failed to send message",code:"MESSAGE_SEND_FAILED"}}),{success:!1,createdSession:C,error:O}}finally{s.setStatePartial({loading:{isLoading:!1,reason:null}})}}async function f(){await o.clearSession(),await o.createSession()}const y=()=>{l(),o.cleanup()};return{chatState:s,sessionState:d,sendMessage:m,createSession:o.createSession,clearSession:o.clearSession,cleanup:y,initialState:r,sessionStorageKey:o.sessionStorageKey,recreateSession:f,contactState:a,contactManager:{shouldCollectData:c,createUnauthenticatedContact:n}}}const Oe={messageArrived:"https://cloud.opencopilot.so/sfx/notification3.mp3"},Re={primaryColor:"hsl(211,65%,59%)",triggerOffset:"20px"},oe={persistSession:!1,useSoundEffects:!1},Ce=1e3*3;function ve(t,e,r){const s=e.logger,a=e.storage;let l=t??oe;async function c(){if(!(!a||!L(a)))try{s==null||s.debug("Attempting to restore settings from storage");const o=await a.getItem(r);o&&(l=JSON.parse(o),s==null||s.debug("Settings restored from storage",l))}catch(o){s==null||s.error("Error restoring settings:",o)}}async function n(o){if(!(!a||!L(a)))try{await a.setItem(r,JSON.stringify(o)),s==null||s.debug("Settings persisted to storage",o)}catch(m){s==null||s.error("Error persisting settings:",m)}}function d(o){l={...l,...o},n(l)}function i(){return l}return c(),{getSettings:i,updateSettings:d}}function Le(t,e){var c,n,d,i,o;if(!t.token)throw new Error("Token is required");if(t.pollingInterval&&t.pollingInterval<Ce)throw new Error("Polling interval must be at least 3 seconds");const r={...t,collectUserData:t.collectUserData??!1,initialMessages:t.initialMessages??[],apiUrl:t.apiUrl??"https://api.open.cx",pollingInterval:t.pollingInterval??3e3,headers:t.headers??{},queryParams:t.queryParams??{},pathParams:t.pathParams??{},bot:{name:((c=t.bot)==null?void 0:c.name)??"Bot",avatar:((n=t.bot)==null?void 0:n.avatar)??null,id:((d=t.bot)==null?void 0:d.id)??null,isAi:((i=t.bot)==null?void 0:i.isAi)??!0},contactToken:t.contactToken,debug:t.debug??!1,language:t.language??"en",user:t.user??{},soundEffectFiles:Object.assign({},Oe,t.soundEffectFiles),theme:Object.assign({},Re,t.theme),settings:Object.assign({},oe,t.settings),assets:{organizationLogo:((o=t.assets)==null?void 0:o.organizationLogo)??""}},s=`${r.token}:settings`,{getSettings:a,updateSettings:l}=ve(r.settings,e,s);return{config:r,updateSettings:l,getConfig:()=>({...r,settings:a()}),getApiConfig:()=>({apiUrl:r.apiUrl,token:r.token,headers:r.headers,queryParams:r.queryParams,pathParams:r.pathParams}),getBotConfig:()=>r.bot,getThemeConfig:()=>r.theme,getSoundEffects:()=>r.soundEffectFiles,getUser:()=>r.user,getLanguage:()=>r.language,getDebugMode:()=>r.debug}}const De=/\{[^{}]+\}/g,Ue=()=>{var t,e;return typeof process=="object"&&Number.parseInt((e=(t=process==null?void 0:process.versions)==null?void 0:t.node)==null?void 0:e.substring(0,2))>=18&&process.versions.undici};function _e(){return Math.random().toString(36).slice(2,11)}function xe(t){let{baseUrl:e="",Request:r=globalThis.Request,fetch:s=globalThis.fetch,querySerializer:a,bodySerializer:l,headers:c,requestInitExt:n=void 0,...d}={...t};n=Ue()?n:void 0,e=ee(e);const i=[];async function o(m,f){const{baseUrl:y,fetch:w=s,Request:R=r,headers:I,params:E={},parseAs:C="json",querySerializer:D,bodySerializer:O=l??Ne,body:x,...v}=f||{};y&&(e=ee(y));let u=typeof a=="function"?a:Z(a);D&&(u=typeof D=="function"?D:Z({...typeof a=="object"?a:{},...D}));const g=x===void 0?void 0:O(x),h=g===void 0||g instanceof FormData?{}:{"Content-Type":"application/json"},$={redirect:"follow",...d,...v,body:g,headers:ke(h,c,I,E.header)};let z,H,M=new r(Fe(m,{baseUrl:e,params:E,querySerializer:u}),$);for(const P in v)P in M||(M[P]=v[P]);if(i.length){z=_e(),H=Object.freeze({baseUrl:e,fetch:w,parseAs:C,querySerializer:u,bodySerializer:O});for(const P of i)if(P&&typeof P=="object"&&typeof P.onRequest=="function"){const A=await P.onRequest({request:M,schemaPath:m,params:E,options:H,id:z});if(A){if(!(A instanceof r))throw new Error("onRequest: must return new Request() when modifying the request");M=A}}}let p;try{p=await w(M,n)}catch(P){let A=P;if(i.length)for(let N=i.length-1;N>=0;N--){const G=i[N];if(G&&typeof G=="object"&&typeof G.onError=="function"){const j=await G.onError({request:M,error:A,schemaPath:m,params:E,options:H,id:z});if(j){if(j instanceof Response){A=void 0,p=j;break}if(j instanceof Error){A=j;continue}throw new Error("onError: must return new Response() or instance of Error")}}}if(A)throw A}if(i.length)for(let P=i.length-1;P>=0;P--){const A=i[P];if(A&&typeof A=="object"&&typeof A.onResponse=="function"){const N=await A.onResponse({request:M,response:p,schemaPath:m,params:E,options:H,id:z});if(N){if(!(N instanceof Response))throw new Error("onResponse: must return new Response() when modifying the response");p=N}}}if(p.status===204||p.headers.get("Content-Length")==="0")return p.ok?{data:void 0,response:p}:{error:void 0,response:p};if(p.ok)return C==="stream"?{data:p.body,response:p}:{data:await p[C](),response:p};let K=await p.text();try{K=JSON.parse(K)}catch{}return{error:K,response:p}}return{request(m,f,y){return o(f,{...y,method:m.toUpperCase()})},GET(m,f){return o(m,{...f,method:"GET"})},PUT(m,f){return o(m,{...f,method:"PUT"})},POST(m,f){return o(m,{...f,method:"POST"})},DELETE(m,f){return o(m,{...f,method:"DELETE"})},OPTIONS(m,f){return o(m,{...f,method:"OPTIONS"})},HEAD(m,f){return o(m,{...f,method:"HEAD"})},PATCH(m,f){return o(m,{...f,method:"PATCH"})},TRACE(m,f){return o(m,{...f,method:"TRACE"})},use(...m){for(const f of m)if(f){if(typeof f!="object"||!("onRequest"in f||"onResponse"in f||"onError"in f))throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");i.push(f)}},eject(...m){for(const f of m){const y=i.indexOf(f);y!==-1&&i.splice(y,1)}}}}function W(t,e,r){if(e==null)return"";if(typeof e=="object")throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${t}=${(r==null?void 0:r.allowReserved)===!0?e:encodeURIComponent(e)}`}function le(t,e,r){if(!e||typeof e!="object")return"";const s=[],a={simple:",",label:".",matrix:";"}[r.style]||"&";if(r.style!=="deepObject"&&r.explode===!1){for(const n in e)s.push(n,r.allowReserved===!0?e[n]:encodeURIComponent(e[n]));const c=s.join(",");switch(r.style){case"form":return`${t}=${c}`;case"label":return`.${c}`;case"matrix":return`;${t}=${c}`;default:return c}}for(const c in e){const n=r.style==="deepObject"?`${t}[${c}]`:c;s.push(W(n,e[c],r))}const l=s.join(a);return r.style==="label"||r.style==="matrix"?`${a}${l}`:l}function ce(t,e,r){if(!Array.isArray(e))return"";if(r.explode===!1){const l={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[r.style]||",",c=(r.allowReserved===!0?e:e.map(n=>encodeURIComponent(n))).join(l);switch(r.style){case"simple":return c;case"label":return`.${c}`;case"matrix":return`;${t}=${c}`;default:return`${t}=${c}`}}const s={simple:",",label:".",matrix:";"}[r.style]||"&",a=[];for(const l of e)r.style==="simple"||r.style==="label"?a.push(r.allowReserved===!0?l:encodeURIComponent(l)):a.push(W(t,l,r));return r.style==="label"||r.style==="matrix"?`${s}${a.join(s)}`:a.join(s)}function Z(t){return function(r){const s=[];if(r&&typeof r=="object")for(const a in r){const l=r[a];if(l!=null){if(Array.isArray(l)){if(l.length===0)continue;s.push(ce(a,l,{style:"form",explode:!0,...t==null?void 0:t.array,allowReserved:(t==null?void 0:t.allowReserved)||!1}));continue}if(typeof l=="object"){s.push(le(a,l,{style:"deepObject",explode:!0,...t==null?void 0:t.object,allowReserved:(t==null?void 0:t.allowReserved)||!1}));continue}s.push(W(a,l,t))}}return s.join("&")}}function Me(t,e){let r=t;for(const s of t.match(De)??[]){let a=s.substring(1,s.length-1),l=!1,c="simple";if(a.endsWith("*")&&(l=!0,a=a.substring(0,a.length-1)),a.startsWith(".")?(c="label",a=a.substring(1)):a.startsWith(";")&&(c="matrix",a=a.substring(1)),!e||e[a]===void 0||e[a]===null)continue;const n=e[a];if(Array.isArray(n)){r=r.replace(s,ce(a,n,{style:c,explode:l}));continue}if(typeof n=="object"){r=r.replace(s,le(a,n,{style:c,explode:l}));continue}if(c==="matrix"){r=r.replace(s,`;${W(a,n)}`);continue}r=r.replace(s,c==="label"?`.${encodeURIComponent(n)}`:encodeURIComponent(n))}return r}function Ne(t){return t instanceof FormData?t:JSON.stringify(t)}function Fe(t,e){var a;let r=`${e.baseUrl}${t}`;(a=e.params)!=null&&a.path&&(r=Me(r,e.params.path));let s=e.querySerializer(e.params.query??{});return s.startsWith("?")&&(s=s.substring(1)),s&&(r+=`?${s}`),r}function ke(...t){const e=new Headers;for(const r of t){if(!r||typeof r!="object")continue;const s=r instanceof Headers?r.entries():Object.entries(r);for(const[a,l]of s)if(l===null)e.delete(a);else if(Array.isArray(l))for(const c of l)e.append(a,c);else l!==void 0&&e.set(a,l)}return e}function ee(t){return t.endsWith("/")?t.substring(0,t.length-1):t}const je=t=>{console.log(t.error)},qe=t=>{const e=xe({baseUrl:t.baseUrl}),r={onRequest:t.onRequest,onResponse:t.onResponse,onError:t.onError||je};return e.use(r),e};var T;class $e{constructor(e){B(this,T);S(this,"createClient",e=>{const r={claim:"",value:""};return e!=null&&e.email?(r.claim="email",r.value=e.email):e!=null&&e.phone&&(r.claim="phone",r.value=e.phone),qe({baseUrl:this.options.config.apiUrl,onRequest:({request:s})=>{s.headers.set("X-Bot-Token",this.options.config.token),s.headers.set("X-Consumer-Id",`${r.claim}:${r.value}`),s.headers.set("Content-Type","application/json"),s.headers.set("Accept","application/json"),this.options.config.contactToken&&s.headers.set("Authorization",`Bearer ${this.options.config.contactToken}`)}})});S(this,"setUser",e=>{F(this,T,this.createClient(e))});S(this,"me",async()=>await b(this,T).GET("/backend/widget/v2/me"));S(this,"widgetPrelude",async()=>await b(this,T).GET("/backend/widget/v2/prelude",{params:{header:{"X-Bot-Token":this.options.config.token}}}));S(this,"handleMessage",async(e,r)=>await b(this,T).POST("/backend/widget/v2/chat/send",{body:e,signal:r}));S(this,"getSessionHistory",async(e,r)=>{const s=r?{lastMessageTimestamp:r}:void 0;return await b(this,T).GET("/backend/widget/v2/session/history/{sessionId}",{params:{path:{sessionId:e},query:s}})});S(this,"createContact",async e=>await b(this,T).POST("/backend/widget/v2/me/create",{params:{header:{"x-bot-token":this.options.config.token}},body:e}));S(this,"createSession",async()=>await b(this,T).POST("/backend/widget/v2/create-session"));S(this,"getSession",async e=>await b(this,T).GET("/backend/widget/v2/session/{sessionId}",{params:{path:{sessionId:e}}}));S(this,"uploadFile",async({file:e,abortSignal:r})=>{const s=new FormData;return s.append("file",e.file),await b(this,T).POST("/backend/widget/v2/upload",{params:{query:{fileId:e.id,sessionId:""}},body:s,signal:r,headers:{"Content-Type":"multipart/form-data"}})});S(this,"vote",async e=>await b(this,T).POST("/backend/widget/v2/chat/vote",{body:e}));this.options=e,F(this,T,this.createClient(e.config.user))}}T=new WeakMap;exports.ApiCaller=$e;exports.AuthenticationError=Se;exports.ConnectionError=me;exports.ExternalIdNotDefinedError=be;exports.FileUploadError=pe;exports.LifecycleEvent=se;exports.OpenCXError=_;exports.PubSub=q;exports.SessionError=te;exports.SessionNotDefinedError=he;exports.StorageNotAvailableError=re;exports.TransportError=Ee;exports.createChat=Ie;exports.createConfig=Le;exports.createContactHandler=ie;exports.createLogger=we;exports.createPubSub=ye;exports.isAudioAvailable=ne;exports.isStorageAvailable=L;exports.safeAudioOperation=ae;exports.safeStorageOperation=Q;
|
|
2
|
+
//# sourceMappingURL=api-BEtFfKMB.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-BEtFfKMB.cjs","sources":["../core/errors/index.ts","../core/types/pub-sub.ts","../core/platform/storage.ts","../core/platform/logger.ts","../core/platform/audio.ts","../core/utils/genUuid.ts","../core/client/contact.ts","../core/client/chat.ts","../core/client/config.ts","../node_modules/.pnpm/openapi-fetch@0.13.4/node_modules/openapi-fetch/dist/index.js","../core/sdk/index.ts","../core/client/api.ts"],"sourcesContent":["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\nexport class StorageNotAvailableError extends OpenCXError {\n constructor(message = \"Storage is not available\") {\n super(message);\n this.name = \"StorageNotAvailableError\";\n }\n}\n\nexport class ExternalIdNotDefinedError extends OpenCXError {\n constructor(message = \"External ID is not defined\") {\n super(message);\n this.name = \"ExternalIdNotDefinedError\";\n }\n}\n","import isEqual from 'lodash.isequal';\n\nexport type Subscriber<T> = (data: T) => void\n\nexport enum LifecycleEvent {\n INIT = 'init',\n STATE_CHANGE = 'stateChange',\n BEFORE_UPDATE = 'beforeUpdate',\n AFTER_UPDATE = 'afterUpdate',\n DESTROY = 'destroy',\n ERROR = 'error'\n}\n\ntype LifecycleListener = (event: { type: LifecycleEvent; timestamp: number; data?: any }) => void;\n\nexport class PubSub<S> {\n private subscribers = new Set<Subscriber<S>>();\n #state: S;\n private initialState: S;\n #lastUpdated: number | null;\n private lifecycleListeners: Map<LifecycleEvent, Set<LifecycleListener>> = new Map();\n\n constructor(state: S) {\n this.#state = state;\n this.initialState = state;\n this.#lastUpdated = Date.now();\n this.emitLifecycle(LifecycleEvent.INIT, { initialState: this.#state });\n }\n\n private emitLifecycle = (event: LifecycleEvent, data?: any) => {\n const listeners = this.lifecycleListeners.get(event);\n if (listeners) {\n const eventData = {\n type: event,\n timestamp: Date.now(),\n data\n };\n listeners.forEach(listener => {\n try {\n listener(eventData);\n } catch {\n // ignore error\n }\n });\n }\n }\n\n private notifySubscribers = (state: S) => {\n const subscribersArray = Array.from(this.subscribers);\n subscribersArray.forEach(callback => {\n try {\n callback(state);\n } catch (error) {\n this.emitLifecycle(LifecycleEvent.ERROR, { error });\n }\n });\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 // Don't call the callback immediately with current state\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n onLifecycle = (event: LifecycleEvent, listener: LifecycleListener): () => void => {\n if (!this.lifecycleListeners.has(event)) {\n this.lifecycleListeners.set(event, new Set());\n }\n const listeners = this.lifecycleListeners.get(event)!;\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.lifecycleListeners.delete(event);\n }\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 this.emitLifecycle(LifecycleEvent.BEFORE_UPDATE, {\n previousState: this.#state,\n nextState: newState\n });\n\n if (!isEqual(this.#state, newState)) {\n this.#state = newState;\n this.#lastUpdated = Date.now();\n this.emitLifecycle(LifecycleEvent.STATE_CHANGE, { state: newState });\n this.notifySubscribers(newState);\n }\n\n this.emitLifecycle(LifecycleEvent.AFTER_UPDATE, { state: newState });\n }\n\n setStatePartial = (_s: Partial<S>): void => {\n if (_s === undefined || _s === null) return;\n const newState = { ...this.#state, ..._s };\n this.setState(newState);\n }\n\n /**\n * Clear all subscriptions\n */\n clear = (): void => {\n this.emitLifecycle(LifecycleEvent.DESTROY);\n this.subscribers = new Set(); // Create a new Set instead of just clearing\n this.lifecycleListeners = new Map();\n }\n\n reset = (): void => {\n this.setState(this.initialState);\n }\n\n lastUpdated = (): number | null => {\n return this.#lastUpdated;\n }\n}\n\nexport function createPubSub<S>(state: S): PubSub<S> {\n return new PubSub<S>(state);\n}","/**\n * Platform-agnostic storage interface that can be implemented\n * for different environments (web, mobile, desktop, etc.)\n */\nexport interface Storage {\n /**\n * Retrieves the value associated with the given key\n * @param key The key to look up\n * @returns The stored value or null if not found\n */\n getItem(key: string): Promise<string | null>;\n\n /**\n * Stores a value with the given key\n * @param key The key to store under\n * @param value The value to store\n */\n setItem(key: string, value: string): Promise<void>;\n\n /**\n * Removes the value associated with the given key\n * @param key The key to remove\n */\n removeItem(key: string): Promise<void>;\n\n /**\n * Checks if the storage is available and working\n * @returns true if storage is available and working\n */\n isAvailable?(): boolean;\n}\n\n/**\n * Helper function to check if storage is available and working\n */\nexport function isStorageAvailable(storage: Storage | undefined): storage is Storage {\n if (!storage) return false;\n try {\n return typeof storage.isAvailable === 'function'\n ? storage.isAvailable()\n : true; // If isAvailable is not implemented, assume storage is available\n } catch {\n return false;\n }\n}\n\n/**\n * Type for the result of a safe storage operation\n */\nexport type StorageOperationResult<T> =\n | { success: true; result: T; error: null }\n | { success: false; result: null; error: { message: string; code: string; context: string } };\n\n/**\n * Helper function to safely perform storage operations\n */\nexport async function safeStorageOperation<T>(\n operation: () => Promise<T>,\n errorContext: string\n): Promise<StorageOperationResult<T>> {\n try {\n const result = await operation();\n return { success: true, result, error: null };\n } catch (error) {\n return {\n success: false,\n result: null,\n error: {\n message: error instanceof Error\n ? (error.message || 'Unknown error')\n : (error?.toString() || 'Unknown error'),\n code: 'STORAGE_OPERATION_FAILED',\n context: errorContext\n }\n };\n }\n} ","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface Logger {\n debug(message: string, ...args: any[]): void;\n info(message: string, ...args: any[]): void;\n warn(message: string, ...args: any[]): void;\n error(message: string, ...args: any[]): void;\n setLevel(level: LogLevel): void;\n}\n\nexport type LoggerOptions = {\n level?: LogLevel;\n prefix?: string;\n enabled?: boolean;\n};\n\nexport function createLogger(options: LoggerOptions = {}): Logger {\n const {\n level = 'info',\n prefix = '[openCx]',\n enabled = true\n } = options;\n\n let currentLevel = level;\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3\n };\n\n function shouldLog(messageLevel: LogLevel): boolean {\n return enabled && levels[messageLevel] >= levels[currentLevel];\n }\n\n function formatMessage(message: string): string {\n return `${prefix} ${message}`;\n }\n\n function formatArgs(args: any[]): any[] {\n return args.map(arg => {\n if (arg instanceof Error) {\n return {\n name: arg.name,\n message: arg.message,\n stack: arg.stack\n };\n }\n if (typeof arg === 'object') {\n try {\n return JSON.stringify(arg, null, 2);\n } catch {\n return arg;\n }\n }\n return arg;\n });\n }\n\n return {\n debug(message: string, ...args: any[]) {\n if (shouldLog('debug')) {\n console.debug(formatMessage(message), ...formatArgs(args));\n }\n },\n\n info(message: string, ...args: any[]) {\n if (shouldLog('info')) {\n console.info(formatMessage(message), ...formatArgs(args));\n }\n },\n\n warn(message: string, ...args: any[]) {\n if (shouldLog('warn')) {\n console.warn(formatMessage(message), ...formatArgs(args));\n }\n },\n\n error(message: string, ...args: any[]) {\n if (shouldLog('error')) {\n console.error(formatMessage(message), ...formatArgs(args));\n }\n },\n\n setLevel(level: LogLevel) {\n currentLevel = level;\n }\n };\n} ","/**\n * Platform-agnostic audio interface that can be implemented\n * for different environments (web, mobile, desktop, etc.)\n */\nexport interface Audio {\n /**\n * Plays a notification sound\n * @returns Promise that resolves when the sound finishes playing or rejects on error\n */\n playNotification(): Promise<void>;\n\n /**\n * Checks if audio playback is available and working\n * @returns true if audio is available and working\n */\n isAvailable?(): boolean;\n}\n\n/**\n * Helper function to check if audio is available and working\n */\nexport function isAudioAvailable(audio: Audio | undefined): audio is Audio {\n if (!audio) return false;\n try {\n return typeof audio.isAvailable === 'function'\n ? audio.isAvailable()\n : true; // If isAvailable is not implemented, assume audio is available\n } catch {\n return false;\n }\n}\n\n/**\n * Type for the result of a safe audio operation\n */\nexport type AudioOperationResult =\n | { success: true; error: null }\n | { success: false; error: { message: string; code: string; context: string } };\n\n/**\n * Helper function to safely perform audio operations\n */\nexport async function safeAudioOperation(\n operation: () => Promise<void>,\n errorContext: string\n): Promise<AudioOperationResult> {\n try {\n await operation();\n return { success: true, error: null };\n } catch (error) {\n return {\n success: false,\n error: {\n message: error instanceof Error\n ? (error.message || 'Unknown error')\n : (error?.toString() || 'Unknown error'),\n code: 'AUDIO_OPERATION_FAILED',\n context: errorContext\n }\n };\n }\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\nexport function genUuid() {\n return uuidv4();\n}\n","import { PubSub } from \"../types/pub-sub\";\nimport { ApiCaller } from \"./api\";\nimport { Platform } from \"../platform\";\nimport { LoadingState, ErrorState } from \"../types/helpers\";\nimport { ConfigInstance } from \"./config\";\nimport { Contact } from \"../types/contact\";\nimport { Dto } from \"@core/sdk\";\n\ntype ContactState = {\n contact: Contact | null;\n loading: LoadingState;\n error: ErrorState;\n};\n\nexport type CreateContactOptions = {\n api: ApiCaller;\n config: ConfigInstance;\n};\n\n\nexport function createContactHandler({ config, api }: CreateContactOptions, platform: Platform) {\n const state = new PubSub<ContactState>({\n contact: null,\n loading: { isLoading: false, reason: null },\n error: { hasError: false }\n });\n\n function shouldCollectData() {\n const currentState = state.getState();\n\n if (!currentState.contact?.contactId && config.getConfig().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 async function cleanup() {\n try {\n state.setStatePartial({\n loading: { isLoading: true, reason: 'cleaning_up' },\n error: { hasError: false }\n });\n state.setState({\n contact: null,\n loading: { isLoading: false, reason: null },\n error: { hasError: false }\n });\n\n state.clear();\n } catch (error) {\n state.setStatePartial({\n error: {\n hasError: true,\n message: error instanceof Error ? error.message : 'Failed to cleanup contact data',\n code: 'CONTACT_CLEANUP_FAILED'\n }\n });\n } finally {\n state.setStatePartial({\n loading: { isLoading: false, reason: null }\n });\n }\n }\n\n async function createUnauthenticatedContact(payload: Dto['CreateContactDto']): Promise<Dto['WidgetContactDto'] | null> {\n state.setStatePartial({\n loading: { isLoading: true, reason: 'creating_unauthenticated_contact' },\n error: { hasError: false }\n });\n\n const { data, error } = await api.createContact(payload);\n if (data?.contactId) {\n state.setStatePartial({\n contact: {\n authenticationStatus: {\n is: false\n },\n contactId: data.contactId,\n contactName: data.contactName\n }\n });\n api.setUser({ email: payload.email, name: payload.name })\n return data\n }\n\n if (error) {\n state.setStatePartial({\n loading: { isLoading: false, reason: null },\n error: { hasError: true, message: error?.message, code: 'CONTACT_CREATION_FAILED' }\n });\n }\n\n return null;\n }\n\n return {\n contactState: state,\n shouldCollectData,\n cleanup,\n createUnauthenticatedContact\n };\n} ","import { PubSub } from \"../types/pub-sub\";\nimport { BotMessageType, MessageType, UserMessageType } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { genUuid } from \"../utils/genUuid\";\nimport {\n ChatAttachmentType,\n HandleContactMessageOutputSchema,\n SendChatDto,\n WidgetHistoryDto,\n WidgetSessionDto,\n} from \"../types/schemas-v2\";\nimport {\n LoadingState,\n ErrorState,\n SomeOptional,\n SafeOmit,\n} from \"../types/helpers\";\nimport { ConfigInstance } from \"./config\";\nimport {\n Platform,\n isStorageAvailable,\n safeStorageOperation,\n} from \"../platform\";\nimport { Logger } from \"../platform/logger\";\nimport {\n StorageNotAvailableError,\n} from \"@core/errors\";\nimport { isAudioAvailable, safeAudioOperation } from \"@core/platform/audio\";\nimport { createContactHandler } from \"./contact\";\n\n// Constants\nconst POLLING_INTERVALS = {\n SESSION: 10000, // every 10 seconds\n MESSAGES: 5000, // every 5 seconds\n} as const;\n\n// Types\nexport type PollingType = \"session\" | \"messages\";\n\nexport type PollingState = {\n isPolling: boolean;\n lastPollTime: string | null;\n nextPollTime: string | null;\n error: ErrorState;\n};\n\nexport type PollingStates = {\n [K in PollingType]: PollingState;\n};\n\nexport type ChatState = {\n messages: MessageType[];\n keyboard: { options: string[] } | null;\n loading: LoadingState;\n error: ErrorState;\n polling: PollingStates;\n};\n\ntype ChatOptions = {\n api: ApiCaller;\n config: ConfigInstance;\n onSessionDestroy?: () => void;\n platform: Platform;\n};\n\n// Message Mapping\nfunction mapHistoryToMessage(history: WidgetHistoryDto): MessageType {\n const commonFields = {\n id: history.publicId,\n timestamp: history.sentAt || \"\",\n attachments: history.attachments || undefined,\n };\n\n if (history.sender.kind === \"user\") {\n return {\n ...commonFields,\n type: \"FROM_USER\",\n content: history.content.text || \"\",\n deliveredAt: history.sentAt || \"\",\n };\n }\n\n if (history.sender.kind === \"agent\") {\n return {\n id: history.publicId,\n type: \"FROM_AGENT\",\n component: \"agent_message\",\n data: {\n message: history.content.text || \"\",\n },\n timestamp: history.sentAt || \"\",\n attachments: history.attachments || undefined,\n };\n }\n\n return {\n ...commonFields,\n type: \"FROM_BOT\",\n component: \"bot_message\",\n agent: {\n id: null,\n name: history.sender.name || \"\",\n isAi: history.sender.kind === \"ai\",\n avatar: history.sender.avatar || null,\n },\n data: {\n message: history.content.text,\n },\n };\n}\n\n// Message Handling\nfunction createMessageHandler(\n api: ApiCaller,\n state: PubSub<ChatState>,\n logger?: Logger,\n config?: ConfigInstance,\n platform?: Platform,\n) {\n async function fetchHistoryMessages(session: WidgetSessionDto) {\n const messages = state.getState().messages;\n const lastMessageTimestamp = state.getState().messages.at(-1)?.timestamp;\n\n const { data: response } = await api.getSessionHistory(\n session.id,\n lastMessageTimestamp,\n );\n\n if (response && response.length > 0) {\n const newMessages = response\n .map(mapHistoryToMessage)\n .filter(\n (newMsg) =>\n !messages.some((existingMsg) => existingMsg.id === newMsg.id),\n );\n\n if (newMessages.length > 0) {\n logger?.debug(\"Adding new messages to state\", {\n count: newMessages.length,\n messageIds: newMessages.map((m) => m.id),\n messageTypes: newMessages.map((m) => m.type),\n });\n const useSoundEffects = config?.getConfig().settings.useSoundEffects;\n // Play notification sound for new messages if enabled\n if (\n useSoundEffects &&\n platform?.audio &&\n isAudioAvailable(platform.audio)\n ) {\n const botMessages = newMessages.filter(\n (msg) => msg.type === \"FROM_BOT\",\n );\n if (botMessages.length > 0) {\n await safeAudioOperation(\n () => platform.audio!.playNotification(),\n \"Failed to play notification sound for new messages\",\n );\n }\n }\n\n state.setStatePartial({\n messages: [...messages, ...newMessages],\n });\n }\n }\n }\n\n function toUserMessage(\n content: string,\n attachments?: ChatAttachmentType[],\n ): UserMessageType {\n return {\n id: genUuid(),\n type: \"FROM_USER\",\n content,\n deliveredAt: new Date().toISOString(),\n attachments,\n timestamp: new Date().toISOString(),\n };\n }\n\n function toBotMessage(\n response: HandleContactMessageOutputSchema,\n ): BotMessageType | null {\n if (response.success && response.autopilotResponse) {\n return {\n type: \"FROM_BOT\",\n id: response.autopilotResponse.id || genUuid(),\n timestamp: new Date().toISOString(),\n component: \"bot_message\",\n data: {\n message: response.autopilotResponse.value.content,\n },\n };\n }\n\n if (response.success && response.uiResponse) {\n const uiVal = response.uiResponse.value;\n return {\n type: \"FROM_BOT\" as const,\n id: genUuid(),\n timestamp: new Date().toISOString(),\n component: uiVal.name,\n data: uiVal.request_response,\n };\n }\n\n return null;\n }\n\n function addErrorMessage(message: string) {\n return {\n type: \"FROM_BOT\" as const,\n id: genUuid(),\n timestamp: new Date().toISOString(),\n component: \"TEXT\",\n data: {\n message,\n variant: \"error\",\n },\n };\n }\n\n return {\n fetchHistoryMessages,\n toUserMessage,\n toBotMessage,\n addErrorMessage,\n };\n}\n\n// Session Management\nfunction createSessionManager(\n api: ApiCaller,\n sessionState: PubSub<WidgetSessionDto | null>,\n chatState: PubSub<ChatState>,\n messageHandler: ReturnType<typeof createMessageHandler>,\n config: ConfigInstance,\n options: ChatOptions,\n) {\n let stopPolling: (() => void) | null = null;\n const logger = options.platform?.logger;\n const storage = options.platform?.storage;\n const persistSession = () => config.getConfig().settings.persistSession;\n\n if (persistSession() && !isStorageAvailable(storage)) {\n throw new StorageNotAvailableError();\n }\n\n if (persistSession() && !config.getConfig().user.external_id) {\n logger?.error(\n \"session persistence is enabled but external id is not defined\",\n );\n }\n\n const { token, user } = config.getConfig();\n const sessionStorageKey = `${user.external_id ?? user.email ?? \"unknown\"\n }:${token}:session`;\n /**\n * Restores the session from storage\n */\n async function restoreSession() {\n logger?.debug(\"Restoring session from storage\", {\n sessionStorageKey,\n stroageAvailable: isStorageAvailable(storage),\n });\n if (isStorageAvailable(storage)) {\n safeStorageOperation(async () => {\n logger?.debug(\"Attempting to restore session from storage\");\n const storedSession = await storage.getItem(sessionStorageKey);\n if (storedSession) {\n const session = JSON.parse(storedSession) as WidgetSessionDto;\n logger?.info(\"Session restored from storage\", {\n sessionId: session.id,\n });\n sessionState.setState(session);\n await messageHandler.fetchHistoryMessages(session);\n startPolling();\n }\n }, \"Error restoring session from storage\");\n }\n }\n\n /**\n * Sets up session persistence\n */\n function setupSessionPersistence() {\n logger?.debug(\"Setting up session persistence\", {\n sessionStorageKey,\n stroageAvailable: isStorageAvailable(storage),\n });\n if (!isStorageAvailable(storage)) return;\n sessionState.subscribe(async (session) => {\n try {\n if (session) {\n await storage.setItem(sessionStorageKey, JSON.stringify(session));\n logger?.debug(\"Session persisted to storage\", {\n sessionId: session.id,\n });\n } else {\n await storage.removeItem(sessionStorageKey);\n logger?.debug(\"Session removed from storage\");\n }\n } catch (error) {\n logger?.error(\"Error persisting session:\", error);\n chatState.setStatePartial({\n error: {\n hasError: true,\n message:\n error instanceof Error\n ? error.message\n : \"Failed to persist session\",\n code: \"SESSION_PERSISTENCE_FAILED\",\n },\n });\n }\n });\n }\n\n /**\n * Starts polling for the session and messages\n */\n function startPolling() {\n if (stopPolling) return;\n\n logger?.debug(\"Starting polling\");\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 now = new Date();\n chatState.setStatePartial({\n polling: {\n ...chatState.getState().polling,\n session: {\n isPolling: true,\n lastPollTime: now.toISOString(),\n nextPollTime: new Date(\n now.getTime() + POLLING_INTERVALS.SESSION,\n ).toISOString(),\n error: { hasError: false },\n },\n },\n });\n\n const { data } = await api.getSession(session.id);\n if (data) {\n sessionState.setState(data);\n }\n\n chatState.setStatePartial({\n polling: {\n ...chatState.getState().polling,\n session: {\n ...chatState.getState().polling.session,\n isPolling: false,\n },\n },\n });\n } catch (error) {\n logger?.error(\"Error polling session:\", error);\n chatState.setStatePartial({\n polling: {\n ...chatState.getState().polling,\n session: {\n ...chatState.getState().polling.session,\n isPolling: false,\n error: {\n hasError: true,\n message:\n error instanceof Error\n ? error.message\n : \"Failed to poll session\",\n code: \"SESSION_POLLING_FAILED\",\n },\n },\n },\n });\n }\n }, POLLING_INTERVALS.SESSION),\n );\n\n // Poll messages\n intervals.push(\n setInterval(async () => {\n const session = sessionState.getState();\n if (!session?.id) return;\n try {\n const now = new Date();\n chatState.setStatePartial({\n polling: {\n ...chatState.getState().polling,\n messages: {\n isPolling: true,\n lastPollTime: now.toISOString(),\n nextPollTime: new Date(\n now.getTime() + POLLING_INTERVALS.MESSAGES,\n ).toISOString(),\n error: { hasError: false },\n },\n },\n });\n\n await messageHandler.fetchHistoryMessages(session);\n\n chatState.setStatePartial({\n polling: {\n ...chatState.getState().polling,\n messages: {\n ...chatState.getState().polling.messages,\n isPolling: false,\n },\n },\n });\n } catch (error) {\n logger?.error(\"Error polling messages:\", error);\n chatState.setStatePartial({\n polling: {\n ...chatState.getState().polling,\n messages: {\n ...chatState.getState().polling.messages,\n isPolling: false,\n error: {\n hasError: true,\n message:\n error instanceof Error\n ? error.message\n : \"Failed to poll messages\",\n code: \"MESSAGES_POLLING_FAILED\",\n },\n },\n },\n });\n }\n }, POLLING_INTERVALS.MESSAGES),\n );\n\n stopPolling = () => {\n logger?.debug(\"Stopping polling\");\n intervals.forEach(clearInterval);\n // Reset polling states\n chatState.setStatePartial({\n polling: {\n session: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n messages: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n },\n });\n };\n }\n\n /**\n * Creates a new session\n * @returns The session\n */\n async function createSession() {\n logger?.info(\"Creating new session\");\n chatState.setStatePartial({\n loading: { isLoading: true, reason: \"creating_session\" },\n error: { hasError: false },\n });\n\n const { data: session, error } = await api.createSession();\n if (session) {\n logger?.info(\"Session created successfully\", { sessionId: session.id });\n sessionState.setState(session);\n chatState.setStatePartial({\n loading: { isLoading: false, reason: null },\n });\n startPolling();\n return session;\n }\n\n logger?.error(\"Failed to create session:\", error);\n const errorState = {\n hasError: true,\n message:\n error instanceof Error ? error.message : \"Failed to create session\",\n code: \"SESSION_CREATION_FAILED\" as const,\n };\n chatState.setStatePartial({\n error: errorState,\n loading: { isLoading: false, reason: null },\n });\n return null;\n }\n\n /**\n * Clears the session and stops polling\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\n if (persistSession() && storage) {\n await storage.removeItem(sessionStorageKey);\n }\n\n chatState.setState({\n messages: [],\n keyboard: null,\n loading: { isLoading: false, reason: null },\n error: { hasError: false },\n polling: {\n session: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n messages: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n },\n });\n\n options.onSessionDestroy?.();\n } catch (error) {\n chatState.setStatePartial({\n error: {\n hasError: true,\n message:\n error instanceof Error ? error.message : \"Failed to clear session\",\n code: \"SESSION_CLEAR_FAILED\",\n },\n });\n }\n }\n\n /**\n * Cleans up the session and stops polling\n */\n function cleanup(removeSession = false) {\n try {\n if (stopPolling) {\n stopPolling();\n stopPolling = null;\n }\n\n if (removeSession && persistSession() && isStorageAvailable(storage)) {\n console.log(\"removing session data\", sessionStorageKey);\n safeStorageOperation(\n () => storage.removeItem(sessionStorageKey),\n \"Error removing session data\",\n );\n }\n\n chatState.setState({\n messages: [],\n keyboard: null,\n loading: { isLoading: false, reason: null },\n error: { hasError: false },\n polling: {\n session: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n messages: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n },\n });\n\n sessionState.setState(null);\n chatState.clear();\n sessionState.clear();\n } catch (error) {\n chatState.setStatePartial({\n error: {\n hasError: true,\n message: error instanceof Error ? error.message : \"Failed to cleanup\",\n code: \"SESSION_CLEAR_FAILED\",\n },\n });\n }\n }\n\n /**\n * Fetches the session from the API\n * @param id - The ID of the session to fetch\n * @returns The session\n */\n async function fetchSession(id: string) {\n return api.getSession(id);\n }\n\n /**\n * Refetches the session and updates the state\n */\n async function refetchSession() {\n const session = sessionState.getState();\n if (!session?.id) return;\n const { data: newSession } = await fetchSession(session.id);\n if (newSession) {\n sessionState.setState(newSession);\n }\n return newSession;\n }\n\n // Initialize session if persistence is enabled\n if (persistSession() && isStorageAvailable(storage)) {\n logger?.debug(\"Initializing session persistence\", {\n sessionStorageKey,\n stroageAvailable: isStorageAvailable(storage),\n });\n restoreSession();\n setupSessionPersistence();\n }\n\n return {\n createSession,\n clearSession,\n cleanup,\n startPolling,\n fetchSession,\n refetchSession,\n sessionStorageKey,\n };\n}\n\nexport type SendMessageInput = SomeOptional<\n SafeOmit<SendChatDto, \"bot_token\" | \"uuid\">,\n \"session_id\" | \"user\"\n>;\n\n// Main Chat Function\nexport function createChat(options: ChatOptions) {\n const logger = options.platform?.logger;\n const initialState = <ChatState>{\n messages: [],\n keyboard: null,\n loading: { isLoading: false, reason: null },\n error: { hasError: false },\n polling: {\n session: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n messages: {\n isPolling: false,\n lastPollTime: null,\n nextPollTime: null,\n error: { hasError: false },\n },\n },\n };\n const chatState = new PubSub<ChatState>(initialState);\n\n const {\n contactState,\n cleanup: cleanupContact,\n shouldCollectData,\n createUnauthenticatedContact\n } = createContactHandler(\n { config: options.config, api: options.api },\n options.platform,\n );\n\n const sessionState = new PubSub<WidgetSessionDto | null>(null);\n\n const messageHandler = createMessageHandler(\n options.api,\n chatState,\n logger,\n options.config,\n options.platform,\n );\n\n const sessionManager = createSessionManager(\n options.api,\n sessionState,\n chatState,\n messageHandler,\n options.config,\n options,\n );\n\n async function sendMessage(input: SendMessageInput, abort?: AbortSignal) {\n let session = sessionState.getState();\n let createdSession = false;\n\n if (!session?.id) {\n logger?.debug(\"No active session, creating new session\");\n session = await sessionManager.createSession();\n if (!session)\n return {\n success: false,\n createdSession,\n };\n createdSession = true;\n }\n\n if (session.assignee.kind === \"ai\") {\n session = (await sessionManager.refetchSession()) ?? session;\n }\n\n try {\n logger?.debug(\"Sending message\", { sessionId: session.id });\n if (session.assignee.kind === \"ai\") {\n chatState.setStatePartial({\n loading: { isLoading: true, reason: \"sending_message_to_bot\" },\n error: { hasError: false },\n });\n } else {\n chatState.setStatePartial({\n loading: { isLoading: true, reason: \"sending_message_to_agent\" },\n error: { hasError: false },\n });\n }\n\n const userMessage = messageHandler.toUserMessage(\n input.content,\n input.attachments || undefined,\n );\n const currentMessages = chatState.getState().messages;\n chatState.setStatePartial({\n messages: [...currentMessages, userMessage],\n });\n\n const config = options.config.getConfig();\n const { data } = await options.api.handleMessage(\n {\n uuid: userMessage.id,\n bot_token: config.token,\n headers: config.headers,\n query_params: config.queryParams,\n session_id: session.id,\n user: config.user,\n ...input,\n },\n abort,\n );\n\n if (data?.success) {\n logger?.debug(\"Message sent successfully\");\n const botMessage = messageHandler.toBotMessage(data);\n if (botMessage) {\n const updatedMessages = chatState.getState().messages;\n chatState.setStatePartial({\n messages: [...updatedMessages, botMessage],\n });\n }\n return {\n success: true,\n createdSession,\n botMessage,\n };\n } else {\n logger?.warn(\"Message send failed\", data?.error);\n const errorMessage = messageHandler.addErrorMessage(\n data?.error?.message || \"Unknown error occurred\",\n );\n const currentMessages = chatState.getState().messages;\n chatState.setStatePartial({\n messages: [...currentMessages, errorMessage],\n });\n return {\n success: false,\n createdSession,\n error: data?.error,\n };\n }\n } catch (error) {\n logger?.error(\"Error sending message:\", error);\n chatState.setStatePartial({\n error: {\n hasError: true,\n message:\n error instanceof Error ? error.message : \"Failed to send message\",\n code: \"MESSAGE_SEND_FAILED\",\n },\n });\n return {\n success: false,\n createdSession,\n error,\n };\n } finally {\n chatState.setStatePartial({\n loading: { isLoading: false, reason: null },\n });\n }\n }\n\n async function recreateSession() {\n await sessionManager.clearSession();\n await sessionManager.createSession();\n }\n\n const cleanup = () => {\n cleanupContact();\n sessionManager.cleanup();\n };\n\n return {\n chatState,\n sessionState,\n sendMessage,\n createSession: sessionManager.createSession,\n clearSession: sessionManager.clearSession,\n cleanup,\n initialState,\n sessionStorageKey: sessionManager.sessionStorageKey,\n recreateSession,\n contactState,\n contactManager: {\n shouldCollectData,\n createUnauthenticatedContact,\n }\n };\n}\n","import { isStorageAvailable, Platform } from \"@core/platform\";\nimport { CoreOptions, createPubSub, PubSub } from \"../types\";\n\nconst DEFAULT_SOUND_EFFECTS = {\n messageArrived: \"https://cloud.opencopilot.so/sfx/notification3.mp3\"\n};\n/**\n * exclusive for web client\n */\nconst DEFAULT_THEME = {\n primaryColor: \"hsl(211,65%,59%)\",\n triggerOffset: \"20px\"\n};\n\nconst DEFAULT_SETTINGS = {\n persistSession: false,\n useSoundEffects: false\n};\n\nexport type NormalizedConfig = Required<Omit<CoreOptions, 'contactToken' | 'initialMessages'>> & {\n contactToken: string | undefined | null;\n initialMessages: string[];\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 assets: {\n organizationLogo: string;\n };\n};\n\nexport type ConfigInstance = {\n config: NormalizedConfig;\n updateSettings: (newSettings: Partial<WidgetSettings>) => void;\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 getSoundEffects: () => NormalizedConfig['soundEffectFiles'];\n getUser: () => NormalizedConfig['user'];\n getLanguage: () => string;\n getDebugMode: () => boolean;\n};\n\nconst MIN_POLLING_INTERVAL = 1000 * 3;\n\nexport type WidgetSettings = {\n persistSession: boolean;\n useSoundEffects: boolean;\n};\n\nfunction createSettingsManager(initialSettings: NormalizedConfig['settings'], platform: Platform, settingsStorageKey: string) {\n const logger = platform.logger;\n const storage = platform.storage;\n let settings = initialSettings ?? DEFAULT_SETTINGS;\n\n async function restoreSettings() {\n if (!storage || !isStorageAvailable(storage)) return;\n try {\n logger?.debug('Attempting to restore settings from storage');\n const storedSettings = await storage.getItem(settingsStorageKey);\n if (storedSettings) {\n settings = JSON.parse(storedSettings) as WidgetSettings;\n logger?.debug('Settings restored from storage', settings);\n }\n } catch (error) {\n logger?.error('Error restoring settings:', error);\n }\n }\n\n async function persistSettings(newSettings: WidgetSettings) {\n if (!storage || !isStorageAvailable(storage)) return;\n try {\n await storage.setItem(settingsStorageKey, JSON.stringify(newSettings));\n logger?.debug('Settings persisted to storage', newSettings);\n } catch (error) {\n logger?.error('Error persisting settings:', error);\n }\n }\n\n function updateSettings(newSettings: Partial<WidgetSettings>) {\n settings = {\n ...settings,\n ...newSettings\n };\n persistSettings(settings);\n }\n\n function getSettings() {\n return settings;\n }\n\n // Initialize settings\n restoreSettings();\n return {\n getSettings,\n updateSettings\n }\n}\n\nexport function createConfig(options: CoreOptions, platform: Platform): ConfigInstance {\n if (!options.token) {\n throw new Error(\"Token is required\");\n }\n\n if (options.pollingInterval && options.pollingInterval < MIN_POLLING_INTERVAL) {\n throw new Error(\"Polling interval must be at least 3 seconds\");\n }\n\n const normalizedConfig: NormalizedConfig = {\n ...options,\n collectUserData: options.collectUserData ?? false,\n initialMessages: options.initialMessages ?? [],\n apiUrl: options.apiUrl ?? \"https://api.open.cx\",\n pollingInterval: options.pollingInterval ?? 3000,\n headers: options.headers ?? {},\n queryParams: options.queryParams ?? {},\n pathParams: options.pathParams ?? {},\n bot: {\n name: options.bot?.name ?? \"Bot\",\n avatar: options.bot?.avatar ?? null,\n id: options.bot?.id ?? null,\n isAi: options.bot?.isAi ?? true\n },\n contactToken: options.contactToken,\n debug: options.debug ?? false,\n language: options.language ?? \"en\",\n user: options.user ?? {},\n soundEffectFiles: Object.assign({}, DEFAULT_SOUND_EFFECTS, options.soundEffectFiles),\n theme: Object.assign({}, DEFAULT_THEME, options.theme),\n settings: Object.assign({}, DEFAULT_SETTINGS, options.settings),\n assets: {\n organizationLogo: options.assets?.organizationLogo ?? \"\"\n }\n };\n const settingsStorageKey = `${normalizedConfig.token}:settings`;\n const { getSettings, updateSettings } = createSettingsManager(normalizedConfig.settings, platform, settingsStorageKey);\n\n return {\n config: normalizedConfig,\n updateSettings,\n getConfig: () => ({\n ...normalizedConfig,\n settings: getSettings()\n }),\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 getSoundEffects: () => normalizedConfig.soundEffectFiles,\n getUser: () => normalizedConfig.user,\n getLanguage: () => normalizedConfig.language,\n getDebugMode: () => normalizedConfig.debug\n };\n} ","// settings & const\nconst PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nconst supportsRequestInitExt = () => {\n return (\n typeof process === \"object\" &&\n Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 &&\n process.versions.undici\n );\n};\n\n/**\n * Returns a cheap, non-cryptographically-secure random ID\n * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya)\n */\nexport function randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\n\n/**\n * Create an openapi-fetch client.\n * @type {import(\"./index.js\").default}\n */\nexport default function createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = undefined,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : undefined;\n baseUrl = removeTrailingSlash(baseUrl);\n const middlewares = [];\n\n /**\n * Per-request fetch (keeps settings created in createClient()\n * @param {T} url\n * @param {import('./index.js').FetchOptions<T>} fetchOptions\n */\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n ...init\n } = fetchOptions || {};\n if (localBaseUrl) {\n baseUrl = removeTrailingSlash(localBaseUrl);\n }\n\n let querySerializer =\n typeof globalQuerySerializer === \"function\"\n ? globalQuerySerializer\n : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer =\n typeof requestQuerySerializer === \"function\"\n ? requestQuerySerializer\n : createQuerySerializer({\n ...(typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {}),\n ...requestQuerySerializer,\n });\n }\n\n const serializedBody = body === undefined ? undefined : bodySerializer(body);\n\n const defaultHeaders =\n // with no body, we should not to set Content-Type\n serializedBody === undefined ||\n // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData\n ? {}\n : {\n \"Content-Type\": \"application/json\",\n };\n\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: mergeHeaders(defaultHeaders, baseHeaders, headers, params.header),\n };\n\n let id;\n let options;\n let request = new CustomRequest(createFinalURL(schemaPath, { baseUrl, params, querySerializer }), requestInit);\n\n /** Add custom parameters to Request object */\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n\n if (middlewares.length) {\n id = randomID();\n\n // middleware (request)\n options = Object.freeze({\n baseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer,\n });\n for (const m of middlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (!(result instanceof CustomRequest)) {\n throw new Error(\"onRequest: must return new Request() when modifying the request\");\n }\n request = result;\n }\n }\n }\n }\n\n // fetch!\n let response;\n try {\n response = await fetch(request, requestInitExt);\n } catch (error) {\n let errorAfterMiddleware = error;\n // middleware (error)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n // if error is handled by returning a response, skip remaining middleware\n if (result instanceof Response) {\n errorAfterMiddleware = undefined;\n response = result;\n break;\n }\n\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n\n // rethrow error if not handled by middleware\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n\n // middleware (response)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n\n // handle empty content\n if (response.status === 204 || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: undefined, response } : { error: undefined, response };\n }\n\n // parse response (falling back to .text() when necessary)\n if (response.ok) {\n // if \"stream\", skip parsing entirely\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n\n // handle errors\n let error = await response.text();\n try {\n error = JSON.parse(error); // attempt to parse as JSON\n } catch {\n // noop\n }\n return { error, response };\n }\n\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n middlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = middlewares.indexOf(m);\n if (i !== -1) {\n middlewares.splice(i, 1);\n }\n }\n },\n };\n}\n\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n\n GET(init) {\n return this.client.GET(this.url, init);\n }\n PUT(init) {\n return this.client.PUT(this.url, init);\n }\n POST(init) {\n return this.client.POST(this.url, init);\n }\n DELETE(init) {\n return this.client.DELETE(this.url, init);\n }\n OPTIONS(init) {\n return this.client.OPTIONS(this.url, init);\n }\n HEAD(init) {\n return this.client.HEAD(this.url, init);\n }\n PATCH(init) {\n return this.client.PATCH(this.url, init);\n }\n TRACE(init) {\n return this.client.TRACE(this.url, init);\n }\n}\n\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\n\n/**\n * Wrap openapi-fetch client to support a path based API.\n * @type {import(\"./index.js\").wrapAsPathBasedClient}\n */\nexport function wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n\n // Put the proxy on the prototype chain of the actual client.\n // This means if we do not have a memoized PathCallForwarder,\n // we fall back to the proxy to synthesize it.\n // However, the proxy itself is not on the hot-path (if we fetch the same\n // endpoint multiple times, only the first call will hit the proxy).\n function Client() {}\n Client.prototype = proxy;\n\n const client = new Client();\n\n // Feed the client back to the proxy handler so it can store the generated\n // PathCallForwarder.\n handler.client = client;\n\n return client;\n}\n\n/**\n * Convenience method to an openapi-fetch path based client.\n * Strictly equivalent to `wrapAsPathBasedClient(createClient(...))`.\n * @type {import(\"./index.js\").createPathBasedClient}\n */\nexport function createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\n\n// utils\n\n/**\n * Serialize primitive param values\n * @type {import(\"./index.js\").serializePrimitiveParam}\n */\nexport function serializePrimitiveParam(name, value, options) {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\n\n/**\n * Serialize object param (shallow only)\n * @type {import(\"./index.js\").serializeObjectParam}\n */\nexport function serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner =\n {\n simple: \",\",\n label: \".\",\n matrix: \";\",\n }[options.style] || \"&\";\n\n // explode: false\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final = values.join(\",\"); // note: values are always joined by comma in explode: false (but joiner can prefix)\n switch (options.style) {\n case \"form\": {\n return `${name}=${final}`;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n default: {\n return final;\n }\n }\n }\n\n // explode: true\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\n\n/**\n * Serialize array param (shallow only)\n * @type {import(\"./index.js\").serializeArrayParam}\n */\nexport function serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n // explode: false\n if (options.explode === false) {\n const joiner = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\"; // note: for arrays, joiners vary wildly based on style + explode behavior\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n\n // explode: true\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\"\n ? `${joiner}${values.join(joiner)}`\n : values.join(joiner);\n}\n\n/**\n * Serialize query params to string\n * @type {import(\"./index.js\").createQuerySerializer}\n */\nexport function createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\n\n/**\n * Handle different OpenAPI 3.x serialization styles\n * @type {import(\"./index.js\").defaultPathSerializer}\n * @see https://swagger.io/docs/specification/serialization/#path\n */\nexport function defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === undefined || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\n\n/**\n * Serialize body object to string\n * @type {import(\"./index.js\").defaultBodySerializer}\n */\nexport function defaultBodySerializer(body) {\n if (body instanceof FormData) {\n return body;\n }\n return JSON.stringify(body);\n}\n\n/**\n * Construct URL string from baseUrl and handle path and query params\n * @type {import(\"./index.js\").createFinalURL}\n */\nexport function createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\n\n/**\n * Merge headers a and b, with b taking priority\n * @type {import(\"./index.js\").mergeHeaders}\n */\nexport function mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== undefined) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\n\n/**\n * Remove trailing slash from url\n * @type {import(\"./index.js\").removeTrailingSlash}\n */\nexport function removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n","import createClient, { type Middleware } from 'openapi-fetch';\nimport type { paths } from './schema';\nimport type { components } from './schema';\n\ntype Options = {\n baseUrl: string;\n onRequest?: Middleware['onRequest'];\n onResponse?: Middleware['onResponse'];\n onError?: Middleware['onError'];\n};\n\nconst defaultOnError: Middleware['onError'] = (onErrorOptions) => {\n console.log(onErrorOptions.error);\n};\n\nexport const basicClient = (options: Options) => {\n const client = createClient<paths>({\n baseUrl: options.baseUrl\n });\n\n const middlewares: Middleware = {\n onRequest: options.onRequest,\n onResponse: options.onResponse,\n onError: options.onError || defaultOnError\n };\n\n client.use(middlewares);\n return client;\n};\n\nexport type Dto = components['schemas'];\n\n","import { User } from \"@core/types\";\nimport { SendChatDto, WidgetVoteDto } from \"../types/schemas-v2\";\nimport { NormalizedConfig } from \"./config\";\nimport { basicClient, Dto } from \"@core/sdk\";\n\nexport interface ApiCallerOptions {\n config: NormalizedConfig;\n}\n\nexport class ApiCaller {\n #client: ReturnType<typeof basicClient>;\n\n constructor(private readonly options: ApiCallerOptions) {\n this.#client = this.createClient(options.config.user)\n }\n\n createClient = (user: User) => {\n const consumerHeader = {\n claim: \"\",\n value: \"\",\n };\n\n if (user?.email) {\n consumerHeader.claim = \"email\";\n consumerHeader.value = user.email;\n } else if (user?.phone) {\n consumerHeader.claim = \"phone\";\n consumerHeader.value = user.phone;\n }\n\n return basicClient({\n baseUrl: this.options.config.apiUrl,\n onRequest: ({ request }) => {\n request.headers.set(\"X-Bot-Token\", this.options.config.token);\n request.headers.set(\n \"X-Consumer-Id\",\n `${consumerHeader.claim}:${consumerHeader.value}`,\n );\n request.headers.set(\"Content-Type\", \"application/json\");\n request.headers.set(\"Accept\", \"application/json\");\n if (this.options.config.contactToken) {\n request.headers.set(\n \"Authorization\",\n `Bearer ${this.options.config.contactToken}`,\n );\n }\n },\n });\n }\n\n setUser = (user: User) => {\n this.#client = this.createClient(user)\n }\n\n me = async () => {\n return await this.#client.GET(\"/backend/widget/v2/me\");\n };\n\n widgetPrelude = async () => {\n return await this.#client.GET(\"/backend/widget/v2/prelude\", {\n params: { header: { \"X-Bot-Token\": this.options.config.token } },\n });\n };\n\n handleMessage = async (body: SendChatDto, abortSignal?: AbortSignal) => {\n return await this.#client.POST(\"/backend/widget/v2/chat/send\", {\n body,\n signal: abortSignal,\n });\n };\n\n getSessionHistory = async (\n sessionId: string,\n lastMessageTimestamp?: string,\n ) => {\n const query = lastMessageTimestamp ? { lastMessageTimestamp } : undefined;\n return await this.#client.GET(\n \"/backend/widget/v2/session/history/{sessionId}\",\n { params: { path: { sessionId }, query } },\n );\n };\n\n createContact = async (body: Dto[\"CreateContactDto\"]) => {\n return await this.#client.POST(\"/backend/widget/v2/me/create\", {\n params: { header: { \"x-bot-token\": this.options.config.token } },\n body,\n });\n };\n\n createSession = async () => {\n return await this.#client.POST(\"/backend/widget/v2/create-session\");\n };\n\n getSession = async (sessionId: string) => {\n return await this.#client.GET(\"/backend/widget/v2/session/{sessionId}\", {\n params: { path: { sessionId } },\n });\n };\n\n uploadFile = async ({\n file,\n abortSignal,\n }: {\n file: {\n id: string;\n file: File;\n };\n abortSignal?: AbortSignal;\n }) => {\n const formData = new FormData();\n formData.append(\"file\", file.file);\n\n return await this.#client.POST(\"/backend/widget/v2/upload\", {\n params: { query: { fileId: file.id, sessionId: \"\" } },\n body: formData as unknown as Dto[\"FileUploadDto\"],\n signal: abortSignal,\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n });\n };\n\n vote = async (body: WidgetVoteDto) => {\n return await this.#client.POST(\"/backend/widget/v2/chat/vote\", { body });\n };\n}\n"],"names":["OpenCXError","message","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError","StorageNotAvailableError","ExternalIdNotDefinedError","LifecycleEvent","PubSub","state","__publicField","__privateAdd","_state","_lastUpdated","event","data","listeners","eventData","listener","callback","error","__privateGet","newState","isEqual","__privateSet","_s","createPubSub","isStorageAvailable","storage","safeStorageOperation","operation","errorContext","createLogger","options","level","prefix","enabled","currentLevel","levels","shouldLog","messageLevel","formatMessage","formatArgs","args","arg","isAudioAvailable","audio","safeAudioOperation","genUuid","uuidv4","createContactHandler","config","api","platform","shouldCollectData","_a","cleanup","createUnauthenticatedContact","payload","POLLING_INTERVALS","mapHistoryToMessage","history","commonFields","createMessageHandler","logger","fetchHistoryMessages","session","messages","lastMessageTimestamp","response","newMessages","newMsg","existingMsg","m","msg","toUserMessage","content","attachments","toBotMessage","uiVal","addErrorMessage","createSessionManager","sessionState","chatState","messageHandler","stopPolling","_b","persistSession","token","user","sessionStorageKey","restoreSession","storedSession","startPolling","setupSessionPersistence","intervals","now","createSession","errorState","clearSession","removeSession","fetchSession","id","refetchSession","newSession","createChat","initialState","contactState","cleanupContact","sessionManager","sendMessage","input","abort","createdSession","userMessage","currentMessages","botMessage","updatedMessages","errorMessage","recreateSession","DEFAULT_SOUND_EFFECTS","DEFAULT_THEME","DEFAULT_SETTINGS","MIN_POLLING_INTERVAL","createSettingsManager","initialSettings","settingsStorageKey","settings","restoreSettings","storedSettings","persistSettings","newSettings","updateSettings","getSettings","createConfig","normalizedConfig","_c","_d","_e","PATH_PARAM_RE","supportsRequestInitExt","randomID","createClient","clientOptions","baseUrl","CustomRequest","baseFetch","globalQuerySerializer","globalBodySerializer","baseHeaders","requestInitExt","baseOptions","removeTrailingSlash","middlewares","coreFetch","schemaPath","fetchOptions","localBaseUrl","fetch","Request","headers","params","parseAs","requestQuerySerializer","bodySerializer","defaultBodySerializer","body","init","querySerializer","createQuerySerializer","serializedBody","defaultHeaders","requestInit","mergeHeaders","request","createFinalURL","key","result","errorAfterMiddleware","i","method","url","middleware","serializePrimitiveParam","name","value","serializeObjectParam","values","joiner","k","final","finalName","serializeArrayParam","v","queryParams","search","defaultPathSerializer","pathname","pathParams","nextURL","match","explode","style","finalURL","allHeaders","finalHeaders","h","iterator","v2","defaultOnError","onErrorOptions","basicClient","client","ApiCaller","_client","consumerHeader","abortSignal","sessionId","query","file","formData"],"mappings":"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","x_google_ignoreList":[9]}
|