Giter VIP home page Giter VIP logo

bbolek / amazon-connect-chatjs Goto Github PK

View Code? Open in Web Editor NEW

This project forked from amazon-connect/amazon-connect-chatjs

0.0 0.0 0.0 3.71 MB

Amazon Connect Chat JS - a browser-based contact center integration API for Chat on the Agent and Customer side.

Home Page: https://docs.aws.amazon.com/connect/latest/adminguide/what-is-amazon-connect.html

License: Apache License 2.0

JavaScript 99.73% HTML 0.27%

amazon-connect-chatjs's Introduction

About

The Amazon Connect Chat javascript library (ChatJS) gives you the power to build your own chat widget to customize the chat experience. This can be used for both the agent user interface, in conjunction with Amazon Connect Streams, and for the customer chat interface.

There is a Chat UI reference implementation here. This will help you deploy an API Gateway and Lambda function for initiating chat from your webpage. From there you can use the ChatJS library to build a custom widget.

Learn More

To learn more about Amazon Connect and its capabilities, please check out the Amazon Connect User Guide.

Getting Started

A note about the AWS-SDK and ChatJS

The AWS-SDK is, by default, included in ChatJS as a "baked-in" dependency. You can view it at ./client/aws-sdk-connectparticipant.js. In ./client/client.js we import ConnectParticipant from this file. This file and import can be removed while using the AWS SDK imported through a script in the page file of your application, assuming that version of the AWS SDK has the ConnectParticipant service included. Incidentally, Amazon Connect Streams also contains a "baked-in" AWS SDK. This SDK cannot be removed, as it contains unreleased APIs that will not be available in the SDK you include as a script in the page file. Therefore, there are several occasions where implementations can run into AWS SDK issues.

Scenario 1: Streams and ChatJS are used. You are not importing the AWS SDK.

Ensure you import ChatJS after Streams.

Scenario 2: Streams and ChatJS are used. You are importing the AWS SDK.

Import Streams, then ChatJS, then the SDK. Ensure that your AWS SDK includes the ConnectParticipant Service (it is relatively new, so make sure you have an up-to-date AWS SDK version [^2.597.0]).

Scenario 3: ChatJS only, no AWS SDK import.

No need to worry here, this will always work.

Scenario 4: ChatJS only, with AWS SDK import.

Import ChatJS before the AWS SDK, and ensure the AWS SDK version you are using contains the ConnectParticipant Service.

A note for Scenarios 2 and 4.

When using the SDK and ChatJS, you may remove the SDK from ChatJS to ensure lack of import conflicts. However, this should not be relevant if the order in which you are importing these libraries is the order reflected above.

Using ChatJS from npm

npm install amazon-connect-chatjs

Importing using npm and ES6

import "amazon-connect-chatjs" Note: this will apply the global connect variable to your current scope.

Usage with TypeScript

amazon-connect-chatjs is compatible with TypeScript. You'll need to use version 3.0.1 or higher:

import "amazon-connect-streams";

connect.ChatSession.create({ /* ... */ });

Using ChatJS from Github

$ git clone https://github.com/amazon-connect/amazon-connect-chatjs

Building

  1. Install latest LTS version of NodeJS
  2. Checkout this package into workspace and navigate to root folder
  3. npm install
  4. To build (non-minified):
    1. npm run devo for a non-minified build.
    2. Find build artifacts in dist directory.
  5. To build (minified):
    1. npm run release for a minified build.
    2. Find build artifacts in dist directory.
  6. To run unit tests:
    1. npm run test
  7. To clean node_modules:
    1. npm run clean
  8. To make webpack watch all files:
    1. npm run watch

Find build artifacts in dist directory - This will generate a file called amazon-connect-chat.js - this is the full Connect ChatJS API which you will want to include in your page.

API

connect.ChatSession API

This is the main entry point to amazon-connect-chatjs. All your interactions with the library start here.

connect.ChatSession.setGlobalConfig()

