diff --git a/package-lock.json b/package-lock.json index e739b40..83eba60 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10274,7 +10274,7 @@ }, "packages/chat-core-aws-connect": { "name": "@yext/chat-core-aws-connect", - "version": "0.1.0-alpha.2", + "version": "0.1.0", "license": "BSD-3-Clause", "dependencies": { "amazon-connect-chatjs": "^2.3.0", @@ -10287,7 +10287,7 @@ "@microsoft/api-extractor": "^7.34.8", "@types/jest": "^29.5.1", "@types/node-fetch": "^2.6.4", - "@yext/chat-core": "^0.8.1", + "@yext/chat-core": "^0.8.2", "@yext/eslint-config": "^1.0.0", "babel-jest": "^29.5.0", "dotenv": "^16.4.5", diff --git a/packages/chat-core-aws-connect/LICENSE b/packages/chat-core-aws-connect/LICENSE index b85203b..326c945 100644 --- a/packages/chat-core-aws-connect/LICENSE +++ b/packages/chat-core-aws-connect/LICENSE @@ -1,6 +1,7 @@ -Contains information from the language-subtag-registry JSON Database (https://github.com/mattcg/language-subtag-registry/tree/master/data/json) which is made available under the ODC Attribution License (https://github.com/mattcg/language-subtag-registry/blob/master/LICENSE.md). +Contains information from the language-subtag-registry JSON Database (https://github.com/mattcg/language-subtag-registry/tree/master/data/json) +which is made available under the ODC Attribution License (https://github.com/mattcg/language-subtag-registry/blob/master/LICENSE.md). -The files listed in this repository are licensed under the below license. All other features and products are subject to separate agreements and certain functionality requires paid subscriptions to Yext products. +The files listed in this repository are licensed under the below license. All other features and products are subject to separate agreements and certain functionality requires paid subscriptions to Yext products. BSD 3-Clause License diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.emit.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.emit.md index bc2c8dc..9eba5b1 100644 --- a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.emit.md +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.emit.md @@ -4,7 +4,7 @@ ## ChatCoreAwsConnect.emit() method -Emit an event into the AWS Connect chat session. Supported events are: - `typing`: The customer is typing. +Emit an event into the Amazon Connect chat session. Supported events are: - `typing`: The customer is typing. **Signature:** diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.getsession.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.getsession.md index 9367a9c..3df4324 100644 --- a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.getsession.md +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.getsession.md @@ -4,7 +4,7 @@ ## ChatCoreAwsConnect.getSession() method -Get the current AWS Connect chat session. +Get the current Amazon Connect chat session. **Signature:** diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.init.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.init.md index 3bed370..e7180a6 100644 --- a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.init.md +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.init.md @@ -4,7 +4,7 @@ ## ChatCoreAwsConnect.init() method -Initialize the AWS Connect chat session using the credentials from the Chat API. +Initialize the Amazon Connect chat session using the credentials from the Chat API. **Signature:** diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.md index 6eebfd9..3858a0b 100644 --- a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.md +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.md @@ -4,7 +4,7 @@ ## ChatCoreAwsConnect interface -Provides methods for interacting with Chat's AWS Connect integration. +Provides methods for interacting with Chat's Amazon Connect integration. **Signature:** @@ -16,9 +16,10 @@ export interface ChatCoreAwsConnect | Method | Description | | --- | --- | -| [emit(eventName, data)](./chat-core-aws-connect.chatcoreawsconnect.emit.md) | Emit an event into the AWS Connect chat session. Supported events are: - typing: The customer is typing. | -| [getSession()](./chat-core-aws-connect.chatcoreawsconnect.getsession.md) | Get the current AWS Connect chat session. | -| [init(messageResponse)](./chat-core-aws-connect.chatcoreawsconnect.init.md) | Initialize the AWS Connect chat session using the credentials from the Chat API. | -| [on(eventName, cb)](./chat-core-aws-connect.chatcoreawsconnect.on.md) | Register a callback for an event triggered within the AWS Connect chat session. Supported events are: - message: A new message has been received. - typing: The agent is typing. - close: The chat session has been closed. | +| [emit(eventName, data)](./chat-core-aws-connect.chatcoreawsconnect.emit.md) | Emit an event into the Amazon Connect chat session. Supported events are: - typing: The customer is typing. | +| [getSession()](./chat-core-aws-connect.chatcoreawsconnect.getsession.md) | Get the current Amazon Connect chat session. | +| [init(messageResponse)](./chat-core-aws-connect.chatcoreawsconnect.init.md) | Initialize the Amazon Connect chat session using the credentials from the Chat API. | +| [on(eventName, cb)](./chat-core-aws-connect.chatcoreawsconnect.on.md) | Register a callback for an event triggered within the Amazon Connect chat session. Supported events are: - message: A new message has been received. - typing: The agent is typing. - close: The chat session has been closed. | | [processMessage(request)](./chat-core-aws-connect.chatcoreawsconnect.processmessage.md) | Process a message sent by the user. | +| [resetSession()](./chat-core-aws-connect.chatcoreawsconnect.resetsession.md) | Resets the [ChatCoreAwsConnect](./chat-core-aws-connect.chatcoreawsconnect.md) instance, clearing the underlying Amazon Connect session. | diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.on.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.on.md index 539f469..292778a 100644 --- a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.on.md +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.on.md @@ -4,7 +4,7 @@ ## ChatCoreAwsConnect.on() method -Register a callback for an event triggered within the AWS Connect chat session. Supported events are: - `message`: A new message has been received. - `typing`: The agent is typing. - `close`: The chat session has been closed. +Register a callback for an event triggered within the Amazon Connect chat session. Supported events are: - `message`: A new message has been received. - `typing`: The agent is typing. - `close`: The chat session has been closed. **Signature:** diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.resetsession.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.resetsession.md new file mode 100644 index 0000000..f19e739 --- /dev/null +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.chatcoreawsconnect.resetsession.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@yext/chat-core-aws-connect](./chat-core-aws-connect.md) > [ChatCoreAwsConnect](./chat-core-aws-connect.chatcoreawsconnect.md) > [resetSession](./chat-core-aws-connect.chatcoreawsconnect.resetsession.md) + +## ChatCoreAwsConnect.resetSession() method + +Resets the [ChatCoreAwsConnect](./chat-core-aws-connect.chatcoreawsconnect.md) instance, clearing the underlying Amazon Connect session. + +**Signature:** + +```typescript +resetSession(): void; +``` +**Returns:** + +void + diff --git a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.md b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.md index b69f991..c8fc0f6 100644 --- a/packages/chat-core-aws-connect/docs/chat-core-aws-connect.md +++ b/packages/chat-core-aws-connect/docs/chat-core-aws-connect.md @@ -15,7 +15,7 @@ | Interface | Description | | --- | --- | | [AwsConnectEventData](./chat-core-aws-connect.awsconnecteventdata.md) | Data associated with an AWS Connect event. | -| [ChatCoreAwsConnect](./chat-core-aws-connect.chatcoreawsconnect.md) | Provides methods for interacting with Chat's AWS Connect integration. | +| [ChatCoreAwsConnect](./chat-core-aws-connect.chatcoreawsconnect.md) | Provides methods for interacting with Chat's Amazon Connect integration. | | [ChatCoreAwsConnectConfig](./chat-core-aws-connect.chatcoreawsconnectconfig.md) | Configuration for this instance of the [ChatCoreAwsConnect](./chat-core-aws-connect.chatcoreawsconnect.md). | | [LoggerConfig](./chat-core-aws-connect.loggerconfig.md) | Configuration for the internal logger of the AWS Connect Chat session. | diff --git a/packages/chat-core-aws-connect/etc/chat-core-aws-connect.api.md b/packages/chat-core-aws-connect/etc/chat-core-aws-connect.api.md index f566fbe..e03b3f8 100644 --- a/packages/chat-core-aws-connect/etc/chat-core-aws-connect.api.md +++ b/packages/chat-core-aws-connect/etc/chat-core-aws-connect.api.md @@ -27,6 +27,7 @@ export interface ChatCoreAwsConnect { init(messageResponse: MessageResponse): Promise; on(eventName: T, cb: EventCallback): void; processMessage(request: MessageRequest): Promise; + resetSession(): void; } // @public diff --git a/packages/chat-core-aws-connect/package.json b/packages/chat-core-aws-connect/package.json index 91d5e4e..61634e5 100644 --- a/packages/chat-core-aws-connect/package.json +++ b/packages/chat-core-aws-connect/package.json @@ -1,6 +1,6 @@ { "name": "@yext/chat-core-aws-connect", - "version": "0.1.0-alpha.2", + "version": "0.1.0", "description": "Typescript Networking Library for the Yext Chat API Integration with Amazon Connect", "main": "./dist/commonjs/index.js", "module": "./dist/esm/index.mjs", @@ -54,9 +54,10 @@ "@microsoft/api-extractor": "^7.34.8", "@types/jest": "^29.5.1", "@types/node-fetch": "^2.6.4", - "@yext/chat-core": "^0.8.1", "@yext/eslint-config": "^1.0.0", "babel-jest": "^29.5.0", + "@yext/chat-core": "^0.8.2", + "dotenv": "^16.4.5", "eslint": "^8.39.0", "generate-license-file": "^1.0.0", "jest": "^29.5.0", @@ -64,8 +65,7 @@ "prettier": "^2.8.8", "rollup": "^3.29.0", "rollup-plugin-typescript2": "^0.35.0", - "typescript": "^5.0.4", - "dotenv": "^16.4.5" + "typescript": "^5.0.4" }, "peerDependencies": { "@yext/chat-core": "^0.8.2" diff --git a/packages/chat-core-aws-connect/src/infra/ChatCoreAwsConnectImpl.ts b/packages/chat-core-aws-connect/src/infra/ChatCoreAwsConnectImpl.ts index e6be1c1..37cdf82 100644 --- a/packages/chat-core-aws-connect/src/infra/ChatCoreAwsConnectImpl.ts +++ b/packages/chat-core-aws-connect/src/infra/ChatCoreAwsConnectImpl.ts @@ -4,6 +4,7 @@ import { AwsConnectEvent } from "../models/AwsConnectEvent"; import { EventMap, EventCallback } from "../models/EventCallback"; import { LoggerConfig } from "../models/LoggerConfig"; import { ChatCoreAwsConnectConfig } from "../models/ChatCoreAwsConnectConfig"; +import { isCustomerChatSession } from "../models/ChatSession"; import "amazon-connect-chatjs"; /** @@ -12,7 +13,7 @@ import "amazon-connect-chatjs"; * @internal */ export class ChatCoreAwsConnectImpl implements ChatCoreAwsConnect { - private session?: connect.ActiveChatSession; + private session?: connect.ActiveCustomerChatSession; private eventListeners: { [T in keyof EventMap]?: EventCallback[] } = {}; private loggerConfig: LoggerConfig = { level: "ERROR", @@ -51,11 +52,16 @@ export class ChatCoreAwsConnectImpl implements ChatCoreAwsConnect { region: messageRsp.integrationDetails?.awsConnectHandoff?.region, }); - this.session = connect.ChatSession.create({ + const sess = connect.ChatSession.create({ chatDetails: connectionCreds, type: "CUSTOMER", }); + if (!isCustomerChatSession(sess)) { + throw new Error("Unexpected non-customer chat session type"); + } + this.session = sess; + const { connectCalled, connectSuccess } = await this.session.connect({}); if (!connectCalled || !connectSuccess) { throw new Error("Failed to connect to chat session"); @@ -97,7 +103,7 @@ export class ChatCoreAwsConnectImpl implements ChatCoreAwsConnect { this.session?.onEnded((event: AwsConnectEvent) => { this.eventListeners["close"]?.forEach((cb) => cb(event.data)); // Connection is closed. Clear session and create new one on next handoff request. - this.session = undefined; + this.resetSession(); }); } @@ -130,4 +136,13 @@ export class ChatCoreAwsConnectImpl implements ChatCoreAwsConnect { getSession(): connect.ActiveChatSession | undefined { return this.session; } + + resetSession(): void { + if (this.session === undefined) { + return; + } + + this.session.disconnectParticipant(); + this.session = undefined; + } } diff --git a/packages/chat-core-aws-connect/src/models/ChatCoreAwsConnect.ts b/packages/chat-core-aws-connect/src/models/ChatCoreAwsConnect.ts index b8c8bed..465890e 100644 --- a/packages/chat-core-aws-connect/src/models/ChatCoreAwsConnect.ts +++ b/packages/chat-core-aws-connect/src/models/ChatCoreAwsConnect.ts @@ -2,20 +2,20 @@ import { MessageRequest, MessageResponse } from "@yext/chat-core"; import { EventCallback, EventMap } from "./EventCallback"; /** - * Provides methods for interacting with Chat's AWS Connect integration. + * Provides methods for interacting with Chat's Amazon Connect integration. * * @public */ export interface ChatCoreAwsConnect { /** - * Initialize the AWS Connect chat session using the credentials from the Chat API. + * Initialize the Amazon Connect chat session using the credentials from the Chat API. * * @param messageResponse - The response returned from a successful call to the Chat API. */ init(messageResponse: MessageResponse): Promise; /** - * Register a callback for an event triggered within the AWS Connect chat session. + * Register a callback for an event triggered within the Amazon Connect chat session. * Supported events are: * - `message`: A new message has been received. * - `typing`: The agent is typing. @@ -27,7 +27,7 @@ export interface ChatCoreAwsConnect { on(eventName: T, cb: EventCallback): void; /** - * Emit an event into the AWS Connect chat session. + * Emit an event into the Amazon Connect chat session. * Supported events are: * - `typing`: The customer is typing. * @@ -44,10 +44,15 @@ export interface ChatCoreAwsConnect { processMessage(request: MessageRequest): Promise; /** - * Get the current AWS Connect chat session. + * Get the current Amazon Connect chat session. * * @remarks * If the session is not initialized, this method will return `undefined`. */ getSession(): connect.ActiveChatSession | undefined; + + /** + * Resets the {@link ChatCoreAwsConnect} instance, clearing the underlying Amazon Connect session. + */ + resetSession(): void; } diff --git a/packages/chat-core-aws-connect/src/models/ChatSession.ts b/packages/chat-core-aws-connect/src/models/ChatSession.ts new file mode 100644 index 0000000..ec2af04 --- /dev/null +++ b/packages/chat-core-aws-connect/src/models/ChatSession.ts @@ -0,0 +1,14 @@ +/** + * Returns true if the Amazon connect chat session is a customer chat session. + * @param session - The Amazon connect chat session. + * + * @internal + */ +export function isCustomerChatSession( + session: connect.ActiveChatSession +): session is connect.ActiveCustomerChatSession { + return ( + (session as connect.ActiveCustomerChatSession).disconnectParticipant !== + undefined + ); +} diff --git a/packages/chat-core-aws-connect/src/models/connect.d.ts b/packages/chat-core-aws-connect/src/models/connect.d.ts index d066e4c..b1c01e9 100644 --- a/packages/chat-core-aws-connect/src/models/connect.d.ts +++ b/packages/chat-core-aws-connect/src/models/connect.d.ts @@ -5,6 +5,7 @@ declare global { const ChatSession: typeof AwsChatSession; const LogLevel: typeof AwsChatSession.LogLevel; export type ActiveChatSession = ReturnType; + export type ActiveCustomerChatSession = Extract; export type Logger = typeof AwsChatSession.Logger; } } \ No newline at end of file diff --git a/packages/chat-core-aws-connect/test-browser-esm/index.html b/packages/chat-core-aws-connect/test-browser-esm/index.html index c94fe89..0a55761 100644 --- a/packages/chat-core-aws-connect/test-browser-esm/index.html +++ b/packages/chat-core-aws-connect/test-browser-esm/index.html @@ -13,5 +13,6 @@ />

    + diff --git a/packages/chat-core-aws-connect/test-browser-esm/src/script.js b/packages/chat-core-aws-connect/test-browser-esm/src/script.js index f9df42d..ba7a3cc 100644 --- a/packages/chat-core-aws-connect/test-browser-esm/src/script.js +++ b/packages/chat-core-aws-connect/test-browser-esm/src/script.js @@ -12,6 +12,11 @@ let chatCore = provideChatCore({ }); let coreAws = provideChatCoreAwsConnect(); + +window.resetSession = () => { + coreAws.resetSession(); +}; + const msgInput = document.getElementById("messageInput"); window.getNextMessage = async () => { const req = { diff --git a/packages/chat-core-aws-connect/tests/ChatCoreAwsConnect.test.ts b/packages/chat-core-aws-connect/tests/ChatCoreAwsConnect.test.ts index b8e2b54..8712fb6 100644 --- a/packages/chat-core-aws-connect/tests/ChatCoreAwsConnect.test.ts +++ b/packages/chat-core-aws-connect/tests/ChatCoreAwsConnect.test.ts @@ -6,7 +6,6 @@ import { AwsConnectEventData, } from "../src/models/AwsConnectEvent"; import "amazon-connect-chatjs"; -import "../src/models/connect"; const createSpy = jest.fn().mockReturnValue(mockChatSession()); const globalConfigSpy = jest.fn(); @@ -33,7 +32,7 @@ afterEach(() => { jest.clearAllMocks(); }); -function mockChatSession(): connect.ActiveChatSession { +function mockChatSession(): connect.ActiveCustomerChatSession { return { onMessage(_: (event: DeepPartial) => void) { return null; @@ -53,7 +52,10 @@ function mockChatSession(): connect.ActiveChatSession { connect() { return { connectCalled: true, connectSuccess: true }; }, - } as unknown as connect.ActiveChatSession; + disconnectParticipant() { + return null; + }, + } as Partial as connect.ActiveCustomerChatSession; } function mockMessageResponse(): MessageResponse { @@ -369,3 +371,30 @@ it("clear session on close event", async () => { onEndedFn({}); expect(chatCoreAwsConnect.getSession()).toBeUndefined(); }); + +it("clears session on resetSession", async () => { + const chatCoreAwsConnect = provideChatCoreAwsConnect(); + await chatCoreAwsConnect.init(mockMessageResponse()); + expect(chatCoreAwsConnect.getSession()).toBeDefined(); + + chatCoreAwsConnect.resetSession(); + expect(chatCoreAwsConnect.getSession()).toBeUndefined(); +}); + +it("noops when clearing undefined session", async () => { + const chatCoreAwsConnect = provideChatCoreAwsConnect(); + expect(chatCoreAwsConnect.getSession()).toBeUndefined(); + + chatCoreAwsConnect.resetSession(); + expect(chatCoreAwsConnect.getSession()).toBeUndefined(); +}); + +it("throws error when session is not a customer session", async () => { + const sess = {} as unknown as connect.ActiveChatSession; + createSpy.mockReturnValue(sess); + + const chatCoreAwsConnect = provideChatCoreAwsConnect(); + expect(() => chatCoreAwsConnect.init(mockMessageResponse())).rejects.toThrow( + "Unexpected non-customer chat session type" + ); +});