{"version":3,"file":"ChatHeadlessImpl.mjs","sources":["../../../src/ChatHeadlessImpl.ts"],"sourcesContent":["import {\n  provideChatCore,\n  Message,\n  MessageNotes,\n  MessageResponse,\n  MessageSource,\n  StreamEventName,\n  ApiError,\n  IntegrationDetails,\n} from \"@yext/chat-core\";\nimport {\n  ChatClient,\n  ChatHeadless,\n  HeadlessConfig,\n  State,\n  StateListener,\n} from \"./models\";\nimport { ReduxStateManager } from \"./ReduxStateManager\";\nimport {\n  loadSessionState,\n  saveSessionState,\n  setCanSendMessage,\n  setConversationId,\n  setIsLoading,\n  setMessageNotes,\n  setMessages,\n  addMessage,\n} from \"./slices/conversation\";\nimport { Store, Unsubscribe } from \"@reduxjs/toolkit\";\nimport { setContext } from \"./slices/meta\";\nimport {\n  analytics,\n  AnalyticsEventService,\n  EventPayload,\n} from \"@yext/analytics\";\nimport { getClientSdk } from \"./utils/clientSdk\";\nimport {\n  ChatEventClient,\n  isChatEventClient,\n} from \"./models/clients/ChatEventClient\";\nimport { RecursivePartial } from \"./models/ChatHeadless\";\n\nconst BASE_HANDOFF_CREDENTIALS_SESSION_STORAGE_KEY =\n  \"yext_chat_handoff_credentials\";\n\n/**\n * Concrete implementation of {@link ChatHeadless}\n *\n * @internal\n */\nexport class ChatHeadlessImpl implements ChatHeadless {\n  private config: HeadlessConfig;\n  private chatClient: ChatClient;\n  private botClient: ChatClient;\n  private clients: ChatClient[];\n  private stateManager: ReduxStateManager;\n  private analyticsService: AnalyticsEventService;\n  private credentialsSessionStorageKey: string | undefined;\n\n  private isImpressionAnalyticEventSent = false;\n\n  /**\n   * Constructs a new instance of the {@link ChatHeadlessImpl} class.\n   *\n   * @internal\n   *\n   * @param config - The configuration for the {@link ChatHeadlessImpl} instance\n   * @param chatClient - An optional override for the default {@link ChatClient} instance\n   */\n  constructor(\n    config: HeadlessConfig,\n    botClient?: ChatClient,\n    agentClient?: ChatClient\n  ) {\n    const defaultConfig: Partial<HeadlessConfig> = {\n      saveToLocalStorage: true,\n    };\n    this.config = { ...defaultConfig, ...config };\n\n    // bot client is the default client.\n    // If agent client is provided, it will be used as the second client on handoff\n    this.chatClient = botClient ?? provideChatCore(this.config);\n    this.botClient = this.chatClient;\n    this.clients = [this.chatClient];\n    if (agentClient) {\n      this.clients.push(agentClient);\n    }\n    this.setClientEventListeners();\n\n    this.stateManager = new ReduxStateManager();\n    this.analyticsService = analytics({\n      authorizationType: 'apiKey',\n      authorization: this.config.apiKey,\n      env: this.config.env,\n      region: this.config.region,\n      ...this.config.analyticsConfig,\n    });\n    if (this.config.saveToLocalStorage) {\n      this.initLocalStorage();\n    }\n  }\n\n  private get sessionAgentCredentials(): unknown | void {\n    if (this.credentialsSessionStorageKey) {\n      const credentials = sessionStorage.getItem(\n        this.credentialsSessionStorageKey\n      );\n      if (credentials) {\n        try {\n          return JSON.parse(credentials);\n        } catch (e) {\n          this.removeSessionAgentCredentials();\n          throw new Error(\n            `Error occurred while parsing credentials from session storage: ${e}`\n          );\n        }\n      }\n    }\n  }\n\n  private setSessionAgentCredentials(credentials: unknown) {\n    if (this.credentialsSessionStorageKey) {\n      sessionStorage.setItem(\n        this.credentialsSessionStorageKey,\n        JSON.stringify(credentials)\n      );\n    }\n  }\n\n  private removeSessionAgentCredentials() {\n    if (this.credentialsSessionStorageKey) {\n      sessionStorage.removeItem(this.credentialsSessionStorageKey);\n    }\n  }\n\n  get state(): State {\n    return this.stateManager.getState();\n  }\n\n  setState(state: State): void {\n    this.stateManager.dispatch({\n      type: \"set-state\",\n      payload: state,\n    });\n  }\n\n  get store(): Store {\n    return this.stateManager.getStore();\n  }\n\n  /**\n   * Sets up event listeners to update state for event-driven clients.\n   */\n  private setClientEventListeners() {\n    this.clients.forEach((client) => {\n      if (!client || !isChatEventClient(client)) {\n        return;\n      }\n\n      client.on(\"message\", (data: string) => {\n        this.addMessage({\n          source:\n            client === this.botClient ? MessageSource.BOT : MessageSource.AGENT,\n          text: data,\n          timestamp: new Date().toISOString(),\n        });\n      });\n\n      client.on(\"typing\", (data: boolean) => {\n        this.setChatLoadingStatus(data);\n      });\n\n      client.on(\"close\", async (_data: unknown) => {\n        this.handoff();\n      });\n    });\n  }\n\n  /**\n   * Switches the current chat client with the next client, if available.\n   */\n  private async handoff(integrationDetails?: IntegrationDetails) {\n    if (isChatEventClient(this.chatClient)) {\n      this.removeSessionAgentCredentials();\n    }\n\n    let nextClient: ChatClient | undefined = undefined;\n    for (const client of this.clients) {\n      if (this.chatClient !== client) {\n        nextClient = client;\n      }\n    }\n    if (!nextClient) {\n      console.warn(\"No next client available for handoff.\");\n      return;\n    }\n\n    if (isChatEventClient(nextClient)) {\n      try {\n        if (this.sessionAgentCredentials) {\n          await this.reinitializeAgentSession(nextClient);\n        } else {\n          const creds = await nextClient.init({\n            conversationId: this.state.conversation.conversationId,\n            message: this.state.conversation.messages.at(-1) || {\n              source: MessageSource.BOT,\n              text: \"\",\n            },\n            notes: this.state.conversation.notes || {},\n            integrationDetails,\n          });\n\n          this.setSessionAgentCredentials(creds);\n        }\n      } catch (e) {\n        console.error(\"Error occurred while initializing next client:\", e);\n        return;\n      }\n    }\n    this.chatClient = nextClient;\n  }\n\n  private async reinitializeAgentSession(client: ChatEventClient) {\n    this.setCanSendMessage(false);\n    await client.reinitializeSession(this.sessionAgentCredentials);\n    this.setCanSendMessage(true);\n  }\n\n  addClientSdk(additionalClientSdk: Record<string, string>) {\n    const { analyticsConfig } = this.config;\n    this.config.analyticsConfig = {\n      ...analyticsConfig,\n      baseEventPayload: {\n        ...analyticsConfig?.baseEventPayload,\n        clientSdk: {\n          ...analyticsConfig?.baseEventPayload?.clientSdk,\n          ...additionalClientSdk,\n        },\n      },\n    };\n  }\n\n  initLocalStorage() {\n    const hostname = window.location.hostname;\n    if (!hostname) {\n      console.warn(\n        \"Unable to get hostname of current page. State will not be persisted while navigating across pages.\"\n      );\n      return;\n    }\n\n    if (!localStorage) {\n      console.warn(\n        \"Local storage is not available. State will not be persisted while navigating across pages.\"\n      );\n      return;\n    }\n\n    this.setState({\n      ...this.state,\n      conversation: loadSessionState(this.config.botId),\n    });\n    this.addListener({\n      valueAccessor: (s) => s.conversation,\n      callback: () =>\n        saveSessionState(this.config.botId, this.state.conversation),\n    });\n\n    if (!sessionStorage) {\n      console.warn(\n        \"Session storage is not available. State will not be persisted while navigating across pages.\"\n      );\n      return;\n    }\n\n    this.credentialsSessionStorageKey = `${BASE_HANDOFF_CREDENTIALS_SESSION_STORAGE_KEY}__${hostname}__${this.config.botId}`;\n\n    try {\n      const credentials = this.sessionAgentCredentials;\n      if (credentials) {\n        this.handoff();\n      }\n    } catch (e) {\n      console.error(\n        \"Error occurred while initializing agent session using stored credentials:\",\n        e\n      );\n    }\n  }\n\n  async report(\n    eventPayload: Omit<EventPayload, \"chat\"> &\n        RecursivePartial<Pick<EventPayload, \"chat\">>\n  ) {\n    if (eventPayload.action === \"CHAT_IMPRESSION\") {\n      if (this.isImpressionAnalyticEventSent) {\n        return;\n      }\n      this.isImpressionAnalyticEventSent = true;\n    }\n    const chatProps: EventPayload[\"chat\"] = {\n      botId: this.config.botId,\n      conversationId: this.state.conversation.conversationId,\n    };\n    const baseEventPayload = this.config.analyticsConfig?.baseEventPayload;\n    try {\n      await this.analyticsService.report({\n        timestamp: new Date().toISOString(),\n        pageUrl: window?.location.href || undefined,\n        referrerUrl: window?.document.referrer || undefined,\n        ...baseEventPayload,\n        ...eventPayload,\n        clientSdk: getClientSdk({\n          ...baseEventPayload?.clientSdk,\n          ...eventPayload.clientSdk,\n        }),\n        chat: {\n          ...chatProps,\n          ...baseEventPayload?.chat,\n          ...eventPayload.chat,\n        },\n      });\n    } catch (e) {\n      console.error(\"Error occured on request to Analytics API:\", e);\n    }\n  }\n\n  setContext(context: unknown) {\n    this.stateManager.dispatch(setContext(context));\n  }\n\n  setMessages(messages: Message[]) {\n    this.stateManager.dispatch(setMessages(messages));\n  }\n\n  addMessage(message: Message) {\n    this.stateManager.dispatch(addMessage(message));\n  }\n\n  setMessageNotes(notes: MessageNotes) {\n    this.stateManager.dispatch(setMessageNotes(notes));\n  }\n\n  setChatLoadingStatus(isLoading: boolean) {\n    this.stateManager.dispatch(setIsLoading(isLoading));\n  }\n\n  setCanSendMessage(canSendMessage: boolean) {\n    this.stateManager.dispatch(setCanSendMessage(canSendMessage));\n  }\n\n  /**\n   * Sets {@link ConversationState.conversationId} to the specified id\n   *\n   * @internal\n   *\n   * @param id - the id to set\n   */\n  private setConversationId(id: string | undefined) {\n    this.stateManager.dispatch(setConversationId(id));\n  }\n\n  restartConversation() {\n    if (isChatEventClient(this.chatClient)) {\n      this.removeSessionAgentCredentials();\n      this.chatClient.resetSession();\n    }\n    this.chatClient = this.botClient;\n\n    this.setConversationId(undefined);\n    this.setChatLoadingStatus(false);\n    this.setCanSendMessage(true);\n    this.setMessageNotes({});\n    this.setMessages([]);\n  }\n\n  addListener<T>(listener: StateListener<T>): Unsubscribe {\n    return this.stateManager.addListener<T>(listener);\n  }\n\n  async getNextMessage(\n    text?: string,\n    source: MessageSource = MessageSource.USER\n  ): Promise<MessageResponse | undefined> {\n    const client = this.chatClient;\n    if (isChatEventClient(client)) {\n      const { conversationId, notes } = this.state.conversation;\n      if (text && text.length > 0) {\n        this.addMessage({\n          timestamp: new Date().toISOString(),\n          source,\n          text,\n        });\n      }\n      client.processMessage({\n        conversationId,\n        notes,\n        messages: this.state.conversation.messages,\n        context: this.state.meta.context,\n      });\n      return;\n    }\n    return this.nextMessageHandler(\n      async () => {\n        const { messages, conversationId, notes } = this.state.conversation;\n        const nextMessage = await client.getNextMessage({\n          conversationId,\n          messages,\n          notes,\n          context: this.state.meta.context,\n        });\n        this.setConversationId(nextMessage.conversationId);\n        this.addMessage(nextMessage.message);\n        this.setMessageNotes(nextMessage.notes);\n        return nextMessage;\n      },\n      text,\n      source\n    );\n  }\n\n  async streamNextMessage(\n    text?: string,\n    source: MessageSource = MessageSource.USER\n  ): Promise<MessageResponse | undefined> {\n    const client = this.chatClient;\n    if (isChatEventClient(client)) {\n      throw new Error(\"streamNextMessage is not supported by this client.\");\n    }\n    return this.nextMessageHandler(\n      async () => {\n        let messageResponse: MessageResponse | undefined = undefined;\n        let nextMessage: Message = {\n          source: MessageSource.BOT,\n          text: \"\",\n        };\n        const { messages, conversationId, notes } = this.state.conversation;\n        const stream = await client.streamNextMessage({\n          conversationId,\n          messages,\n          notes,\n          context: this.state.meta.context,\n        });\n        stream.addEventListener(StreamEventName.StartEvent, ({ data }) => {\n          this.setChatLoadingStatus(false);\n          this.setMessageNotes(data);\n        });\n        stream.addEventListener(\n          StreamEventName.TokenStreamEvent,\n          ({ data }) => {\n            nextMessage = {\n              ...nextMessage,\n              text: nextMessage.text + data.token,\n            };\n            this.setMessages([...messages, nextMessage]);\n          }\n        );\n        stream.addEventListener(StreamEventName.EndEvent, ({ data }) => {\n          this.setConversationId(data.conversationId);\n          this.setMessages([...messages, data.message]);\n          messageResponse = data;\n        });\n        await stream.consume();\n        if (!messageResponse) {\n          return Promise.reject(\n            new ApiError(\n              \"Stream Error: Missing full message response at the end of stream.\"\n            )\n          );\n        }\n        return messageResponse;\n      },\n      text,\n      source\n    );\n  }\n\n  /**\n   * Setup relevant state before hitting Chat API endpoint for next message, such as\n   * setting loading status, \"canSendMessage\" status, and appending new user's message\n   * in conversation state.\n   *\n   * @remarks\n   * If the response contains integration details, it will trigger a handoff to the next client.\n   *\n   * @internal\n   *\n   * @param nextMessageFn - function to invoke to get next message\n   * @param text - the text of the next message\n   * @param source - the source of the message\n   * @returns a Promise of a response from the Chat API\n   */\n  private async nextMessageHandler(\n    nextMessageFn: () => Promise<MessageResponse>,\n    text?: string,\n    source: MessageSource = MessageSource.USER\n  ): Promise<MessageResponse | undefined> {\n    if (!this.state.conversation.canSendMessage) {\n      console.warn(\n        \"Unable to process new message at the moment. Another message is still being processed.\"\n      );\n      return;\n    }\n    this.setCanSendMessage(false);\n    this.setChatLoadingStatus(true);\n    let messages: Message[] = this.state.conversation.messages;\n    if (text && text.length > 0) {\n      messages = [\n        ...messages,\n        {\n          timestamp: new Date().toISOString(),\n          source,\n          text,\n        },\n      ];\n      this.setMessages(messages);\n    }\n    let messageResponse;\n    try {\n      messageResponse = await nextMessageFn();\n    } catch (e) {\n      this.setCanSendMessage(true);\n      this.setChatLoadingStatus(false);\n      return Promise.reject(e);\n    }\n    await this.report({\n      action: \"CHAT_RESPONSE\",\n      timestamp: messageResponse.message.timestamp,\n      chat: {\n        conversationId: messageResponse.conversationId,\n        responseId: messageResponse.message.responseId,\n      },\n    });\n    this.setCanSendMessage(true);\n    this.setChatLoadingStatus(false);\n    if (!!messageResponse.integrationDetails) {\n      await this.handoff(messageResponse.integrationDetails);\n    }\n    return messageResponse;\n  }\n}\n"],"names":[],"mappings":"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"}