connect.ChatSession.setGlobalConfig({
  loggerConfig: { // optional, the logging configuration. If omitted, no logging occurs
    // You can provide your own logger here, otherwise this property is optional
    customizedLogger: {
      debug: (msg) => console.debug(msg), // REQUIRED, can be any function
      info: (msg) => console.info(msg), // REQUIRED, can be any function
      warn: (msg) => console.warn(msg), // REQUIRED, can be any function
      error: (msg) => console.error(msg) // REQUIRED, can be any function
    },
    // There are five levels available - DEBUG, INFO, WARN, ERROR, ADVANCED_LOG. Default is INFO
    level: connect.LogLevel.INFO,
    // Choose if you want to use the default logger
    useDefaultLogger: true
  },
  region: "us-east-1", // optional, defaults to: "us-west-2"
  //Control switch for enabling/disabling message-receipts (Read/Delivered) for messages
  //message receipts use sendEvent API for sending Read/Delivered events https://docs.aws.amazon.com/connect-participant/latest/APIReference/API_SendEvent.html
  features: {
    messageReceipts: {
      shouldSendMessageReceipts: false, // by default messageReceipts is enabled
      throttleTime: 5000 //default throttle time - time to wait before sending Read/Delivered receipt.
    }
  }
});

Set the global configuration to use. If this method is not called, the defaults of loggerConfig and region are used. This method should be called before connect.ChatSession.create().

Customizing loggerConfig for ChatJS:

  • If you don't want to use any logger, you can skip this field.
  • There are five log levels available - DEBUG, INFO, WARN, ERROR, ADVANCED_LOG.
  • If you want to use your own logger, you can add them into customizedLogger, and add customizedLogger object as the value of loggerConfig.customizedLogger, then set the lowest logger level. globalConfig.loggerConfig.useDefaultLogger is not required.
  • If you want to use the default logger provided by ChatJS, you can set the logger level, and set useDefaultLogger to true. loggerConfig.customizedLogger is not required.
  • If you not only provide your own logger, but also set useDefaultLogger to true, your own logger will be overwritten by the default logger.
  • amazon-connect-chatjs/src/log.js - has the logic to select LogLevel. Default value is INFO - which cause all logs with higher priority than INFO to be logged. eg: by default info, warn, error and advancedLog messages will be logged.
  • Priority of logs: 10: "DEBUG" 20: "INFO" 30: "WARN" 40: "ERROR" 50: "ADVANCED_LOG"

connect.ChatSession.create()

const customerChatSession = connect.ChatSession.create({
  chatDetails: { // REQUIRED
    contactId: "...", // REQUIRED
    participantId: "...", // REQUIRED
    participantToken: "...", // REQUIRED
  },
  options: { // optional
    region: "us-east-1", // optional, defaults to `region` set in `connect.ChatSession.setGlobalConfig()`
  },
  type: connect.ChatSession.SessionTypes.CUSTOMER, // REQUIRED
});

Creates an instance of AgentChatSession or CustomerChatSession, depending on the specified type.

If you're creating a CustomerChatSession, the chatDetails field should be populated with the response of the StartChatContact API.

If you're creating an AgentChatSession, you must also include amazon-connect-streams. For example:

// order is important, alternatively use <script> tags
import "amazon-connect-streams";
import "amazon-connect-chatjs";

connect.contact(contact => {
  if (contact.getType() !== connect.ContactType.CHAT) {
    // applies only to CHAT contacts
    return;
  }

  // recommended: calls `connect.ChatSession.setGlobalConfig()` and `connect.ChatSession.create()` internally
  contact.onAccepted(async () => {
    const cnn = contact.getConnections().find(cnn => cnn.getType() === connect.ConnectionType.AGENT);

    const agentChatSession = await cnn.getMediaController();
  });

  // alternative: if you want control over the args of `connect.ChatSession.setGlobalConfig()` and `connect.ChatSession.create()`
  contact.onAccepted(() => {
    const cnn = contact.getConnections().find(cnn => cnn.getType() === connect.ConnectionType.AGENT);

    const agentChatSession = connect.ChatSession.create({
      chatDetails: cnn.getMediaInfo(), // REQUIRED
      options: { // REQUIRED
        region: "us-east-1", // REQUIRED, must match the value provided to `connect.core.initCCP()`
      },
      type: connect.ChatSession.SessionTypes.AGENT, // REQUIRED
      websocketManager: connect.core.getWebSocketManager() // REQUIRED
    });
  });
});

See the amazon-connect-streams API documentation for more information on the methods not documented here.

Note: AgentChatSession and CustomerChatSession are logical concepts. As a result, the instanceof operator will not work how you expect:

if (connect.ChatSession.create(/* ... */) instanceof connect.ChatSession) {
  // this will never execute
}

