UNPKG

@yext/chat-headless

Version:

A state manager library powered by Redux for Yext Chat integrations

1 lines 28 kB
{"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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"}