azure-sdk-for-js/sdk/communication/communication-chat
Matthew Podwysocki 0188ca180f
[communication] Move @azure/communication-call-automation to ESM/vitest (#31680)
### Packages impacted by this PR

- @azure/communication-call-automation

### Issues associated with this PR

- https://github.com/Azure/azure-sdk-for-js/issues/31338

### Describe the problem that is addressed by this PR

Migrates package to ESM/vitest. Note that ServiceBus has issues with
Browser loads that we can fix in a later revision as Buffer is not
defined when you try to import any files. But then including Buffer then
also causes issues with the unit tests.

### What are the possible designs available to address the problem? If
there are more than one possible design, why was the one in this PR
chosen?


### Are there test cases added in this PR? _(If not, why?)_


### Provide a list of related PRs _(if any)_


### Command used to generate this PR:**_(Applicable only to SDK release
request PRs)_

### Checklists
- [ ] Added impacted package name to the issue description
- [ ] Does this PR needs any fixes in the SDK Generator?** _(If so,
create an Issue in the
[Autorest/typescript](https://github.com/Azure/autorest.typescript)
repository and link it here)_
- [ ] Added a changelog (if necessary)
2024-11-18 18:29:38 -05:00
..
.vscode
review [eslint-plugin] add rule "@typescript-eslint/consistent-type-imports": "warn" 2024-10-30 15:48:52 +00:00
samples/v1 [EngSys] move to vendored version of cross-env via dev-tool 2024-11-02 00:48:06 +00:00
samples-dev [EngSys] upgrade to prettier v3 2024-01-10 18:45:01 -05:00
src [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
swagger Post release automated changes for communication releases (#31517) 2024-11-06 09:00:59 -08:00
test [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
.gitignore
CHANGELOG.md Post release automated changes for communication releases (#31517) 2024-11-06 09:00:59 -08:00
LICENSE
README.md
api-extractor.json [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
assets.json Update the Core Client Version and Test Recorder (#30032) 2024-06-13 10:43:47 -07:00
eslint.config.mjs fix remaining linting errors 2024-08-22 11:43:26 -07:00
package.json [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
sample.env
test.env Update the Core Client Version and Test Recorder (#30032) 2024-06-13 10:43:47 -07:00
tests.yml Switch to TME test subscription (#31329) 2024-10-14 18:19:12 -07:00
tsconfig.browser.config.json [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
tsconfig.json [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
vitest.browser.config.ts [communication] Move @azure/communication-chat to ESM/vitest (#31651) 2024-11-18 09:21:58 -08:00
vitest.config.ts [communication] Move @azure/communication-call-automation to ESM/vitest (#31680) 2024-11-18 18:29:38 -05:00

README.md

Azure Communication Chat client library for JavaScript

Azure Communication Services for Chat lets developers add chat capabilities to their app. Use this client library to manage chat threads and their users, and send and receive chat messages.

Read more about Azure Communication Services here

Getting started

Prerequisites

Installing

npm install @azure/communication-chat

Browser support

JavaScript Bundle

To use this client library in the browser, first you need to use a bundler. For details on how to do this, please refer to our bundling documentation. In rollup.config.js, add following customized name exports in cjs plugin.


cjs({
  namedExports: {
    events: ["EventEmitter"],
    "@azure/communication-signaling": ["CommunicationSignalingClient", "SignalingClient"],
    "@opentelemetry/api": ["CanonicalCode", "SpanKind", "TraceFlags"]
  }
})

Key concepts

A chat conversation is represented by a thread. Each user in the thread is called a chat participant. Chat participants can chat with one another privately in a 1:1 chat or huddle up in a 1:N group chat. Users also get near-real time updates for when others are typing and when they have read the messages.

ChatClient

ChatClient is the primary interface for developers using this client library. It provides asynchronous methods to create and delete a thread.

ChatThreadClient

ChatThreadClient provides asynchronous methods to do the message and chat participants operations within the chat thread.

Examples

Initialize ChatClient

Use resource url and user access token to initialize chat client.

import { ChatClient } from '@azure/communication-chat';
import { AzureCommunicationTokenCredential } from "@azure/communication-common";

// Your unique Azure Communication service endpoint
const endpointUrl = '<ENDPOINT>';
const userAccessToken = '<USER_ACCESS_TOKEN>';
const tokenCredential = new AzureCommunicationTokenCredential(userAccessToken);
const chatClient = new ChatClient(endpointUrl, tokenCredential);

Create a thread with two users

Use the createThread method to create a chat thread.

createChatThreadRequest is used to describe the thread request:

  • Use topic to give a thread topic;

createChatThreadOptions is used to set the optional params to create the thread:

  • Use participants to list the chat participants to be added to the thread;
  • Use idempotencyToken to specify a repeatable request

createChatThreadResult is the result returned from creating a thread. It contains a chatThread which is the thread that was created, as well as an errors property which will contain information about invalid participants if they failed to be added to the thread.

const createChatThreadRequest = {
  topic: "Hello, World!"
};
const createChatThreadOptions = {
  participants: [
    {
      id: { communicationUserId: '<USER_ID>' },
      displayName: '<USER_DISPLAY_NAME>'
    }
  ]
};
const createChatThreadResult = await chatClient.createChatThread(
  createChatThreadRequest,
  createChatThreadOptions
);
const threadId = createChatThreadResult.chatThread.id;

Create a ChatThreadClient

The ChatThreadClient will allow you to perform operations specific to a chat thread, like update the chat thread topic, send a message, add participants to the chat thread, etc.

You can initialize a new ChatThreadClient using the getChatThreadClient method of the ChatClient with an existing thread id:

const chatThreadClient = chatClient.getChatThreadClient(threadId);

Send a message to the thread

Use sendMessage method to sends a message to a thread identified by threadId.

sendMessageRequest is used to describe the message request:

  • Use content to provide the chat message content;

sendMessageOptions is used to describe the operation optional params:

  • Use senderDisplayName to specify the display name of the sender;
  • Use type to specify the message type, such as 'text' or 'html' ;

sendChatMessageResult is the result returned from sending a message, it contains an ID, which is the unique ID of the message.

const sendMessageRequest =
{
  content: 'Hello Geeta! Can you share the deck for the conference?'
};
const sendMessageOptions:SendMessageOptions = {
  senderDisplayName: "Jack",
  type: "text"
};
const sendChatMessageResult = await chatThreadClient.sendMessage(sendMessageRequest, sendMessageOptions);
const messageId = sendChatMessageResult.id;

Receive messages from a thread

With real-time signaling, you can subscribe to listen for new incoming messages and update the current messages in memory accordingly.


// open notifications channel
await chatClient.startRealtimeNotifications();
// subscribe to new notification
chatClient.on("chatMessageReceived", (e) => {
  console.log("Notification chatMessageReceived!");
  // your code here
});

Alternatively you can retrieve chat messages by polling the listMessages method at specified intervals.

for await (const chatMessage of chatThreadClient.listMessages()) {
   // your code here
}

Add Users to a thread

Once a thread is created, you can then add and remove users from that thread. By adding users, you give them access to be able to send messages to the thread. You will need to start by getting a new access token and identity for that user. The user will need that access token in order to initialize their chat client. More information on tokens here: Authenticate to Azure Communication Services


const addParticipantsRequest =
{
  participants: [
    {
      id: { communicationUserId: '<NEW_PARTICIPANT_USER_ID>' },
      displayName: 'Jane'
    }
  ]
};

await chatThreadClient.addParticipants(addParticipantsRequest);

Remove Users from a thread

Similar to above, you can also remove users from a thread. In order to remove, you will need to track the IDs of the participants you have added.


await chatThreadClient.removeParticipant({ communicationUserId: '<MEMBER_ID>' });

Subscribe to connection status of real time notifications

Subscription to events realTimeNotificationConnected and realTimeNotificationDisconnected allows you to know when the connection to the call server is active.


// subscribe to realTimeNotificationConnected event
chatClient.on('realTimeNotificationConnected', () => {
  console.log("Real time notification is now connected!");
  // your code here
});

// subscribe to realTimeNotificationDisconnected event
chatClient.on('realTimeNotificationDisconnected', () => {
  console.log("Real time notification is now disconnected!");
  // your code here
});

Troubleshooting

Next steps

In this quickstart you learned how to:

  • Create a chat client
  • Create a thread with 2 users
  • Send a message to the thread
  • Receive messages from a thread
  • Remove Users from a thread

Contributing

If you'd like to contribute to this library, please read the contributing guide to learn more about how to build and test the code.