connect.ChatSession.LogLevel

connect.ChatSession.LogLevel = {
  DEBUG: /* ... */,
  INFO: /* ... */,
  WARN: /* ... */,
  ERROR: /* ... */
};

Enumerates the logging levels.

connect.ChatSession.SessionTypes

connect.ChatSession.SessionTypes = {
  AGENT: /* ... */,
  CUSTOMER: /* ... */
};

Enumerates the session types.

ChatSession API

The ChatSession API divided into three sections: Amazon Connect Participant Service API wrappers, events, and other.

Amazon Connect Participant Service API wrappers

Functions in this section:

  • Wrap the APIs of the Amazon Connect Participant Service.
  • Return a Promise<Response> (except for chatSession.connect()), where:
    • Response is an aws-sdk Response object.
    • If the Promise rejects, the error will still be a Response object. However, the data field will not be populated while the error field will.
  • Can optionally specify a metadata arg field (except for customerChatSession.disconnectParticipant()). The metadata arg field is not used directly by amazon-connect-chatjs, rather it's merely copied to the response object for usage by developers.

For example:

function handleResponse(response) {
  // `response` is an aws-sdk `Response` object
  // `data` contains the response data
  // `metadata` === "foo"
  const { data, metadata } = response;
  // ...
}

function handleError(response) {
  // `response` is an aws-sdk `Response` object
  // `error` contains the response error
  // `metadata` === "foo"
  const { error, metadata } = response;
  // ...
}

chatSession
  .getTranscript({ metadata: "foo" })
  .then(handleResponse, handleError);

chatSession.connect()

// connectCalled: indicates whether the Amazon Connect Participant Service was called
// connectSuccess: indicates whether the operation succeeded
const { connectCalled, connectSuccess } = await chatSession.connect();

Wraps the CreateParticipantConnection API.

The arguments and response do not overlap with the API request or response.

Note: If the operation fails, the Promise will reject, but the error will have the same schema as a successful response.

chatSession.getTranscript()

const awsSdkResponse = await chatSession.getTranscript({
  maxResults: 100,
  sortOrder: "ASCENDING"
});
const { InitialContactId, NextToken, Transcript } = awsSdkResponse.data;

Wraps the GetTranscript API.

The arguments are based on the API request body with the following differences:

  • Fields are in camelCase.
  • MaxResults defaults to 15.
  • ScanDirection defaults to BACKWARD always.
  • SortOrder defaults to ASCENDING.

The response data is the same as the API response body.

Important note: In order to specify scanDirection as FORWARD, you need to explicitly include a startPosition. This is because the default startPosition is at the most recent update to the transcript, so requesting a transcript in the FORWARD direction from the default startPosition is equivalent to asking for a transcript containing only messages more recent than the present (you are asking for messages in the future!).

chatSession.sendEvent()

const awsSdkResponse = await chatSession.sendEvent({
  contentType: "application/vnd.amazonaws.connect.event.typing"
});
const { AbsoluteTime, Id } = awsSdkResponse.data;

Wraps the SendEvent API.

The arguments are based on the API request body with the following differences:

  • Fields are in camelCase.
  • ClientToken cannot be specified.
  • ContentType allows the following values:
    • "application/vnd.amazonaws.connect.event.chat.ended"
    • "application/vnd.amazonaws.connect.event.participant.joined"
    • "application/vnd.amazonaws.connect.event.participant.left"
    • "application/vnd.amazonaws.connect.event.transfer.succeeded"
    • "application/vnd.amazonaws.connect.event.transfer.failed"
    • "application/vnd.amazonaws.connect.event.typing"

The response data is the same as the API response body.

chatSession.sendMessage()

const awsSdkResponse = await chatSession.sendMessage({
  contentType: "text/plain",
  message: "Hello World!"
});
const { AbsoluteTime, Id } = awsSdkResponse.data;

Wraps the SendMessage API.

The arguments are based on the API request body with the following differences:

  • Fields are in camelCase.
  • ClientToken cannot be specified.

The response data is the same as the API response body.

chatSession.sendAttachment()

// attachment object is the actual file that will be sent to agent from end-customer and vice versa.
const awsSdkResponse = await chatSession.sendAttachment({
  attachment: attachment
});

