@twilio/conversations 2.0.1-rc.7 → 2.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/builds/browser.js +249 -65
- package/builds/browser.js.map +1 -1
- package/builds/lib.d.ts +86 -9
- package/builds/lib.js +249 -65
- package/builds/lib.js.map +1 -1
- package/builds/twilio-conversations.js +254 -251
- package/builds/twilio-conversations.min.js +3 -3
- package/dist/conversation.js +24 -10
- package/dist/conversation.js.map +1 -1
- package/dist/data/conversations.js +1 -1
- package/dist/data/conversations.js.map +1 -1
- package/dist/data/messages.js +1 -1
- package/dist/data/messages.js.map +1 -1
- package/dist/data/participants.js +7 -3
- package/dist/data/participants.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/attributes.js +147 -0
- package/dist/interfaces/attributes.js.map +1 -0
- package/dist/message-builder.js +52 -0
- package/dist/message-builder.js.map +1 -1
- package/dist/message.js +35 -4
- package/dist/message.js.map +1 -1
- package/dist/packages/conversations/package.json.js +1 -1
- package/dist/participant.js +20 -3
- package/dist/participant.js.map +1 -1
- package/dist/user.js +2 -1
- package/dist/user.js.map +1 -1
- package/docs/assets/js/search.js +1 -1
- package/docs/classes/AggregatedDeliveryReceipt.html +15 -0
- package/docs/classes/Client.html +15 -0
- package/docs/classes/Conversation.html +24 -2
- package/docs/classes/DetailedDeliveryReceipt.html +15 -0
- package/docs/classes/Media.html +15 -0
- package/docs/classes/Message.html +83 -2
- package/docs/classes/MessageBuilder.html +91 -0
- package/docs/classes/Participant.html +45 -1
- package/docs/classes/PushNotification.html +15 -0
- package/docs/classes/RestPaginator.html +15 -0
- package/docs/classes/UnsentMessage.html +15 -0
- package/docs/classes/User.html +15 -0
- package/docs/index.html +37 -3
- package/docs/interfaces/ClientOptions.html +15 -0
- package/docs/interfaces/ConversationBindings.html +3118 -0
- package/docs/interfaces/ConversationEmailBinding.html +3118 -0
- package/docs/interfaces/ConversationState.html +15 -0
- package/docs/interfaces/CreateConversationOptions.html +15 -0
- package/docs/interfaces/LastMessage.html +15 -0
- package/docs/interfaces/Paginator.html +15 -0
- package/docs/interfaces/ParticipantBindings.html +3118 -0
- package/docs/interfaces/ParticipantEmailBinding.html +3118 -0
- package/docs/interfaces/PushNotificationData.html +15 -0
- package/docs/interfaces/SendEmailOptions.html +15 -0
- package/docs/interfaces/SendMediaOptions.html +15 -0
- package/docs/modules.html +37 -3
- package/package.json +9 -9
package/dist/conversation.js
CHANGED
@@ -137,6 +137,7 @@ var participant = require('./participant.js');
|
|
137
137
|
var messages = require('./data/messages.js');
|
138
138
|
var index = require('./util/index.js');
|
139
139
|
var declarativeTypeValidator = require('@twilio/declarative-type-validator');
|
140
|
+
var attributes = require('./interfaces/attributes.js');
|
140
141
|
var messageBuilder = require('./message-builder.js');
|
141
142
|
var replayEventEmitter = require('@twilio/replay-event-emitter');
|
142
143
|
var isEqual = require('lodash.isequal');
|
@@ -158,7 +159,8 @@ const fieldMappings = {
|
|
158
159
|
sid: 'sid',
|
159
160
|
status: 'status',
|
160
161
|
uniqueName: 'uniqueName',
|
161
|
-
state: 'state'
|
162
|
+
state: 'state',
|
163
|
+
bindings: 'bindings'
|
162
164
|
};
|
163
165
|
function parseTime(timeString) {
|
164
166
|
try {
|
@@ -176,6 +178,7 @@ class Conversation extends replayEventEmitter.ReplayEventEmitter {
|
|
176
178
|
* @internal
|
177
179
|
*/
|
178
180
|
constructor(descriptor, sid, links, configuration, services) {
|
181
|
+
var _a;
|
179
182
|
super();
|
180
183
|
this.sid = sid;
|
181
184
|
this.links = links;
|
@@ -203,7 +206,8 @@ class Conversation extends replayEventEmitter.ReplayEventEmitter {
|
|
203
206
|
dateCreated,
|
204
207
|
dateUpdated,
|
205
208
|
friendlyName,
|
206
|
-
lastReadMessageIndex
|
209
|
+
lastReadMessageIndex,
|
210
|
+
bindings: (_a = descriptor.bindings) !== null && _a !== void 0 ? _a : {},
|
207
211
|
};
|
208
212
|
if (descriptor.notificationLevel) {
|
209
213
|
this.channelState.notificationLevel = descriptor.notificationLevel;
|
@@ -261,6 +265,7 @@ class Conversation extends replayEventEmitter.ReplayEventEmitter {
|
|
261
265
|
* User notification level for this conversation.
|
262
266
|
*/
|
263
267
|
get notificationLevel() { return this.channelState.notificationLevel; }
|
268
|
+
get bindings() { return this.channelState.bindings; }
|
264
269
|
get limits() { return this.configuration.limits; }
|
265
270
|
/**
|
266
271
|
* State of the conversation.
|
@@ -477,6 +482,13 @@ class Conversation extends replayEventEmitter.ReplayEventEmitter {
|
|
477
482
|
this.channelState.state = state;
|
478
483
|
updateReasons.add(localKey);
|
479
484
|
break;
|
485
|
+
case fieldMappings.bindings:
|
486
|
+
if (isEqual__default['default'](this.channelState.bindings, update.bindings)) {
|
487
|
+
break;
|
488
|
+
}
|
489
|
+
this.channelState.bindings = update.bindings;
|
490
|
+
updateReasons.add(localKey);
|
491
|
+
break;
|
480
492
|
default:
|
481
493
|
const isDate = update[key] instanceof Date;
|
482
494
|
const keysMatchAsDates = isDate && ((_e = this.channelState[localKey]) === null || _e === void 0 ? void 0 : _e.getTime()) === update[key].getTime();
|
@@ -516,16 +528,17 @@ class Conversation extends replayEventEmitter.ReplayEventEmitter {
|
|
516
528
|
* @param attributes Attributes to be attached to the participant.
|
517
529
|
*/
|
518
530
|
async add(identity, attributes) {
|
519
|
-
return this.participantsEntity.add(identity, attributes);
|
531
|
+
return this.participantsEntity.add(identity, attributes !== null && attributes !== void 0 ? attributes : {});
|
520
532
|
}
|
521
533
|
/**
|
522
534
|
* Add a non-chat participant to the conversation.
|
523
535
|
* @param proxyAddress Proxy (Twilio) address of the participant.
|
524
536
|
* @param address User address of the participant.
|
525
537
|
* @param attributes Attributes to be attached to the participant.
|
538
|
+
* @param bindingOptions Options for adding email participants - name and CC/To level.
|
526
539
|
*/
|
527
|
-
async addNonChatParticipant(proxyAddress, address, attributes) {
|
528
|
-
return this.participantsEntity.addNonChatParticipant(proxyAddress, address, attributes);
|
540
|
+
async addNonChatParticipant(proxyAddress, address, attributes = {}, bindingOptions = {}) {
|
541
|
+
return this.participantsEntity.addNonChatParticipant(proxyAddress, address, attributes !== null && attributes !== void 0 ? attributes : {}, bindingOptions !== null && bindingOptions !== void 0 ? bindingOptions : {});
|
529
542
|
}
|
530
543
|
/**
|
531
544
|
* Advance the conversation's last read message index to the current read horizon.
|
@@ -698,6 +711,7 @@ class Conversation extends replayEventEmitter.ReplayEventEmitter {
|
|
698
711
|
/**
|
699
712
|
* New interface to prepare for sending a message.
|
700
713
|
* Use instead of `sendMessage`.
|
714
|
+
* @return A MessageBuilder to help set all message sending options.
|
701
715
|
*/
|
702
716
|
prepareMessage() {
|
703
717
|
return new messageBuilder.MessageBuilder(this.limits, this.messagesEntity);
|
@@ -871,15 +885,15 @@ Conversation.updated = 'updated';
|
|
871
885
|
*/
|
872
886
|
Conversation.removed = 'removed';
|
873
887
|
tslib_es6.__decorate([
|
874
|
-
declarativeTypeValidator.validateTypesAsync(declarativeTypeValidator.nonEmptyString,
|
888
|
+
declarativeTypeValidator.validateTypesAsync(declarativeTypeValidator.nonEmptyString, attributes.optionalAttributesValidator),
|
875
889
|
tslib_es6.__metadata("design:type", Function),
|
876
890
|
tslib_es6.__metadata("design:paramtypes", [String, Object]),
|
877
891
|
tslib_es6.__metadata("design:returntype", Promise)
|
878
892
|
], Conversation.prototype, "add", null);
|
879
893
|
tslib_es6.__decorate([
|
880
|
-
declarativeTypeValidator.validateTypesAsync(declarativeTypeValidator.nonEmptyString, declarativeTypeValidator.nonEmptyString,
|
894
|
+
declarativeTypeValidator.validateTypesAsync(declarativeTypeValidator.nonEmptyString, declarativeTypeValidator.nonEmptyString, attributes.optionalAttributesValidator),
|
881
895
|
tslib_es6.__metadata("design:type", Function),
|
882
|
-
tslib_es6.__metadata("design:paramtypes", [String, String, Object]),
|
896
|
+
tslib_es6.__metadata("design:paramtypes", [String, String, Object, Object]),
|
883
897
|
tslib_es6.__metadata("design:returntype", Promise)
|
884
898
|
], Conversation.prototype, "addNonChatParticipant", null);
|
885
899
|
tslib_es6.__decorate([
|
@@ -931,7 +945,7 @@ tslib_es6.__decorate([
|
|
931
945
|
];
|
932
946
|
})
|
933
947
|
})
|
934
|
-
],
|
948
|
+
], attributes.optionalAttributesValidator, ['undefined', declarativeTypeValidator.literal(null), declarativeTypeValidator.objectSchema('email attributes', {
|
935
949
|
subject: [declarativeTypeValidator.nonEmptyString, 'undefined']
|
936
950
|
})]),
|
937
951
|
tslib_es6.__metadata("design:type", Function),
|
@@ -945,7 +959,7 @@ tslib_es6.__decorate([
|
|
945
959
|
tslib_es6.__metadata("design:returntype", Promise)
|
946
960
|
], Conversation.prototype, "setUserNotificationLevel", null);
|
947
961
|
tslib_es6.__decorate([
|
948
|
-
declarativeTypeValidator.validateTypesAsync(
|
962
|
+
declarativeTypeValidator.validateTypesAsync(attributes.attributesValidator),
|
949
963
|
tslib_es6.__metadata("design:type", Function),
|
950
964
|
tslib_es6.__metadata("design:paramtypes", [Object]),
|
951
965
|
tslib_es6.__metadata("design:returntype", Promise)
|
package/dist/conversation.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"conversation.js","sources":["../src/conversation.ts"],"sourcesContent":["import { Logger } from './logger';\n\nimport { Participants } from './data/participants';\nimport {\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason\n} from './participant';\nimport { Messages } from './data/messages';\nimport { Message, MessageUpdatedEventArgs, MessageUpdateReason } from './message';\n\nimport { UriBuilder, parseToNumber } from './util';\nimport { Users } from './data/users';\nimport { Paginator } from './interfaces/paginator';\nimport { ConversationsDataSource } from './data/conversations';\nimport { McsClient } from '@twilio/mcs-client';\n\nimport { SyncClient } from 'twilio-sync';\nimport { TypingIndicator } from './services/typing-indicator';\nimport { Network } from './services/network';\nimport {\n validateTypesAsync, custom, literal, nonEmptyString, nonNegativeInteger, objectSchema\n} from '@twilio/declarative-type-validator';\nimport { Configuration } from './configuration';\nimport { CommandExecutor } from './command-executor';\nimport {\n AddParticipantRequest\n} from './interfaces/commands/add-participant';\nimport { EditConversationRequest } from './interfaces/commands/edit-conversation';\nimport { ConversationResponse } from './interfaces/commands/conversation-response';\nimport { ParticipantResponse } from './interfaces/commands/participant-response';\nimport { EditNotificationLevelRequest } from './interfaces/commands/edit-notification-level';\nimport {\n EditLastReadMessageIndexRequest,\n EditLastReadMessageIndexResponse\n} from './interfaces/commands/edit-last-read-message-index';\nimport { Limits } from './interfaces/limits';\nimport { MessageBuilder } from './message-builder';\nimport { ReplayEventEmitter } from '@twilio/replay-event-emitter';\nimport isEqual from 'lodash.isequal';\n\ntype ConversationEvents = {\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n updated: (data: {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n }) => void;\n removed: (conversation: Conversation) => void;\n};\n\nconst log = Logger.scope('Conversation');\n\nconst fieldMappings = {\n lastMessage: 'lastMessage',\n attributes: 'attributes',\n createdBy: 'createdBy',\n dateCreated: 'dateCreated',\n dateUpdated: 'dateUpdated',\n friendlyName: 'friendlyName',\n lastConsumedMessageIndex: 'lastConsumedMessageIndex',\n notificationLevel: 'notificationLevel',\n sid: 'sid',\n status: 'status',\n uniqueName: 'uniqueName',\n state: 'state'\n};\n\nfunction parseTime(timeString) {\n try {\n return new Date(timeString);\n } catch (e) {\n return null;\n }\n}\n\nexport interface ConversationServices {\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n}\n\ninterface ConversationInternalState {\n uniqueName: string;\n status: ConversationStatus;\n attributes: any;\n createdBy?: string;\n dateCreated: Date;\n dateUpdated: Date;\n friendlyName?: string;\n lastReadMessageIndex: number | null;\n lastMessage?: LastMessage;\n notificationLevel?: NotificationLevel;\n state?: ConversationState;\n}\n\ninterface ConversationDescriptor {\n channel: string;\n entityName: string;\n uniqueName: string;\n attributes: any;\n createdBy?: string;\n friendlyName?: string;\n lastConsumedMessageIndex: number;\n dateCreated: any;\n dateUpdated: any;\n notificationLevel?: NotificationLevel;\n}\n\ninterface ConversationLinks {\n self: string;\n messages: string;\n participants: string;\n}\n\n/**\n * The reason for the `updated` event being emitted by a conversation.\n */\ntype ConversationUpdateReason =\n | 'attributes'\n | 'createdBy'\n | 'dateCreated'\n | 'dateUpdated'\n | 'friendlyName'\n | 'lastReadMessageIndex'\n | 'state'\n | 'status'\n | 'uniqueName'\n | 'lastMessage'\n | 'notificationLevel';\n\n/**\n * The status of the conversation, relative to the client: whether\n * the conversation has been `joined` or the client is\n * `notParticipating` in the conversation.\n */\ntype ConversationStatus = 'notParticipating' | 'joined';\n\n/**\n * The user's notification level for the conversation. Determines\n * whether the currently logged-in user will receive pushes for events\n * in this conversation. Can be either `muted` or `default`, where\n * `default` defers to the global service push configuration.\n */\ntype NotificationLevel = 'default' | 'muted';\n\n/**\n * The state of the conversation.\n */\ninterface ConversationState {\n /**\n * The current state.\n */\n current: 'active' | 'inactive' | 'closed';\n\n /**\n * Date at which the latest conversation state update happened.\n */\n dateUpdated: Date;\n}\n\ninterface ConversationUpdatedEventArgs {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n}\n\n/**\n * Configuration for attaching a media file to a message.\n * These options can be passed to {@link Conversation.sendMessage} and\n * {@link MessageBuilder.addMedia}.\n */\ninterface SendMediaOptions {\n /**\n * Content type of media.\n */\n contentType: string;\n\n /**\n * Optional filename.\n */\n filename?: string;\n\n /**\n * Content to post.\n */\n media: string | Buffer | Blob;\n}\n\n/**\n * These options can be passed to {@link Conversation.sendMessage}.\n */\ninterface SendEmailOptions {\n /**\n * Message subject. Ignored for media messages.\n */\n subject?: string;\n}\n\n/**\n * Information about the last message of a conversation.\n */\ninterface LastMessage {\n /**\n * Message's index.\n */\n index?: number;\n\n /**\n * Message's creation date.\n */\n dateCreated?: Date;\n}\n\n/**\n * A conversation represents communication between multiple Conversations clients\n */\nclass Conversation extends ReplayEventEmitter<ConversationEvents> {\n /**\n * Unique system identifier of the conversation.\n */\n public readonly sid: string;\n public readonly links: ConversationLinks;\n\n private readonly configuration: Configuration;\n private readonly services: ConversationServices;\n private channelState: ConversationInternalState;\n private statusSource: ConversationsDataSource;\n\n private entityPromise: Promise<any>;\n private entityName: string;\n private entity: any;\n private messagesEntity: any;\n private participantsEntity: Participants;\n private readonly participants: any;\n\n /**\n * @internal\n */\n constructor(\n descriptor: ConversationDescriptor,\n sid: string,\n links: ConversationLinks,\n configuration: Configuration,\n services: ConversationServices\n ) {\n super();\n\n this.sid = sid;\n this.links = links;\n this.configuration = configuration;\n this.services = services;\n\n let attributes = descriptor.attributes || {};\n let createdBy = descriptor.createdBy;\n let dateCreated = parseTime(descriptor.dateCreated);\n let dateUpdated = parseTime(descriptor.dateUpdated);\n let friendlyName = descriptor.friendlyName || null;\n let lastReadMessageIndex =\n Number.isInteger(descriptor.lastConsumedMessageIndex) ? descriptor.lastConsumedMessageIndex : null;\n let uniqueName = descriptor.uniqueName || null;\n\n try {\n JSON.stringify(attributes);\n } catch (e) {\n throw new Error('Attributes must be a valid JSON object.');\n }\n\n this.entityName = descriptor.channel;\n this.channelState = {\n uniqueName,\n status: 'notParticipating',\n attributes,\n createdBy,\n dateCreated,\n dateUpdated,\n friendlyName,\n lastReadMessageIndex: lastReadMessageIndex\n };\n\n if (descriptor.notificationLevel) {\n this.channelState.notificationLevel = descriptor.notificationLevel;\n }\n\n const participantsLinks = {\n participants: this.links.participants\n };\n\n this.participants = new Map();\n this.participantsEntity = new Participants(\n this,\n this.participants,\n participantsLinks,\n this.configuration,\n this.services\n );\n this.participantsEntity.on('participantJoined', this.emit.bind(this, 'participantJoined'));\n this.participantsEntity.on('participantLeft', this.emit.bind(this, 'participantLeft'));\n this.participantsEntity.on('participantUpdated',\n (args: ParticipantUpdatedEventArgs) => this.emit('participantUpdated', args));\n\n this.messagesEntity = new Messages(this, configuration, services);\n this.messagesEntity.on('messageAdded', message => this._onMessageAdded(message));\n this.messagesEntity.on('messageUpdated',\n (args: MessageUpdatedEventArgs) => this.emit('messageUpdated', args));\n this.messagesEntity.on('messageRemoved', this.emit.bind(this, 'messageRemoved'));\n }\n\n /**\n * Fired when a participant has joined the conversation.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - participant that joined the conversation\n * @event\n */\n static readonly participantJoined = 'participantJoined';\n\n /**\n * Fired when a participant has left the conversation.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - participant that left the conversation\n * @event\n */\n static readonly participantLeft = 'participantLeft';\n\n /**\n * Fired when data of a participant has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Participant} `participant` - participant that has received the update\n * * {@link ParticipantUpdateReason}[] `updateReasons` - array of reasons for update\n * @event\n */\n static readonly participantUpdated = 'participantUpdated';\n\n /**\n * Fired when a new message has been added to the conversation.\n *\n * Parameters:\n * 1. {@link Message} `message` - message that has been added\n * @event\n */\n static readonly messageAdded = 'messageAdded';\n\n /**\n * Fired when message is removed from the conversation's message list.\n *\n * Parameters:\n * 1. {@link Message} `message` - message that has been removed\n * @event\n */\n static readonly messageRemoved = 'messageRemoved';\n\n /**\n * Fired when data of a message has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Message} `message` - message that has received the update\n * * {@link MessageUpdateReason}[] `updateReasons` - array of reasons for update\n * @event\n */\n static readonly messageUpdated = 'messageUpdated';\n\n /**\n * Fired when a participant has stopped typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant that has stopped typing\n * @event\n */\n static readonly typingEnded = 'typingEnded';\n\n /**\n * Fired when a participant has started typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant that has started typing\n * @event\n */\n static readonly typingStarted = 'typingStarted';\n\n /**\n * Fired when the data of the conversation has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Conversation} `conversation` - conversation that has received the update\n * * {@link ConversationUpdateReason}[] `updateReasons` - array of reasons for update\n * @event\n */\n static readonly updated = 'updated';\n\n /**\n * Fired when the conversation was destroyed or the currently-logged-in user has left private conversation.\n *\n * Parameters:\n * 1. {@link Conversation} `conversation` - conversation that has been removed\n * @event\n */\n static readonly removed = 'removed';\n\n /**\n * Unique name of the conversation.\n */\n public get uniqueName(): string { return this.channelState.uniqueName; }\n\n /**\n * Status of the conversation.\n */\n public get status(): ConversationStatus { return this.channelState.status; }\n\n /**\n * Name of the conversation.\n */\n public get friendlyName(): string { return this.channelState.friendlyName; }\n\n /**\n * Date this conversation was last updated on.\n */\n public get dateUpdated(): any { return this.channelState.dateUpdated; }\n\n /**\n * Date this conversation was created on.\n */\n public get dateCreated(): any { return this.channelState.dateCreated; }\n\n /**\n * Identity of the user that created this conversation.\n */\n public get createdBy(): string { return this.channelState.createdBy; }\n\n /**\n * Custom attributes of the conversation.\n */\n public get attributes(): any { return this.channelState.attributes; }\n\n /**\n * Index of the last message the user has read in this conversation.\n */\n public get lastReadMessageIndex(): number | null { return this.channelState.lastReadMessageIndex; }\n\n /**\n * Last message sent to this conversation.\n */\n public get lastMessage(): LastMessage { return this.channelState.lastMessage; }\n\n /**\n * User notification level for this conversation.\n */\n public get notificationLevel(): NotificationLevel { return this.channelState.notificationLevel; }\n\n public get limits(): Limits { return this.configuration.limits; }\n\n /**\n * State of the conversation.\n */\n public get state(): ConversationState | undefined { return this.channelState.state; }\n\n /**\n * Load and subscribe to this conversation and do not subscribe to its participants and messages.\n * This or _subscribeStreams will need to be called before any events on conversation will fire.\n * @internal\n */\n _subscribe() {\n return this.entityPromise = this.entityPromise ??\n this.services.syncClient.document({ id: this.entityName, mode: 'open_existing' })\n .then(entity => {\n this.entity = entity;\n this.entity.on('updated', args => { this._update(args.data); });\n this.entity.on('removed', () => this.emit('removed', this));\n this._update(this.entity.data);\n return entity;\n })\n .catch(err => {\n this.entity = null;\n this.entityPromise = null;\n if (this.services.syncClient.connectionState != 'disconnected') {\n log.error('Failed to get conversation object', err);\n }\n log.debug('ERROR: Failed to get conversation object', err);\n throw err;\n });\n }\n\n /**\n * Load the attributes of this conversation and instantiate its participants and messages.\n * This or _subscribe will need to be called before any events on the conversation will fire.\n * This will need to be called before any events on participants or messages will fire\n * @internal\n */\n async _subscribeStreams() {\n try {\n await this._subscribe();\n log.trace('_subscribeStreams, this.entity.data=', this.entity.data);\n const messagesObjectName = this.entity.data.messages;\n const rosterObjectName = this.entity.data.roster;\n await Promise.all([\n this.messagesEntity.subscribe(messagesObjectName),\n this.participantsEntity.subscribe(rosterObjectName)\n ]);\n } catch (err) {\n if (this.services.syncClient.connectionState !== 'disconnected') {\n log.error('Failed to subscribe on conversation objects', this.sid, err);\n }\n log.debug('ERROR: Failed to subscribe on conversation objects', this.sid, err);\n throw err;\n }\n }\n\n /**\n * Stop listening for and firing events on this conversation.\n * @internal\n */\n async _unsubscribe() {\n if (this.entity) {\n await this.entity.close();\n this.entity = null;\n this.entityPromise = null;\n }\n\n return Promise.all([\n this.participantsEntity.unsubscribe(),\n this.messagesEntity.unsubscribe()\n ]);\n }\n\n /**\n * Set conversation status.\n * @internal\n */\n _setStatus(status: ConversationStatus, source: ConversationsDataSource) {\n this.statusSource = source;\n\n if (this.channelState.status === status) { return; }\n\n this.channelState.status = status;\n\n if (status === 'joined') {\n this._subscribeStreams()\n .catch(err => {\n log.debug('ERROR while setting conversation status ' + status, err);\n if (this.services.syncClient.connectionState !== 'disconnected') {\n throw err;\n }\n });\n } else if (this.entityPromise) {\n this._unsubscribe().catch(err => {\n log.debug('ERROR while setting conversation status ' + status, err);\n if (this.services.syncClient.connectionState !== 'disconnected') {\n throw err;\n }\n });\n }\n }\n\n /**\n * Get the source of the conversation update.\n * @internal\n */\n _statusSource(): ConversationsDataSource {\n return this.statusSource;\n }\n\n private static preprocessUpdate(update, conversationSid) {\n try {\n if (typeof update.attributes === 'string') {\n update.attributes = JSON.parse(update.attributes);\n } else if (update.attributes) {\n JSON.stringify(update.attributes);\n }\n } catch (e) {\n log.warn('Retrieved malformed attributes from the server for conversation: ' + conversationSid);\n update.attributes = {};\n }\n\n try {\n if (update.dateCreated) {\n update.dateCreated = new Date(update.dateCreated);\n }\n } catch (e) {\n log.warn('Retrieved malformed dateCreated from the server for conversation: ' + conversationSid);\n delete update.dateCreated;\n }\n\n try {\n if (update.dateUpdated) {\n update.dateUpdated = new Date(update.dateUpdated);\n }\n } catch (e) {\n log.warn('Retrieved malformed dateUpdated from the server for conversation: ' + conversationSid);\n delete update.dateUpdated;\n }\n\n try {\n if (update.lastMessage && update.lastMessage.timestamp) {\n update.lastMessage.timestamp = new Date(update.lastMessage.timestamp);\n }\n } catch (e) {\n log.warn('Retrieved malformed lastMessage.timestamp from the server for conversation: ' + conversationSid);\n delete update.lastMessage.timestamp;\n }\n }\n\n /**\n * Update the local conversation object with new values.\n * @internal\n */\n _update(update) {\n log.trace('_update', update);\n\n Conversation.preprocessUpdate(update, this.sid);\n const updateReasons = new Set<ConversationUpdateReason>();\n\n for (const key of Object.keys(update)) {\n const localKey = fieldMappings[key];\n\n if (!localKey) {\n continue;\n }\n\n switch (localKey) {\n case fieldMappings.status:\n if (!update.status || update.status === 'unknown'\n || this.channelState.status === update.status) {\n break;\n }\n\n this.channelState.status = update.status;\n updateReasons.add(localKey);\n\n break;\n case fieldMappings.attributes:\n if (isEqual(this.channelState.attributes, update.attributes)) {\n break;\n }\n\n this.channelState.attributes = update.attributes;\n updateReasons.add(localKey);\n\n break;\n case fieldMappings.lastConsumedMessageIndex:\n if (update.lastConsumedMessageIndex === undefined\n || update.lastConsumedMessageIndex === this.channelState.lastReadMessageIndex) {\n break;\n }\n\n this.channelState.lastReadMessageIndex = update.lastConsumedMessageIndex;\n updateReasons.add('lastReadMessageIndex');\n\n break;\n case fieldMappings.lastMessage:\n if (this.channelState.lastMessage && !update.lastMessage) {\n delete this.channelState.lastMessage;\n updateReasons.add(localKey);\n\n break;\n }\n\n this.channelState.lastMessage = this.channelState.lastMessage || {};\n\n if (update.lastMessage?.index !== undefined\n && update.lastMessage.index !== this.channelState.lastMessage.index) {\n this.channelState.lastMessage.index = update.lastMessage.index;\n updateReasons.add(localKey);\n }\n\n if (update.lastMessage?.timestamp !== undefined\n && this.channelState.lastMessage?.dateCreated?.getTime() !== update.lastMessage.timestamp.getTime()) {\n this.channelState.lastMessage.dateCreated = update.lastMessage.timestamp;\n updateReasons.add(localKey);\n }\n\n if (isEqual(this.channelState.lastMessage, {})) {\n delete this.channelState.lastMessage;\n }\n\n break;\n case fieldMappings.state:\n const state = update.state || undefined;\n\n if (state !== undefined) {\n state.dateUpdated = new Date(state.dateUpdated);\n }\n\n if (isEqual(this.channelState.state, state)) {\n break;\n }\n\n this.channelState.state = state;\n updateReasons.add(localKey);\n\n break;\n default:\n const isDate = update[key] instanceof Date;\n const keysMatchAsDates = isDate && this.channelState[localKey]?.getTime() === update[key].getTime();\n const keysMatchAsNonDates = !isDate && this[localKey] === update[key];\n\n if (keysMatchAsDates || keysMatchAsNonDates) {\n break;\n }\n\n this.channelState[localKey] = update[key];\n updateReasons.add(localKey);\n }\n }\n\n if (updateReasons.size > 0) {\n this.emit('updated', { conversation: this, updateReasons: [...updateReasons] });\n }\n }\n\n /**\n * @internal\n */\n private _onMessageAdded(message) {\n for (let participant of this.participants.values()) {\n if (participant.identity === message.author) {\n participant._endTyping();\n break;\n }\n }\n this.emit('messageAdded', message);\n }\n\n private async _setLastReadMessageIndex(index: number | null): Promise<number> {\n const result = await this.services.commandExecutor.mutateResource<\n EditLastReadMessageIndexRequest,\n EditLastReadMessageIndexResponse\n >(\n 'post',\n `${this.configuration.links.myConversations}/${this.sid}`,\n {\n last_read_message_index: index\n }\n );\n\n return result.unread_messages_count;\n }\n\n /**\n * Add a participant to the conversation by its identity.\n * @param identity Identity of the Client to add.\n * @param attributes Attributes to be attached to the participant.\n */\n @validateTypesAsync(\n nonEmptyString,\n ['undefined', 'string', 'number', 'boolean', 'object', literal(null)]\n )\n async add(identity: string, attributes?: any): Promise<void> {\n return this.participantsEntity.add(identity, attributes);\n }\n\n /**\n * Add a non-chat participant to the conversation.\n * @param proxyAddress Proxy (Twilio) address of the participant.\n * @param address User address of the participant.\n * @param attributes Attributes to be attached to the participant.\n */\n @validateTypesAsync(\n nonEmptyString,\n nonEmptyString,\n ['undefined', 'string', 'number', 'boolean', 'object', literal(null)]\n )\n async addNonChatParticipant(proxyAddress: string, address: string, attributes?: any): Promise<void> {\n return this.participantsEntity.addNonChatParticipant(proxyAddress, address, attributes);\n }\n\n /**\n * Advance the conversation's last read message index to the current read horizon.\n * Rejects if the user is not a participant of the conversation.\n * Last read message index is updated only if the new index value is higher than the previous.\n * @param index Message index to advance to.\n * @return Resulting unread messages count in the conversation.\n */\n @validateTypesAsync(nonNegativeInteger)\n async advanceLastReadMessageIndex(index: number): Promise<number> {\n await this._subscribeStreams();\n\n if (index < this.lastReadMessageIndex) {\n return await this._setLastReadMessageIndex(this.lastReadMessageIndex);\n }\n\n return await this._setLastReadMessageIndex(index);\n }\n\n /**\n * Delete the conversation and unsubscribe from its events.\n */\n async delete(): Promise<Conversation> {\n await this.services.commandExecutor.mutateResource(\n 'delete',\n this.links.self,\n );\n\n return this;\n }\n\n /**\n * Get the custom attributes of this Conversation.\n */\n async getAttributes(): Promise<any> {\n await this._subscribe();\n return this.attributes;\n }\n\n /**\n * Returns messages from the conversation using the paginator interface.\n * @param pageSize Number of messages to return in a single chunk. Default is 30.\n * @param anchor Index of the newest message to fetch. Default is from the end.\n * @param direction Query direction. By default it queries backwards\n * from newer to older. The `\"forward\"` value will query in the opposite direction.\n * @return A page of messages.\n */\n @validateTypesAsync(\n ['undefined', nonNegativeInteger],\n ['undefined', nonNegativeInteger],\n ['undefined', literal('backwards', 'forward')]\n )\n async getMessages(pageSize?: number, anchor?: number, direction?: 'backwards' | 'forward'): Promise<Paginator<Message>> {\n await this._subscribeStreams();\n return this.messagesEntity.getMessages(pageSize, anchor, direction);\n }\n\n /**\n * Get a list of all the participants who are joined to this conversation.\n */\n async getParticipants(): Promise<Participant[]> {\n await this._subscribeStreams();\n return this.participantsEntity.getParticipants();\n }\n\n /**\n * Get conversation participants count.\n *\n * This method is semi-realtime. This means that this data will be eventually correct,\n * but will also be possibly incorrect for a few seconds. The Conversations system does not\n * provide real time events for counter values changes.\n *\n * This is useful for any UI badges, but it is not recommended to build any core application\n * logic based on these counters being accurate in real time.\n */\n async getParticipantsCount(): Promise<number> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(this.sid)\n .build();\n const response = await this.services.network.get(url);\n\n return response.body.participants_count;\n }\n\n /**\n * Get a participant by its SID.\n * @param participantSid Participant SID.\n */\n @validateTypesAsync(nonEmptyString)\n async getParticipantBySid(participantSid: string): Promise<Participant> {\n return this.participantsEntity.getParticipantBySid(participantSid);\n }\n\n /**\n * Get a participant by its identity.\n * @param identity Participant identity.\n */\n @validateTypesAsync(nonEmptyString)\n async getParticipantByIdentity(identity: string): Promise<Participant> {\n return this.participantsEntity.getParticipantByIdentity(identity);\n }\n\n /**\n * Get the total message count in the conversation.\n *\n * This method is semi-realtime. This means that this data will be eventually correct,\n * but will also be possibly incorrect for a few seconds. The Conversations system does not\n * provide real time events for counter values changes.\n *\n * This is useful for any UI badges, but it is not recommended to build any core application\n * logic based on these counters being accurate in real time.\n */\n async getMessagesCount(): Promise<number> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(this.sid)\n .build();\n const response = await this.services.network.get(url);\n\n return response.body.messages_count;\n }\n\n /**\n * Get unread messages count for the user if they are a participant of this conversation.\n * Rejects if the user is not a participant of the conversation.\n *\n * Use this method to obtain the number of unread messages together with\n * {@link Conversation.updateLastReadMessageIndex} instead of relying on the\n * message indices which may have gaps. See {@link Message.index} for details.\n *\n * This method is semi-realtime. This means that this data will be eventually correct,\n * but will also be possibly incorrect for a few seconds. The Conversations system does not\n * provide real time events for counter values changes.\n *\n * This is useful for any UI badges, but it is not recommended to build any core application\n * logic based on these counters being accurate in real time.\n */\n async getUnreadMessagesCount(): Promise<number | null> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(this.sid)\n .build();\n const response = await this.services.network.get(url);\n\n if (response.body.conversation_sid !== this.sid) {\n throw new Error(\n 'Conversation was not found in the user conversations list'\n );\n }\n\n const unreadMessageCount = response.body.unread_messages_count;\n\n if (typeof unreadMessageCount === 'number') {\n return unreadMessageCount;\n }\n\n return null;\n }\n\n /**\n * Join the conversation and subscribe to its events.\n */\n async join(): Promise<Conversation> {\n await this.services.commandExecutor.mutateResource<AddParticipantRequest, ParticipantResponse>(\n 'post',\n this.links.participants,\n {\n identity: this.configuration.userIdentity\n }\n );\n\n return this;\n }\n\n /**\n * Leave the conversation.\n */\n async leave(): Promise<Conversation> {\n if (this.channelState.status === 'joined') {\n await this.services.commandExecutor.mutateResource(\n 'delete',\n `${this.links.participants}/${this.configuration.userIdentity}`\n );\n }\n\n return this;\n }\n\n /**\n * Remove a participant from the conversation. When a string is passed as the\n * argument, it will assume that the string is an identity or SID.\n * @param participant Identity, SID or the participant object to remove.\n */\n @validateTypesAsync([nonEmptyString, Participant])\n async removeParticipant(participant: string | Participant): Promise<void> {\n await this.participantsEntity.remove(\n typeof participant === 'string'\n ? participant\n : participant.sid\n );\n }\n\n /**\n * Send a message to the conversation.\n * @param message Message body for the text message,\n * `FormData` or {@link SendMediaOptions} for media content. Sending FormData is supported only with the browser engine.\n * @param messageAttributes Attributes for the message.\n * @param emailOptions Email options for the message.\n * @return Index of the new message.\n */\n @validateTypesAsync(\n [\n 'string',\n literal(null),\n // Wrapping it into a custom rule is necessary because the FormData class is not available on initialization.\n custom((value) => [value instanceof FormData, 'an instance of FormData']),\n objectSchema('media options', {\n contentType: nonEmptyString,\n media: custom((value) => {\n let isValid = (typeof value === 'string' && value.length > 0) || value instanceof Uint8Array || value instanceof ArrayBuffer;\n\n if (typeof Blob === 'function') {\n isValid = isValid || value instanceof Blob;\n }\n\n return [\n isValid,\n 'a non-empty string, an instance of Buffer or an instance of Blob'\n ];\n })\n })\n ],\n ['undefined', 'string', 'number', 'boolean', 'object', literal(null)],\n ['undefined', literal(null), objectSchema('email attributes', {\n subject: [nonEmptyString, 'undefined']\n })]\n )\n async sendMessage(message: string | FormData | SendMediaOptions | null, messageAttributes?: any,\n emailOptions?: SendEmailOptions): Promise<number> {\n if (typeof message === 'string' || message === null) {\n let response = await this.messagesEntity.send(message, messageAttributes, emailOptions);\n return parseToNumber(response.index);\n }\n\n let response = await this.messagesEntity.sendMedia(message, messageAttributes, emailOptions);\n return parseToNumber(response.index);\n }\n\n /**\n * New interface to prepare for sending a message.\n * Use instead of `sendMessage`.\n */\n public prepareMessage(): MessageBuilder {\n return new MessageBuilder(this.limits, this.messagesEntity);\n }\n\n /**\n * Set last read message index of the conversation to the index of the last known message.\n * @return Resulting unread messages count in the conversation.\n */\n public async setAllMessagesRead(): Promise<number> {\n await this._subscribeStreams();\n\n let messagesPage = await this.getMessages(1);\n\n if (messagesPage.items.length > 0) {\n return this.advanceLastReadMessageIndex(messagesPage.items[0].index);\n }\n\n return Promise.resolve(0);\n }\n\n /**\n * Set all messages in the conversation unread.\n * @return Resulting unread messages count in the conversation.\n */\n public async setAllMessagesUnread(): Promise<number> {\n await this._subscribeStreams();\n return await this._setLastReadMessageIndex(null);\n }\n\n /**\n * Set user notification level for this conversation.\n * @param notificationLevel New user notification level.\n */\n @validateTypesAsync(literal('default', 'muted'))\n async setUserNotificationLevel(notificationLevel: NotificationLevel): Promise<void> {\n await this.services.commandExecutor.mutateResource<EditNotificationLevelRequest>(\n 'post',\n `${this.configuration.links.myConversations}/${this.sid}`,\n {\n notification_level: notificationLevel\n }\n );\n }\n\n /**\n * Send a notification to the server indicating that this client is currently typing in this conversation.\n * Typing ended notification is sent after a while automatically, but by calling this method again you ensure that typing ended is not received.\n */\n typing(): Promise<void> {\n return this.services.typingIndicator.send(this.sid);\n }\n\n /**\n * Update the attributes of the conversation.\n * @param attributes New attributes.\n */\n @validateTypesAsync(['string', 'number', 'boolean', 'object', literal(null)])\n async updateAttributes(attributes: any): Promise<Conversation> {\n await this.services.commandExecutor.mutateResource<EditConversationRequest, ConversationResponse>(\n 'post',\n this.links.self,\n {\n attributes: attributes !== undefined ? JSON.stringify(attributes) : undefined\n }\n );\n\n return this;\n }\n\n /**\n * Update the friendly name of the conversation.\n * @param friendlyName New friendly name.\n */\n @validateTypesAsync(['string'])\n async updateFriendlyName(friendlyName: string): Promise<Conversation> {\n if (this.channelState.friendlyName !== friendlyName) {\n await this.services.commandExecutor.mutateResource<EditConversationRequest, ConversationResponse>(\n 'post',\n this.links.self,\n { friendly_name: friendlyName }\n );\n }\n\n return this;\n }\n\n /**\n * Set the last read message index to the current read horizon.\n * @param index Message index to set as last read.\n * If null is provided, then the behavior is identical to {@link Conversation.setAllMessagesUnread}.\n * @returns Resulting unread messages count in the conversation.\n */\n @validateTypesAsync([literal(null), nonNegativeInteger])\n async updateLastReadMessageIndex(index: number | null): Promise<number> {\n await this._subscribeStreams();\n return this._setLastReadMessageIndex(index);\n }\n\n /**\n * Update the unique name of the conversation.\n * @param uniqueName New unique name for the conversation. Setting unique name to null removes it.\n */\n @validateTypesAsync(['string', literal(null)])\n async updateUniqueName(uniqueName: string | null): Promise<Conversation> {\n if (this.channelState.uniqueName !== uniqueName) {\n if (!uniqueName) {\n uniqueName = '';\n }\n\n await this.services.commandExecutor.mutateResource<EditConversationRequest, ConversationResponse>(\n 'post',\n this.links.self,\n {\n unique_name: uniqueName\n }\n );\n }\n\n return this;\n }\n}\n\nexport {\n ConversationDescriptor,\n Conversation,\n ConversationUpdateReason,\n ConversationStatus,\n NotificationLevel,\n ConversationState,\n ConversationUpdatedEventArgs,\n SendMediaOptions,\n SendEmailOptions,\n LastMessage\n};\n"],"names":["Logger","ReplayEventEmitter","Participants","Messages","isEqual","UriBuilder","parseToNumber","MessageBuilder","__decorate","validateTypesAsync","nonEmptyString","literal","nonNegativeInteger","Participant","custom","objectSchema"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"conversation.js","sources":["../src/conversation.ts"],"sourcesContent":["import { Logger } from './logger';\n\nimport { ParticipantBindingOptions, Participants } from './data/participants';\nimport {\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason\n} from './participant';\nimport { Messages } from './data/messages';\nimport { Message, MessageUpdatedEventArgs, MessageUpdateReason } from './message';\n\nimport { UriBuilder, parseToNumber } from './util';\nimport { Users } from './data/users';\nimport { Paginator } from './interfaces/paginator';\nimport { ConversationsDataSource } from './data/conversations';\nimport { McsClient } from '@twilio/mcs-client';\n\nimport { SyncClient } from 'twilio-sync';\nimport { TypingIndicator } from './services/typing-indicator';\nimport { Network } from './services/network';\nimport {\n validateTypesAsync, custom, literal, nonEmptyString, nonNegativeInteger, objectSchema\n} from '@twilio/declarative-type-validator';\nimport { attributesValidator, optionalAttributesValidator } from './interfaces/attributes';\nimport { Configuration } from './configuration';\nimport { CommandExecutor } from './command-executor';\nimport {\n AddParticipantRequest\n} from './interfaces/commands/add-participant';\nimport { EditConversationRequest } from './interfaces/commands/edit-conversation';\nimport { ConversationResponse } from './interfaces/commands/conversation-response';\nimport { ParticipantResponse } from './interfaces/commands/participant-response';\nimport { EditNotificationLevelRequest } from './interfaces/commands/edit-notification-level';\nimport {\n EditLastReadMessageIndexRequest,\n EditLastReadMessageIndexResponse\n} from './interfaces/commands/edit-last-read-message-index';\nimport { Limits } from './interfaces/limits';\nimport { MessageBuilder } from './message-builder';\nimport { ReplayEventEmitter } from '@twilio/replay-event-emitter';\nimport isEqual from 'lodash.isequal';\n\ntype ConversationEvents = {\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n updated: (data: {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n }) => void;\n removed: (conversation: Conversation) => void;\n};\n\nconst log = Logger.scope('Conversation');\n\nconst fieldMappings = {\n lastMessage: 'lastMessage',\n attributes: 'attributes',\n createdBy: 'createdBy',\n dateCreated: 'dateCreated',\n dateUpdated: 'dateUpdated',\n friendlyName: 'friendlyName',\n lastConsumedMessageIndex: 'lastConsumedMessageIndex',\n notificationLevel: 'notificationLevel',\n sid: 'sid',\n status: 'status',\n uniqueName: 'uniqueName',\n state: 'state',\n bindings: 'bindings'\n};\n\nfunction parseTime(timeString) {\n try {\n return new Date(timeString);\n } catch (e) {\n return null;\n }\n}\n\nexport interface ConversationServices {\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n}\n\ninterface ConversationInternalState {\n uniqueName: string;\n status: ConversationStatus;\n attributes: any;\n createdBy?: string;\n dateCreated: Date;\n dateUpdated: Date;\n friendlyName?: string;\n lastReadMessageIndex: number | null;\n lastMessage?: LastMessage;\n notificationLevel?: NotificationLevel;\n state?: ConversationState;\n bindings: ConversationBindings;\n}\n\ninterface ConversationDescriptor {\n channel: string;\n entityName: string;\n uniqueName: string;\n attributes: any;\n createdBy?: string;\n friendlyName?: string;\n lastConsumedMessageIndex: number;\n dateCreated: any;\n dateUpdated: any;\n notificationLevel?: NotificationLevel;\n bindings?: ConversationBindings;\n}\n\ninterface ConversationLinks {\n self: string;\n messages: string;\n participants: string;\n}\n\n/**\n * The reason for the `updated` event being emitted by a conversation.\n */\ntype ConversationUpdateReason =\n | 'attributes'\n | 'createdBy'\n | 'dateCreated'\n | 'dateUpdated'\n | 'friendlyName'\n | 'lastReadMessageIndex'\n | 'state'\n | 'status'\n | 'uniqueName'\n | 'lastMessage'\n | 'notificationLevel'\n | 'bindings';\n\n/**\n * The status of the conversation, relative to the client: whether\n * the conversation has been `joined` or the client is\n * `notParticipating` in the conversation.\n */\ntype ConversationStatus = 'notParticipating' | 'joined';\n\n/**\n * The user's notification level for the conversation. Determines\n * whether the currently logged-in user will receive pushes for events\n * in this conversation. Can be either `muted` or `default`, where\n * `default` defers to the global service push configuration.\n */\ntype NotificationLevel = 'default' | 'muted';\n\n/**\n * The state of the conversation.\n */\ninterface ConversationState {\n /**\n * The current state.\n */\n current: 'active' | 'inactive' | 'closed';\n\n /**\n * Date at which the latest conversation state update happened.\n */\n dateUpdated: Date;\n}\n\ninterface ConversationUpdatedEventArgs {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n}\n\n/**\n * Binding for email conversation.\n */\ninterface ConversationBindings {\n email?: ConversationEmailBinding;\n}\n\n/**\n * Binding for email conversation.\n */\ninterface ConversationEmailBinding {\n name?: string;\n projected_address: string;\n}\n\n/**\n * Configuration for attaching a media file to a message.\n * These options can be passed to {@link Conversation.sendMessage} and\n * {@link MessageBuilder.addMedia}.\n */\ninterface SendMediaOptions {\n /**\n * Content type of media.\n */\n contentType: string;\n\n /**\n * Optional filename.\n */\n filename?: string;\n\n /**\n * Content to post.\n */\n media: string | Buffer | Blob;\n}\n\n/**\n * These options can be passed to {@link Conversation.sendMessage}.\n */\ninterface SendEmailOptions {\n /**\n * Message subject. Ignored for media messages.\n */\n subject?: string;\n}\n\n/**\n * Information about the last message of a conversation.\n */\ninterface LastMessage {\n /**\n * Message's index.\n */\n index?: number;\n\n /**\n * Message's creation date.\n */\n dateCreated?: Date;\n}\n\n/**\n * A conversation represents communication between multiple Conversations clients\n */\nclass Conversation extends ReplayEventEmitter<ConversationEvents> {\n /**\n * Unique system identifier of the conversation.\n */\n public readonly sid: string;\n public readonly links: ConversationLinks;\n\n private readonly configuration: Configuration;\n private readonly services: ConversationServices;\n private channelState: ConversationInternalState;\n private statusSource: ConversationsDataSource;\n\n private entityPromise: Promise<any>;\n private entityName: string;\n private entity: any;\n private messagesEntity: any;\n private participantsEntity: Participants;\n private readonly participants: any;\n\n /**\n * @internal\n */\n constructor(\n descriptor: ConversationDescriptor,\n sid: string,\n links: ConversationLinks,\n configuration: Configuration,\n services: ConversationServices\n ) {\n super();\n\n this.sid = sid;\n this.links = links;\n this.configuration = configuration;\n this.services = services;\n\n let attributes = descriptor.attributes || {};\n let createdBy = descriptor.createdBy;\n let dateCreated = parseTime(descriptor.dateCreated);\n let dateUpdated = parseTime(descriptor.dateUpdated);\n let friendlyName = descriptor.friendlyName || null;\n let lastReadMessageIndex =\n Number.isInteger(descriptor.lastConsumedMessageIndex) ? descriptor.lastConsumedMessageIndex : null;\n let uniqueName = descriptor.uniqueName || null;\n\n try {\n JSON.stringify(attributes);\n } catch (e) {\n throw new Error('Attributes must be a valid JSON object.');\n }\n\n this.entityName = descriptor.channel;\n this.channelState = {\n uniqueName,\n status: 'notParticipating',\n attributes,\n createdBy,\n dateCreated,\n dateUpdated,\n friendlyName,\n lastReadMessageIndex,\n bindings: descriptor.bindings ?? {},\n };\n\n if (descriptor.notificationLevel) {\n this.channelState.notificationLevel = descriptor.notificationLevel;\n }\n\n const participantsLinks = {\n participants: this.links.participants\n };\n\n this.participants = new Map();\n this.participantsEntity = new Participants(\n this,\n this.participants,\n participantsLinks,\n this.configuration,\n this.services\n );\n this.participantsEntity.on('participantJoined', this.emit.bind(this, 'participantJoined'));\n this.participantsEntity.on('participantLeft', this.emit.bind(this, 'participantLeft'));\n this.participantsEntity.on('participantUpdated',\n (args: ParticipantUpdatedEventArgs) => this.emit('participantUpdated', args));\n\n this.messagesEntity = new Messages(this, configuration, services);\n this.messagesEntity.on('messageAdded', message => this._onMessageAdded(message));\n this.messagesEntity.on('messageUpdated',\n (args: MessageUpdatedEventArgs) => this.emit('messageUpdated', args));\n this.messagesEntity.on('messageRemoved', this.emit.bind(this, 'messageRemoved'));\n }\n\n /**\n * Fired when a participant has joined the conversation.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - participant that joined the conversation\n * @event\n */\n static readonly participantJoined = 'participantJoined';\n\n /**\n * Fired when a participant has left the conversation.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - participant that left the conversation\n * @event\n */\n static readonly participantLeft = 'participantLeft';\n\n /**\n * Fired when data of a participant has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Participant} `participant` - participant that has received the update\n * * {@link ParticipantUpdateReason}[] `updateReasons` - array of reasons for update\n * @event\n */\n static readonly participantUpdated = 'participantUpdated';\n\n /**\n * Fired when a new message has been added to the conversation.\n *\n * Parameters:\n * 1. {@link Message} `message` - message that has been added\n * @event\n */\n static readonly messageAdded = 'messageAdded';\n\n /**\n * Fired when message is removed from the conversation's message list.\n *\n * Parameters:\n * 1. {@link Message} `message` - message that has been removed\n * @event\n */\n static readonly messageRemoved = 'messageRemoved';\n\n /**\n * Fired when data of a message has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Message} `message` - message that has received the update\n * * {@link MessageUpdateReason}[] `updateReasons` - array of reasons for update\n * @event\n */\n static readonly messageUpdated = 'messageUpdated';\n\n /**\n * Fired when a participant has stopped typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant that has stopped typing\n * @event\n */\n static readonly typingEnded = 'typingEnded';\n\n /**\n * Fired when a participant has started typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant that has started typing\n * @event\n */\n static readonly typingStarted = 'typingStarted';\n\n /**\n * Fired when the data of the conversation has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Conversation} `conversation` - conversation that has received the update\n * * {@link ConversationUpdateReason}[] `updateReasons` - array of reasons for update\n * @event\n */\n static readonly updated = 'updated';\n\n /**\n * Fired when the conversation was destroyed or the currently-logged-in user has left private conversation.\n *\n * Parameters:\n * 1. {@link Conversation} `conversation` - conversation that has been removed\n * @event\n */\n static readonly removed = 'removed';\n\n /**\n * Unique name of the conversation.\n */\n public get uniqueName(): string { return this.channelState.uniqueName; }\n\n /**\n * Status of the conversation.\n */\n public get status(): ConversationStatus { return this.channelState.status; }\n\n /**\n * Name of the conversation.\n */\n public get friendlyName(): string { return this.channelState.friendlyName; }\n\n /**\n * Date this conversation was last updated on.\n */\n public get dateUpdated(): any { return this.channelState.dateUpdated; }\n\n /**\n * Date this conversation was created on.\n */\n public get dateCreated(): any { return this.channelState.dateCreated; }\n\n /**\n * Identity of the user that created this conversation.\n */\n public get createdBy(): string { return this.channelState.createdBy; }\n\n /**\n * Custom attributes of the conversation.\n */\n public get attributes(): any { return this.channelState.attributes; }\n\n /**\n * Index of the last message the user has read in this conversation.\n */\n public get lastReadMessageIndex(): number | null { return this.channelState.lastReadMessageIndex; }\n\n /**\n * Last message sent to this conversation.\n */\n public get lastMessage(): LastMessage { return this.channelState.lastMessage; }\n\n /**\n * User notification level for this conversation.\n */\n public get notificationLevel(): NotificationLevel { return this.channelState.notificationLevel; }\n\n public get bindings(): ConversationBindings { return this.channelState.bindings; }\n\n public get limits(): Limits { return this.configuration.limits; }\n\n /**\n * State of the conversation.\n */\n public get state(): ConversationState | undefined { return this.channelState.state; }\n\n /**\n * Load and subscribe to this conversation and do not subscribe to its participants and messages.\n * This or _subscribeStreams will need to be called before any events on conversation will fire.\n * @internal\n */\n _subscribe() {\n return this.entityPromise = this.entityPromise ??\n this.services.syncClient.document({ id: this.entityName, mode: 'open_existing' })\n .then(entity => {\n this.entity = entity;\n this.entity.on('updated', args => { this._update(args.data); });\n this.entity.on('removed', () => this.emit('removed', this));\n this._update(this.entity.data);\n return entity;\n })\n .catch(err => {\n this.entity = null;\n this.entityPromise = null;\n if (this.services.syncClient.connectionState != 'disconnected') {\n log.error('Failed to get conversation object', err);\n }\n log.debug('ERROR: Failed to get conversation object', err);\n throw err;\n });\n }\n\n /**\n * Load the attributes of this conversation and instantiate its participants and messages.\n * This or _subscribe will need to be called before any events on the conversation will fire.\n * This will need to be called before any events on participants or messages will fire\n * @internal\n */\n async _subscribeStreams() {\n try {\n await this._subscribe();\n log.trace('_subscribeStreams, this.entity.data=', this.entity.data);\n const messagesObjectName = this.entity.data.messages;\n const rosterObjectName = this.entity.data.roster;\n await Promise.all([\n this.messagesEntity.subscribe(messagesObjectName),\n this.participantsEntity.subscribe(rosterObjectName)\n ]);\n } catch (err) {\n if (this.services.syncClient.connectionState !== 'disconnected') {\n log.error('Failed to subscribe on conversation objects', this.sid, err);\n }\n log.debug('ERROR: Failed to subscribe on conversation objects', this.sid, err);\n throw err;\n }\n }\n\n /**\n * Stop listening for and firing events on this conversation.\n * @internal\n */\n async _unsubscribe() {\n if (this.entity) {\n await this.entity.close();\n this.entity = null;\n this.entityPromise = null;\n }\n\n return Promise.all([\n this.participantsEntity.unsubscribe(),\n this.messagesEntity.unsubscribe()\n ]);\n }\n\n /**\n * Set conversation status.\n * @internal\n */\n _setStatus(status: ConversationStatus, source: ConversationsDataSource) {\n this.statusSource = source;\n\n if (this.channelState.status === status) { return; }\n\n this.channelState.status = status;\n\n if (status === 'joined') {\n this._subscribeStreams()\n .catch(err => {\n log.debug('ERROR while setting conversation status ' + status, err);\n if (this.services.syncClient.connectionState !== 'disconnected') {\n throw err;\n }\n });\n } else if (this.entityPromise) {\n this._unsubscribe().catch(err => {\n log.debug('ERROR while setting conversation status ' + status, err);\n if (this.services.syncClient.connectionState !== 'disconnected') {\n throw err;\n }\n });\n }\n }\n\n /**\n * Get the source of the conversation update.\n * @internal\n */\n _statusSource(): ConversationsDataSource {\n return this.statusSource;\n }\n\n private static preprocessUpdate(update, conversationSid) {\n try {\n if (typeof update.attributes === 'string') {\n update.attributes = JSON.parse(update.attributes);\n } else if (update.attributes) {\n JSON.stringify(update.attributes);\n }\n } catch (e) {\n log.warn('Retrieved malformed attributes from the server for conversation: ' + conversationSid);\n update.attributes = {};\n }\n\n try {\n if (update.dateCreated) {\n update.dateCreated = new Date(update.dateCreated);\n }\n } catch (e) {\n log.warn('Retrieved malformed dateCreated from the server for conversation: ' + conversationSid);\n delete update.dateCreated;\n }\n\n try {\n if (update.dateUpdated) {\n update.dateUpdated = new Date(update.dateUpdated);\n }\n } catch (e) {\n log.warn('Retrieved malformed dateUpdated from the server for conversation: ' + conversationSid);\n delete update.dateUpdated;\n }\n\n try {\n if (update.lastMessage && update.lastMessage.timestamp) {\n update.lastMessage.timestamp = new Date(update.lastMessage.timestamp);\n }\n } catch (e) {\n log.warn('Retrieved malformed lastMessage.timestamp from the server for conversation: ' + conversationSid);\n delete update.lastMessage.timestamp;\n }\n }\n\n /**\n * Update the local conversation object with new values.\n * @internal\n */\n _update(update) {\n log.trace('_update', update);\n\n Conversation.preprocessUpdate(update, this.sid);\n const updateReasons = new Set<ConversationUpdateReason>();\n\n for (const key of Object.keys(update)) {\n const localKey = fieldMappings[key];\n\n if (!localKey) {\n continue;\n }\n\n switch (localKey) {\n case fieldMappings.status:\n if (!update.status || update.status === 'unknown'\n || this.channelState.status === update.status) {\n break;\n }\n\n this.channelState.status = update.status;\n updateReasons.add(localKey);\n\n break;\n case fieldMappings.attributes:\n if (isEqual(this.channelState.attributes, update.attributes)) {\n break;\n }\n\n this.channelState.attributes = update.attributes;\n updateReasons.add(localKey);\n\n break;\n case fieldMappings.lastConsumedMessageIndex:\n if (update.lastConsumedMessageIndex === undefined\n || update.lastConsumedMessageIndex === this.channelState.lastReadMessageIndex) {\n break;\n }\n\n this.channelState.lastReadMessageIndex = update.lastConsumedMessageIndex;\n updateReasons.add('lastReadMessageIndex');\n\n break;\n case fieldMappings.lastMessage:\n if (this.channelState.lastMessage && !update.lastMessage) {\n delete this.channelState.lastMessage;\n updateReasons.add(localKey);\n\n break;\n }\n\n this.channelState.lastMessage = this.channelState.lastMessage || {};\n\n if (update.lastMessage?.index !== undefined\n && update.lastMessage.index !== this.channelState.lastMessage.index) {\n this.channelState.lastMessage.index = update.lastMessage.index;\n updateReasons.add(localKey);\n }\n\n if (update.lastMessage?.timestamp !== undefined\n && this.channelState.lastMessage?.dateCreated?.getTime() !== update.lastMessage.timestamp.getTime()) {\n this.channelState.lastMessage.dateCreated = update.lastMessage.timestamp;\n updateReasons.add(localKey);\n }\n\n if (isEqual(this.channelState.lastMessage, {})) {\n delete this.channelState.lastMessage;\n }\n\n break;\n case fieldMappings.state:\n const state = update.state || undefined;\n\n if (state !== undefined) {\n state.dateUpdated = new Date(state.dateUpdated);\n }\n\n if (isEqual(this.channelState.state, state)) {\n break;\n }\n\n this.channelState.state = state;\n updateReasons.add(localKey);\n\n break;\n case fieldMappings.bindings:\n if (isEqual(this.channelState.bindings, update.bindings)) {\n break;\n }\n\n this.channelState.bindings = update.bindings;\n updateReasons.add(localKey);\n\n break;\n default:\n const isDate = update[key] instanceof Date;\n const keysMatchAsDates = isDate && this.channelState[localKey]?.getTime() === update[key].getTime();\n const keysMatchAsNonDates = !isDate && this[localKey] === update[key];\n\n if (keysMatchAsDates || keysMatchAsNonDates) {\n break;\n }\n\n this.channelState[localKey] = update[key];\n updateReasons.add(localKey);\n }\n }\n\n if (updateReasons.size > 0) {\n this.emit('updated', { conversation: this, updateReasons: [...updateReasons] });\n }\n }\n\n /**\n * @internal\n */\n private _onMessageAdded(message) {\n for (let participant of this.participants.values()) {\n if (participant.identity === message.author) {\n participant._endTyping();\n break;\n }\n }\n this.emit('messageAdded', message);\n }\n\n private async _setLastReadMessageIndex(index: number | null): Promise<number> {\n const result = await this.services.commandExecutor.mutateResource<\n EditLastReadMessageIndexRequest,\n EditLastReadMessageIndexResponse\n >(\n 'post',\n `${this.configuration.links.myConversations}/${this.sid}`,\n {\n last_read_message_index: index\n }\n );\n\n return result.unread_messages_count;\n }\n\n /**\n * Add a participant to the conversation by its identity.\n * @param identity Identity of the Client to add.\n * @param attributes Attributes to be attached to the participant.\n */\n @validateTypesAsync(nonEmptyString, optionalAttributesValidator)\n async add(identity: string, attributes?: any): Promise<void> {\n return this.participantsEntity.add(identity, attributes ?? {});\n }\n\n /**\n * Add a non-chat participant to the conversation.\n * @param proxyAddress Proxy (Twilio) address of the participant.\n * @param address User address of the participant.\n * @param attributes Attributes to be attached to the participant.\n * @param bindingOptions Options for adding email participants - name and CC/To level.\n */\n @validateTypesAsync(nonEmptyString, nonEmptyString, optionalAttributesValidator)\n async addNonChatParticipant(proxyAddress: string, address: string, attributes: Record<string, any> = {},\n bindingOptions: ParticipantBindingOptions = {}): Promise<void> {\n return this.participantsEntity.addNonChatParticipant(proxyAddress, address, attributes ?? {},\n bindingOptions ?? {});\n }\n\n /**\n * Advance the conversation's last read message index to the current read horizon.\n * Rejects if the user is not a participant of the conversation.\n * Last read message index is updated only if the new index value is higher than the previous.\n * @param index Message index to advance to.\n * @return Resulting unread messages count in the conversation.\n */\n @validateTypesAsync(nonNegativeInteger)\n async advanceLastReadMessageIndex(index: number): Promise<number> {\n await this._subscribeStreams();\n\n if (index < this.lastReadMessageIndex) {\n return await this._setLastReadMessageIndex(this.lastReadMessageIndex);\n }\n\n return await this._setLastReadMessageIndex(index);\n }\n\n /**\n * Delete the conversation and unsubscribe from its events.\n */\n async delete(): Promise<Conversation> {\n await this.services.commandExecutor.mutateResource(\n 'delete',\n this.links.self,\n );\n\n return this;\n }\n\n /**\n * Get the custom attributes of this Conversation.\n */\n async getAttributes(): Promise<any> {\n await this._subscribe();\n return this.attributes;\n }\n\n /**\n * Returns messages from the conversation using the paginator interface.\n * @param pageSize Number of messages to return in a single chunk. Default is 30.\n * @param anchor Index of the newest message to fetch. Default is from the end.\n * @param direction Query direction. By default it queries backwards\n * from newer to older. The `\"forward\"` value will query in the opposite direction.\n * @return A page of messages.\n */\n @validateTypesAsync(\n ['undefined', nonNegativeInteger],\n ['undefined', nonNegativeInteger],\n ['undefined', literal('backwards', 'forward')]\n )\n async getMessages(pageSize?: number, anchor?: number, direction?: 'backwards' | 'forward'): Promise<Paginator<Message>> {\n await this._subscribeStreams();\n return this.messagesEntity.getMessages(pageSize, anchor, direction);\n }\n\n /**\n * Get a list of all the participants who are joined to this conversation.\n */\n async getParticipants(): Promise<Participant[]> {\n await this._subscribeStreams();\n return this.participantsEntity.getParticipants();\n }\n\n /**\n * Get conversation participants count.\n *\n * This method is semi-realtime. This means that this data will be eventually correct,\n * but will also be possibly incorrect for a few seconds. The Conversations system does not\n * provide real time events for counter values changes.\n *\n * This is useful for any UI badges, but it is not recommended to build any core application\n * logic based on these counters being accurate in real time.\n */\n async getParticipantsCount(): Promise<number> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(this.sid)\n .build();\n const response = await this.services.network.get(url);\n\n return response.body.participants_count;\n }\n\n /**\n * Get a participant by its SID.\n * @param participantSid Participant SID.\n */\n @validateTypesAsync(nonEmptyString)\n async getParticipantBySid(participantSid: string): Promise<Participant> {\n return this.participantsEntity.getParticipantBySid(participantSid);\n }\n\n /**\n * Get a participant by its identity.\n * @param identity Participant identity.\n */\n @validateTypesAsync(nonEmptyString)\n async getParticipantByIdentity(identity: string): Promise<Participant> {\n return this.participantsEntity.getParticipantByIdentity(identity);\n }\n\n /**\n * Get the total message count in the conversation.\n *\n * This method is semi-realtime. This means that this data will be eventually correct,\n * but will also be possibly incorrect for a few seconds. The Conversations system does not\n * provide real time events for counter values changes.\n *\n * This is useful for any UI badges, but it is not recommended to build any core application\n * logic based on these counters being accurate in real time.\n */\n async getMessagesCount(): Promise<number> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(this.sid)\n .build();\n const response = await this.services.network.get(url);\n\n return response.body.messages_count;\n }\n\n /**\n * Get unread messages count for the user if they are a participant of this conversation.\n * Rejects if the user is not a participant of the conversation.\n *\n * Use this method to obtain the number of unread messages together with\n * {@link Conversation.updateLastReadMessageIndex} instead of relying on the\n * message indices which may have gaps. See {@link Message.index} for details.\n *\n * This method is semi-realtime. This means that this data will be eventually correct,\n * but will also be possibly incorrect for a few seconds. The Conversations system does not\n * provide real time events for counter values changes.\n *\n * This is useful for any UI badges, but it is not recommended to build any core application\n * logic based on these counters being accurate in real time.\n */\n async getUnreadMessagesCount(): Promise<number | null> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(this.sid)\n .build();\n const response = await this.services.network.get(url);\n\n if (response.body.conversation_sid !== this.sid) {\n throw new Error(\n 'Conversation was not found in the user conversations list'\n );\n }\n\n const unreadMessageCount = response.body.unread_messages_count;\n\n if (typeof unreadMessageCount === 'number') {\n return unreadMessageCount;\n }\n\n return null;\n }\n\n /**\n * Join the conversation and subscribe to its events.\n */\n async join(): Promise<Conversation> {\n await this.services.commandExecutor.mutateResource<AddParticipantRequest, ParticipantResponse>(\n 'post',\n this.links.participants,\n {\n identity: this.configuration.userIdentity\n }\n );\n\n return this;\n }\n\n /**\n * Leave the conversation.\n */\n async leave(): Promise<Conversation> {\n if (this.channelState.status === 'joined') {\n await this.services.commandExecutor.mutateResource(\n 'delete',\n `${this.links.participants}/${this.configuration.userIdentity}`\n );\n }\n\n return this;\n }\n\n /**\n * Remove a participant from the conversation. When a string is passed as the\n * argument, it will assume that the string is an identity or SID.\n * @param participant Identity, SID or the participant object to remove.\n */\n @validateTypesAsync([nonEmptyString, Participant])\n async removeParticipant(participant: string | Participant): Promise<void> {\n await this.participantsEntity.remove(\n typeof participant === 'string'\n ? participant\n : participant.sid\n );\n }\n\n /**\n * Send a message to the conversation.\n * @param message Message body for the text message,\n * `FormData` or {@link SendMediaOptions} for media content. Sending FormData is supported only with the browser engine.\n * @param messageAttributes Attributes for the message.\n * @param emailOptions Email options for the message.\n * @return Index of the new message.\n */\n @validateTypesAsync(\n [\n 'string',\n literal(null),\n // Wrapping it into a custom rule is necessary because the FormData class is not available on initialization.\n custom((value) => [value instanceof FormData, 'an instance of FormData']),\n objectSchema('media options', {\n contentType: nonEmptyString,\n media: custom((value) => {\n let isValid = (typeof value === 'string' && value.length > 0) || value instanceof Uint8Array || value instanceof ArrayBuffer;\n\n if (typeof Blob === 'function') {\n isValid = isValid || value instanceof Blob;\n }\n\n return [\n isValid,\n 'a non-empty string, an instance of Buffer or an instance of Blob'\n ];\n })\n })\n ],\n optionalAttributesValidator,\n ['undefined', literal(null), objectSchema('email attributes', {\n subject: [nonEmptyString, 'undefined']\n })]\n )\n async sendMessage(message: string | FormData | SendMediaOptions | null, messageAttributes?: any,\n emailOptions?: SendEmailOptions): Promise<number> {\n if (typeof message === 'string' || message === null) {\n let response = await this.messagesEntity.send(message, messageAttributes, emailOptions);\n return parseToNumber(response.index);\n }\n\n let response = await this.messagesEntity.sendMedia(message, messageAttributes, emailOptions);\n return parseToNumber(response.index);\n }\n\n /**\n * New interface to prepare for sending a message.\n * Use instead of `sendMessage`.\n * @return A MessageBuilder to help set all message sending options.\n */\n public prepareMessage(): MessageBuilder {\n return new MessageBuilder(this.limits, this.messagesEntity);\n }\n\n /**\n * Set last read message index of the conversation to the index of the last known message.\n * @return Resulting unread messages count in the conversation.\n */\n public async setAllMessagesRead(): Promise<number> {\n await this._subscribeStreams();\n\n let messagesPage = await this.getMessages(1);\n\n if (messagesPage.items.length > 0) {\n return this.advanceLastReadMessageIndex(messagesPage.items[0].index);\n }\n\n return Promise.resolve(0);\n }\n\n /**\n * Set all messages in the conversation unread.\n * @return Resulting unread messages count in the conversation.\n */\n public async setAllMessagesUnread(): Promise<number> {\n await this._subscribeStreams();\n return await this._setLastReadMessageIndex(null);\n }\n\n /**\n * Set user notification level for this conversation.\n * @param notificationLevel New user notification level.\n */\n @validateTypesAsync(literal('default', 'muted'))\n async setUserNotificationLevel(notificationLevel: NotificationLevel): Promise<void> {\n await this.services.commandExecutor.mutateResource<EditNotificationLevelRequest>(\n 'post',\n `${this.configuration.links.myConversations}/${this.sid}`,\n {\n notification_level: notificationLevel\n }\n );\n }\n\n /**\n * Send a notification to the server indicating that this client is currently typing in this conversation.\n * Typing ended notification is sent after a while automatically, but by calling this method again you ensure that typing ended is not received.\n */\n typing(): Promise<void> {\n return this.services.typingIndicator.send(this.sid);\n }\n\n /**\n * Update the attributes of the conversation.\n * @param attributes New attributes.\n */\n @validateTypesAsync(attributesValidator)\n async updateAttributes(attributes: any): Promise<Conversation> {\n await this.services.commandExecutor.mutateResource<EditConversationRequest, ConversationResponse>(\n 'post',\n this.links.self,\n {\n attributes: attributes !== undefined ? JSON.stringify(attributes) : undefined\n }\n );\n\n return this;\n }\n\n /**\n * Update the friendly name of the conversation.\n * @param friendlyName New friendly name.\n */\n @validateTypesAsync(['string'])\n async updateFriendlyName(friendlyName: string): Promise<Conversation> {\n if (this.channelState.friendlyName !== friendlyName) {\n await this.services.commandExecutor.mutateResource<EditConversationRequest, ConversationResponse>(\n 'post',\n this.links.self,\n { friendly_name: friendlyName }\n );\n }\n\n return this;\n }\n\n /**\n * Set the last read message index to the current read horizon.\n * @param index Message index to set as last read.\n * If null is provided, then the behavior is identical to {@link Conversation.setAllMessagesUnread}.\n * @returns Resulting unread messages count in the conversation.\n */\n @validateTypesAsync([literal(null), nonNegativeInteger])\n async updateLastReadMessageIndex(index: number | null): Promise<number> {\n await this._subscribeStreams();\n return this._setLastReadMessageIndex(index);\n }\n\n /**\n * Update the unique name of the conversation.\n * @param uniqueName New unique name for the conversation. Setting unique name to null removes it.\n */\n @validateTypesAsync(['string', literal(null)])\n async updateUniqueName(uniqueName: string | null): Promise<Conversation> {\n if (this.channelState.uniqueName !== uniqueName) {\n if (!uniqueName) {\n uniqueName = '';\n }\n\n await this.services.commandExecutor.mutateResource<EditConversationRequest, ConversationResponse>(\n 'post',\n this.links.self,\n {\n unique_name: uniqueName\n }\n );\n }\n\n return this;\n }\n}\n\nexport {\n ConversationDescriptor,\n Conversation,\n ConversationUpdateReason,\n ConversationStatus,\n NotificationLevel,\n ConversationState,\n ConversationUpdatedEventArgs,\n SendMediaOptions,\n SendEmailOptions,\n LastMessage,\n ConversationBindings,\n ConversationEmailBinding\n};\n"],"names":["Logger","ReplayEventEmitter","Participants","Messages","isEqual","UriBuilder","parseToNumber","MessageBuilder","__decorate","validateTypesAsync","nonEmptyString","optionalAttributesValidator","nonNegativeInteger","literal","Participant","custom","objectSchema","attributesValidator"],"mappings":"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"}
|
@@ -409,7 +409,7 @@ class Conversations extends replayEventEmitter.ReplayEventEmitter {
|
|
409
409
|
channel: conversationDescriptor.sync_objects.conversation,
|
410
410
|
messages: conversationDescriptor.sync_objects.messages,
|
411
411
|
roster: `${conversationDescriptor.conversation_sid}.roster`,
|
412
|
-
lastConsumedMessageIndex: conversationDescriptor.
|
412
|
+
lastConsumedMessageIndex: conversationDescriptor.last_read_message_index,
|
413
413
|
notificationLevel: conversationDescriptor.notification_level
|
414
414
|
}));
|
415
415
|
pageToken = response.body.meta.next_token;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"conversations.js","sources":["../../src/data/conversations.ts"],"sourcesContent":["import { Logger } from '../logger';\nimport {\n Conversation,\n ConversationUpdatedEventArgs,\n ConversationUpdateReason\n} from '../conversation';\nimport { SyncMap, SyncClient, SyncMapItem } from 'twilio-sync';\nimport { Users } from './users';\nimport { Network } from '../services/network';\nimport { TypingIndicator } from '../services/typing-indicator';\nimport { McsClient } from '@twilio/mcs-client';\nimport { Deferred } from '../util/deferred';\nimport {\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason\n} from '../participant';\nimport {\n Message,\n MessageUpdatedEventArgs,\n MessageUpdateReason\n} from '../message';\nimport { UriBuilder } from '../util';\nimport { Configuration } from '../configuration';\nimport { CommandExecutor } from '../command-executor';\nimport {\n CreateConversationRequest\n} from '../interfaces/commands/create-conversation';\nimport { ConversationResponse } from '../interfaces/commands/conversation-response';\nimport { ReplayEventEmitter } from '@twilio/replay-event-emitter';\nimport isEqual from 'lodash.isequal';\n\ntype ConversationsEvents = {\n conversationAdded: (conversation: Conversation) => void;\n conversationJoined: (conversation: Conversation) => void;\n conversationLeft: (conversation: Conversation) => void;\n conversationRemoved: (conversation: Conversation) => void;\n conversationUpdated: (data: {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n }) => void;\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n};\n\ntype ConversationsDataSource = 'sync' | 'chat' | 'rest';\n\ninterface ConversationsServices {\n syncClient: SyncClient;\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n commandExecutor: CommandExecutor;\n}\n\nconst log = Logger.scope('Conversations');\n\n/**\n * Represents conversations collection\n * {@see Conversation}\n */\nclass Conversations extends ReplayEventEmitter<ConversationsEvents> {\n public readonly conversations: Map<string, Conversation> = new Map();\n public readonly myConversationsRead: Deferred<boolean> = new Deferred();\n private readonly configuration: Configuration;\n private readonly services: ConversationsServices;\n private readonly tombstones: Set<string> = new Set();\n private myConversationsFetched = false;\n\n public constructor(\n configuration: Configuration,\n services: ConversationsServices\n ) {\n super();\n\n this.configuration = configuration;\n this.services = services;\n }\n\n public async addConversation(options): Promise<Conversation> {\n const attributes = typeof options?.attributes !== 'undefined'\n ? options.attributes\n : {};\n\n const response = await this.services.commandExecutor.mutateResource<CreateConversationRequest, ConversationResponse>(\n 'post',\n this.configuration.links.conversations,\n {\n friendly_name: options.friendlyName,\n unique_name: options.uniqueName,\n attributes: typeof attributes !== 'undefined' ? JSON.stringify(attributes) : undefined\n }\n );\n\n const conversationSid = response.sid ?? null;\n const conversationDocument = response.sync_objects?.conversation ?? null;\n const links = {\n self: response.url,\n ...response.links\n };\n const existingConversation = this.conversations.get(conversationSid);\n\n if (existingConversation) {\n await existingConversation._subscribe();\n return existingConversation;\n }\n\n const conversation = new Conversation(\n {\n channel: conversationDocument,\n entityName: null,\n uniqueName: null,\n attributes: null,\n createdBy: null,\n friendlyName: null,\n lastConsumedMessageIndex: null,\n dateCreated: null,\n dateUpdated: null\n },\n conversationSid,\n links,\n this.configuration,\n this.services\n );\n\n this.conversations.set(conversation.sid, conversation);\n this._registerForEvents(conversation);\n\n await conversation._subscribe();\n this.emit('conversationAdded', conversation);\n\n return conversation;\n }\n\n /**\n * Fetch conversations list and instantiate all necessary objects\n */\n public async fetchConversations(): Promise<Conversations> {\n try {\n const map = await this._getMap();\n\n map.on('itemAdded', args => {\n log.debug(`itemAdded: ${args.item.key}`);\n\n this._upsertConversation('sync', args.item.key, args.item.data);\n });\n\n map.on('itemRemoved', args => {\n log.debug(`itemRemoved: ${args.key}`);\n\n const sid = args.key;\n\n if (!this.myConversationsFetched) {\n this.tombstones.add(sid);\n }\n\n const conversation = this.conversations.get(sid);\n\n if (!conversation) {\n return;\n }\n\n if (conversation.status === 'joined') {\n conversation._setStatus('notParticipating', 'sync');\n this.emit('conversationLeft', conversation);\n }\n\n this.conversations.delete(sid);\n this.emit('conversationRemoved', conversation);\n conversation.emit('removed', conversation);\n });\n\n map.on('itemUpdated', args => {\n log.debug(`itemUpdated: ${args.item.key}`);\n\n this._upsertConversation('sync', args.item.key, args.item.data);\n });\n\n const myConversations = await this._fetchMyConversations();\n const upserts = [];\n\n for (const conversation of myConversations) {\n upserts.push(this._upsertConversation('rest', conversation.channel_sid, conversation));\n }\n\n this.myConversationsRead.set(true);\n\n await Promise.all(upserts);\n\n this.myConversationsFetched = true;\n this.tombstones.clear();\n\n log.debug('The conversations list has been successfully fetched');\n\n return this;\n } catch (error) {\n const errorMessage = 'Failed to fetch the conversations list';\n\n if (this.services.syncClient.connectionState !== 'disconnected') {\n log.error(errorMessage, error);\n }\n\n log.debug(`ERROR: ${errorMessage}`, error);\n\n throw error;\n }\n }\n\n public async getConversations(args) {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems();\n\n return this._wrapPaginator(page\n , items => Promise.all(items.map((item: SyncMapItem) => this._upsertConversation('sync', item.key, item.data))));\n }\n\n public async getConversation(sid: string): Promise<Conversation> {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems({ key: sid });\n const items = page.items.map((item: SyncMapItem) => this._upsertConversation('sync', item.key, item.data));\n\n return items.length > 0 ? items[0] : null;\n }\n\n public async getConversationByUniqueName(uniqueName: string): Promise<Conversation> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(uniqueName)\n .build();\n const response = await this.services.network.get(url);\n const body = response.body;\n\n const sid = body.conversation_sid;\n const data = {\n entityName: null,\n lastConsumedMessageIndex: body.last_read_message_index,\n status: body?.status || 'unknown',\n friendlyName: body.friendly_name,\n dateUpdated: body.date_updated,\n dateCreated: body.date_created,\n uniqueName: body.unique_name,\n createdBy: body.created_by,\n attributes: body.attributes,\n channel: body.sync_objects.conversation,\n notificationLevel: body?.notification_level,\n sid\n };\n\n return this._upsertConversation('sync', sid, data);\n }\n\n public async peekConversation(sid: string): Promise<Conversation> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(sid)\n .build();\n const response = await this.services.network.get(url);\n const body = response.body;\n\n const data = {\n entityName: null,\n // lastConsumedMessageIndex: body.last_read_message_index,\n status: body?.status || 'unknown',\n friendlyName: body.friendly_name,\n dateUpdated: body.date_updated,\n dateCreated: body.date_created,\n uniqueName: body.unique_name,\n createdBy: body.created_by,\n attributes: body.attributes,\n channel: `${sid}.channel`,\n // notificationLevel: body?.notification_level,\n sid\n };\n\n return this._upsertConversation('sync', sid, data);\n }\n\n private async _getMap(): Promise<SyncMap> {\n return await this.services.syncClient.map({\n id: this.configuration.myConversations,\n mode: 'open_existing'\n });\n }\n\n private async _wrapPaginator(page, op) {\n const items = await op(page.items);\n\n return {\n items,\n hasNextPage: page.hasNextPage,\n hasPrevPage: page.hasPrevPage,\n nextPage: () => page.nextPage().then(x => this._wrapPaginator(x, op)),\n prevPage: () => page.prevPage().then(x => this._wrapPaginator(x, op))\n };\n }\n\n private async _updateConversation(source: ConversationsDataSource, conversation: Conversation, data): Promise<void> {\n const areSourcesDifferent = conversation._statusSource() !== undefined && source !== conversation._statusSource();\n const isChannelSourceSync = source !== 'rest' || conversation._statusSource() === 'sync';\n\n if (areSourcesDifferent && isChannelSourceSync && source !== 'sync') {\n log.trace('upsertConversation: conversation is known from sync and came from chat, ignoring', {\n sid: conversation.sid,\n data: data.status,\n conversation: conversation.status\n });\n\n return;\n }\n\n if (data.status === 'joined' && conversation.status !== 'joined') {\n conversation._setStatus('joined', source);\n\n let updateData: any = {};\n\n if (typeof data.notificationLevel !== 'undefined') {\n updateData.notificationLevel = data.notificationLevel;\n }\n\n if (typeof data.lastConsumedMessageIndex !== 'undefined') {\n updateData.lastConsumedMessageIndex = data.lastConsumedMessageIndex;\n }\n\n if (!isEqual(updateData, {})) {\n conversation._update(updateData);\n }\n\n conversation._subscribe().then(() => {\n this.emit('conversationJoined', conversation);\n });\n\n return;\n }\n\n if (data.status === 'notParticipating' && conversation.status === 'joined') {\n conversation._setStatus('notParticipating', source);\n conversation._update(data);\n await conversation._subscribe();\n this.emit('conversationLeft', conversation);\n\n return;\n }\n\n if (data.status === 'notParticipating') {\n await conversation._subscribe();\n\n return;\n }\n\n conversation._update(data);\n }\n\n private async _upsertConversation(source: ConversationsDataSource, sid: string, data): Promise<Conversation> {\n log.trace(`upsertConversation called for ${sid}`, data);\n\n const conversation = this.conversations.get(sid);\n\n // If the channel is known, update it\n if (conversation) {\n log.trace(\n `upsertConversation: the conversation ${conversation.sid} is known;` +\n `its status is known from the source ${conversation._statusSource()} ` +\n `and the update came from the source ${source}`,\n conversation\n );\n\n await this._updateConversation(source, conversation, data);\n await conversation._subscribe();\n\n return conversation;\n }\n\n // If the conversations is deleted, ignore it\n if (['chat', 'rest'].includes(source) && this.tombstones.has(sid)) {\n log.trace('upsertChannel: the channel is deleted but reappeared again from chat, ignoring', sid);\n return;\n }\n\n // If the conversation is unknown, fetch it\n log.trace('upsertConversation: creating a local conversation object with sid ' + sid, data);\n\n const baseLink = `${this.configuration.links.conversations}/${sid}`;\n const links = {\n self: baseLink,\n messages: `${baseLink}/Messages`,\n participants: `${baseLink}/Participants`\n };\n const newConversation = new Conversation(\n data,\n sid,\n links,\n this.configuration,\n this.services\n );\n this.conversations.set(sid, newConversation);\n\n await newConversation._subscribe();\n this._registerForEvents(newConversation);\n this.emit('conversationAdded', newConversation);\n\n if (data.status === 'joined') {\n newConversation._setStatus('joined', source);\n this.emit('conversationJoined', newConversation);\n }\n\n return newConversation;\n }\n\n private async _fetchMyConversations() {\n let conversations = [];\n let pageToken: null | string = null;\n\n do {\n const url = new UriBuilder(this.configuration.links.myConversations);\n\n if (pageToken) {\n url.arg('PageToken', pageToken);\n }\n\n const response = await this.services.network.get(url.build());\n const receivedConversations = response.body.conversations.map(\n (conversationDescriptor) => ({\n descriptor: conversationDescriptor,\n channel_sid: conversationDescriptor.conversation_sid,\n status: conversationDescriptor.status,\n channel: conversationDescriptor.sync_objects.conversation,\n messages: conversationDescriptor.sync_objects.messages,\n roster: `${conversationDescriptor.conversation_sid}.roster`,\n lastConsumedMessageIndex: conversationDescriptor.last_consumed_message_index,\n notificationLevel: conversationDescriptor.notification_level\n })\n );\n\n pageToken = response.body.meta.next_token;\n conversations = [...conversations, ...receivedConversations];\n } while (pageToken);\n\n return conversations;\n }\n\n private _onConversationRemoved(sid: string) {\n const conversation = this.conversations.get(sid);\n\n if (conversation) {\n this.conversations.delete(sid);\n this.emit('conversationRemoved', conversation);\n }\n }\n\n private _registerForEvents(conversation) {\n conversation.on('removed', () => this._onConversationRemoved(conversation.sid));\n conversation.on('updated', (args: ConversationUpdatedEventArgs) => this.emit('conversationUpdated', args));\n conversation.on('participantJoined', this.emit.bind(this, 'participantJoined'));\n conversation.on('participantLeft', this.emit.bind(this, 'participantLeft'));\n conversation.on('participantUpdated', (args: ParticipantUpdatedEventArgs) => this.emit('participantUpdated', args));\n conversation.on('messageAdded', this.emit.bind(this, 'messageAdded'));\n conversation.on('messageUpdated', (args: MessageUpdatedEventArgs) => this.emit('messageUpdated', args));\n conversation.on('messageRemoved', this.emit.bind(this, 'messageRemoved'));\n conversation.on('typingStarted', this.emit.bind(this, 'typingStarted'));\n conversation.on('typingEnded', this.emit.bind(this, 'typingEnded'));\n }\n}\n\nexport {\n ConversationsServices,\n ConversationsDataSource,\n Conversation,\n Conversations\n};\n"],"names":["Logger","ReplayEventEmitter","Deferred","conversation","Conversation","UriBuilder","isEqual"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoEA,MAAM,GAAG,GAAGA,aAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAE1C;;;;AAIA,MAAM,aAAc,SAAQC,qCAAuC;IAQjE,YACE,aAA4B,EAC5B,QAA+B;QAE/B,KAAK,EAAE,CAAC;QAXM,kBAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;QACrD,wBAAmB,GAAsB,IAAIC,iBAAQ,EAAE,CAAC;QAGvD,eAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;QAC7C,2BAAsB,GAAG,KAAK,CAAC;QAQrC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC1B;IAEM,MAAM,eAAe,CAAC,OAAO;;QAClC,MAAM,UAAU,GAAG,QAAO,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAA,KAAK,WAAW;cACzD,OAAO,CAAC,UAAU;cAClB,EAAE,CAAC;QAEP,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CACjE,MAAM,EACN,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,EACtC;YACE,aAAa,EAAE,OAAO,CAAC,YAAY;YACnC,WAAW,EAAE,OAAO,CAAC,UAAU;YAC/B,UAAU,EAAE,OAAO,UAAU,KAAK,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,SAAS;SACvF,CACF,CAAC;QAEF,MAAM,eAAe,GAAG,MAAA,QAAQ,CAAC,GAAG,mCAAI,IAAI,CAAC;QAC7C,MAAM,oBAAoB,GAAG,MAAA,MAAA,QAAQ,CAAC,YAAY,0CAAE,YAAY,mCAAI,IAAI,CAAC;QACzE,MAAM,KAAK,mBACT,IAAI,EAAE,QAAQ,CAAC,GAAG,IACf,QAAQ,CAAC,KAAK,CAClB,CAAC;QACF,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAErE,IAAI,oBAAoB,EAAE;YACxB,MAAM,oBAAoB,CAAC,UAAU,EAAE,CAAC;YACxC,OAAO,oBAAoB,CAAC;SAC7B;QAED,MAAMC,cAAY,GAAG,IAAIC,yBAAY,CACnC;YACE,OAAO,EAAE,oBAAoB;YAC7B,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,IAAI;YAClB,wBAAwB,EAAE,IAAI;YAC9B,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI;SAClB,EACD,eAAe,EACf,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,CACd,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CAACD,cAAY,CAAC,GAAG,EAAEA,cAAY,CAAC,CAAC;QACvD,IAAI,CAAC,kBAAkB,CAACA,cAAY,CAAC,CAAC;QAEtC,MAAMA,cAAY,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAEA,cAAY,CAAC,CAAC;QAE7C,OAAOA,cAAY,CAAC;KACrB;;;;IAKM,MAAM,kBAAkB;QAC7B,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAEjC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI;gBACtB,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEzC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjE,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI;gBACxB,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;gBAErB,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;oBAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC1B;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEjD,IAAI,CAAC,YAAY,EAAE;oBACjB,OAAO;iBACR;gBAED,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;oBACpC,YAAY,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;oBACpD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;iBAC7C;gBAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;gBAC/C,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;aAC5C,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI;gBACxB,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBAE3C,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjE,CAAC,CAAC;YAEH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3D,MAAM,OAAO,GAAG,EAAE,CAAC;YAEnB,KAAK,MAAM,YAAY,IAAI,eAAe,EAAE;gBAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;aACxF;YAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEnC,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE3B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;YACnC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAExB,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAElE,OAAO,IAAI,CAAC;SACb;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,YAAY,GAAG,wCAAwC,CAAC;YAE9D,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,KAAK,cAAc,EAAE;gBAC/D,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;aAChC;YAED,GAAG,CAAC,KAAK,CAAC,UAAU,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;YAE3C,MAAM,KAAK,CAAC;SACb;KACF;IAEM,MAAM,gBAAgB,CAAC,IAAI;QAChC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QAE/C,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAC3B,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAiB,KAAK,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;KACpH;IAEM,MAAM,eAAe,CAAC,GAAW;QACtC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAiB,KAAK,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAE3G,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KAC3C;IAEM,MAAM,2BAA2B,CAAC,UAAkB;QACzD,MAAM,GAAG,GAAG,IAAIE,gBAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC;aACjE,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAClC,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,IAAI;YAChB,wBAAwB,EAAE,IAAI,CAAC,uBAAuB;YACtD,MAAM,EAAE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,SAAS;YACjC,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY;YACvC,iBAAiB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,kBAAkB;YAC3C,GAAG;SACJ,CAAC;QAEF,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;KACpD;IAEM,MAAM,gBAAgB,CAAC,GAAW;QACvC,MAAM,GAAG,GAAG,IAAIA,gBAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC;aAC/D,IAAI,CAAC,GAAG,CAAC;aACT,KAAK,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAE3B,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,IAAI;;YAEhB,MAAM,EAAE,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,SAAS;YACjC,YAAY,EAAE,IAAI,CAAC,aAAa;YAChC,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,GAAG,GAAG,UAAU;;YAEzB,GAAG;SACJ,CAAC;QAEF,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;KACpD;IAEO,MAAM,OAAO;QACnB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;YACxC,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,eAAe;YACtC,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;KACJ;IAEO,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,OAAO;YACL,KAAK;YACL,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrE,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACtE,CAAC;KACH;IAEO,MAAM,mBAAmB,CAAC,MAA+B,EAAE,YAA0B,EAAE,IAAI;QACjG,MAAM,mBAAmB,GAAG,YAAY,CAAC,aAAa,EAAE,KAAK,SAAS,IAAI,MAAM,KAAK,YAAY,CAAC,aAAa,EAAE,CAAC;QAClH,MAAM,mBAAmB,GAAG,MAAM,KAAK,MAAM,IAAI,YAAY,CAAC,aAAa,EAAE,KAAK,MAAM,CAAC;QAEzF,IAAI,mBAAmB,IAAI,mBAAmB,IAAI,MAAM,KAAK,MAAM,EAAE;YACnE,GAAG,CAAC,KAAK,CAAC,kFAAkF,EAAE;gBAC5F,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,YAAY,EAAE,YAAY,CAAC,MAAM;aAClC,CAAC,CAAC;YAEH,OAAO;SACR;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YAChE,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE1C,IAAI,UAAU,GAAQ,EAAE,CAAC;YAEzB,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,WAAW,EAAE;gBACjD,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;aACvD;YAED,IAAI,OAAO,IAAI,CAAC,wBAAwB,KAAK,WAAW,EAAE;gBACxD,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC;aACrE;YAED,IAAI,CAACC,2BAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;gBAC5B,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aAClC;YAED,YAAY,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;aAC/C,CAAC,CAAC;YAEH,OAAO;SACR;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;YAC1E,YAAY,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;YACpD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;YAE5C,OAAO;SACR;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB,EAAE;YACtC,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAEhC,OAAO;SACR;QAED,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5B;IAEO,MAAM,mBAAmB,CAAC,MAA+B,EAAE,GAAW,EAAE,IAAI;QAClF,GAAG,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAExD,MAAMH,cAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;QAGjD,IAAIA,cAAY,EAAE;YAChB,GAAG,CAAC,KAAK,CACP,wCAAwCA,cAAY,CAAC,GAAG,YAAY;gBACpE,uCAAuCA,cAAY,CAAC,aAAa,EAAE,GAAG;gBACtE,uCAAuC,MAAM,EAAE,EAC/CA,cAAY,CACb,CAAC;YAEF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAEA,cAAY,EAAE,IAAI,CAAC,CAAC;YAC3D,MAAMA,cAAY,CAAC,UAAU,EAAE,CAAC;YAEhC,OAAOA,cAAY,CAAC;SACrB;;QAGD,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACjE,GAAG,CAAC,KAAK,CAAC,gFAAgF,EAAE,GAAG,CAAC,CAAC;YACjG,OAAO;SACR;;QAGD,GAAG,CAAC,KAAK,CAAC,oEAAoE,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;QAE5F,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC;QACpE,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,GAAG,QAAQ,WAAW;YAChC,YAAY,EAAE,GAAG,QAAQ,eAAe;SACzC,CAAC;QACF,MAAM,eAAe,GAAG,IAAIC,yBAAY,CACtC,IAAI,EACJ,GAAG,EACH,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAE7C,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;YAC5B,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;SAClD;QAED,OAAO,eAAe,CAAC;KACxB;IAEO,MAAM,qBAAqB;QACjC,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,GAAG;YACD,MAAM,GAAG,GAAG,IAAIC,gBAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAErE,IAAI,SAAS,EAAE;gBACb,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;aACjC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,MAAM,qBAAqB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAC3D,CAAC,sBAAsB,MAAM;gBAC3B,UAAU,EAAE,sBAAsB;gBAClC,WAAW,EAAE,sBAAsB,CAAC,gBAAgB;gBACpD,MAAM,EAAE,sBAAsB,CAAC,MAAM;gBACrC,OAAO,EAAE,sBAAsB,CAAC,YAAY,CAAC,YAAY;gBACzD,QAAQ,EAAE,sBAAsB,CAAC,YAAY,CAAC,QAAQ;gBACtD,MAAM,EAAE,GAAG,sBAAsB,CAAC,gBAAgB,SAAS;gBAC3D,wBAAwB,EAAE,sBAAsB,CAAC,2BAA2B;gBAC5E,iBAAiB,EAAE,sBAAsB,CAAC,kBAAkB;aAC7D,CAAC,CACH,CAAC;YAEF,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YAC1C,aAAa,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,qBAAqB,CAAC,CAAC;SAC9D,QAAQ,SAAS,EAAE;QAEpB,OAAO,aAAa,CAAC;KACtB;IAEO,sBAAsB,CAAC,GAAW;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;SAChD;KACF;IAEO,kBAAkB,CAAC,YAAY;QACrC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAkC,KAAK,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3G,YAAY,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAChF,YAAY,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC5E,YAAY,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,IAAiC,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,CAAC;QACpH,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;QACtE,YAAY,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAA6B,KAAK,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;QACxG,YAAY,CAAC,EAAE,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC1E,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;QACxE,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;KACrE;;;;;;"}
|
1
|
+
{"version":3,"file":"conversations.js","sources":["../../src/data/conversations.ts"],"sourcesContent":["import { Logger } from '../logger';\nimport {\n Conversation,\n ConversationUpdatedEventArgs,\n ConversationUpdateReason\n} from '../conversation';\nimport { SyncMap, SyncClient, SyncMapItem } from 'twilio-sync';\nimport { Users } from './users';\nimport { Network } from '../services/network';\nimport { TypingIndicator } from '../services/typing-indicator';\nimport { McsClient } from '@twilio/mcs-client';\nimport { Deferred } from '../util/deferred';\nimport {\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason\n} from '../participant';\nimport {\n Message,\n MessageUpdatedEventArgs,\n MessageUpdateReason\n} from '../message';\nimport { UriBuilder } from '../util';\nimport { Configuration } from '../configuration';\nimport { CommandExecutor } from '../command-executor';\nimport {\n CreateConversationRequest\n} from '../interfaces/commands/create-conversation';\nimport { ConversationResponse } from '../interfaces/commands/conversation-response';\nimport { ReplayEventEmitter } from '@twilio/replay-event-emitter';\nimport isEqual from 'lodash.isequal';\n\ntype ConversationsEvents = {\n conversationAdded: (conversation: Conversation) => void;\n conversationJoined: (conversation: Conversation) => void;\n conversationLeft: (conversation: Conversation) => void;\n conversationRemoved: (conversation: Conversation) => void;\n conversationUpdated: (data: {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n }) => void;\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n};\n\ntype ConversationsDataSource = 'sync' | 'chat' | 'rest';\n\ninterface ConversationsServices {\n syncClient: SyncClient;\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n commandExecutor: CommandExecutor;\n}\n\nconst log = Logger.scope('Conversations');\n\n/**\n * Represents conversations collection\n * {@see Conversation}\n */\nclass Conversations extends ReplayEventEmitter<ConversationsEvents> {\n public readonly conversations: Map<string, Conversation> = new Map();\n public readonly myConversationsRead: Deferred<boolean> = new Deferred();\n private readonly configuration: Configuration;\n private readonly services: ConversationsServices;\n private readonly tombstones: Set<string> = new Set();\n private myConversationsFetched = false;\n\n public constructor(\n configuration: Configuration,\n services: ConversationsServices\n ) {\n super();\n\n this.configuration = configuration;\n this.services = services;\n }\n\n public async addConversation(options): Promise<Conversation> {\n const attributes = typeof options?.attributes !== 'undefined'\n ? options.attributes\n : {};\n\n const response = await this.services.commandExecutor.mutateResource<CreateConversationRequest, ConversationResponse>(\n 'post',\n this.configuration.links.conversations,\n {\n friendly_name: options.friendlyName,\n unique_name: options.uniqueName,\n attributes: typeof attributes !== 'undefined' ? JSON.stringify(attributes) : undefined\n }\n );\n\n const conversationSid = response.sid ?? null;\n const conversationDocument = response.sync_objects?.conversation ?? null;\n const links = {\n self: response.url,\n ...response.links\n };\n const existingConversation = this.conversations.get(conversationSid);\n\n if (existingConversation) {\n await existingConversation._subscribe();\n return existingConversation;\n }\n\n const conversation = new Conversation(\n {\n channel: conversationDocument,\n entityName: null,\n uniqueName: null,\n attributes: null,\n createdBy: null,\n friendlyName: null,\n lastConsumedMessageIndex: null,\n dateCreated: null,\n dateUpdated: null\n },\n conversationSid,\n links,\n this.configuration,\n this.services\n );\n\n this.conversations.set(conversation.sid, conversation);\n this._registerForEvents(conversation);\n\n await conversation._subscribe();\n this.emit('conversationAdded', conversation);\n\n return conversation;\n }\n\n /**\n * Fetch conversations list and instantiate all necessary objects\n */\n public async fetchConversations(): Promise<Conversations> {\n try {\n const map = await this._getMap();\n\n map.on('itemAdded', args => {\n log.debug(`itemAdded: ${args.item.key}`);\n\n this._upsertConversation('sync', args.item.key, args.item.data);\n });\n\n map.on('itemRemoved', args => {\n log.debug(`itemRemoved: ${args.key}`);\n\n const sid = args.key;\n\n if (!this.myConversationsFetched) {\n this.tombstones.add(sid);\n }\n\n const conversation = this.conversations.get(sid);\n\n if (!conversation) {\n return;\n }\n\n if (conversation.status === 'joined') {\n conversation._setStatus('notParticipating', 'sync');\n this.emit('conversationLeft', conversation);\n }\n\n this.conversations.delete(sid);\n this.emit('conversationRemoved', conversation);\n conversation.emit('removed', conversation);\n });\n\n map.on('itemUpdated', args => {\n log.debug(`itemUpdated: ${args.item.key}`);\n\n this._upsertConversation('sync', args.item.key, args.item.data);\n });\n\n const myConversations = await this._fetchMyConversations();\n const upserts = [];\n\n for (const conversation of myConversations) {\n upserts.push(this._upsertConversation('rest', conversation.channel_sid, conversation));\n }\n\n this.myConversationsRead.set(true);\n\n await Promise.all(upserts);\n\n this.myConversationsFetched = true;\n this.tombstones.clear();\n\n log.debug('The conversations list has been successfully fetched');\n\n return this;\n } catch (error) {\n const errorMessage = 'Failed to fetch the conversations list';\n\n if (this.services.syncClient.connectionState !== 'disconnected') {\n log.error(errorMessage, error);\n }\n\n log.debug(`ERROR: ${errorMessage}`, error);\n\n throw error;\n }\n }\n\n public async getConversations(args) {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems();\n\n return this._wrapPaginator(page\n , items => Promise.all(items.map((item: SyncMapItem) => this._upsertConversation('sync', item.key, item.data))));\n }\n\n public async getConversation(sid: string): Promise<Conversation> {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems({ key: sid });\n const items = page.items.map((item: SyncMapItem) => this._upsertConversation('sync', item.key, item.data));\n\n return items.length > 0 ? items[0] : null;\n }\n\n public async getConversationByUniqueName(uniqueName: string): Promise<Conversation> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(uniqueName)\n .build();\n const response = await this.services.network.get(url);\n const body = response.body;\n\n const sid = body.conversation_sid;\n const data = {\n entityName: null,\n lastConsumedMessageIndex: body.last_read_message_index,\n status: body?.status || 'unknown',\n friendlyName: body.friendly_name,\n dateUpdated: body.date_updated,\n dateCreated: body.date_created,\n uniqueName: body.unique_name,\n createdBy: body.created_by,\n attributes: body.attributes,\n channel: body.sync_objects.conversation,\n notificationLevel: body?.notification_level,\n sid\n };\n\n return this._upsertConversation('sync', sid, data);\n }\n\n public async peekConversation(sid: string): Promise<Conversation> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(sid)\n .build();\n const response = await this.services.network.get(url);\n const body = response.body;\n\n const data = {\n entityName: null,\n // lastConsumedMessageIndex: body.last_read_message_index,\n status: body?.status || 'unknown',\n friendlyName: body.friendly_name,\n dateUpdated: body.date_updated,\n dateCreated: body.date_created,\n uniqueName: body.unique_name,\n createdBy: body.created_by,\n attributes: body.attributes,\n channel: `${sid}.channel`,\n // notificationLevel: body?.notification_level,\n sid\n };\n\n return this._upsertConversation('sync', sid, data);\n }\n\n private async _getMap(): Promise<SyncMap> {\n return await this.services.syncClient.map({\n id: this.configuration.myConversations,\n mode: 'open_existing'\n });\n }\n\n private async _wrapPaginator(page, op) {\n const items = await op(page.items);\n\n return {\n items,\n hasNextPage: page.hasNextPage,\n hasPrevPage: page.hasPrevPage,\n nextPage: () => page.nextPage().then(x => this._wrapPaginator(x, op)),\n prevPage: () => page.prevPage().then(x => this._wrapPaginator(x, op))\n };\n }\n\n private async _updateConversation(source: ConversationsDataSource, conversation: Conversation, data): Promise<void> {\n const areSourcesDifferent = conversation._statusSource() !== undefined && source !== conversation._statusSource();\n const isChannelSourceSync = source !== 'rest' || conversation._statusSource() === 'sync';\n\n if (areSourcesDifferent && isChannelSourceSync && source !== 'sync') {\n log.trace('upsertConversation: conversation is known from sync and came from chat, ignoring', {\n sid: conversation.sid,\n data: data.status,\n conversation: conversation.status\n });\n\n return;\n }\n\n if (data.status === 'joined' && conversation.status !== 'joined') {\n conversation._setStatus('joined', source);\n\n let updateData: any = {};\n\n if (typeof data.notificationLevel !== 'undefined') {\n updateData.notificationLevel = data.notificationLevel;\n }\n\n if (typeof data.lastConsumedMessageIndex !== 'undefined') {\n updateData.lastConsumedMessageIndex = data.lastConsumedMessageIndex;\n }\n\n if (!isEqual(updateData, {})) {\n conversation._update(updateData);\n }\n\n conversation._subscribe().then(() => {\n this.emit('conversationJoined', conversation);\n });\n\n return;\n }\n\n if (data.status === 'notParticipating' && conversation.status === 'joined') {\n conversation._setStatus('notParticipating', source);\n conversation._update(data);\n await conversation._subscribe();\n this.emit('conversationLeft', conversation);\n\n return;\n }\n\n if (data.status === 'notParticipating') {\n await conversation._subscribe();\n\n return;\n }\n\n conversation._update(data);\n }\n\n private async _upsertConversation(source: ConversationsDataSource, sid: string, data): Promise<Conversation> {\n log.trace(`upsertConversation called for ${sid}`, data);\n\n const conversation = this.conversations.get(sid);\n\n // If the channel is known, update it\n if (conversation) {\n log.trace(\n `upsertConversation: the conversation ${conversation.sid} is known;` +\n `its status is known from the source ${conversation._statusSource()} ` +\n `and the update came from the source ${source}`,\n conversation\n );\n\n await this._updateConversation(source, conversation, data);\n await conversation._subscribe();\n\n return conversation;\n }\n\n // If the conversations is deleted, ignore it\n if (['chat', 'rest'].includes(source) && this.tombstones.has(sid)) {\n log.trace('upsertChannel: the channel is deleted but reappeared again from chat, ignoring', sid);\n return;\n }\n\n // If the conversation is unknown, fetch it\n log.trace('upsertConversation: creating a local conversation object with sid ' + sid, data);\n\n const baseLink = `${this.configuration.links.conversations}/${sid}`;\n const links = {\n self: baseLink,\n messages: `${baseLink}/Messages`,\n participants: `${baseLink}/Participants`\n };\n const newConversation = new Conversation(\n data,\n sid,\n links,\n this.configuration,\n this.services\n );\n this.conversations.set(sid, newConversation);\n\n await newConversation._subscribe();\n this._registerForEvents(newConversation);\n this.emit('conversationAdded', newConversation);\n\n if (data.status === 'joined') {\n newConversation._setStatus('joined', source);\n this.emit('conversationJoined', newConversation);\n }\n\n return newConversation;\n }\n\n private async _fetchMyConversations() {\n let conversations = [];\n let pageToken: null | string = null;\n\n do {\n const url = new UriBuilder(this.configuration.links.myConversations);\n\n if (pageToken) {\n url.arg('PageToken', pageToken);\n }\n\n const response = await this.services.network.get(url.build());\n const receivedConversations = response.body.conversations.map(\n (conversationDescriptor) => ({\n descriptor: conversationDescriptor,\n channel_sid: conversationDescriptor.conversation_sid,\n status: conversationDescriptor.status,\n channel: conversationDescriptor.sync_objects.conversation,\n messages: conversationDescriptor.sync_objects.messages,\n roster: `${conversationDescriptor.conversation_sid}.roster`,\n lastConsumedMessageIndex: conversationDescriptor.last_read_message_index,\n notificationLevel: conversationDescriptor.notification_level\n })\n );\n\n pageToken = response.body.meta.next_token;\n conversations = [...conversations, ...receivedConversations];\n } while (pageToken);\n\n return conversations;\n }\n\n private _onConversationRemoved(sid: string) {\n const conversation = this.conversations.get(sid);\n\n if (conversation) {\n this.conversations.delete(sid);\n this.emit('conversationRemoved', conversation);\n }\n }\n\n private _registerForEvents(conversation) {\n conversation.on('removed', () => this._onConversationRemoved(conversation.sid));\n conversation.on('updated', (args: ConversationUpdatedEventArgs) => this.emit('conversationUpdated', args));\n conversation.on('participantJoined', this.emit.bind(this, 'participantJoined'));\n conversation.on('participantLeft', this.emit.bind(this, 'participantLeft'));\n conversation.on('participantUpdated', (args: ParticipantUpdatedEventArgs) => this.emit('participantUpdated', args));\n conversation.on('messageAdded', this.emit.bind(this, 'messageAdded'));\n conversation.on('messageUpdated', (args: MessageUpdatedEventArgs) => this.emit('messageUpdated', args));\n conversation.on('messageRemoved', this.emit.bind(this, 'messageRemoved'));\n conversation.on('typingStarted', this.emit.bind(this, 'typingStarted'));\n conversation.on('typingEnded', this.emit.bind(this, 'typingEnded'));\n }\n}\n\nexport {\n ConversationsServices,\n ConversationsDataSource,\n Conversation,\n Conversations\n};\n"],"names":["Logger","ReplayEventEmitter","Deferred","conversation","Conversation","UriBuilder","isEqual"],"mappings":"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"}
|
package/dist/data/messages.js
CHANGED
@@ -216,7 +216,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
216
216
|
/**
|
217
217
|
* Send Message to the conversation, message could include both text and multiple media attachments.
|
218
218
|
* @param message Message to post
|
219
|
-
* @returns Returns promise which can fail
|
219
|
+
* @returns Returns a promise which can fail
|
220
220
|
*/
|
221
221
|
async sendV2(message) {
|
222
222
|
var _a;
|