@opencx/widget 2.0.0 → 2.2.0
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/README.md +5 -5
- package/dist/basic.cjs +2 -2
- package/dist/basic.cjs.map +1 -1
- package/dist/basic.js +781 -777
- package/dist/basic.js.map +1 -1
- package/dist/core/errors/index.d.ts +6 -6
- package/dist/{index-C11ivBh5.js → index-XkXeMM77.js} +3 -3
- package/dist/{index-C11ivBh5.js.map → index-XkXeMM77.js.map} +1 -1
- package/dist/index-xb7Pg6AD.cjs +18 -0
- package/dist/{index-DQmRZV3b.cjs.map → index-xb7Pg6AD.cjs.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +31 -31
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.js +2 -2
- package/dist/src/designs/basic/index.d.ts +5 -2
- package/dist/src/index.d.ts +1 -1
- package/dist-embed/script.js +2 -2
- package/dist-embed/script.js.map +1 -1
- package/package.json +2 -2
- package/dist/index-DQmRZV3b.cjs +0 -18
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var I=Object.defineProperty;var b=n=>{throw TypeError(n)};var v=(n,e,s)=>e in n?I(n,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[e]=s;var i=(n,e,s)=>v(n,typeof e!="symbol"?e+"":e,s),m=(n,e,s)=>e.has(n)||b("Cannot "+s);var a=(n,e,s)=>(m(n,e,"read from private field"),s?s.call(n):e.get(n)),g=(n,e,s)=>e.has(n)?b("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,s),u=(n,e,s,t)=>(m(n,e,"write to private field"),t?t.call(n,s):e.set(n,s),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./history-to-widget-messages-CdbZolRN.cjs");class f{constructor(){i(this,"subscribers",new Map)}subscribe(e,s){return this.subscribers.has(e)||this.subscribers.set(e,new Set),this.subscribers.get(e).add(s),()=>{const t=this.subscribers.get(e);t&&(t.delete(s),t.size===0&&this.subscribers.delete(e))}}publish(e,s){const t=this.subscribers.get(e);t&&t.forEach(r=>r(s))}clear(){this.subscribers.clear()}}class E{constructor(){i(this,"unsubscribers",[])}addUnsubscriber(e){this.unsubscribers.push(e)}dispose(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[],this.cleanup()}}class T{constructor(e){this.options=e}async createSession(){const e=await fetch(`${this.options.apiUrl}/sessions`,{method:"POST",headers:{Authorization:`Bearer ${this.options.token}`,"Content-Type":"application/json"}});if(!e.ok)throw new Error("Failed to create session");return e.json()}async fetchSession(e){const s=await fetch(`${this.options.apiUrl}/sessions/${e}`,{headers:{Authorization:`Bearer ${this.options.token}`}});if(!s.ok)throw new Error("Failed to fetch session");return s.json()}async ping(){if(!(await fetch(`${this.options.apiUrl}/ping`,{headers:{Authorization:`Bearer ${this.options.token}`}})).ok)throw new Error("Failed to ping API")}async getMessages(e){const s=e?`${this.options.apiUrl}/messages/${e}`:`${this.options.apiUrl}/messages`,t=await fetch(s,{headers:{Authorization:`Bearer ${this.options.token}`}});if(!t.ok)throw new Error("Failed to fetch messages");return t.json()}async sendMessage(e){if(!(await fetch(`${this.options.apiUrl}/messages`,{method:"POST",headers:{Authorization:`Bearer ${this.options.token}`,"Content-Type":"application/json"},body:JSON.stringify(e)})).ok)throw new Error("Failed to send message")}}var o;class C extends f{constructor(s,t){super();g(this,o,null);i(this,"clearSession",()=>{if(a(this,o)){const s=a(this,o).id;u(this,o,null),this.publish("session:closed",{sessionId:s})}});this.httpClient=s,t&&this.setSession(t)}get currentSession(){return a(this,o)?{...a(this,o),isSessionClosed:a(this,o).status!==d.SessionStatus.OPEN,isAssignedToAi:a(this,o).assignee_id===555,isAssignedToHuman:a(this,o).assignee_id!==555,isPendingHuman:a(this,o).assignee_id===555&&a(this,o).ai_closure_type===d.AIClosureType.handed_off}:null}setSession(s){u(this,o,s),this.publish("session:updated",s)}async createSession(){try{const s=await this.httpClient.createSession();return this.setSession(s),this.publish("session:created",s),s}catch(s){throw this.publish("session:error",{error:s}),s}}async getOrCreateSession(){const s=this.currentSession;return s||this.createSession()}async refreshSession(s){try{const t=await this.httpClient.fetchSession(s);if(t)return this.setSession(t),t}catch(t){this.publish("session:error",{error:t}),console.error("Failed to refresh session:",t)}return null}cleanup(){u(this,o,null),this.clear()}}o=new WeakMap;class S{constructor(){i(this,"env",{platform:this.detectPlatform()});i(this,"date",{now:()=>Date.now(),toISOString:e=>new Date(e).toISOString()})}detectPlatform(){return typeof window<"u"?"browser":"server"}}var c;class k extends f{constructor(s){super();g(this,c,{connected:!1});this.options=s}setState(s){u(this,c,{...a(this,c),...s}),"connected"in s&&this.publish("transport:status",{status:s.connected?"connected":"disconnected"})}isConnected(){return a(this,c).connected}getState(){return{...a(this,c)}}}c=new WeakMap;class M extends k{constructor(s,t=new S){super(s);i(this,"pollingInterval");this.httpOptions=s,this.platform=t}async connect(){this.setState({connected:!0}),this.startPolling()}disconnect(){this.pollingInterval&&clearInterval(this.pollingInterval),this.setState({connected:!1})}async sendMessage(s){if(!this.isConnected()){const t=new Error("Transport not connected");throw this.publish("transport:error",{error:t}),t}try{await this.httpOptions.api.sendMessage(s)}catch(t){throw this.publish("transport:error",{error:t}),t}}startPolling(){this.pollingInterval&&clearInterval(this.pollingInterval),this.pollingInterval=setInterval(async()=>{if(this.isConnected())try{const s=await this.httpOptions.sessionManager.getOrCreateSession();(await this.httpOptions.api.getMessages(s.id)).forEach(r=>{this.publish("transport:message:received",r)})}catch(s){this.publish("transport:error",{error:s})}},this.httpOptions.pollingInterval)}}class O extends E{constructor(s,t=new S){super();i(this,"messagingTransport");i(this,"options");i(this,"api");i(this,"session");i(this,"events",new f);i(this,"messages",[]);i(this,"keyboard",null);i(this,"pollingInterval");i(this,"heartbeatInterval");this.platform=t,this.options={...s,apiUrl:s.apiUrl??"https://api-v2.opencopilot.so/backend",socketUrl:s.socketUrl??"https://api-v2.opencopilot.so",transport:s.transport??"socket",pollingInterval:s.pollingInterval??3e3,headers:{"X-Bot-Token":s.token,...s.headers},queryParams:{},pathParams:{},bot:{},debug:!1,language:"en",user:{}},this.api=new T({apiUrl:this.options.apiUrl,token:this.options.token}),this.session=new C(this.api),this.initializeTransport(),this.startMessagePolling(),this.startHeartbeat()}startMessagePolling(){this.pollingInterval&&clearInterval(this.pollingInterval),this.pollingInterval=setInterval(async()=>{const s=this.session.currentSession;if(!s)return;const t=this.messages[this.messages.length-1];if(t!=null&&t.timestamp)try{const r=await this.api.getMessages(s.id);if(r&&r.length>0){const p=r.map(h=>({message:h.content.text,type:"message",publicId:h.id,agent_avatar:null,agent_id:null,agent_name:null,created_at:h.timestamp,from_user:!1,handoff_happened_during_office_hours:!1,session_id:h.session_id,updated_at:null,attachments:h.attachments}));this.appendMessages(d.mapChatHistoryToMessage(p))}}catch(r){console.error("Error polling messages:",r),this.events.publish("client:error",r)}},20*1e3)}startHeartbeat(){this.heartbeatInterval&&clearInterval(this.heartbeatInterval);const s=async()=>{this.session.currentSession};s(),this.heartbeatInterval=setInterval(s,50*1e3)}appendMessages(s){const t=s.filter(r=>!this.messages.some(p=>p.id===r.id));this.messages.push(...t)}handleIncomingMessage(s){this.messages.push(s),this.refreshSession()}async refreshSession(){this.session.currentSession&&await this.session.getOrCreateSession()}initializeTransport(){const s={api:this.api,sessionManager:this.session,coreOptions:this.options};this.options.transport==="http"&&(this.messagingTransport=new M({...s,pollingInterval:this.options.pollingInterval},this.platform))}async sendMessage({content:s,user:t,...r}){const p=await this.session.getOrCreateSession(),h=d.genId(),w={type:"FROM_USER",id:h,content:s.text,user:t,deliveredAt:null,attachments:r.attachments};this.messages.push(w),this.keyboard&&this.setKeyboard(null),await this.messagingTransport.sendMessage({id:h,content:{text:s.text},session_id:p.id,bot_token:this.options.token,headers:this.options.headers,pathParams:this.options.pathParams,queryParams:this.options.queryParams,user:t,language:r.language??this.options.language,attachments:r.attachments,timestamp:new Date().toISOString()})}setKeyboard(s){this.keyboard=s}handleKeyboardOption(s){this.sendMessage({content:{text:s}}),this.setKeyboard(null)}getMessages(){return this.messages}clearChat(){this.messages=[],this.keyboard=null,this.session.clearSession()}async connect(){await this.messagingTransport.connect()}async disconnect(){this.messagingTransport.disconnect()}setTransport(s){this.messagingTransport.disconnect(),this.messagingTransport=s,this.connect()}get state(){return{connected:this.messagingTransport.isConnected(),session:this.session.currentSession,messages:this.messages,keyboard:this.keyboard}}cleanup(){this.pollingInterval&&clearInterval(this.pollingInterval),this.heartbeatInterval&&clearInterval(this.heartbeatInterval),this.messagingTransport.disconnect(),this.session.clear(),this.events.clear(),this.messages=[],this.keyboard=null}}class l extends Error{constructor(e){super(e),this.name="
|
|
1
|
+
"use strict";var I=Object.defineProperty;var b=n=>{throw TypeError(n)};var v=(n,e,s)=>e in n?I(n,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):n[e]=s;var i=(n,e,s)=>v(n,typeof e!="symbol"?e+"":e,s),m=(n,e,s)=>e.has(n)||b("Cannot "+s);var a=(n,e,s)=>(m(n,e,"read from private field"),s?s.call(n):e.get(n)),g=(n,e,s)=>e.has(n)?b("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(n):e.set(n,s),u=(n,e,s,t)=>(m(n,e,"write to private field"),t?t.call(n,s):e.set(n,s),s);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("./history-to-widget-messages-CdbZolRN.cjs");class f{constructor(){i(this,"subscribers",new Map)}subscribe(e,s){return this.subscribers.has(e)||this.subscribers.set(e,new Set),this.subscribers.get(e).add(s),()=>{const t=this.subscribers.get(e);t&&(t.delete(s),t.size===0&&this.subscribers.delete(e))}}publish(e,s){const t=this.subscribers.get(e);t&&t.forEach(r=>r(s))}clear(){this.subscribers.clear()}}class E{constructor(){i(this,"unsubscribers",[])}addUnsubscriber(e){this.unsubscribers.push(e)}dispose(){this.unsubscribers.forEach(e=>e()),this.unsubscribers=[],this.cleanup()}}class T{constructor(e){this.options=e}async createSession(){const e=await fetch(`${this.options.apiUrl}/sessions`,{method:"POST",headers:{Authorization:`Bearer ${this.options.token}`,"Content-Type":"application/json"}});if(!e.ok)throw new Error("Failed to create session");return e.json()}async fetchSession(e){const s=await fetch(`${this.options.apiUrl}/sessions/${e}`,{headers:{Authorization:`Bearer ${this.options.token}`}});if(!s.ok)throw new Error("Failed to fetch session");return s.json()}async ping(){if(!(await fetch(`${this.options.apiUrl}/ping`,{headers:{Authorization:`Bearer ${this.options.token}`}})).ok)throw new Error("Failed to ping API")}async getMessages(e){const s=e?`${this.options.apiUrl}/messages/${e}`:`${this.options.apiUrl}/messages`,t=await fetch(s,{headers:{Authorization:`Bearer ${this.options.token}`}});if(!t.ok)throw new Error("Failed to fetch messages");return t.json()}async sendMessage(e){if(!(await fetch(`${this.options.apiUrl}/messages`,{method:"POST",headers:{Authorization:`Bearer ${this.options.token}`,"Content-Type":"application/json"},body:JSON.stringify(e)})).ok)throw new Error("Failed to send message")}}var o;class C extends f{constructor(s,t){super();g(this,o,null);i(this,"clearSession",()=>{if(a(this,o)){const s=a(this,o).id;u(this,o,null),this.publish("session:closed",{sessionId:s})}});this.httpClient=s,t&&this.setSession(t)}get currentSession(){return a(this,o)?{...a(this,o),isSessionClosed:a(this,o).status!==d.SessionStatus.OPEN,isAssignedToAi:a(this,o).assignee_id===555,isAssignedToHuman:a(this,o).assignee_id!==555,isPendingHuman:a(this,o).assignee_id===555&&a(this,o).ai_closure_type===d.AIClosureType.handed_off}:null}setSession(s){u(this,o,s),this.publish("session:updated",s)}async createSession(){try{const s=await this.httpClient.createSession();return this.setSession(s),this.publish("session:created",s),s}catch(s){throw this.publish("session:error",{error:s}),s}}async getOrCreateSession(){const s=this.currentSession;return s||this.createSession()}async refreshSession(s){try{const t=await this.httpClient.fetchSession(s);if(t)return this.setSession(t),t}catch(t){this.publish("session:error",{error:t}),console.error("Failed to refresh session:",t)}return null}cleanup(){u(this,o,null),this.clear()}}o=new WeakMap;class S{constructor(){i(this,"env",{platform:this.detectPlatform()});i(this,"date",{now:()=>Date.now(),toISOString:e=>new Date(e).toISOString()})}detectPlatform(){return typeof window<"u"?"browser":"server"}}var c;class k extends f{constructor(s){super();g(this,c,{connected:!1});this.options=s}setState(s){u(this,c,{...a(this,c),...s}),"connected"in s&&this.publish("transport:status",{status:s.connected?"connected":"disconnected"})}isConnected(){return a(this,c).connected}getState(){return{...a(this,c)}}}c=new WeakMap;class M extends k{constructor(s,t=new S){super(s);i(this,"pollingInterval");this.httpOptions=s,this.platform=t}async connect(){this.setState({connected:!0}),this.startPolling()}disconnect(){this.pollingInterval&&clearInterval(this.pollingInterval),this.setState({connected:!1})}async sendMessage(s){if(!this.isConnected()){const t=new Error("Transport not connected");throw this.publish("transport:error",{error:t}),t}try{await this.httpOptions.api.sendMessage(s)}catch(t){throw this.publish("transport:error",{error:t}),t}}startPolling(){this.pollingInterval&&clearInterval(this.pollingInterval),this.pollingInterval=setInterval(async()=>{if(this.isConnected())try{const s=await this.httpOptions.sessionManager.getOrCreateSession();(await this.httpOptions.api.getMessages(s.id)).forEach(r=>{this.publish("transport:message:received",r)})}catch(s){this.publish("transport:error",{error:s})}},this.httpOptions.pollingInterval)}}class O extends E{constructor(s,t=new S){super();i(this,"messagingTransport");i(this,"options");i(this,"api");i(this,"session");i(this,"events",new f);i(this,"messages",[]);i(this,"keyboard",null);i(this,"pollingInterval");i(this,"heartbeatInterval");this.platform=t,this.options={...s,apiUrl:s.apiUrl??"https://api-v2.opencopilot.so/backend",socketUrl:s.socketUrl??"https://api-v2.opencopilot.so",transport:s.transport??"socket",pollingInterval:s.pollingInterval??3e3,headers:{"X-Bot-Token":s.token,...s.headers},queryParams:{},pathParams:{},bot:{},debug:!1,language:"en",user:{}},this.api=new T({apiUrl:this.options.apiUrl,token:this.options.token}),this.session=new C(this.api),this.initializeTransport(),this.startMessagePolling(),this.startHeartbeat()}startMessagePolling(){this.pollingInterval&&clearInterval(this.pollingInterval),this.pollingInterval=setInterval(async()=>{const s=this.session.currentSession;if(!s)return;const t=this.messages[this.messages.length-1];if(t!=null&&t.timestamp)try{const r=await this.api.getMessages(s.id);if(r&&r.length>0){const p=r.map(h=>({message:h.content.text,type:"message",publicId:h.id,agent_avatar:null,agent_id:null,agent_name:null,created_at:h.timestamp,from_user:!1,handoff_happened_during_office_hours:!1,session_id:h.session_id,updated_at:null,attachments:h.attachments}));this.appendMessages(d.mapChatHistoryToMessage(p))}}catch(r){console.error("Error polling messages:",r),this.events.publish("client:error",r)}},20*1e3)}startHeartbeat(){this.heartbeatInterval&&clearInterval(this.heartbeatInterval);const s=async()=>{this.session.currentSession};s(),this.heartbeatInterval=setInterval(s,50*1e3)}appendMessages(s){const t=s.filter(r=>!this.messages.some(p=>p.id===r.id));this.messages.push(...t)}handleIncomingMessage(s){this.messages.push(s),this.refreshSession()}async refreshSession(){this.session.currentSession&&await this.session.getOrCreateSession()}initializeTransport(){const s={api:this.api,sessionManager:this.session,coreOptions:this.options};this.options.transport==="http"&&(this.messagingTransport=new M({...s,pollingInterval:this.options.pollingInterval},this.platform))}async sendMessage({content:s,user:t,...r}){const p=await this.session.getOrCreateSession(),h=d.genId(),w={type:"FROM_USER",id:h,content:s.text,user:t,deliveredAt:null,attachments:r.attachments};this.messages.push(w),this.keyboard&&this.setKeyboard(null),await this.messagingTransport.sendMessage({id:h,content:{text:s.text},session_id:p.id,bot_token:this.options.token,headers:this.options.headers,pathParams:this.options.pathParams,queryParams:this.options.queryParams,user:t,language:r.language??this.options.language,attachments:r.attachments,timestamp:new Date().toISOString()})}setKeyboard(s){this.keyboard=s}handleKeyboardOption(s){this.sendMessage({content:{text:s}}),this.setKeyboard(null)}getMessages(){return this.messages}clearChat(){this.messages=[],this.keyboard=null,this.session.clearSession()}async connect(){await this.messagingTransport.connect()}async disconnect(){this.messagingTransport.disconnect()}setTransport(s){this.messagingTransport.disconnect(),this.messagingTransport=s,this.connect()}get state(){return{connected:this.messagingTransport.isConnected(),session:this.session.currentSession,messages:this.messages,keyboard:this.keyboard}}cleanup(){this.pollingInterval&&clearInterval(this.pollingInterval),this.heartbeatInterval&&clearInterval(this.heartbeatInterval),this.messagingTransport.disconnect(),this.session.clear(),this.events.clear(),this.messages=[],this.keyboard=null}}class l extends Error{constructor(e){super(e),this.name="OpenCXError"}}class _ extends l{constructor(e="Connection failed"){super(e),this.name="ConnectionError"}}class P extends l{constructor(e="Authentication failed"){super(e),this.name="AuthenticationError"}}class y extends l{constructor(e="Session error occurred"){super(e),this.name="SessionError"}}class A extends y{constructor(e="Session not defined"){super(e),this.name="SessionNotDefinedError"}}class U extends l{constructor(e="Transport error occurred"){super(e),this.name="TransportError"}}class x extends l{constructor(e="File upload failed"){super(e),this.name="FileUploadError"}}exports.ApiClient=O;exports.AuthenticationError=P;exports.ConnectionError=_;exports.FileUploadError=x;exports.OpenCXError=l;exports.SessionError=y;exports.SessionNotDefinedError=A;exports.TransportError=U;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../core/types/pub-sub.ts","../core/client/api.ts","../core/managers/session-manager.ts","../core/platform/index.ts","../core/transport/transport.ts","../core/transport/http.transport.ts","../core/client/client.ts","../core/errors/index.ts"],"sourcesContent":["/**\n * Base interface for event maps. All event maps must extend this.\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * \"my:other:event\": { data: number }\n * }\n * ```\n */\nexport interface EventMap {\n [key: string]: any;\n}\n\n/**\n * Event subscriber function type\n */\nexport type Subscriber<T> = (data: T) => void;\n\n/**\n * Generic PubSub class that can be typed with specific event maps.\n * Each component should create its own instance with its specific events.\n *\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * }\n *\n * const pubSub = new PubSub<MyEvents>();\n *\n * pubSub.subscribe(\"my:event\", (data) => {\n * console.log(data.toUpperCase()); // Type-safe: data is string\n * });\n * ```\n */\nexport class PubSub<T extends EventMap> {\n private subscribers: Map<keyof T, Set<Subscriber<any>>> = new Map();\n\n /**\n * Subscribe to an event\n * @param event Event name to subscribe to\n * @param callback Function to call when event is published\n * @returns Unsubscribe function\n */\n subscribe<K extends keyof T>(\n event: K,\n callback: Subscriber<T[K]>,\n ): () => void {\n if (!this.subscribers.has(event)) {\n this.subscribers.set(event, new Set());\n }\n this.subscribers.get(event)!.add(callback);\n\n return () => {\n const subs = this.subscribers.get(event);\n if (subs) {\n subs.delete(callback);\n if (subs.size === 0) {\n this.subscribers.delete(event);\n }\n }\n };\n }\n\n /**\n * Publish an event with data\n * @param event Event name to publish\n * @param data Data to send with the event\n */\n publish<K extends keyof T>(event: K, data: T[K]): void {\n const callbacks = this.subscribers.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Abstract base class for components that need subscription management.\n * Provides common functionality for managing subscriptions and cleanup.\n *\n * @example\n * ```typescript\n * class MyComponent extends Subscribable {\n * constructor() {\n * super();\n * // Add unsubscribers\n * this.addUnsubscriber(() => {\n * console.log('Cleanup');\n * });\n * }\n *\n * protected cleanup(): void {\n * // Component-specific cleanup\n * }\n * }\n * ```\n */\nexport abstract class Subscribable {\n protected unsubscribers: (() => void)[] = [];\n\n /**\n * Add an unsubscribe function to be called during cleanup\n */\n protected addUnsubscriber(unsubscribe: () => void) {\n this.unsubscribers.push(unsubscribe);\n }\n\n /**\n * Dispose of all subscriptions and perform cleanup\n */\n public dispose() {\n this.unsubscribers.forEach((unsubscribe) => unsubscribe());\n this.unsubscribers = [];\n this.cleanup();\n }\n\n /**\n * Component-specific cleanup logic\n */\n protected abstract cleanup(): void;\n}\n\n/**\n * Helper function to create a strongly typed PubSub instance\n */\nexport function createPubSub<T extends EventMap>(): PubSub<T> {\n return new PubSub<T>();\n}\n","import { ChatSessionType } from \"../types/schemas\";\nimport { MessageData } from \"../types/transport\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n}\n\nexport class ApiCaller {\n constructor(private readonly options: ApiCallerOptions) {}\n\n async createSession(): Promise<ChatSessionType> {\n const response = await fetch(`${this.options.apiUrl}/sessions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to create session\");\n }\n\n return response.json();\n }\n\n async fetchSession(sessionId: string): Promise<ChatSessionType> {\n const response = await fetch(\n `${this.options.apiUrl}/sessions/${sessionId}`,\n {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch session\");\n }\n\n return response.json();\n }\n\n async ping(): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/ping`, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to ping API\");\n }\n }\n\n async getMessages(sessionId?: string): Promise<MessageData[]> {\n const url = sessionId\n ? `${this.options.apiUrl}/messages/${sessionId}`\n : `${this.options.apiUrl}/messages`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch messages\");\n }\n\n return response.json();\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n }\n}\n","import { EventMap, PubSub } from \"../types/pub-sub\";\nimport {\n AIClosureType,\n SessionStatus,\n ChatSessionType,\n} from \"../types/schemas\";\nimport { ApiCaller } from \"../client/api\";\n\nexport type ChatSessionWithStatus = ChatSessionType & {\n isSessionClosed: boolean;\n isAssignedToAi: boolean;\n isAssignedToHuman: boolean;\n isPendingHuman: boolean;\n};\n\n/**\n * Events emitted by the SessionManager\n */\ninterface SessionEvents extends EventMap {\n \"session:updated\": ChatSessionType;\n \"session:created\": ChatSessionType;\n \"session:closed\": { sessionId: string };\n \"session:error\": { error: Error };\n}\n\nexport class SessionManager extends PubSub<SessionEvents> {\n #currentSession: ChatSessionType | null = null;\n\n constructor(\n private readonly httpClient: ApiCaller,\n initialSession?: ChatSessionType,\n ) {\n super();\n if (initialSession) {\n this.setSession(initialSession);\n }\n }\n\n get currentSession(): ChatSessionWithStatus | null {\n if (!this.#currentSession) {\n return null;\n }\n return {\n ...this.#currentSession,\n isSessionClosed: this.#currentSession.status !== SessionStatus.OPEN,\n isAssignedToAi: this.#currentSession.assignee_id === 555,\n isAssignedToHuman: this.#currentSession.assignee_id !== 555,\n isPendingHuman:\n this.#currentSession.assignee_id === 555 &&\n this.#currentSession.ai_closure_type === AIClosureType.handed_off,\n };\n }\n\n setSession(session: ChatSessionType): void {\n this.#currentSession = session;\n this.publish(\"session:updated\", session);\n }\n\n clearSession = (): void => {\n if (this.#currentSession) {\n const sessionId = this.#currentSession.id;\n this.#currentSession = null;\n this.publish(\"session:closed\", { sessionId });\n }\n };\n\n async createSession(): Promise<ChatSessionType> {\n try {\n const session = await this.httpClient.createSession();\n this.setSession(session);\n this.publish(\"session:created\", session);\n return session;\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n throw error;\n }\n }\n\n async getOrCreateSession(): Promise<ChatSessionType> {\n const session = this.currentSession;\n if (!session) {\n return this.createSession();\n }\n return session;\n }\n\n async refreshSession(sessionId: string): Promise<ChatSessionType | null> {\n try {\n const session = await this.httpClient.fetchSession(sessionId);\n if (session) {\n this.setSession(session);\n return session;\n }\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n console.error(\"Failed to refresh session:\", error);\n }\n return null;\n }\n\n protected cleanup(): void {\n this.#currentSession = null;\n this.clear();\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\n// Default platform implementation\nexport class DefaultPlatform implements Platform {\n env = {\n platform: this.detectPlatform(),\n };\n\n date = {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString(),\n };\n\n private detectPlatform() {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n }\n}\n","import { MessageData, TransportOptions } from \"../types/transport\";\nimport { PubSub } from \"../types/pub-sub\";\n\nexport interface TransportEvents extends Record<string, any> {\n \"transport:message:received\": MessageData;\n \"transport:error\": { error: Error };\n \"transport:status\": { status: \"connected\" | \"disconnected\" };\n}\n\nexport interface TransportState {\n connected: boolean;\n}\n\nexport abstract class MessagingTransport extends PubSub<TransportEvents> {\n #state: TransportState = {\n connected: false,\n };\n\n constructor(protected readonly options: TransportOptions) {\n super();\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): void;\n abstract sendMessage(message: MessageData): Promise<void>;\n\n protected setState(newState: Partial<TransportState>) {\n this.#state = { ...this.#state, ...newState };\n\n // Emit status change event if connected state changes\n if (\"connected\" in newState) {\n this.publish(\"transport:status\", {\n status: newState.connected ? \"connected\" : \"disconnected\",\n });\n }\n }\n\n isConnected(): boolean {\n return this.#state.connected;\n }\n\n getState(): TransportState {\n return { ...this.#state };\n }\n}\n","import { Platform, DefaultPlatform } from \"../platform\";\nimport { MessageData, TransportOptions } from \"../types/transport\";\nimport { MessagingTransport } from \"./transport\";\n\ninterface HttpTransportOptions extends TransportOptions {\n pollingInterval: number;\n}\n\nexport class HttpTransport extends MessagingTransport {\n private pollingInterval?: NodeJS.Timeout;\n\n constructor(\n private readonly httpOptions: HttpTransportOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super(httpOptions);\n }\n\n async connect(): Promise<void> {\n this.setState({ connected: true });\n this.startPolling();\n }\n\n disconnect(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n this.setState({ connected: false });\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n if (!this.isConnected()) {\n const error = new Error(\"Transport not connected\");\n this.publish(\"transport:error\", { error });\n throw error;\n }\n\n try {\n await this.httpOptions.api.sendMessage(message);\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n throw error;\n }\n }\n\n private startPolling(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n if (!this.isConnected()) return;\n\n try {\n const session =\n await this.httpOptions.sessionManager.getOrCreateSession();\n const messages = await this.httpOptions.api.getMessages(session.id);\n\n messages.forEach((message) => {\n this.publish(\"transport:message:received\", message);\n });\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n }\n }, this.httpOptions.pollingInterval);\n }\n}\n","import { CoreOptions } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { PubSub, Subscribable } from \"../types/pub-sub\";\nimport { SessionManager } from \"../managers/session-manager\";\nimport { Platform, DefaultPlatform } from \"../platform\";\nimport { HttpTransport } from \"../transport/http.transport\";\nimport { MessagingTransport } from \"../transport/transport\";\nimport {\n MessageType,\n UserMessageType,\n BotMessageType,\n SendMessageInput,\n} from \"../types/messages\";\nimport { genId } from \"../utils/genId\";\nimport { MessageData } from \"../types/transport\";\nimport { mapChatHistoryToMessage } from \"../utils/history-to-widget-messages\";\n\ninterface ClientEvents {\n \"client:error\": Error;\n}\n\nexport class ApiClient extends Subscribable {\n private messagingTransport!: MessagingTransport;\n private readonly options: Required<CoreOptions>;\n private readonly api: ApiCaller;\n private readonly session: SessionManager;\n private readonly events = new PubSub<ClientEvents>();\n private messages: MessageType[] = [];\n private keyboard: string[] | null = null;\n private pollingInterval?: NodeJS.Timeout;\n private heartbeatInterval?: NodeJS.Timeout;\n\n constructor(\n options: CoreOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super();\n this.options = {\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 \"X-Bot-Token\": options.token,\n ...options.headers,\n },\n queryParams: {},\n pathParams: {},\n bot: {},\n debug: false,\n language: \"en\",\n user: {},\n };\n\n this.api = new ApiCaller({\n apiUrl: this.options.apiUrl,\n token: this.options.token,\n });\n\n this.session = new SessionManager(this.api);\n\n // Initialize transport\n this.initializeTransport();\n\n // Start polling and heartbeat\n this.startMessagePolling();\n this.startHeartbeat();\n }\n\n private startMessagePolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n const session = this.session.currentSession;\n if (!session) return;\n\n const lastMessage = this.messages[this.messages.length - 1];\n if (!lastMessage?.timestamp) return;\n\n try {\n const response = await this.api.getMessages(session.id);\n if (response && response.length > 0) {\n // Convert MessageData[] to ChatHistoryMessageType[]\n const historyMessages = response.map((msg) => ({\n message: msg.content.text,\n type: \"message\",\n publicId: msg.id,\n agent_avatar: null,\n agent_id: null,\n agent_name: null,\n created_at: msg.timestamp,\n from_user: false,\n handoff_happened_during_office_hours: false,\n session_id: msg.session_id,\n updated_at: null,\n attachments: msg.attachments,\n }));\n\n this.appendMessages(mapChatHistoryToMessage(historyMessages));\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n this.events.publish(\"client:error\", error as Error);\n }\n }, 20 * 1000);\n }\n\n private startHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n\n const sendHeartbeat = async () => {\n const session = this.session.currentSession;\n if (!session) return;\n };\n\n sendHeartbeat();\n this.heartbeatInterval = setInterval(sendHeartbeat, 50 * 1000);\n }\n\n private appendMessages(messages: MessageType[]) {\n const newMessages = messages.filter(\n (msg) => !this.messages.some((m) => m.id === msg.id),\n );\n this.messages.push(...newMessages);\n }\n\n private handleIncomingMessage(message: MessageType): void {\n this.messages.push(message);\n this.refreshSession();\n }\n\n private async refreshSession() {\n const session = this.session.currentSession;\n if (session) {\n await this.session.getOrCreateSession();\n }\n }\n\n private initializeTransport() {\n const transportConfig = {\n api: this.api,\n sessionManager: this.session,\n coreOptions: this.options,\n };\n\n if (this.options.transport === \"http\") {\n this.messagingTransport = new HttpTransport(\n {\n ...transportConfig,\n pollingInterval: this.options.pollingInterval,\n },\n this.platform,\n );\n }\n }\n\n public async sendMessage({\n content,\n user,\n ...data\n }: SendMessageInput): Promise<void> {\n const session = await this.session.getOrCreateSession();\n const messageId = genId();\n\n const message: UserMessageType = {\n type: \"FROM_USER\",\n id: messageId,\n content: content.text,\n user,\n deliveredAt: null,\n attachments: data.attachments,\n };\n\n // Add to local messages\n this.messages.push(message);\n\n // Clear keyboard if exists\n if (this.keyboard) {\n this.setKeyboard(null);\n }\n\n // Send through transport\n await this.messagingTransport.sendMessage({\n id: messageId,\n content: { text: content.text },\n session_id: session.id,\n bot_token: this.options.token,\n headers: this.options.headers,\n pathParams: this.options.pathParams,\n queryParams: this.options.queryParams,\n user,\n language: data.language ?? this.options.language,\n attachments: data.attachments,\n timestamp: new Date().toISOString(),\n });\n }\n\n public setKeyboard(options: string[] | null): void {\n this.keyboard = options;\n }\n\n public handleKeyboardOption(option: string): void {\n this.sendMessage({\n content: { text: option },\n });\n this.setKeyboard(null);\n }\n\n public getMessages(): readonly MessageType[] {\n return this.messages;\n }\n\n public clearChat(): void {\n this.messages = [];\n this.keyboard = null;\n this.session.clearSession();\n }\n\n async connect(): Promise<void> {\n await this.messagingTransport.connect();\n }\n\n async disconnect(): Promise<void> {\n this.messagingTransport.disconnect();\n }\n\n setTransport(transport: MessagingTransport): void {\n this.messagingTransport.disconnect();\n this.messagingTransport = transport;\n this.connect();\n }\n\n get state() {\n return {\n connected: this.messagingTransport.isConnected(),\n session: this.session.currentSession,\n messages: this.messages,\n keyboard: this.keyboard,\n };\n }\n\n protected cleanup(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.messagingTransport.disconnect();\n this.session.clear();\n this.events.clear();\n this.messages = [];\n this.keyboard = null;\n }\n}\n","export class OpenCopilotError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenCopilotError\";\n }\n}\n\nexport class ConnectionError extends OpenCopilotError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n\nexport class AuthenticationError extends OpenCopilotError {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class SessionError extends OpenCopilotError {\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 OpenCopilotError {\n constructor(message = \"Transport error occurred\") {\n super(message);\n this.name = \"TransportError\";\n }\n}\n\nexport class FileUploadError extends OpenCopilotError {\n constructor(message = \"File upload failed\") {\n super(message);\n this.name = \"FileUploadError\";\n }\n}\n"],"names":["PubSub","__publicField","event","callback","subs","data","callbacks","Subscribable","unsubscribe","ApiCaller","options","response","sessionId","url","message","SessionManager","httpClient","initialSession","__privateAdd","_currentSession","__privateGet","__privateSet","SessionStatus","AIClosureType","session","error","DefaultPlatform","date","MessagingTransport","_state","newState","HttpTransport","httpOptions","platform","ApiClient","lastMessage","historyMessages","msg","mapChatHistoryToMessage","sendHeartbeat","messages","newMessages","m","transportConfig","content","user","messageId","genId","option","transport","OpenCopilotError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../core/types/pub-sub.ts","../core/client/api.ts","../core/managers/session-manager.ts","../core/platform/index.ts","../core/transport/transport.ts","../core/transport/http.transport.ts","../core/client/client.ts","../core/errors/index.ts"],"sourcesContent":["/**\n * Base interface for event maps. All event maps must extend this.\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * \"my:other:event\": { data: number }\n * }\n * ```\n */\nexport interface EventMap {\n [key: string]: any;\n}\n\n/**\n * Event subscriber function type\n */\nexport type Subscriber<T> = (data: T) => void;\n\n/**\n * Generic PubSub class that can be typed with specific event maps.\n * Each component should create its own instance with its specific events.\n *\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * }\n *\n * const pubSub = new PubSub<MyEvents>();\n *\n * pubSub.subscribe(\"my:event\", (data) => {\n * console.log(data.toUpperCase()); // Type-safe: data is string\n * });\n * ```\n */\nexport class PubSub<T extends EventMap> {\n private subscribers: Map<keyof T, Set<Subscriber<any>>> = new Map();\n\n /**\n * Subscribe to an event\n * @param event Event name to subscribe to\n * @param callback Function to call when event is published\n * @returns Unsubscribe function\n */\n subscribe<K extends keyof T>(\n event: K,\n callback: Subscriber<T[K]>,\n ): () => void {\n if (!this.subscribers.has(event)) {\n this.subscribers.set(event, new Set());\n }\n this.subscribers.get(event)!.add(callback);\n\n return () => {\n const subs = this.subscribers.get(event);\n if (subs) {\n subs.delete(callback);\n if (subs.size === 0) {\n this.subscribers.delete(event);\n }\n }\n };\n }\n\n /**\n * Publish an event with data\n * @param event Event name to publish\n * @param data Data to send with the event\n */\n publish<K extends keyof T>(event: K, data: T[K]): void {\n const callbacks = this.subscribers.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Abstract base class for components that need subscription management.\n * Provides common functionality for managing subscriptions and cleanup.\n *\n * @example\n * ```typescript\n * class MyComponent extends Subscribable {\n * constructor() {\n * super();\n * // Add unsubscribers\n * this.addUnsubscriber(() => {\n * console.log('Cleanup');\n * });\n * }\n *\n * protected cleanup(): void {\n * // Component-specific cleanup\n * }\n * }\n * ```\n */\nexport abstract class Subscribable {\n protected unsubscribers: (() => void)[] = [];\n\n /**\n * Add an unsubscribe function to be called during cleanup\n */\n protected addUnsubscriber(unsubscribe: () => void) {\n this.unsubscribers.push(unsubscribe);\n }\n\n /**\n * Dispose of all subscriptions and perform cleanup\n */\n public dispose() {\n this.unsubscribers.forEach((unsubscribe) => unsubscribe());\n this.unsubscribers = [];\n this.cleanup();\n }\n\n /**\n * Component-specific cleanup logic\n */\n protected abstract cleanup(): void;\n}\n\n/**\n * Helper function to create a strongly typed PubSub instance\n */\nexport function createPubSub<T extends EventMap>(): PubSub<T> {\n return new PubSub<T>();\n}\n","import { ChatSessionType } from \"../types/schemas\";\nimport { MessageData } from \"../types/transport\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n}\n\nexport class ApiCaller {\n constructor(private readonly options: ApiCallerOptions) {}\n\n async createSession(): Promise<ChatSessionType> {\n const response = await fetch(`${this.options.apiUrl}/sessions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to create session\");\n }\n\n return response.json();\n }\n\n async fetchSession(sessionId: string): Promise<ChatSessionType> {\n const response = await fetch(\n `${this.options.apiUrl}/sessions/${sessionId}`,\n {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch session\");\n }\n\n return response.json();\n }\n\n async ping(): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/ping`, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to ping API\");\n }\n }\n\n async getMessages(sessionId?: string): Promise<MessageData[]> {\n const url = sessionId\n ? `${this.options.apiUrl}/messages/${sessionId}`\n : `${this.options.apiUrl}/messages`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch messages\");\n }\n\n return response.json();\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n }\n}\n","import { EventMap, PubSub } from \"../types/pub-sub\";\nimport {\n AIClosureType,\n SessionStatus,\n ChatSessionType,\n} from \"../types/schemas\";\nimport { ApiCaller } from \"../client/api\";\n\nexport type ChatSessionWithStatus = ChatSessionType & {\n isSessionClosed: boolean;\n isAssignedToAi: boolean;\n isAssignedToHuman: boolean;\n isPendingHuman: boolean;\n};\n\n/**\n * Events emitted by the SessionManager\n */\ninterface SessionEvents extends EventMap {\n \"session:updated\": ChatSessionType;\n \"session:created\": ChatSessionType;\n \"session:closed\": { sessionId: string };\n \"session:error\": { error: Error };\n}\n\nexport class SessionManager extends PubSub<SessionEvents> {\n #currentSession: ChatSessionType | null = null;\n\n constructor(\n private readonly httpClient: ApiCaller,\n initialSession?: ChatSessionType,\n ) {\n super();\n if (initialSession) {\n this.setSession(initialSession);\n }\n }\n\n get currentSession(): ChatSessionWithStatus | null {\n if (!this.#currentSession) {\n return null;\n }\n return {\n ...this.#currentSession,\n isSessionClosed: this.#currentSession.status !== SessionStatus.OPEN,\n isAssignedToAi: this.#currentSession.assignee_id === 555,\n isAssignedToHuman: this.#currentSession.assignee_id !== 555,\n isPendingHuman:\n this.#currentSession.assignee_id === 555 &&\n this.#currentSession.ai_closure_type === AIClosureType.handed_off,\n };\n }\n\n setSession(session: ChatSessionType): void {\n this.#currentSession = session;\n this.publish(\"session:updated\", session);\n }\n\n clearSession = (): void => {\n if (this.#currentSession) {\n const sessionId = this.#currentSession.id;\n this.#currentSession = null;\n this.publish(\"session:closed\", { sessionId });\n }\n };\n\n async createSession(): Promise<ChatSessionType> {\n try {\n const session = await this.httpClient.createSession();\n this.setSession(session);\n this.publish(\"session:created\", session);\n return session;\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n throw error;\n }\n }\n\n async getOrCreateSession(): Promise<ChatSessionType> {\n const session = this.currentSession;\n if (!session) {\n return this.createSession();\n }\n return session;\n }\n\n async refreshSession(sessionId: string): Promise<ChatSessionType | null> {\n try {\n const session = await this.httpClient.fetchSession(sessionId);\n if (session) {\n this.setSession(session);\n return session;\n }\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n console.error(\"Failed to refresh session:\", error);\n }\n return null;\n }\n\n protected cleanup(): void {\n this.#currentSession = null;\n this.clear();\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\n// Default platform implementation\nexport class DefaultPlatform implements Platform {\n env = {\n platform: this.detectPlatform(),\n };\n\n date = {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString(),\n };\n\n private detectPlatform() {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n }\n}\n","import { MessageData, TransportOptions } from \"../types/transport\";\nimport { PubSub } from \"../types/pub-sub\";\n\nexport interface TransportEvents extends Record<string, any> {\n \"transport:message:received\": MessageData;\n \"transport:error\": { error: Error };\n \"transport:status\": { status: \"connected\" | \"disconnected\" };\n}\n\nexport interface TransportState {\n connected: boolean;\n}\n\nexport abstract class MessagingTransport extends PubSub<TransportEvents> {\n #state: TransportState = {\n connected: false,\n };\n\n constructor(protected readonly options: TransportOptions) {\n super();\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): void;\n abstract sendMessage(message: MessageData): Promise<void>;\n\n protected setState(newState: Partial<TransportState>) {\n this.#state = { ...this.#state, ...newState };\n\n // Emit status change event if connected state changes\n if (\"connected\" in newState) {\n this.publish(\"transport:status\", {\n status: newState.connected ? \"connected\" : \"disconnected\",\n });\n }\n }\n\n isConnected(): boolean {\n return this.#state.connected;\n }\n\n getState(): TransportState {\n return { ...this.#state };\n }\n}\n","import { Platform, DefaultPlatform } from \"../platform\";\nimport { MessageData, TransportOptions } from \"../types/transport\";\nimport { MessagingTransport } from \"./transport\";\n\ninterface HttpTransportOptions extends TransportOptions {\n pollingInterval: number;\n}\n\nexport class HttpTransport extends MessagingTransport {\n private pollingInterval?: NodeJS.Timeout;\n\n constructor(\n private readonly httpOptions: HttpTransportOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super(httpOptions);\n }\n\n async connect(): Promise<void> {\n this.setState({ connected: true });\n this.startPolling();\n }\n\n disconnect(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n this.setState({ connected: false });\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n if (!this.isConnected()) {\n const error = new Error(\"Transport not connected\");\n this.publish(\"transport:error\", { error });\n throw error;\n }\n\n try {\n await this.httpOptions.api.sendMessage(message);\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n throw error;\n }\n }\n\n private startPolling(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n if (!this.isConnected()) return;\n\n try {\n const session =\n await this.httpOptions.sessionManager.getOrCreateSession();\n const messages = await this.httpOptions.api.getMessages(session.id);\n\n messages.forEach((message) => {\n this.publish(\"transport:message:received\", message);\n });\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n }\n }, this.httpOptions.pollingInterval);\n }\n}\n","import { CoreOptions } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { PubSub, Subscribable } from \"../types/pub-sub\";\nimport { SessionManager } from \"../managers/session-manager\";\nimport { Platform, DefaultPlatform } from \"../platform\";\nimport { HttpTransport } from \"../transport/http.transport\";\nimport { MessagingTransport } from \"../transport/transport\";\nimport {\n MessageType,\n UserMessageType,\n BotMessageType,\n SendMessageInput,\n} from \"../types/messages\";\nimport { genId } from \"../utils/genId\";\nimport { MessageData } from \"../types/transport\";\nimport { mapChatHistoryToMessage } from \"../utils/history-to-widget-messages\";\n\ninterface ClientEvents {\n \"client:error\": Error;\n}\n\nexport class ApiClient extends Subscribable {\n private messagingTransport!: MessagingTransport;\n private readonly options: Required<CoreOptions>;\n private readonly api: ApiCaller;\n private readonly session: SessionManager;\n private readonly events = new PubSub<ClientEvents>();\n private messages: MessageType[] = [];\n private keyboard: string[] | null = null;\n private pollingInterval?: NodeJS.Timeout;\n private heartbeatInterval?: NodeJS.Timeout;\n\n constructor(\n options: CoreOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super();\n this.options = {\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 \"X-Bot-Token\": options.token,\n ...options.headers,\n },\n queryParams: {},\n pathParams: {},\n bot: {},\n debug: false,\n language: \"en\",\n user: {},\n };\n\n this.api = new ApiCaller({\n apiUrl: this.options.apiUrl,\n token: this.options.token,\n });\n\n this.session = new SessionManager(this.api);\n\n // Initialize transport\n this.initializeTransport();\n\n // Start polling and heartbeat\n this.startMessagePolling();\n this.startHeartbeat();\n }\n\n private startMessagePolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n const session = this.session.currentSession;\n if (!session) return;\n\n const lastMessage = this.messages[this.messages.length - 1];\n if (!lastMessage?.timestamp) return;\n\n try {\n const response = await this.api.getMessages(session.id);\n if (response && response.length > 0) {\n // Convert MessageData[] to ChatHistoryMessageType[]\n const historyMessages = response.map((msg) => ({\n message: msg.content.text,\n type: \"message\",\n publicId: msg.id,\n agent_avatar: null,\n agent_id: null,\n agent_name: null,\n created_at: msg.timestamp,\n from_user: false,\n handoff_happened_during_office_hours: false,\n session_id: msg.session_id,\n updated_at: null,\n attachments: msg.attachments,\n }));\n\n this.appendMessages(mapChatHistoryToMessage(historyMessages));\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n this.events.publish(\"client:error\", error as Error);\n }\n }, 20 * 1000);\n }\n\n private startHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n\n const sendHeartbeat = async () => {\n const session = this.session.currentSession;\n if (!session) return;\n };\n\n sendHeartbeat();\n this.heartbeatInterval = setInterval(sendHeartbeat, 50 * 1000);\n }\n\n private appendMessages(messages: MessageType[]) {\n const newMessages = messages.filter(\n (msg) => !this.messages.some((m) => m.id === msg.id),\n );\n this.messages.push(...newMessages);\n }\n\n private handleIncomingMessage(message: MessageType): void {\n this.messages.push(message);\n this.refreshSession();\n }\n\n private async refreshSession() {\n const session = this.session.currentSession;\n if (session) {\n await this.session.getOrCreateSession();\n }\n }\n\n private initializeTransport() {\n const transportConfig = {\n api: this.api,\n sessionManager: this.session,\n coreOptions: this.options,\n };\n\n if (this.options.transport === \"http\") {\n this.messagingTransport = new HttpTransport(\n {\n ...transportConfig,\n pollingInterval: this.options.pollingInterval,\n },\n this.platform,\n );\n }\n }\n\n public async sendMessage({\n content,\n user,\n ...data\n }: SendMessageInput): Promise<void> {\n const session = await this.session.getOrCreateSession();\n const messageId = genId();\n\n const message: UserMessageType = {\n type: \"FROM_USER\",\n id: messageId,\n content: content.text,\n user,\n deliveredAt: null,\n attachments: data.attachments,\n };\n\n // Add to local messages\n this.messages.push(message);\n\n // Clear keyboard if exists\n if (this.keyboard) {\n this.setKeyboard(null);\n }\n\n // Send through transport\n await this.messagingTransport.sendMessage({\n id: messageId,\n content: { text: content.text },\n session_id: session.id,\n bot_token: this.options.token,\n headers: this.options.headers,\n pathParams: this.options.pathParams,\n queryParams: this.options.queryParams,\n user,\n language: data.language ?? this.options.language,\n attachments: data.attachments,\n timestamp: new Date().toISOString(),\n });\n }\n\n public setKeyboard(options: string[] | null): void {\n this.keyboard = options;\n }\n\n public handleKeyboardOption(option: string): void {\n this.sendMessage({\n content: { text: option },\n });\n this.setKeyboard(null);\n }\n\n public getMessages(): readonly MessageType[] {\n return this.messages;\n }\n\n public clearChat(): void {\n this.messages = [];\n this.keyboard = null;\n this.session.clearSession();\n }\n\n async connect(): Promise<void> {\n await this.messagingTransport.connect();\n }\n\n async disconnect(): Promise<void> {\n this.messagingTransport.disconnect();\n }\n\n setTransport(transport: MessagingTransport): void {\n this.messagingTransport.disconnect();\n this.messagingTransport = transport;\n this.connect();\n }\n\n get state() {\n return {\n connected: this.messagingTransport.isConnected(),\n session: this.session.currentSession,\n messages: this.messages,\n keyboard: this.keyboard,\n };\n }\n\n protected cleanup(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.messagingTransport.disconnect();\n this.session.clear();\n this.events.clear();\n this.messages = [];\n this.keyboard = null;\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"],"names":["PubSub","__publicField","event","callback","subs","data","callbacks","Subscribable","unsubscribe","ApiCaller","options","response","sessionId","url","message","SessionManager","httpClient","initialSession","__privateAdd","_currentSession","__privateGet","__privateSet","SessionStatus","AIClosureType","session","error","DefaultPlatform","date","MessagingTransport","_state","newState","HttpTransport","httpOptions","platform","ApiClient","lastMessage","historyMessages","msg","mapChatHistoryToMessage","sendHeartbeat","messages","newMessages","m","transportConfig","content","user","messageId","genId","option","transport","OpenCXError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -3,12 +3,12 @@ var f = (n) => {
|
|
|
3
3
|
throw TypeError(n);
|
|
4
4
|
};
|
|
5
5
|
var w = (n, e, s) => e in n ? y(n, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : n[e] = s;
|
|
6
|
-
var
|
|
6
|
+
var i = (n, e, s) => w(n, typeof e != "symbol" ? e + "" : e, s), m = (n, e, s) => e.has(n) || f("Cannot " + s);
|
|
7
7
|
var a = (n, e, s) => (m(n, e, "read from private field"), s ? s.call(n) : e.get(n)), d = (n, e, s) => e.has(n) ? f("Cannot add the same private member more than once") : e instanceof WeakSet ? e.add(n) : e.set(n, s), p = (n, e, s, t) => (m(n, e, "write to private field"), t ? t.call(n, s) : e.set(n, s), s);
|
|
8
8
|
import { S as I, A as v, m as k, g as E } from "./history-to-widget-messages-CP0hKjhv.js";
|
|
9
9
|
class g {
|
|
10
10
|
constructor() {
|
|
11
|
-
|
|
11
|
+
i(this, "subscribers", /* @__PURE__ */ new Map());
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Subscribe to an event
|
|
@@ -29,7 +29,7 @@ class g {
|
|
|
29
29
|
*/
|
|
30
30
|
publish(e, s) {
|
|
31
31
|
const t = this.subscribers.get(e);
|
|
32
|
-
t && t.forEach((
|
|
32
|
+
t && t.forEach((r) => r(s));
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* Clear all subscriptions
|
|
@@ -40,7 +40,7 @@ class g {
|
|
|
40
40
|
}
|
|
41
41
|
class T {
|
|
42
42
|
constructor() {
|
|
43
|
-
|
|
43
|
+
i(this, "unsubscribers", []);
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* Add an unsubscribe function to be called during cleanup
|
|
@@ -119,7 +119,7 @@ class M extends g {
|
|
|
119
119
|
constructor(s, t) {
|
|
120
120
|
super();
|
|
121
121
|
d(this, o, null);
|
|
122
|
-
|
|
122
|
+
i(this, "clearSession", () => {
|
|
123
123
|
if (a(this, o)) {
|
|
124
124
|
const s = a(this, o).id;
|
|
125
125
|
p(this, o, null), this.publish("session:closed", { sessionId: s });
|
|
@@ -168,10 +168,10 @@ class M extends g {
|
|
|
168
168
|
o = new WeakMap();
|
|
169
169
|
class b {
|
|
170
170
|
constructor() {
|
|
171
|
-
|
|
171
|
+
i(this, "env", {
|
|
172
172
|
platform: this.detectPlatform()
|
|
173
173
|
});
|
|
174
|
-
|
|
174
|
+
i(this, "date", {
|
|
175
175
|
now: () => Date.now(),
|
|
176
176
|
toISOString: (e) => new Date(e).toISOString()
|
|
177
177
|
});
|
|
@@ -205,7 +205,7 @@ c = new WeakMap();
|
|
|
205
205
|
class O extends _ {
|
|
206
206
|
constructor(s, t = new b()) {
|
|
207
207
|
super(s);
|
|
208
|
-
|
|
208
|
+
i(this, "pollingInterval");
|
|
209
209
|
this.httpOptions = s, this.platform = t;
|
|
210
210
|
}
|
|
211
211
|
async connect() {
|
|
@@ -230,8 +230,8 @@ class O extends _ {
|
|
|
230
230
|
if (this.isConnected())
|
|
231
231
|
try {
|
|
232
232
|
const s = await this.httpOptions.sessionManager.getOrCreateSession();
|
|
233
|
-
(await this.httpOptions.api.getMessages(s.id)).forEach((
|
|
234
|
-
this.publish("transport:message:received",
|
|
233
|
+
(await this.httpOptions.api.getMessages(s.id)).forEach((r) => {
|
|
234
|
+
this.publish("transport:message:received", r);
|
|
235
235
|
});
|
|
236
236
|
} catch (s) {
|
|
237
237
|
this.publish("transport:error", { error: s });
|
|
@@ -242,15 +242,15 @@ class O extends _ {
|
|
|
242
242
|
class U extends T {
|
|
243
243
|
constructor(s, t = new b()) {
|
|
244
244
|
super();
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
245
|
+
i(this, "messagingTransport");
|
|
246
|
+
i(this, "options");
|
|
247
|
+
i(this, "api");
|
|
248
|
+
i(this, "session");
|
|
249
|
+
i(this, "events", new g());
|
|
250
|
+
i(this, "messages", []);
|
|
251
|
+
i(this, "keyboard", null);
|
|
252
|
+
i(this, "pollingInterval");
|
|
253
|
+
i(this, "heartbeatInterval");
|
|
254
254
|
this.platform = t, this.options = {
|
|
255
255
|
...s,
|
|
256
256
|
apiUrl: s.apiUrl ?? "https://api-v2.opencopilot.so/backend",
|
|
@@ -279,9 +279,9 @@ class U extends T {
|
|
|
279
279
|
const t = this.messages[this.messages.length - 1];
|
|
280
280
|
if (t != null && t.timestamp)
|
|
281
281
|
try {
|
|
282
|
-
const
|
|
283
|
-
if (
|
|
284
|
-
const l =
|
|
282
|
+
const r = await this.api.getMessages(s.id);
|
|
283
|
+
if (r && r.length > 0) {
|
|
284
|
+
const l = r.map((h) => ({
|
|
285
285
|
message: h.content.text,
|
|
286
286
|
type: "message",
|
|
287
287
|
publicId: h.id,
|
|
@@ -297,8 +297,8 @@ class U extends T {
|
|
|
297
297
|
}));
|
|
298
298
|
this.appendMessages(k(l));
|
|
299
299
|
}
|
|
300
|
-
} catch (
|
|
301
|
-
console.error("Error polling messages:",
|
|
300
|
+
} catch (r) {
|
|
301
|
+
console.error("Error polling messages:", r), this.events.publish("client:error", r);
|
|
302
302
|
}
|
|
303
303
|
}, 20 * 1e3);
|
|
304
304
|
}
|
|
@@ -311,7 +311,7 @@ class U extends T {
|
|
|
311
311
|
}
|
|
312
312
|
appendMessages(s) {
|
|
313
313
|
const t = s.filter(
|
|
314
|
-
(
|
|
314
|
+
(r) => !this.messages.some((l) => l.id === r.id)
|
|
315
315
|
);
|
|
316
316
|
this.messages.push(...t);
|
|
317
317
|
}
|
|
@@ -338,7 +338,7 @@ class U extends T {
|
|
|
338
338
|
async sendMessage({
|
|
339
339
|
content: s,
|
|
340
340
|
user: t,
|
|
341
|
-
...
|
|
341
|
+
...r
|
|
342
342
|
}) {
|
|
343
343
|
const l = await this.session.getOrCreateSession(), h = E(), S = {
|
|
344
344
|
type: "FROM_USER",
|
|
@@ -346,7 +346,7 @@ class U extends T {
|
|
|
346
346
|
content: s.text,
|
|
347
347
|
user: t,
|
|
348
348
|
deliveredAt: null,
|
|
349
|
-
attachments:
|
|
349
|
+
attachments: r.attachments
|
|
350
350
|
};
|
|
351
351
|
this.messages.push(S), this.keyboard && this.setKeyboard(null), await this.messagingTransport.sendMessage({
|
|
352
352
|
id: h,
|
|
@@ -357,8 +357,8 @@ class U extends T {
|
|
|
357
357
|
pathParams: this.options.pathParams,
|
|
358
358
|
queryParams: this.options.queryParams,
|
|
359
359
|
user: t,
|
|
360
|
-
language:
|
|
361
|
-
attachments:
|
|
360
|
+
language: r.language ?? this.options.language,
|
|
361
|
+
attachments: r.attachments,
|
|
362
362
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
363
363
|
});
|
|
364
364
|
}
|
|
@@ -399,7 +399,7 @@ class U extends T {
|
|
|
399
399
|
}
|
|
400
400
|
class u extends Error {
|
|
401
401
|
constructor(e) {
|
|
402
|
-
super(e), this.name = "
|
|
402
|
+
super(e), this.name = "OpenCXError";
|
|
403
403
|
}
|
|
404
404
|
}
|
|
405
405
|
class $ extends u {
|
|
@@ -437,7 +437,7 @@ export {
|
|
|
437
437
|
F as AuthenticationError,
|
|
438
438
|
$ as ConnectionError,
|
|
439
439
|
B as FileUploadError,
|
|
440
|
-
u as
|
|
440
|
+
u as OpenCXError,
|
|
441
441
|
P as SessionError,
|
|
442
442
|
z as SessionNotDefinedError,
|
|
443
443
|
H as TransportError
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../core/types/pub-sub.ts","../core/client/api.ts","../core/managers/session-manager.ts","../core/platform/index.ts","../core/transport/transport.ts","../core/transport/http.transport.ts","../core/client/client.ts","../core/errors/index.ts"],"sourcesContent":["/**\n * Base interface for event maps. All event maps must extend this.\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * \"my:other:event\": { data: number }\n * }\n * ```\n */\nexport interface EventMap {\n [key: string]: any;\n}\n\n/**\n * Event subscriber function type\n */\nexport type Subscriber<T> = (data: T) => void;\n\n/**\n * Generic PubSub class that can be typed with specific event maps.\n * Each component should create its own instance with its specific events.\n *\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * }\n *\n * const pubSub = new PubSub<MyEvents>();\n *\n * pubSub.subscribe(\"my:event\", (data) => {\n * console.log(data.toUpperCase()); // Type-safe: data is string\n * });\n * ```\n */\nexport class PubSub<T extends EventMap> {\n private subscribers: Map<keyof T, Set<Subscriber<any>>> = new Map();\n\n /**\n * Subscribe to an event\n * @param event Event name to subscribe to\n * @param callback Function to call when event is published\n * @returns Unsubscribe function\n */\n subscribe<K extends keyof T>(\n event: K,\n callback: Subscriber<T[K]>,\n ): () => void {\n if (!this.subscribers.has(event)) {\n this.subscribers.set(event, new Set());\n }\n this.subscribers.get(event)!.add(callback);\n\n return () => {\n const subs = this.subscribers.get(event);\n if (subs) {\n subs.delete(callback);\n if (subs.size === 0) {\n this.subscribers.delete(event);\n }\n }\n };\n }\n\n /**\n * Publish an event with data\n * @param event Event name to publish\n * @param data Data to send with the event\n */\n publish<K extends keyof T>(event: K, data: T[K]): void {\n const callbacks = this.subscribers.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Abstract base class for components that need subscription management.\n * Provides common functionality for managing subscriptions and cleanup.\n *\n * @example\n * ```typescript\n * class MyComponent extends Subscribable {\n * constructor() {\n * super();\n * // Add unsubscribers\n * this.addUnsubscriber(() => {\n * console.log('Cleanup');\n * });\n * }\n *\n * protected cleanup(): void {\n * // Component-specific cleanup\n * }\n * }\n * ```\n */\nexport abstract class Subscribable {\n protected unsubscribers: (() => void)[] = [];\n\n /**\n * Add an unsubscribe function to be called during cleanup\n */\n protected addUnsubscriber(unsubscribe: () => void) {\n this.unsubscribers.push(unsubscribe);\n }\n\n /**\n * Dispose of all subscriptions and perform cleanup\n */\n public dispose() {\n this.unsubscribers.forEach((unsubscribe) => unsubscribe());\n this.unsubscribers = [];\n this.cleanup();\n }\n\n /**\n * Component-specific cleanup logic\n */\n protected abstract cleanup(): void;\n}\n\n/**\n * Helper function to create a strongly typed PubSub instance\n */\nexport function createPubSub<T extends EventMap>(): PubSub<T> {\n return new PubSub<T>();\n}\n","import { ChatSessionType } from \"../types/schemas\";\nimport { MessageData } from \"../types/transport\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n}\n\nexport class ApiCaller {\n constructor(private readonly options: ApiCallerOptions) {}\n\n async createSession(): Promise<ChatSessionType> {\n const response = await fetch(`${this.options.apiUrl}/sessions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to create session\");\n }\n\n return response.json();\n }\n\n async fetchSession(sessionId: string): Promise<ChatSessionType> {\n const response = await fetch(\n `${this.options.apiUrl}/sessions/${sessionId}`,\n {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch session\");\n }\n\n return response.json();\n }\n\n async ping(): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/ping`, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to ping API\");\n }\n }\n\n async getMessages(sessionId?: string): Promise<MessageData[]> {\n const url = sessionId\n ? `${this.options.apiUrl}/messages/${sessionId}`\n : `${this.options.apiUrl}/messages`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch messages\");\n }\n\n return response.json();\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n }\n}\n","import { EventMap, PubSub } from \"../types/pub-sub\";\nimport {\n AIClosureType,\n SessionStatus,\n ChatSessionType,\n} from \"../types/schemas\";\nimport { ApiCaller } from \"../client/api\";\n\nexport type ChatSessionWithStatus = ChatSessionType & {\n isSessionClosed: boolean;\n isAssignedToAi: boolean;\n isAssignedToHuman: boolean;\n isPendingHuman: boolean;\n};\n\n/**\n * Events emitted by the SessionManager\n */\ninterface SessionEvents extends EventMap {\n \"session:updated\": ChatSessionType;\n \"session:created\": ChatSessionType;\n \"session:closed\": { sessionId: string };\n \"session:error\": { error: Error };\n}\n\nexport class SessionManager extends PubSub<SessionEvents> {\n #currentSession: ChatSessionType | null = null;\n\n constructor(\n private readonly httpClient: ApiCaller,\n initialSession?: ChatSessionType,\n ) {\n super();\n if (initialSession) {\n this.setSession(initialSession);\n }\n }\n\n get currentSession(): ChatSessionWithStatus | null {\n if (!this.#currentSession) {\n return null;\n }\n return {\n ...this.#currentSession,\n isSessionClosed: this.#currentSession.status !== SessionStatus.OPEN,\n isAssignedToAi: this.#currentSession.assignee_id === 555,\n isAssignedToHuman: this.#currentSession.assignee_id !== 555,\n isPendingHuman:\n this.#currentSession.assignee_id === 555 &&\n this.#currentSession.ai_closure_type === AIClosureType.handed_off,\n };\n }\n\n setSession(session: ChatSessionType): void {\n this.#currentSession = session;\n this.publish(\"session:updated\", session);\n }\n\n clearSession = (): void => {\n if (this.#currentSession) {\n const sessionId = this.#currentSession.id;\n this.#currentSession = null;\n this.publish(\"session:closed\", { sessionId });\n }\n };\n\n async createSession(): Promise<ChatSessionType> {\n try {\n const session = await this.httpClient.createSession();\n this.setSession(session);\n this.publish(\"session:created\", session);\n return session;\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n throw error;\n }\n }\n\n async getOrCreateSession(): Promise<ChatSessionType> {\n const session = this.currentSession;\n if (!session) {\n return this.createSession();\n }\n return session;\n }\n\n async refreshSession(sessionId: string): Promise<ChatSessionType | null> {\n try {\n const session = await this.httpClient.fetchSession(sessionId);\n if (session) {\n this.setSession(session);\n return session;\n }\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n console.error(\"Failed to refresh session:\", error);\n }\n return null;\n }\n\n protected cleanup(): void {\n this.#currentSession = null;\n this.clear();\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\n// Default platform implementation\nexport class DefaultPlatform implements Platform {\n env = {\n platform: this.detectPlatform(),\n };\n\n date = {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString(),\n };\n\n private detectPlatform() {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n }\n}\n","import { MessageData, TransportOptions } from \"../types/transport\";\nimport { PubSub } from \"../types/pub-sub\";\n\nexport interface TransportEvents extends Record<string, any> {\n \"transport:message:received\": MessageData;\n \"transport:error\": { error: Error };\n \"transport:status\": { status: \"connected\" | \"disconnected\" };\n}\n\nexport interface TransportState {\n connected: boolean;\n}\n\nexport abstract class MessagingTransport extends PubSub<TransportEvents> {\n #state: TransportState = {\n connected: false,\n };\n\n constructor(protected readonly options: TransportOptions) {\n super();\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): void;\n abstract sendMessage(message: MessageData): Promise<void>;\n\n protected setState(newState: Partial<TransportState>) {\n this.#state = { ...this.#state, ...newState };\n\n // Emit status change event if connected state changes\n if (\"connected\" in newState) {\n this.publish(\"transport:status\", {\n status: newState.connected ? \"connected\" : \"disconnected\",\n });\n }\n }\n\n isConnected(): boolean {\n return this.#state.connected;\n }\n\n getState(): TransportState {\n return { ...this.#state };\n }\n}\n","import { Platform, DefaultPlatform } from \"../platform\";\nimport { MessageData, TransportOptions } from \"../types/transport\";\nimport { MessagingTransport } from \"./transport\";\n\ninterface HttpTransportOptions extends TransportOptions {\n pollingInterval: number;\n}\n\nexport class HttpTransport extends MessagingTransport {\n private pollingInterval?: NodeJS.Timeout;\n\n constructor(\n private readonly httpOptions: HttpTransportOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super(httpOptions);\n }\n\n async connect(): Promise<void> {\n this.setState({ connected: true });\n this.startPolling();\n }\n\n disconnect(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n this.setState({ connected: false });\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n if (!this.isConnected()) {\n const error = new Error(\"Transport not connected\");\n this.publish(\"transport:error\", { error });\n throw error;\n }\n\n try {\n await this.httpOptions.api.sendMessage(message);\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n throw error;\n }\n }\n\n private startPolling(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n if (!this.isConnected()) return;\n\n try {\n const session =\n await this.httpOptions.sessionManager.getOrCreateSession();\n const messages = await this.httpOptions.api.getMessages(session.id);\n\n messages.forEach((message) => {\n this.publish(\"transport:message:received\", message);\n });\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n }\n }, this.httpOptions.pollingInterval);\n }\n}\n","import { CoreOptions } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { PubSub, Subscribable } from \"../types/pub-sub\";\nimport { SessionManager } from \"../managers/session-manager\";\nimport { Platform, DefaultPlatform } from \"../platform\";\nimport { HttpTransport } from \"../transport/http.transport\";\nimport { MessagingTransport } from \"../transport/transport\";\nimport {\n MessageType,\n UserMessageType,\n BotMessageType,\n SendMessageInput,\n} from \"../types/messages\";\nimport { genId } from \"../utils/genId\";\nimport { MessageData } from \"../types/transport\";\nimport { mapChatHistoryToMessage } from \"../utils/history-to-widget-messages\";\n\ninterface ClientEvents {\n \"client:error\": Error;\n}\n\nexport class ApiClient extends Subscribable {\n private messagingTransport!: MessagingTransport;\n private readonly options: Required<CoreOptions>;\n private readonly api: ApiCaller;\n private readonly session: SessionManager;\n private readonly events = new PubSub<ClientEvents>();\n private messages: MessageType[] = [];\n private keyboard: string[] | null = null;\n private pollingInterval?: NodeJS.Timeout;\n private heartbeatInterval?: NodeJS.Timeout;\n\n constructor(\n options: CoreOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super();\n this.options = {\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 \"X-Bot-Token\": options.token,\n ...options.headers,\n },\n queryParams: {},\n pathParams: {},\n bot: {},\n debug: false,\n language: \"en\",\n user: {},\n };\n\n this.api = new ApiCaller({\n apiUrl: this.options.apiUrl,\n token: this.options.token,\n });\n\n this.session = new SessionManager(this.api);\n\n // Initialize transport\n this.initializeTransport();\n\n // Start polling and heartbeat\n this.startMessagePolling();\n this.startHeartbeat();\n }\n\n private startMessagePolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n const session = this.session.currentSession;\n if (!session) return;\n\n const lastMessage = this.messages[this.messages.length - 1];\n if (!lastMessage?.timestamp) return;\n\n try {\n const response = await this.api.getMessages(session.id);\n if (response && response.length > 0) {\n // Convert MessageData[] to ChatHistoryMessageType[]\n const historyMessages = response.map((msg) => ({\n message: msg.content.text,\n type: \"message\",\n publicId: msg.id,\n agent_avatar: null,\n agent_id: null,\n agent_name: null,\n created_at: msg.timestamp,\n from_user: false,\n handoff_happened_during_office_hours: false,\n session_id: msg.session_id,\n updated_at: null,\n attachments: msg.attachments,\n }));\n\n this.appendMessages(mapChatHistoryToMessage(historyMessages));\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n this.events.publish(\"client:error\", error as Error);\n }\n }, 20 * 1000);\n }\n\n private startHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n\n const sendHeartbeat = async () => {\n const session = this.session.currentSession;\n if (!session) return;\n };\n\n sendHeartbeat();\n this.heartbeatInterval = setInterval(sendHeartbeat, 50 * 1000);\n }\n\n private appendMessages(messages: MessageType[]) {\n const newMessages = messages.filter(\n (msg) => !this.messages.some((m) => m.id === msg.id),\n );\n this.messages.push(...newMessages);\n }\n\n private handleIncomingMessage(message: MessageType): void {\n this.messages.push(message);\n this.refreshSession();\n }\n\n private async refreshSession() {\n const session = this.session.currentSession;\n if (session) {\n await this.session.getOrCreateSession();\n }\n }\n\n private initializeTransport() {\n const transportConfig = {\n api: this.api,\n sessionManager: this.session,\n coreOptions: this.options,\n };\n\n if (this.options.transport === \"http\") {\n this.messagingTransport = new HttpTransport(\n {\n ...transportConfig,\n pollingInterval: this.options.pollingInterval,\n },\n this.platform,\n );\n }\n }\n\n public async sendMessage({\n content,\n user,\n ...data\n }: SendMessageInput): Promise<void> {\n const session = await this.session.getOrCreateSession();\n const messageId = genId();\n\n const message: UserMessageType = {\n type: \"FROM_USER\",\n id: messageId,\n content: content.text,\n user,\n deliveredAt: null,\n attachments: data.attachments,\n };\n\n // Add to local messages\n this.messages.push(message);\n\n // Clear keyboard if exists\n if (this.keyboard) {\n this.setKeyboard(null);\n }\n\n // Send through transport\n await this.messagingTransport.sendMessage({\n id: messageId,\n content: { text: content.text },\n session_id: session.id,\n bot_token: this.options.token,\n headers: this.options.headers,\n pathParams: this.options.pathParams,\n queryParams: this.options.queryParams,\n user,\n language: data.language ?? this.options.language,\n attachments: data.attachments,\n timestamp: new Date().toISOString(),\n });\n }\n\n public setKeyboard(options: string[] | null): void {\n this.keyboard = options;\n }\n\n public handleKeyboardOption(option: string): void {\n this.sendMessage({\n content: { text: option },\n });\n this.setKeyboard(null);\n }\n\n public getMessages(): readonly MessageType[] {\n return this.messages;\n }\n\n public clearChat(): void {\n this.messages = [];\n this.keyboard = null;\n this.session.clearSession();\n }\n\n async connect(): Promise<void> {\n await this.messagingTransport.connect();\n }\n\n async disconnect(): Promise<void> {\n this.messagingTransport.disconnect();\n }\n\n setTransport(transport: MessagingTransport): void {\n this.messagingTransport.disconnect();\n this.messagingTransport = transport;\n this.connect();\n }\n\n get state() {\n return {\n connected: this.messagingTransport.isConnected(),\n session: this.session.currentSession,\n messages: this.messages,\n keyboard: this.keyboard,\n };\n }\n\n protected cleanup(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.messagingTransport.disconnect();\n this.session.clear();\n this.events.clear();\n this.messages = [];\n this.keyboard = null;\n }\n}\n","export class OpenCopilotError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"OpenCopilotError\";\n }\n}\n\nexport class ConnectionError extends OpenCopilotError {\n constructor(message = \"Connection failed\") {\n super(message);\n this.name = \"ConnectionError\";\n }\n}\n\nexport class AuthenticationError extends OpenCopilotError {\n constructor(message = \"Authentication failed\") {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class SessionError extends OpenCopilotError {\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 OpenCopilotError {\n constructor(message = \"Transport error occurred\") {\n super(message);\n this.name = \"TransportError\";\n }\n}\n\nexport class FileUploadError extends OpenCopilotError {\n constructor(message = \"File upload failed\") {\n super(message);\n this.name = \"FileUploadError\";\n }\n}\n"],"names":["PubSub","__publicField","event","callback","subs","data","callbacks","Subscribable","unsubscribe","ApiCaller","options","response","sessionId","url","message","SessionManager","httpClient","initialSession","__privateAdd","_currentSession","__privateGet","__privateSet","SessionStatus","AIClosureType","session","error","DefaultPlatform","date","MessagingTransport","_state","newState","HttpTransport","httpOptions","platform","ApiClient","lastMessage","historyMessages","msg","mapChatHistoryToMessage","sendHeartbeat","messages","newMessages","m","transportConfig","content","user","messageId","genId","option","transport","OpenCopilotError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError"],"mappings":";;;;;;;;AAoCO,MAAMA,EAA2B;AAAA,EAAjC;AACG,IAAAC,EAAA,yCAAsD;;;;;;;;EAQ9D,UACEC,GACAC,GACY;AACZ,WAAK,KAAK,YAAY,IAAID,CAAK,KAC7B,KAAK,YAAY,IAAIA,GAAO,oBAAI,IAAK,CAAA,GAEvC,KAAK,YAAY,IAAIA,CAAK,EAAG,IAAIC,CAAQ,GAElC,MAAM;AACX,YAAMC,IAAO,KAAK,YAAY,IAAIF,CAAK;AACvC,MAAIE,MACFA,EAAK,OAAOD,CAAQ,GAChBC,EAAK,SAAS,KACX,KAAA,YAAY,OAAOF,CAAK;AAAA,IAEjC;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAA2BA,GAAUG,GAAkB;AACrD,UAAMC,IAAY,KAAK,YAAY,IAAIJ,CAAK;AAC5C,IAAII,KACFA,EAAU,QAAQ,CAACH,MAAaA,EAASE,CAAI,CAAC;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,YAAY;EACnB;AACF;AAuBO,MAAeE,EAAa;AAAA,EAA5B;AACK,IAAAN,EAAA,uBAAgC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,gBAAgBO,GAAyB;AAC5C,SAAA,cAAc,KAAKA,CAAW;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU;AACf,SAAK,cAAc,QAAQ,CAACA,MAAgBA,EAAa,CAAA,GACzD,KAAK,gBAAgB,IACrB,KAAK,QAAQ;AAAA,EACf;AAMF;ACzHO,MAAMC,EAAU;AAAA,EACrB,YAA6BC,GAA2B;AAA3B,SAAA,UAAAA;AAAA,EAA4B;AAAA,EAEzD,MAAM,gBAA0C;AAC9C,UAAMC,IAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,MAAM,aAAa;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,QAC3C,gBAAgB;AAAA,MAClB;AAAA,IAAA,CACD;AAEG,QAAA,CAACA,EAAS;AACN,YAAA,IAAI,MAAM,0BAA0B;AAG5C,WAAOA,EAAS;EAClB;AAAA,EAEA,MAAM,aAAaC,GAA6C;AAC9D,UAAMD,IAAW,MAAM;AAAA,MACrB,GAAG,KAAK,QAAQ,MAAM,aAAaC,CAAS;AAAA,MAC5C;AAAA,QACE,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,QAC7C;AAAA,MACF;AAAA,IAAA;AAGE,QAAA,CAACD,EAAS;AACN,YAAA,IAAI,MAAM,yBAAyB;AAG3C,WAAOA,EAAS;EAClB;AAAA,EAEA,MAAM,OAAsB;AAOtB,QAAA,EANa,MAAM,MAAM,GAAG,KAAK,QAAQ,MAAM,SAAS;AAAA,MAC1D,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,MAC7C;AAAA,IAAA,CACD,GAEa;AACN,YAAA,IAAI,MAAM,oBAAoB;AAAA,EAExC;AAAA,EAEA,MAAM,YAAYC,GAA4C;AAC5D,UAAMC,IAAMD,IACR,GAAG,KAAK,QAAQ,MAAM,aAAaA,CAAS,KAC5C,GAAG,KAAK,QAAQ,MAAM,aAEpBD,IAAW,MAAM,MAAME,GAAK;AAAA,MAChC,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,MAC7C;AAAA,IAAA,CACD;AAEG,QAAA,CAACF,EAAS;AACN,YAAA,IAAI,MAAM,0BAA0B;AAG5C,WAAOA,EAAS;EAClB;AAAA,EAEA,MAAM,YAAYG,GAAqC;AAUjD,QAAA,EATa,MAAM,MAAM,GAAG,KAAK,QAAQ,MAAM,aAAa;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,QAC3C,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAUA,CAAO;AAAA,IAAA,CAC7B,GAEa;AACN,YAAA,IAAI,MAAM,wBAAwB;AAAA,EAE5C;AACF;;AC/DO,MAAMC,UAAuBf,EAAsB;AAAA,EAGxD,YACmBgB,GACjBC,GACA;AACM;AANR,IAAAC,EAAA,MAAAC,GAA0C;AAgC1C,IAAAlB,EAAA,sBAAe,MAAY;AACzB,UAAImB,EAAA,MAAKD,IAAiB;AAClB,cAAAP,IAAYQ,EAAA,MAAKD,GAAgB;AACvC,QAAAE,EAAA,MAAKF,GAAkB,OACvB,KAAK,QAAQ,kBAAkB,EAAE,WAAAP,EAAW,CAAA;AAAA,MAC9C;AAAA,IAAA;AAlCiB,SAAA,aAAAI,GAIbC,KACF,KAAK,WAAWA,CAAc;AAAA,EAElC;AAAA,EAEA,IAAI,iBAA+C;AAC7C,WAACG,EAAA,MAAKD,KAGH;AAAA,MACL,GAAGC,EAAA,MAAKD;AAAA,MACR,iBAAiBC,EAAA,MAAKD,GAAgB,WAAWG,EAAc;AAAA,MAC/D,gBAAgBF,EAAA,MAAKD,GAAgB,gBAAgB;AAAA,MACrD,mBAAmBC,EAAA,MAAKD,GAAgB,gBAAgB;AAAA,MACxD,gBACEC,EAAA,MAAKD,GAAgB,gBAAgB,OACrCC,EAAA,MAAKD,GAAgB,oBAAoBI,EAAc;AAAA,IAAA,IATlD;AAAA,EAWX;AAAA,EAEA,WAAWC,GAAgC;AACzC,IAAAH,EAAA,MAAKF,GAAkBK,IAClB,KAAA,QAAQ,mBAAmBA,CAAO;AAAA,EACzC;AAAA,EAUA,MAAM,gBAA0C;AAC1C,QAAA;AACF,YAAMA,IAAU,MAAM,KAAK,WAAW,cAAc;AACpD,kBAAK,WAAWA,CAAO,GAClB,KAAA,QAAQ,mBAAmBA,CAAO,GAChCA;AAAA,aACAC,GAAO;AACd,iBAAK,QAAQ,iBAAiB,EAAE,OAAAA,EAAuB,CAAA,GACjDA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,qBAA+C;AACnD,UAAMD,IAAU,KAAK;AACrB,WAAKA,KACI,KAAK;EAGhB;AAAA,EAEA,MAAM,eAAeZ,GAAoD;AACnE,QAAA;AACF,YAAMY,IAAU,MAAM,KAAK,WAAW,aAAaZ,CAAS;AAC5D,UAAIY;AACF,oBAAK,WAAWA,CAAO,GAChBA;AAAA,aAEFC,GAAO;AACd,WAAK,QAAQ,iBAAiB,EAAE,OAAAA,EAAuB,CAAA,GAC/C,QAAA,MAAM,8BAA8BA,CAAK;AAAA,IACnD;AACO,WAAA;AAAA,EACT;AAAA,EAEU,UAAgB;AACxB,IAAAJ,EAAA,MAAKF,GAAkB,OACvB,KAAK,MAAM;AAAA,EACb;AACF;AA9EEA,IAAA;ACdK,MAAMO,EAAoC;AAAA,EAA1C;AACL,IAAAzB,EAAA,aAAM;AAAA,MACJ,UAAU,KAAK,eAAe;AAAA,IAAA;AAGhC,IAAAA,EAAA,cAAO;AAAA,MACL,KAAK,MAAM,KAAK,IAAI;AAAA,MACpB,aAAa,CAAC0B,MAAiB,IAAI,KAAKA,CAAI,EAAE,YAAY;AAAA,IAAA;AAAA;AAAA,EAGpD,iBAAiB;AAEnB,WAAA,OAAO,SAAW,MACb,YAEF;AAAA,EACT;AACF;;AChBO,MAAeC,UAA2B5B,EAAwB;AAAA,EAKvE,YAA+BU,GAA2B;AAClD;AALR,IAAAQ,EAAA,MAAAW,GAAyB;AAAA,MACvB,WAAW;AAAA,IAAA;AAGkB,SAAA,UAAAnB;AAAA,EAE/B;AAAA,EAMU,SAASoB,GAAmC;AACpD,IAAAT,EAAA,MAAKQ,GAAS,EAAE,GAAGT,EAAA,MAAKS,IAAQ,GAAGC,MAG/B,eAAeA,KACjB,KAAK,QAAQ,oBAAoB;AAAA,MAC/B,QAAQA,EAAS,YAAY,cAAc;AAAA,IAAA,CAC5C;AAAA,EAEL;AAAA,EAEA,cAAuB;AACrB,WAAOV,EAAA,MAAKS,GAAO;AAAA,EACrB;AAAA,EAEA,WAA2B;AAClB,WAAA,EAAE,GAAGT,EAAA,MAAKS;EACnB;AACF;AA9BEA,IAAA;ACNK,MAAME,UAAsBH,EAAmB;AAAA,EAGpD,YACmBI,GACAC,IAAqB,IAAIP,KAC1C;AACA,UAAMM,CAAW;AANX,IAAA/B,EAAA;AAGW,SAAA,cAAA+B,GACA,KAAA,WAAAC;AAAA,EAGnB;AAAA,EAEA,MAAM,UAAyB;AAC7B,SAAK,SAAS,EAAE,WAAW,GAAM,CAAA,GACjC,KAAK,aAAa;AAAA,EACpB;AAAA,EAEA,aAAmB;AACjB,IAAI,KAAK,mBACP,cAAc,KAAK,eAAe,GAEpC,KAAK,SAAS,EAAE,WAAW,GAAO,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,YAAYnB,GAAqC;AACjD,QAAA,CAAC,KAAK,eAAe;AACjB,YAAAW,IAAQ,IAAI,MAAM,yBAAyB;AACjD,iBAAK,QAAQ,mBAAmB,EAAE,OAAAA,EAAO,CAAA,GACnCA;AAAA,IACR;AAEI,QAAA;AACF,YAAM,KAAK,YAAY,IAAI,YAAYX,CAAO;AAAA,aACvCW,GAAO;AACd,iBAAK,QAAQ,mBAAmB,EAAE,OAAAA,EAAuB,CAAA,GACnDA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,eAAqB;AAC3B,IAAI,KAAK,mBACP,cAAc,KAAK,eAAe,GAG/B,KAAA,kBAAkB,YAAY,YAAY;AACzC,UAAC,KAAK,YAAA;AAEN,YAAA;AACF,gBAAMD,IACJ,MAAM,KAAK,YAAY,eAAe,mBAAmB;AAGlD,WAFQ,MAAM,KAAK,YAAY,IAAI,YAAYA,EAAQ,EAAE,GAEzD,QAAQ,CAACV,MAAY;AACvB,iBAAA,QAAQ,8BAA8BA,CAAO;AAAA,UAAA,CACnD;AAAA,iBACMW,GAAO;AACd,eAAK,QAAQ,mBAAmB,EAAE,OAAAA,EAAuB,CAAA;AAAA,QAC3D;AAAA,IAAA,GACC,KAAK,YAAY,eAAe;AAAA,EACrC;AACF;AC7CO,MAAMS,UAAkB3B,EAAa;AAAA,EAW1C,YACEG,GACiBuB,IAAqB,IAAIP,KAC1C;AACM;AAdA,IAAAzB,EAAA;AACS,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAS,IAAID;AACtB,IAAAC,EAAA,kBAA0B,CAAA;AAC1B,IAAAA,EAAA,kBAA4B;AAC5B,IAAAA,EAAA;AACA,IAAAA,EAAA;AAIW,SAAA,WAAAgC,GAGjB,KAAK,UAAU;AAAA,MACb,GAAGvB;AAAA,MACH,QAAQA,EAAQ,UAAU;AAAA,MAC1B,WAAWA,EAAQ,aAAa;AAAA,MAChC,WAAWA,EAAQ,aAAa;AAAA,MAChC,iBAAiBA,EAAQ,mBAAmB;AAAA,MAC5C,SAAS;AAAA,QACP,eAAeA,EAAQ;AAAA,QACvB,GAAGA,EAAQ;AAAA,MACb;AAAA,MACA,aAAa,CAAC;AAAA,MACd,YAAY,CAAC;AAAA,MACb,KAAK,CAAC;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM,CAAC;AAAA,IAAA,GAGJ,KAAA,MAAM,IAAID,EAAU;AAAA,MACvB,QAAQ,KAAK,QAAQ;AAAA,MACrB,OAAO,KAAK,QAAQ;AAAA,IAAA,CACrB,GAED,KAAK,UAAU,IAAIM,EAAe,KAAK,GAAG,GAG1C,KAAK,oBAAoB,GAGzB,KAAK,oBAAoB,GACzB,KAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,sBAAsB;AAC5B,IAAI,KAAK,mBACP,cAAc,KAAK,eAAe,GAG/B,KAAA,kBAAkB,YAAY,YAAY;AACvC,YAAAS,IAAU,KAAK,QAAQ;AAC7B,UAAI,CAACA,EAAS;AAEd,YAAMW,IAAc,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC;AACtD,UAACA,KAAA,QAAAA,EAAa;AAEd,YAAA;AACF,gBAAMxB,IAAW,MAAM,KAAK,IAAI,YAAYa,EAAQ,EAAE;AAClD,cAAAb,KAAYA,EAAS,SAAS,GAAG;AAEnC,kBAAMyB,IAAkBzB,EAAS,IAAI,CAAC0B,OAAS;AAAA,cAC7C,SAASA,EAAI,QAAQ;AAAA,cACrB,MAAM;AAAA,cACN,UAAUA,EAAI;AAAA,cACd,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAYA,EAAI;AAAA,cAChB,WAAW;AAAA,cACX,sCAAsC;AAAA,cACtC,YAAYA,EAAI;AAAA,cAChB,YAAY;AAAA,cACZ,aAAaA,EAAI;AAAA,YACjB,EAAA;AAEG,iBAAA,eAAeC,EAAwBF,CAAe,CAAC;AAAA,UAC9D;AAAA,iBACOX,GAAO;AACN,kBAAA,MAAM,2BAA2BA,CAAK,GACzC,KAAA,OAAO,QAAQ,gBAAgBA,CAAc;AAAA,QACpD;AAAA,IAAA,GACC,KAAK,GAAI;AAAA,EACd;AAAA,EAEQ,iBAAiB;AACvB,IAAI,KAAK,qBACP,cAAc,KAAK,iBAAiB;AAGtC,UAAMc,IAAgB,YAAY;AAEhC,MADgB,KAAK,QAAQ;AAAA,IACf;AAGF,IAAAA,KACd,KAAK,oBAAoB,YAAYA,GAAe,KAAK,GAAI;AAAA,EAC/D;AAAA,EAEQ,eAAeC,GAAyB;AAC9C,UAAMC,IAAcD,EAAS;AAAA,MAC3B,CAACH,MAAQ,CAAC,KAAK,SAAS,KAAK,CAACK,MAAMA,EAAE,OAAOL,EAAI,EAAE;AAAA,IAAA;AAEhD,SAAA,SAAS,KAAK,GAAGI,CAAW;AAAA,EACnC;AAAA,EAEQ,sBAAsB3B,GAA4B;AACnD,SAAA,SAAS,KAAKA,CAAO,GAC1B,KAAK,eAAe;AAAA,EACtB;AAAA,EAEA,MAAc,iBAAiB;AAE7B,IADgB,KAAK,QAAQ,kBAErB,MAAA,KAAK,QAAQ;EAEvB;AAAA,EAEQ,sBAAsB;AAC5B,UAAM6B,IAAkB;AAAA,MACtB,KAAK,KAAK;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,aAAa,KAAK;AAAA,IAAA;AAGhB,IAAA,KAAK,QAAQ,cAAc,WAC7B,KAAK,qBAAqB,IAAIZ;AAAA,MAC5B;AAAA,QACE,GAAGY;AAAA,QACH,iBAAiB,KAAK,QAAQ;AAAA,MAChC;AAAA,MACA,KAAK;AAAA,IAAA;AAAA,EAGX;AAAA,EAEA,MAAa,YAAY;AAAA,IACvB,SAAAC;AAAA,IACA,MAAAC;AAAA,IACA,GAAGxC;AAAA,EAAA,GAC+B;AAClC,UAAMmB,IAAU,MAAM,KAAK,QAAQ,mBAAmB,GAChDsB,IAAYC,KAEZjC,IAA2B;AAAA,MAC/B,MAAM;AAAA,MACN,IAAIgC;AAAA,MACJ,SAASF,EAAQ;AAAA,MACjB,MAAAC;AAAA,MACA,aAAa;AAAA,MACb,aAAaxC,EAAK;AAAA,IAAA;AAIf,SAAA,SAAS,KAAKS,CAAO,GAGtB,KAAK,YACP,KAAK,YAAY,IAAI,GAIjB,MAAA,KAAK,mBAAmB,YAAY;AAAA,MACxC,IAAIgC;AAAA,MACJ,SAAS,EAAE,MAAMF,EAAQ,KAAK;AAAA,MAC9B,YAAYpB,EAAQ;AAAA,MACpB,WAAW,KAAK,QAAQ;AAAA,MACxB,SAAS,KAAK,QAAQ;AAAA,MACtB,YAAY,KAAK,QAAQ;AAAA,MACzB,aAAa,KAAK,QAAQ;AAAA,MAC1B,MAAAqB;AAAA,MACA,UAAUxC,EAAK,YAAY,KAAK,QAAQ;AAAA,MACxC,aAAaA,EAAK;AAAA,MAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAAA,CACnC;AAAA,EACH;AAAA,EAEO,YAAYK,GAAgC;AACjD,SAAK,WAAWA;AAAA,EAClB;AAAA,EAEO,qBAAqBsC,GAAsB;AAChD,SAAK,YAAY;AAAA,MACf,SAAS,EAAE,MAAMA,EAAO;AAAA,IAAA,CACzB,GACD,KAAK,YAAY,IAAI;AAAA,EACvB;AAAA,EAEO,cAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,YAAkB;AACvB,SAAK,WAAW,IAChB,KAAK,WAAW,MAChB,KAAK,QAAQ;EACf;AAAA,EAEA,MAAM,UAAyB;AACvB,UAAA,KAAK,mBAAmB;EAChC;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,mBAAmB;EAC1B;AAAA,EAEA,aAAaC,GAAqC;AAChD,SAAK,mBAAmB,cACxB,KAAK,qBAAqBA,GAC1B,KAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,QAAQ;AACH,WAAA;AAAA,MACL,WAAW,KAAK,mBAAmB,YAAY;AAAA,MAC/C,SAAS,KAAK,QAAQ;AAAA,MACtB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,IAAA;AAAA,EAEnB;AAAA,EAEU,UAAgB;AACxB,IAAI,KAAK,mBACP,cAAc,KAAK,eAAe,GAEhC,KAAK,qBACP,cAAc,KAAK,iBAAiB,GAEtC,KAAK,mBAAmB,cACxB,KAAK,QAAQ,SACb,KAAK,OAAO,SACZ,KAAK,WAAW,IAChB,KAAK,WAAW;AAAA,EAClB;AACF;ACnQO,MAAMC,UAAyB,MAAM;AAAA,EAC1C,YAAYpC,GAAiB;AAC3B,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAMqC,UAAwBD,EAAiB;AAAA,EACpD,YAAYpC,IAAU,qBAAqB;AACzC,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAMsC,UAA4BF,EAAiB;AAAA,EACxD,YAAYpC,IAAU,yBAAyB;AAC7C,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAMuC,UAAqBH,EAAiB;AAAA,EACjD,YAAYpC,IAAU,0BAA0B;AAC9C,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAMwC,UAA+BD,EAAa;AAAA,EACvD,YAAYvC,IAAU,uBAAuB;AAC3C,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAMyC,UAAuBL,EAAiB;AAAA,EACnD,YAAYpC,IAAU,4BAA4B;AAChD,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM0C,UAAwBN,EAAiB;AAAA,EACpD,YAAYpC,IAAU,sBAAsB;AAC1C,UAAMA,CAAO,GACb,KAAK,OAAO;AAAA,EACd;AACF;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../core/types/pub-sub.ts","../core/client/api.ts","../core/managers/session-manager.ts","../core/platform/index.ts","../core/transport/transport.ts","../core/transport/http.transport.ts","../core/client/client.ts","../core/errors/index.ts"],"sourcesContent":["/**\n * Base interface for event maps. All event maps must extend this.\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * \"my:other:event\": { data: number }\n * }\n * ```\n */\nexport interface EventMap {\n [key: string]: any;\n}\n\n/**\n * Event subscriber function type\n */\nexport type Subscriber<T> = (data: T) => void;\n\n/**\n * Generic PubSub class that can be typed with specific event maps.\n * Each component should create its own instance with its specific events.\n *\n * @example\n * ```typescript\n * interface MyEvents extends EventMap {\n * \"my:event\": string\n * }\n *\n * const pubSub = new PubSub<MyEvents>();\n *\n * pubSub.subscribe(\"my:event\", (data) => {\n * console.log(data.toUpperCase()); // Type-safe: data is string\n * });\n * ```\n */\nexport class PubSub<T extends EventMap> {\n private subscribers: Map<keyof T, Set<Subscriber<any>>> = new Map();\n\n /**\n * Subscribe to an event\n * @param event Event name to subscribe to\n * @param callback Function to call when event is published\n * @returns Unsubscribe function\n */\n subscribe<K extends keyof T>(\n event: K,\n callback: Subscriber<T[K]>,\n ): () => void {\n if (!this.subscribers.has(event)) {\n this.subscribers.set(event, new Set());\n }\n this.subscribers.get(event)!.add(callback);\n\n return () => {\n const subs = this.subscribers.get(event);\n if (subs) {\n subs.delete(callback);\n if (subs.size === 0) {\n this.subscribers.delete(event);\n }\n }\n };\n }\n\n /**\n * Publish an event with data\n * @param event Event name to publish\n * @param data Data to send with the event\n */\n publish<K extends keyof T>(event: K, data: T[K]): void {\n const callbacks = this.subscribers.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(data));\n }\n }\n\n /**\n * Clear all subscriptions\n */\n clear(): void {\n this.subscribers.clear();\n }\n}\n\n/**\n * Abstract base class for components that need subscription management.\n * Provides common functionality for managing subscriptions and cleanup.\n *\n * @example\n * ```typescript\n * class MyComponent extends Subscribable {\n * constructor() {\n * super();\n * // Add unsubscribers\n * this.addUnsubscriber(() => {\n * console.log('Cleanup');\n * });\n * }\n *\n * protected cleanup(): void {\n * // Component-specific cleanup\n * }\n * }\n * ```\n */\nexport abstract class Subscribable {\n protected unsubscribers: (() => void)[] = [];\n\n /**\n * Add an unsubscribe function to be called during cleanup\n */\n protected addUnsubscriber(unsubscribe: () => void) {\n this.unsubscribers.push(unsubscribe);\n }\n\n /**\n * Dispose of all subscriptions and perform cleanup\n */\n public dispose() {\n this.unsubscribers.forEach((unsubscribe) => unsubscribe());\n this.unsubscribers = [];\n this.cleanup();\n }\n\n /**\n * Component-specific cleanup logic\n */\n protected abstract cleanup(): void;\n}\n\n/**\n * Helper function to create a strongly typed PubSub instance\n */\nexport function createPubSub<T extends EventMap>(): PubSub<T> {\n return new PubSub<T>();\n}\n","import { ChatSessionType } from \"../types/schemas\";\nimport { MessageData } from \"../types/transport\";\n\nexport interface ApiCallerOptions {\n apiUrl: string;\n token: string;\n}\n\nexport class ApiCaller {\n constructor(private readonly options: ApiCallerOptions) {}\n\n async createSession(): Promise<ChatSessionType> {\n const response = await fetch(`${this.options.apiUrl}/sessions`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to create session\");\n }\n\n return response.json();\n }\n\n async fetchSession(sessionId: string): Promise<ChatSessionType> {\n const response = await fetch(\n `${this.options.apiUrl}/sessions/${sessionId}`,\n {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch session\");\n }\n\n return response.json();\n }\n\n async ping(): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/ping`, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to ping API\");\n }\n }\n\n async getMessages(sessionId?: string): Promise<MessageData[]> {\n const url = sessionId\n ? `${this.options.apiUrl}/messages/${sessionId}`\n : `${this.options.apiUrl}/messages`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to fetch messages\");\n }\n\n return response.json();\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n const response = await fetch(`${this.options.apiUrl}/messages`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to send message\");\n }\n }\n}\n","import { EventMap, PubSub } from \"../types/pub-sub\";\nimport {\n AIClosureType,\n SessionStatus,\n ChatSessionType,\n} from \"../types/schemas\";\nimport { ApiCaller } from \"../client/api\";\n\nexport type ChatSessionWithStatus = ChatSessionType & {\n isSessionClosed: boolean;\n isAssignedToAi: boolean;\n isAssignedToHuman: boolean;\n isPendingHuman: boolean;\n};\n\n/**\n * Events emitted by the SessionManager\n */\ninterface SessionEvents extends EventMap {\n \"session:updated\": ChatSessionType;\n \"session:created\": ChatSessionType;\n \"session:closed\": { sessionId: string };\n \"session:error\": { error: Error };\n}\n\nexport class SessionManager extends PubSub<SessionEvents> {\n #currentSession: ChatSessionType | null = null;\n\n constructor(\n private readonly httpClient: ApiCaller,\n initialSession?: ChatSessionType,\n ) {\n super();\n if (initialSession) {\n this.setSession(initialSession);\n }\n }\n\n get currentSession(): ChatSessionWithStatus | null {\n if (!this.#currentSession) {\n return null;\n }\n return {\n ...this.#currentSession,\n isSessionClosed: this.#currentSession.status !== SessionStatus.OPEN,\n isAssignedToAi: this.#currentSession.assignee_id === 555,\n isAssignedToHuman: this.#currentSession.assignee_id !== 555,\n isPendingHuman:\n this.#currentSession.assignee_id === 555 &&\n this.#currentSession.ai_closure_type === AIClosureType.handed_off,\n };\n }\n\n setSession(session: ChatSessionType): void {\n this.#currentSession = session;\n this.publish(\"session:updated\", session);\n }\n\n clearSession = (): void => {\n if (this.#currentSession) {\n const sessionId = this.#currentSession.id;\n this.#currentSession = null;\n this.publish(\"session:closed\", { sessionId });\n }\n };\n\n async createSession(): Promise<ChatSessionType> {\n try {\n const session = await this.httpClient.createSession();\n this.setSession(session);\n this.publish(\"session:created\", session);\n return session;\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n throw error;\n }\n }\n\n async getOrCreateSession(): Promise<ChatSessionType> {\n const session = this.currentSession;\n if (!session) {\n return this.createSession();\n }\n return session;\n }\n\n async refreshSession(sessionId: string): Promise<ChatSessionType | null> {\n try {\n const session = await this.httpClient.fetchSession(sessionId);\n if (session) {\n this.setSession(session);\n return session;\n }\n } catch (error) {\n this.publish(\"session:error\", { error: error as Error });\n console.error(\"Failed to refresh session:\", error);\n }\n return null;\n }\n\n protected cleanup(): void {\n this.#currentSession = null;\n this.clear();\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\n// Default platform implementation\nexport class DefaultPlatform implements Platform {\n env = {\n platform: this.detectPlatform(),\n };\n\n date = {\n now: () => Date.now(),\n toISOString: (date: number) => new Date(date).toISOString(),\n };\n\n private detectPlatform() {\n // detect browser\n if (typeof window !== \"undefined\") {\n return \"browser\";\n }\n return \"server\";\n }\n}\n","import { MessageData, TransportOptions } from \"../types/transport\";\nimport { PubSub } from \"../types/pub-sub\";\n\nexport interface TransportEvents extends Record<string, any> {\n \"transport:message:received\": MessageData;\n \"transport:error\": { error: Error };\n \"transport:status\": { status: \"connected\" | \"disconnected\" };\n}\n\nexport interface TransportState {\n connected: boolean;\n}\n\nexport abstract class MessagingTransport extends PubSub<TransportEvents> {\n #state: TransportState = {\n connected: false,\n };\n\n constructor(protected readonly options: TransportOptions) {\n super();\n }\n\n abstract connect(): Promise<void>;\n abstract disconnect(): void;\n abstract sendMessage(message: MessageData): Promise<void>;\n\n protected setState(newState: Partial<TransportState>) {\n this.#state = { ...this.#state, ...newState };\n\n // Emit status change event if connected state changes\n if (\"connected\" in newState) {\n this.publish(\"transport:status\", {\n status: newState.connected ? \"connected\" : \"disconnected\",\n });\n }\n }\n\n isConnected(): boolean {\n return this.#state.connected;\n }\n\n getState(): TransportState {\n return { ...this.#state };\n }\n}\n","import { Platform, DefaultPlatform } from \"../platform\";\nimport { MessageData, TransportOptions } from \"../types/transport\";\nimport { MessagingTransport } from \"./transport\";\n\ninterface HttpTransportOptions extends TransportOptions {\n pollingInterval: number;\n}\n\nexport class HttpTransport extends MessagingTransport {\n private pollingInterval?: NodeJS.Timeout;\n\n constructor(\n private readonly httpOptions: HttpTransportOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super(httpOptions);\n }\n\n async connect(): Promise<void> {\n this.setState({ connected: true });\n this.startPolling();\n }\n\n disconnect(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n this.setState({ connected: false });\n }\n\n async sendMessage(message: MessageData): Promise<void> {\n if (!this.isConnected()) {\n const error = new Error(\"Transport not connected\");\n this.publish(\"transport:error\", { error });\n throw error;\n }\n\n try {\n await this.httpOptions.api.sendMessage(message);\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n throw error;\n }\n }\n\n private startPolling(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n if (!this.isConnected()) return;\n\n try {\n const session =\n await this.httpOptions.sessionManager.getOrCreateSession();\n const messages = await this.httpOptions.api.getMessages(session.id);\n\n messages.forEach((message) => {\n this.publish(\"transport:message:received\", message);\n });\n } catch (error) {\n this.publish(\"transport:error\", { error: error as Error });\n }\n }, this.httpOptions.pollingInterval);\n }\n}\n","import { CoreOptions } from \"../types\";\nimport { ApiCaller } from \"./api\";\nimport { PubSub, Subscribable } from \"../types/pub-sub\";\nimport { SessionManager } from \"../managers/session-manager\";\nimport { Platform, DefaultPlatform } from \"../platform\";\nimport { HttpTransport } from \"../transport/http.transport\";\nimport { MessagingTransport } from \"../transport/transport\";\nimport {\n MessageType,\n UserMessageType,\n BotMessageType,\n SendMessageInput,\n} from \"../types/messages\";\nimport { genId } from \"../utils/genId\";\nimport { MessageData } from \"../types/transport\";\nimport { mapChatHistoryToMessage } from \"../utils/history-to-widget-messages\";\n\ninterface ClientEvents {\n \"client:error\": Error;\n}\n\nexport class ApiClient extends Subscribable {\n private messagingTransport!: MessagingTransport;\n private readonly options: Required<CoreOptions>;\n private readonly api: ApiCaller;\n private readonly session: SessionManager;\n private readonly events = new PubSub<ClientEvents>();\n private messages: MessageType[] = [];\n private keyboard: string[] | null = null;\n private pollingInterval?: NodeJS.Timeout;\n private heartbeatInterval?: NodeJS.Timeout;\n\n constructor(\n options: CoreOptions,\n private readonly platform: Platform = new DefaultPlatform(),\n ) {\n super();\n this.options = {\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 \"X-Bot-Token\": options.token,\n ...options.headers,\n },\n queryParams: {},\n pathParams: {},\n bot: {},\n debug: false,\n language: \"en\",\n user: {},\n };\n\n this.api = new ApiCaller({\n apiUrl: this.options.apiUrl,\n token: this.options.token,\n });\n\n this.session = new SessionManager(this.api);\n\n // Initialize transport\n this.initializeTransport();\n\n // Start polling and heartbeat\n this.startMessagePolling();\n this.startHeartbeat();\n }\n\n private startMessagePolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n\n this.pollingInterval = setInterval(async () => {\n const session = this.session.currentSession;\n if (!session) return;\n\n const lastMessage = this.messages[this.messages.length - 1];\n if (!lastMessage?.timestamp) return;\n\n try {\n const response = await this.api.getMessages(session.id);\n if (response && response.length > 0) {\n // Convert MessageData[] to ChatHistoryMessageType[]\n const historyMessages = response.map((msg) => ({\n message: msg.content.text,\n type: \"message\",\n publicId: msg.id,\n agent_avatar: null,\n agent_id: null,\n agent_name: null,\n created_at: msg.timestamp,\n from_user: false,\n handoff_happened_during_office_hours: false,\n session_id: msg.session_id,\n updated_at: null,\n attachments: msg.attachments,\n }));\n\n this.appendMessages(mapChatHistoryToMessage(historyMessages));\n }\n } catch (error) {\n console.error(\"Error polling messages:\", error);\n this.events.publish(\"client:error\", error as Error);\n }\n }, 20 * 1000);\n }\n\n private startHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n\n const sendHeartbeat = async () => {\n const session = this.session.currentSession;\n if (!session) return;\n };\n\n sendHeartbeat();\n this.heartbeatInterval = setInterval(sendHeartbeat, 50 * 1000);\n }\n\n private appendMessages(messages: MessageType[]) {\n const newMessages = messages.filter(\n (msg) => !this.messages.some((m) => m.id === msg.id),\n );\n this.messages.push(...newMessages);\n }\n\n private handleIncomingMessage(message: MessageType): void {\n this.messages.push(message);\n this.refreshSession();\n }\n\n private async refreshSession() {\n const session = this.session.currentSession;\n if (session) {\n await this.session.getOrCreateSession();\n }\n }\n\n private initializeTransport() {\n const transportConfig = {\n api: this.api,\n sessionManager: this.session,\n coreOptions: this.options,\n };\n\n if (this.options.transport === \"http\") {\n this.messagingTransport = new HttpTransport(\n {\n ...transportConfig,\n pollingInterval: this.options.pollingInterval,\n },\n this.platform,\n );\n }\n }\n\n public async sendMessage({\n content,\n user,\n ...data\n }: SendMessageInput): Promise<void> {\n const session = await this.session.getOrCreateSession();\n const messageId = genId();\n\n const message: UserMessageType = {\n type: \"FROM_USER\",\n id: messageId,\n content: content.text,\n user,\n deliveredAt: null,\n attachments: data.attachments,\n };\n\n // Add to local messages\n this.messages.push(message);\n\n // Clear keyboard if exists\n if (this.keyboard) {\n this.setKeyboard(null);\n }\n\n // Send through transport\n await this.messagingTransport.sendMessage({\n id: messageId,\n content: { text: content.text },\n session_id: session.id,\n bot_token: this.options.token,\n headers: this.options.headers,\n pathParams: this.options.pathParams,\n queryParams: this.options.queryParams,\n user,\n language: data.language ?? this.options.language,\n attachments: data.attachments,\n timestamp: new Date().toISOString(),\n });\n }\n\n public setKeyboard(options: string[] | null): void {\n this.keyboard = options;\n }\n\n public handleKeyboardOption(option: string): void {\n this.sendMessage({\n content: { text: option },\n });\n this.setKeyboard(null);\n }\n\n public getMessages(): readonly MessageType[] {\n return this.messages;\n }\n\n public clearChat(): void {\n this.messages = [];\n this.keyboard = null;\n this.session.clearSession();\n }\n\n async connect(): Promise<void> {\n await this.messagingTransport.connect();\n }\n\n async disconnect(): Promise<void> {\n this.messagingTransport.disconnect();\n }\n\n setTransport(transport: MessagingTransport): void {\n this.messagingTransport.disconnect();\n this.messagingTransport = transport;\n this.connect();\n }\n\n get state() {\n return {\n connected: this.messagingTransport.isConnected(),\n session: this.session.currentSession,\n messages: this.messages,\n keyboard: this.keyboard,\n };\n }\n\n protected cleanup(): void {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.messagingTransport.disconnect();\n this.session.clear();\n this.events.clear();\n this.messages = [];\n this.keyboard = null;\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"],"names":["PubSub","__publicField","event","callback","subs","data","callbacks","Subscribable","unsubscribe","ApiCaller","options","response","sessionId","url","message","SessionManager","httpClient","initialSession","__privateAdd","_currentSession","__privateGet","__privateSet","SessionStatus","AIClosureType","session","error","DefaultPlatform","date","MessagingTransport","_state","newState","HttpTransport","httpOptions","platform","ApiClient","lastMessage","historyMessages","msg","mapChatHistoryToMessage","sendHeartbeat","messages","newMessages","m","transportConfig","content","user","messageId","genId","option","transport","OpenCXError","ConnectionError","AuthenticationError","SessionError","SessionNotDefinedError","TransportError","FileUploadError"],"mappings":"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"}
|
package/dist/react.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-xb7Pg6AD.cjs"),a=["monday","tuesday","wednesday","thursday","friday","saturday","sunday","WeekDays","Everyday"];function u(t,o){const{http:s}=e.useConfigData();return e._default(async()=>s.apis.upvote(t).then(o),[s.options,t,o])}function n(t,o){const{http:s}=e.useConfigData();return e._default(async()=>s.apis.downvote(t).then(o),[s.options,t])}exports.WidgetRoot=e.WidgetRoot;exports.useChat=e.useChat;exports.useConfigData=e.useConfigData;exports.useContact=e.useContact;exports.useLocale=e.useLocale;exports.usePreludeData=e.usePreludeData;exports.useUploadFiles=e.useUploadFiles;exports.useWidgetSoundEffects=e.useWidgetSoundEffects;exports.useDownvote=n;exports.useUpvote=u;exports.workingDays=a;
|
|
2
2
|
//# sourceMappingURL=react.cjs.map
|
package/dist/react.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { u as e, _ as o } from "./index-
|
|
2
|
-
import { W as i, e as f, a as c, d as h, b as l, h as v, l as D } from "./index-
|
|
1
|
+
import { u as e, _ as o } from "./index-XkXeMM77.js";
|
|
2
|
+
import { W as i, e as f, a as c, d as h, b as l, h as v, l as D } from "./index-XkXeMM77.js";
|
|
3
3
|
const u = [
|
|
4
4
|
"monday",
|
|
5
5
|
"tuesday",
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { WidgetOptions } from '../../../react-lib/index';
|
|
2
|
-
import { default as React } from 'react';
|
|
3
|
-
|
|
2
|
+
import { default as React, ComponentPropsWithoutRef, ReactNode } from 'react';
|
|
3
|
+
declare function Widget({ className, ...props }: ComponentPropsWithoutRef<"div">): React.JSX.Element;
|
|
4
|
+
declare function WidgetRoot({ options, children, }: {
|
|
4
5
|
options: WidgetOptions;
|
|
6
|
+
children: ReactNode;
|
|
5
7
|
}): React.JSX.Element;
|
|
8
|
+
export { WidgetRoot, Widget };
|
package/dist/src/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { WidgetOptions } from '../react-lib/types';
|
|
|
2
2
|
declare global {
|
|
3
3
|
interface Window {
|
|
4
4
|
initOpenScript: typeof initOpenScript;
|
|
5
|
-
|
|
5
|
+
openCXWidgetVersion: string;
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
declare function initOpenScript(options: WidgetOptions): void;
|