Wraps the StartAttachmentUpload and CompleteAttachmentUpload API. The arguments are based on the StartAttachmentUpload and CompleteAttachmentUpload API request body with the following differences:

  • Fields are in camelCase. The response data is the same as the StartAttachmentUpload and CompleteAttachmentUpload API response body. chatSession.sendAttachment() invokes the StartAttachmentUpload API, uploads the Attachment to the S3 bucket using the pre-signed URL received in the StartAttachmentUpload API response and invokes the CompleteAttachmentUpload API to finish the Attachment upload process.

chatSession.downloadAttachment()

const awsSdkResponse = await chatSession.downloadAttachment({
  attachmentId: "string"
});
const { attachment } = awsSdkResponse.data;
/* 
Attachment Object - This is the actual file that will be downloaded by either agent or end-customer.
attachment => {
  lastModified: long
  name: "string"
  size: long
  type: "string"
  webkitRelativePath: "string"
}
*/

Wraps the GetAttachment API. The arguments are based on the API request body with the following differences:

  • Fields are in camelCase. The response data is the same as the API response body. chatSession.downloadAttachment() invokes the GetAttachment using the AttachmentId as a request parameter and fetches the Attachment from the S3 bucket using the pre-signed URL received in the GetAttachment API response.

customerChatSession.disconnectParticipant()

const awsSdkResponse = await customerChatSession.disconnectParticipant();

Wraps the DisconnectParticipant API.

The arguments and response do not overlap with the API request or response.

Once this method is called, the CustomerChatSession cannot be used anymore.

Applies only for CustomerChatSession. See connect.ChatSession.create() for more info.

Events

Function in this section:

  • When invoked, register an event handler that is triggered whenever the event occurs.
  • Can be called multiple times (i.e. register multiple event handlers).
  • Receive an event object that contains a chatDetails field. See chatSession.getChatDetails() for more info.

chatSession.onConnectionBroken()

chatSession.onConnectionBroken(event => {
  const { chatDetails } = event;
  // ...
});

Subscribes an event handler that triggers when the session connection is broken.

chatSession.onConnectionEstablished()

chatSession.onConnectionEstablished(event => {
  const { chatDetails } = event;
  // ...
});

Subscribes an event handler that triggers when the session connection is established.

chatSession.onEnded()

chatSession.onEnded(event => {
  const { chatDetails, data } = event;
  // ...
});

Subscribes an event handler that triggers when the session is ended.

chatSession.onMessage()

chatSession.onMessage(event => {
  const { chatDetails, data } = event;
  switch (data.ContentType) {
    // ...
  }
});

Subscribes an event handler that triggers whenever a message or an event (except for application/vnd.amazonaws.connect.event.typing) is created by any participant. The data field has the same schema as the Item data type from the Amazon Connect Participant Service with the addition of the following optional fields: contactId, initialContactId.

chatSession.onTyping()

chatSession.onTyping(event => {
  const { chatDetails, data } = event;
  if (data.ParticipantRole === "AGENT") {
    // ...
  }
});

Subscribes an event handler that triggers whenever a application/vnd.amazonaws.connect.event.typing event is created by any participant. The data field has the same schema as chatSession.onMessage().

Client side metric

In version 1.2.0 the client side metric(CSM) service is added into this library. Client side metric can provide insights into the real performance and usability, it helps us to understnad how customers are actually using the website and what UI experiences they prefer. This feature is enabled by default. User can also disable this feature by passing a flag: disableCSM when they create a new chat session:

const customerChatSession = connect.ChatSession.create({
  ...,
  disableCSM: true
});

Other

This section contains all the functions that do not fall under the previous two categories.

chatSession.getChatDetails()

const {
  contactId,
  initialContactId,
  participantId,
  participantToken,
} = chatSession.getChatDetails();

Gets the chat session details.

agentChatSession.cleanUpOnParticipantDisconnect()

agentChatSession.cleanUpOnParticipantDisconnect();

Cleans up all event handlers.

Applies only for AgentChatSession. See connect.ChatSession.create() for more info.

amazon-connect-chatjs's People

Contributors

jiahaoyu6666 avatar ctwomblyamzn avatar haomingli2020 avatar mhiaror avatar labelson avatar dependabot[bot] avatar sseidel16 avatar tscheuneman avatar swiszm-amazon avatar johnmryan avatar amazon-auto avatar marcogrcr avatar seiyako avatar sriramchivukula avatar yaminli-aws avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.