@twilio/conversations 3.0.0-rc.9 → 3.0.1-rc.0
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/README.md +39 -29
- package/builds/browser.esm.js +10846 -0
- package/builds/browser.esm.js.map +1 -0
- package/builds/browser.js +2505 -479
- package/builds/browser.js.map +1 -1
- package/builds/lib.d.ts +805 -70
- package/builds/lib.esm.d.ts +3178 -0
- package/builds/lib.esm.js +10845 -0
- package/builds/lib.js +2505 -479
- package/builds/lib.js.map +1 -1
- package/builds/twilio-conversations.js +25853 -24412
- package/builds/twilio-conversations.js.map +1 -0
- package/builds/twilio-conversations.min.js +2 -1
- package/builds/twilio-conversations.min.js.map +1 -0
- package/dist/aggregated-delivery-receipt.js +10 -5
- package/dist/aggregated-delivery-receipt.js.map +1 -1
- package/dist/channel-metadata-client.js +187 -0
- package/dist/channel-metadata-client.js.map +1 -0
- package/dist/client.js +266 -192
- package/dist/client.js.map +1 -1
- package/dist/command-executor.js +53 -15
- package/dist/command-executor.js.map +1 -1
- package/dist/configuration.js +23 -12
- package/dist/configuration.js.map +1 -1
- package/dist/content-client.js +180 -0
- package/dist/content-client.js.map +1 -0
- package/dist/content-template.js +304 -0
- package/dist/content-template.js.map +1 -0
- package/dist/conversation.js +213 -134
- package/dist/conversation.js.map +1 -1
- package/dist/data/conversations.js +70 -50
- package/dist/data/conversations.js.map +1 -1
- package/dist/data/messages.js +40 -27
- package/dist/data/messages.js.map +1 -1
- package/dist/data/participants.js +38 -32
- package/dist/data/participants.js.map +1 -1
- package/dist/data/users.js +19 -14
- package/dist/data/users.js.map +1 -1
- package/dist/detailed-delivery-receipt.js +9 -4
- package/dist/detailed-delivery-receipt.js.map +1 -1
- package/dist/index.js +26 -41
- package/dist/index.js.map +1 -1
- package/dist/interfaces/notification-types.js +9 -4
- package/dist/interfaces/notification-types.js.map +1 -1
- package/dist/interfaces/rules.js +160 -0
- package/dist/interfaces/rules.js.map +1 -0
- package/dist/logger.js +17 -28
- package/dist/logger.js.map +1 -1
- package/dist/media.js +40 -24
- package/dist/media.js.map +1 -1
- package/dist/message-builder.js +79 -12
- package/dist/message-builder.js.map +1 -1
- package/dist/message-recipients-client.js +231 -0
- package/dist/message-recipients-client.js.map +1 -0
- package/dist/message.js +258 -92
- package/dist/message.js.map +1 -1
- package/dist/node_modules/quick-lru/index.js +261 -0
- package/dist/node_modules/quick-lru/index.js.map +1 -0
- package/dist/node_modules/tslib/tslib.es6.js +15 -5
- package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/packages/conversations/package.json.js +12 -7
- package/dist/packages/conversations/package.json.js.map +1 -1
- package/dist/participant.js +42 -38
- package/dist/participant.js.map +1 -1
- package/dist/push-notification.js +9 -4
- package/dist/push-notification.js.map +1 -1
- package/dist/rest-paginator.js +9 -4
- package/dist/rest-paginator.js.map +1 -1
- package/dist/services/network.js +11 -6
- package/dist/services/network.js.map +1 -1
- package/dist/services/typing-indicator.js +17 -11
- package/dist/services/typing-indicator.js.map +1 -1
- package/dist/unsent-message.js +14 -9
- package/dist/unsent-message.js.map +1 -1
- package/dist/user.js +40 -32
- package/dist/user.js.map +1 -1
- package/dist/util/deferred.js +9 -4
- package/dist/util/deferred.js.map +1 -1
- package/dist/util/index.js +44 -8
- package/dist/util/index.js.map +1 -1
- package/dist/{interfaces/attributes.js → utils/uuid.js} +17 -19
- package/dist/utils/uuid.js.map +1 -0
- package/package.json +21 -20
- package/CHANGELOG.md +0 -509
- package/dist/interfaces/attributes.js.map +0 -1
- package/docs/assets/css/main.css +0 -2660
- package/docs/assets/images/icons.png +0 -0
- package/docs/assets/images/icons@2x.png +0 -0
- package/docs/assets/images/widgets.png +0 -0
- package/docs/assets/images/widgets@2x.png +0 -0
- package/docs/assets/js/main.js +0 -248
- package/docs/assets/js/search.js +0 -1
- package/docs/classes/AggregatedDeliveryReceipt.html +0 -3184
- package/docs/classes/CancellablePromise.html +0 -3213
- package/docs/classes/Client.html +0 -4239
- package/docs/classes/Conversation.html +0 -4354
- package/docs/classes/DetailedDeliveryReceipt.html +0 -3163
- package/docs/classes/Media.html +0 -3167
- package/docs/classes/Message.html +0 -3732
- package/docs/classes/MessageBuilder.html +0 -3277
- package/docs/classes/Participant.html +0 -3444
- package/docs/classes/PushNotification.html +0 -3130
- package/docs/classes/RestPaginator.html +0 -3160
- package/docs/classes/UnsentMessage.html +0 -3042
- package/docs/classes/User.html +0 -3349
- package/docs/index.html +0 -3509
- package/docs/interfaces/ClientOptions.html +0 -3034
- package/docs/interfaces/ConversationBindings.html +0 -3001
- package/docs/interfaces/ConversationEmailBinding.html +0 -3001
- package/docs/interfaces/ConversationLimits.html +0 -3098
- package/docs/interfaces/ConversationState.html +0 -3050
- package/docs/interfaces/ConversationUpdatedEventArgs.html +0 -3001
- package/docs/interfaces/CreateConversationOptions.html +0 -3066
- package/docs/interfaces/LastMessage.html +0 -3050
- package/docs/interfaces/Paginator.html +0 -3141
- package/docs/interfaces/ParticipantBindings.html +0 -3001
- package/docs/interfaces/ParticipantEmailBinding.html +0 -3001
- package/docs/interfaces/PushNotificationData.html +0 -3114
- package/docs/interfaces/SendEmailOptions.html +0 -3034
- package/docs/interfaces/SendMediaOptions.html +0 -3068
- package/docs/modules.html +0 -3510
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversations.js","sources":["../../src/data/conversations.ts"],"sourcesContent":["import { Logger } from \"../logger\";\nimport {\n Conversation,\n ConversationDescriptor,\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 { CreateConversationRequest } from \"../interfaces/commands/create-conversation\";\nimport { ConversationResponse } from \"../interfaces/commands/conversation-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { ResponseMeta } from \"../interfaces/commands/response-meta\";\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\" | \"rest\";\n\ninterface ConversationsServices {\n syncClient: SyncClient;\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n commandExecutor: CommandExecutor;\n}\n\ntype ConversationRestData = {\n roster: string;\n notificationLevel: \"default\" | \"muted\";\n lastConsumedMessageIndex: number;\n channel: string;\n messages: string;\n descriptor: ConversationResponse;\n channel_sid: string;\n status: string;\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 =\n typeof options?.attributes !== \"undefined\" ? options.attributes : {};\n\n const response = await this.services.commandExecutor.mutateResource<\n CreateConversationRequest,\n ConversationResponse\n >(\"post\", this.configuration.links.conversations, {\n friendly_name: options.friendlyName,\n unique_name: options.uniqueName,\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\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: \"\",\n uniqueName: \"\",\n attributes: null,\n createdBy: \"\",\n friendlyName: \"\",\n lastConsumedMessageIndex: 0,\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: ConversationRestData[] =\n await this._fetchMyConversations();\n const upserts: Promise<Conversation | null>[] = [];\n\n for (const conversation of myConversations) {\n upserts.push(\n this._upsertConversation(\n \"rest\",\n conversation[\"channel_sid\"],\n conversation\n )\n );\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() {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems();\n\n return this._wrapPaginator(page, (items) =>\n Promise.all(\n items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n )\n )\n );\n }\n\n public async getConversation(\n sid: string\n ): Promise<Conversation | undefined | null> {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems({ key: sid });\n const items = page.items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n );\n\n return items.length > 0 ? items[0] : null;\n }\n\n public async getConversationByUniqueName(\n uniqueName: string\n ): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(uniqueName)\n .build();\n const response = await this.services.network.get<ConversationResponse>(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 sid ? this._upsertConversation(\"sync\", sid, data) : null;\n }\n\n public async peekConversation(sid: string): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(sid)\n .build();\n const response = await this.services.network.get<ConversationResponse>(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(\n source: ConversationsDataSource,\n conversation: Conversation,\n data\n ): Promise<void> {\n const areSourcesDifferent =\n conversation._statusSource !== undefined &&\n source !== conversation._statusSource;\n const isChannelSourceSync =\n source !== \"rest\" || conversation._statusSource === \"sync\";\n\n if (areSourcesDifferent && isChannelSourceSync && source !== \"sync\") {\n log.trace(\n \"upsertConversation: conversation is known from sync and came from REST, ignoring\",\n {\n sid: conversation.sid,\n data: data.status,\n conversation: conversation.status,\n }\n );\n\n return;\n }\n\n if (data.status === \"joined\" && conversation.status !== \"joined\") {\n conversation._setStatus(\"joined\", source);\n\n const updateData: Partial<ConversationDescriptor> = {};\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 await conversation._subscribe();\n this.emit(\"conversationJoined\", conversation);\n\n return;\n }\n\n if (\n data.status === \"notParticipating\" &&\n conversation.status === \"joined\"\n ) {\n conversation._setStatus(\"notParticipating\", source);\n conversation._update(data);\n\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(\n source: ConversationsDataSource,\n sid: string,\n data\n ): Promise<Conversation | null> {\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 (source === \"rest\" && this.tombstones.has(sid)) {\n log.trace(\n \"upsertChannel: the channel is deleted but reappeared again from REST, ignoring\",\n sid\n );\n return null;\n }\n\n // If the conversation is unknown, fetch it\n log.trace(\n \"upsertConversation: creating a local conversation object with sid \" +\n sid,\n data\n );\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 private async _fetchMyConversations(): Promise<ConversationRestData[]> {\n let conversations: ConversationRestData[] = [];\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<\n { conversations: ConversationResponse[] } & ResponseMeta\n >(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:\n 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\", () =>\n this._onConversationRemoved(conversation.sid)\n );\n conversation.on(\"updated\", (args: ConversationUpdatedEventArgs) =>\n this.emit(\"conversationUpdated\", args)\n );\n conversation.on(\"participantJoined\", (participant) =>\n this.emit(\"participantJoined\", participant)\n );\n conversation.on(\"participantLeft\", (participant) =>\n this.emit(\"participantLeft\", participant)\n );\n conversation.on(\"participantUpdated\", (args: ParticipantUpdatedEventArgs) =>\n this.emit(\"participantUpdated\", args)\n );\n conversation.on(\"messageAdded\", (message) =>\n this.emit(\"messageAdded\", message)\n );\n conversation.on(\"messageUpdated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n conversation.on(\"messageRemoved\", (message) =>\n this.emit(\"messageRemoved\", message)\n );\n conversation.on(\"typingStarted\", (participant) =>\n this.emit(\"typingStarted\", participant)\n );\n conversation.on(\"typingEnded\", (participant) =>\n this.emit(\"typingEnded\", participant)\n );\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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"}
|
|
1
|
+
{"version":3,"file":"conversations.js","sources":["../../src/data/conversations.ts"],"sourcesContent":["import { Logger } from \"../logger\";\nimport {\n Conversation,\n ConversationDescriptor,\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 { CreateConversationRequest } from \"../interfaces/commands/create-conversation\";\nimport { ConversationResponse } from \"../interfaces/commands/conversation-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { isEqual } from \"../util\";\nimport { ResponseMeta } from \"../interfaces/commands/response-meta\";\nimport { ChannelMetadataClient } from \"../channel-metadata-client\";\nimport { MessageRecipientsClient } from \"../message-recipients-client\";\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\" | \"rest\";\n\ninterface ConversationsServices {\n syncClient: SyncClient;\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n commandExecutor: CommandExecutor;\n channelMetadataClient: ChannelMetadataClient;\n messageRecipientsClient: MessageRecipientsClient;\n}\n\ntype ConversationRestData = {\n roster: string;\n notificationLevel: \"default\" | \"muted\";\n lastConsumedMessageIndex: number;\n channel: string;\n messages: string;\n descriptor: ConversationResponse;\n channel_sid: string;\n status: string;\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 =\n typeof options?.attributes !== \"undefined\" ? options.attributes : {};\n\n const response = await this.services.commandExecutor.mutateResource<\n CreateConversationRequest,\n ConversationResponse\n >(\"post\", this.configuration.links.conversations, {\n friendly_name: options.friendlyName,\n unique_name: options.uniqueName,\n access: options.access,\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\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: \"\",\n uniqueName: \"\",\n attributes: null,\n createdBy: \"\",\n friendlyName: \"\",\n lastConsumedMessageIndex: 0,\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(SyncMap.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(SyncMap.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(SyncMap.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: ConversationRestData[] =\n await this._fetchMyConversations();\n const upserts: Promise<Conversation | null>[] = [];\n\n for (const conversation of myConversations) {\n upserts.push(\n this._upsertConversation(\n \"rest\",\n conversation[\"channel_sid\"],\n conversation\n )\n );\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() {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems();\n\n return this._wrapPaginator(page, (items) =>\n Promise.all(\n items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n )\n )\n );\n }\n\n public async getConversation(\n sid: string\n ): Promise<Conversation | undefined | null> {\n const conversationsMap = await this._getMap();\n\n const page = await conversationsMap.getItems({ key: sid });\n const items = page.items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n );\n\n return items.length > 0 ? items[0] : null;\n }\n\n public async getConversationByUniqueName(\n uniqueName: string\n ): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(uniqueName)\n .build();\n const response = await this.services.network.get<ConversationResponse>(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 roster: body.sync_objects.participants,\n messages: body.sync_objects.messages,\n notificationLevel: body?.notification_level,\n sid,\n };\n\n return sid ? this._upsertConversation(\"sync\", sid, data) : null;\n }\n\n public async peekConversation(sid: string): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(sid)\n .build();\n const response = await this.services.network.get<ConversationResponse>(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: body.sync_objects.conversation || `${sid}.channel`,\n roster: body.sync_objects.participants,\n messages: body.sync_objects.messages,\n notificationLevel: body?.notification_level,\n sid,\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: items.filter((item) => item !== null),\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(\n source: ConversationsDataSource,\n conversation: Conversation,\n data\n ): Promise<void> {\n const areSourcesDifferent =\n conversation._statusSource !== undefined &&\n source !== conversation._statusSource;\n const isChannelSourceSync =\n source !== \"rest\" || conversation._statusSource === \"sync\";\n\n if (areSourcesDifferent && isChannelSourceSync && source !== \"sync\") {\n log.trace(\n \"upsertConversation: conversation is known from sync and came from REST, ignoring\",\n {\n sid: conversation.sid,\n data: data.status,\n conversation: conversation.status,\n }\n );\n\n return;\n }\n\n if (data.status === \"joined\" && conversation.status !== \"joined\") {\n conversation._setStatus(\"joined\", source);\n\n const updateData: Partial<ConversationDescriptor> = {};\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 await conversation._subscribe();\n this.emit(\"conversationJoined\", conversation);\n\n return;\n }\n\n if (\n data.status === \"notParticipating\" &&\n conversation.status === \"joined\"\n ) {\n conversation._setStatus(\"notParticipating\", source);\n conversation._update(data);\n\n await conversation._subscribe();\n this.emit(\"conversationLeft\", conversation);\n\n return;\n }\n\n if (data.status === \"notParticipating\") {\n await conversation._subscribe(); // why do we subscribe if we just left it??\n\n return;\n }\n\n conversation._update(data);\n }\n\n private async _upsertConversation(\n source: ConversationsDataSource,\n sid: string,\n data\n ): Promise<Conversation | null> {\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 (source === \"rest\" && this.tombstones.has(sid)) {\n log.trace(\n \"upsertChannel: the conversation is deleted but reappeared again from REST, ignoring\",\n sid\n );\n return null;\n }\n\n // If the conversation is unknown, fetch it\n log.trace(\n \"upsertConversation: creating a local conversation object with sid \" +\n sid,\n data\n );\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\n this.conversations.set(sid, newConversation);\n\n try {\n await newConversation._subscribe();\n\n if (data.status === \"joined\") {\n await newConversation._fetchStreams();\n }\n } catch (error) {\n if (error.name !== \"SyncError\") {\n throw error;\n }\n\n log.trace(\n \"upsertChannel: the conversation is missing some Sync entity(ies), ignoring\",\n sid,\n error\n );\n\n this.conversations.delete(sid);\n return null;\n }\n\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(): Promise<ConversationRestData[]> {\n let conversations: ConversationRestData[] = [];\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<\n { conversations: ConversationResponse[] } & ResponseMeta\n >(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:\n conversationDescriptor.sync_objects.participants ||\n `${conversationDescriptor.conversation_sid}.roster`,\n lastConsumedMessageIndex:\n 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\", () =>\n this._onConversationRemoved(conversation.sid)\n );\n conversation.on(\"updated\", (args: ConversationUpdatedEventArgs) =>\n this.emit(\"conversationUpdated\", args)\n );\n conversation.on(\"participantJoined\", (participant) =>\n this.emit(\"participantJoined\", participant)\n );\n conversation.on(\"participantLeft\", (participant) =>\n this.emit(\"participantLeft\", participant)\n );\n conversation.on(\"participantUpdated\", (args: ParticipantUpdatedEventArgs) =>\n this.emit(\"participantUpdated\", args)\n );\n conversation.on(\"messageAdded\", (message) =>\n this.emit(\"messageAdded\", message)\n );\n conversation.on(\"messageUpdated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n conversation.on(\"messageRemoved\", (message) =>\n this.emit(\"messageRemoved\", message)\n );\n conversation.on(\"typingStarted\", (participant) =>\n this.emit(\"typingStarted\", participant)\n );\n conversation.on(\"typingEnded\", (participant) =>\n this.emit(\"typingEnded\", participant)\n );\n }\n}\n\nexport {\n ConversationsServices,\n ConversationsDataSource,\n Conversation,\n Conversations,\n};\n"],"names":[],"mappings":"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"}
|
package/dist/data/messages.js
CHANGED
|
@@ -126,20 +126,25 @@ This software includes platform.js under the following license.
|
|
|
126
126
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
127
127
|
|
|
128
128
|
*/
|
|
129
|
-
|
|
129
|
+
var global =
|
|
130
|
+
typeof global !== "undefined"
|
|
131
|
+
? global
|
|
132
|
+
: typeof self !== "undefined"
|
|
133
|
+
? self
|
|
134
|
+
: typeof window !== "undefined"
|
|
135
|
+
? window
|
|
136
|
+
: {};
|
|
130
137
|
|
|
131
|
-
|
|
138
|
+
import { Logger } from '../logger.js';
|
|
139
|
+
import { Message } from '../message.js';
|
|
140
|
+
import { CancellablePromise } from '@twilio/mcs-client';
|
|
141
|
+
import { ReplayEventEmitter } from '@twilio/replay-event-emitter';
|
|
132
142
|
|
|
133
|
-
|
|
134
|
-
var message = require('../message.js');
|
|
135
|
-
var mcsClient = require('@twilio/mcs-client');
|
|
136
|
-
var replayEventEmitter = require('@twilio/replay-event-emitter');
|
|
137
|
-
|
|
138
|
-
const log = logger.Logger.scope("Messages");
|
|
143
|
+
const log = Logger.scope("Messages");
|
|
139
144
|
/**
|
|
140
145
|
* Represents the collection of messages in a conversation
|
|
141
146
|
*/
|
|
142
|
-
class Messages extends
|
|
147
|
+
class Messages extends ReplayEventEmitter {
|
|
143
148
|
constructor(conversation, configuration, services) {
|
|
144
149
|
super();
|
|
145
150
|
this.conversation = conversation;
|
|
@@ -150,16 +155,20 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
|
150
155
|
}
|
|
151
156
|
/**
|
|
152
157
|
* Subscribe to the Messages Event Stream
|
|
153
|
-
* @param
|
|
158
|
+
* @param arg - Name of the Sync object, or the SyncList itself, that
|
|
159
|
+
* represents the Messages resource.
|
|
154
160
|
*/
|
|
155
|
-
async subscribe(
|
|
161
|
+
async subscribe(arg) {
|
|
156
162
|
if (this.messagesListPromise) {
|
|
157
163
|
return this.messagesListPromise;
|
|
158
164
|
}
|
|
159
|
-
this.messagesListPromise =
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
165
|
+
this.messagesListPromise =
|
|
166
|
+
typeof arg === "string"
|
|
167
|
+
? this.services.syncClient.list({
|
|
168
|
+
id: arg,
|
|
169
|
+
mode: "open_existing",
|
|
170
|
+
})
|
|
171
|
+
: Promise.resolve(arg);
|
|
163
172
|
try {
|
|
164
173
|
const list = await this.messagesListPromise;
|
|
165
174
|
list.on("itemAdded", (args) => {
|
|
@@ -169,14 +178,14 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
|
169
178
|
conversation: this.conversation._links.self,
|
|
170
179
|
messages_receipts: `${this.conversation._links.messages}/${args.item.data.sid}/Receipts`,
|
|
171
180
|
};
|
|
172
|
-
const message
|
|
173
|
-
if (this.messagesByIndex.has(message
|
|
174
|
-
log.debug("Message arrived, but is already known and ignored", this.conversation.sid, message
|
|
181
|
+
const message = new Message(args.item.index, args.item.data, this.conversation, links, this.configuration, this.services);
|
|
182
|
+
if (this.messagesByIndex.has(message.index)) {
|
|
183
|
+
log.debug("Message arrived, but is already known and ignored", this.conversation.sid, message.index);
|
|
175
184
|
return;
|
|
176
185
|
}
|
|
177
|
-
this.messagesByIndex.set(message
|
|
178
|
-
message
|
|
179
|
-
this.emit("messageAdded", message
|
|
186
|
+
this.messagesByIndex.set(message.index, message);
|
|
187
|
+
message.on("updated", (args) => this.emit("messageUpdated", args));
|
|
188
|
+
this.emit("messageAdded", message);
|
|
180
189
|
});
|
|
181
190
|
list.on("itemRemoved", (args) => {
|
|
182
191
|
log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);
|
|
@@ -223,7 +232,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
|
223
232
|
*/
|
|
224
233
|
sendV2(message) {
|
|
225
234
|
log.debug("Sending message V2", message.mediaContent, message.attributes, message.emailOptions);
|
|
226
|
-
return new
|
|
235
|
+
return new CancellablePromise(async (resolve, reject, onCancel) => {
|
|
227
236
|
var _a, _b, _c;
|
|
228
237
|
const media = [];
|
|
229
238
|
const requests = [];
|
|
@@ -251,6 +260,10 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
|
251
260
|
attributes: typeof message.attributes !== "undefined"
|
|
252
261
|
? JSON.stringify(message.attributes)
|
|
253
262
|
: undefined,
|
|
263
|
+
content_sid: message.contentSid,
|
|
264
|
+
content_variables: typeof message.contentVariables !== "undefined"
|
|
265
|
+
? JSON.stringify(message.contentVariables.reduce((accum, current) => (Object.assign(Object.assign({}, accum), { [current.name]: current.value })), {}))
|
|
266
|
+
: undefined,
|
|
254
267
|
});
|
|
255
268
|
try {
|
|
256
269
|
resolve(await messagesPostRequest);
|
|
@@ -335,10 +348,10 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
|
335
348
|
conversation: this.conversation._links.self,
|
|
336
349
|
messages_receipts: `${this.conversation._links.messages}/${value.sid}/Receipts`,
|
|
337
350
|
};
|
|
338
|
-
const message
|
|
339
|
-
this.messagesByIndex.set(message
|
|
340
|
-
message
|
|
341
|
-
return message
|
|
351
|
+
const message = new Message(index, value, this.conversation, links, this.configuration, this.services);
|
|
352
|
+
this.messagesByIndex.set(message.index, message);
|
|
353
|
+
message.on("updated", (args) => this.emit("messageUpdated", args));
|
|
354
|
+
return message;
|
|
342
355
|
}
|
|
343
356
|
/**
|
|
344
357
|
* Returns last messages from conversation
|
|
@@ -361,5 +374,5 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
|
|
|
361
374
|
}
|
|
362
375
|
}
|
|
363
376
|
|
|
364
|
-
|
|
377
|
+
export { Messages };
|
|
365
378
|
//# sourceMappingURL=messages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sources":["../../src/data/messages.ts"],"sourcesContent":["import { Logger } from \"../logger\";\n\nimport {\n Message,\n MessageData,\n MessageUpdatedEventArgs,\n MessageUpdateReason,\n} from \"../message\";\nimport {\n Conversation,\n SendEmailOptions,\n SendMediaOptions,\n} from \"../conversation\";\nimport { UnsentMessage } from \"../unsent-message\";\n\nimport { SyncList, SyncClient } from \"twilio-sync\";\nimport { SyncPaginator } from \"../sync-paginator\";\n\nimport { McsClient, McsMedia, CancellablePromise } from \"@twilio/mcs-client\";\nimport { Network } from \"../services/network\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { SendMessageRequest } from \"../interfaces/commands/send-message\";\nimport { MessageResponse } from \"../interfaces/commands/message-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { JSONValue } from \"../types\";\n\ntype MessagesEvents = {\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Messages\");\n\nexport interface MessagesServices {\n mcsClient: McsClient;\n network: Network;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n}\n\n/**\n * Represents the collection of messages in a conversation\n */\nclass Messages extends ReplayEventEmitter<MessagesEvents> {\n public readonly conversation: Conversation;\n private readonly configuration: Configuration;\n private readonly services: MessagesServices;\n private readonly messagesByIndex: Map<number, Message>;\n private messagesListPromise: Promise<SyncList> | null;\n\n public constructor(\n conversation: Conversation,\n configuration: Configuration,\n services: MessagesServices\n ) {\n super();\n\n this.conversation = conversation;\n this.configuration = configuration;\n this.services = services;\n\n this.messagesByIndex = new Map();\n this.messagesListPromise = null;\n }\n\n /**\n * Subscribe to the Messages Event Stream\n * @param name - The name of Sync object for the Messages resource.\n */\n public async subscribe(name: string) {\n if (this.messagesListPromise) {\n return this.messagesListPromise;\n }\n\n this.messagesListPromise = this.services.syncClient.list({\n id: name,\n mode: \"open_existing\",\n });\n\n try {\n const list = await this.messagesListPromise;\n\n list.on(\"itemAdded\", (args) => {\n log.debug(`${this.conversation.sid} itemAdded: ${args.item.index}`);\n\n const links = {\n self: `${this.conversation._links.messages}/${args.item.data.sid}`,\n conversation: this.conversation._links.self,\n messages_receipts: `${this.conversation._links.messages}/${args.item.data.sid}/Receipts`,\n };\n const message = new Message(\n args.item.index,\n args.item.data,\n this.conversation,\n links,\n this.configuration,\n this.services\n );\n\n if (this.messagesByIndex.has(message.index)) {\n log.debug(\n \"Message arrived, but is already known and ignored\",\n this.conversation.sid,\n message.index\n );\n return;\n }\n\n this.messagesByIndex.set(message.index, message);\n\n message.on(\"updated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n\n this.emit(\"messageAdded\", message);\n });\n\n list.on(\"itemRemoved\", (args) => {\n log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);\n\n const index = args.index;\n\n if (this.messagesByIndex.has(index)) {\n const message = this.messagesByIndex.get(index);\n if (!message) {\n return;\n }\n\n this.messagesByIndex.delete(message.index);\n message.removeAllListeners(\"updated\");\n this.emit(\"messageRemoved\", message);\n }\n });\n\n list.on(\"itemUpdated\", (args) => {\n log.debug(`${this.conversation.sid} itemUpdated: ${args.item.index}`);\n\n const message = this.messagesByIndex.get(args.item.index);\n\n if (message) {\n message._update(args.item.data);\n }\n });\n\n return list;\n } catch (err) {\n this.messagesListPromise = null;\n\n if (this.services.syncClient.connectionState !== \"disconnected\") {\n log.error(\n \"Failed to get messages object for conversation\",\n this.conversation.sid,\n err\n );\n }\n\n log.debug(\n \"ERROR: Failed to get messages object for conversation\",\n this.conversation.sid,\n err\n );\n\n throw err;\n }\n }\n\n public async unsubscribe() {\n if (!this.messagesListPromise) {\n return;\n }\n\n const entity = await this.messagesListPromise;\n entity.close();\n this.messagesListPromise = null;\n }\n\n /**\n * Send a message to the conversation. The message could include text and multiple media attachments.\n * @param message Message to post\n */\n public sendV2(message: UnsentMessage): CancellablePromise<MessageResponse> {\n log.debug(\n \"Sending message V2\",\n message.mediaContent,\n message.attributes,\n message.emailOptions\n );\n\n return new CancellablePromise(async (resolve, reject, onCancel) => {\n const media: McsMedia[] = [];\n const requests: CancellablePromise<McsMedia>[] = [];\n\n onCancel(() => {\n requests.forEach((request) => request.cancel());\n });\n\n for (const [category, mediaContent] of message.mediaContent) {\n try {\n log.debug(\n `Adding media to a message as ${\n mediaContent instanceof FormData ? \"FormData\" : \"SendMediaOptions\"\n }`,\n mediaContent\n );\n\n const request =\n mediaContent instanceof FormData\n ? this.services.mcsClient.postFormData(mediaContent, category)\n : this.services.mcsClient.post(\n mediaContent.contentType ?? \"\",\n mediaContent.media ?? \"\",\n category,\n mediaContent.filename\n );\n\n requests.push(request);\n\n media.push(await request);\n } catch (e) {\n reject(e);\n return;\n }\n }\n\n const messagesPostRequest = this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n body: message.text,\n subject: message.emailOptions?.subject,\n media_sids: media.map((m) => m.sid),\n attributes:\n typeof message.attributes !== \"undefined\"\n ? JSON.stringify(message.attributes)\n : undefined,\n });\n\n try {\n resolve(await messagesPostRequest);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Send Message to the conversation\n * @param message Message to post\n * @param attributes Message attributes\n * @param emailOptions Options that modify E-mail integration behaviors.\n * @returns Returns promise which can fail\n */\n public async send(\n message: null | string | FormData | SendMediaOptions,\n attributes: JSONValue = {},\n emailOptions?: SendEmailOptions\n ): Promise<MessageResponse> {\n log.debug(\"Sending text message\", message, attributes, emailOptions);\n\n return this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n body: message ?? \"\",\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n subject: emailOptions?.subject,\n });\n }\n\n /**\n * Send Media Message to the conversation\n * @param mediaContent Media content to post\n * @param attributes Message attributes\n * @param emailOptions Email options\n * @returns Returns promise which can fail\n */\n public async sendMedia(\n mediaContent: FormData | SendMediaOptions,\n attributes: JSONValue = {},\n emailOptions?: SendEmailOptions\n ) {\n log.debug(\"Sending media message\", mediaContent, attributes, emailOptions);\n log.debug(\n `Sending media message as ${\n mediaContent instanceof FormData ? \"FormData\" : \"SendMediaOptions\"\n }`,\n mediaContent,\n attributes\n );\n\n const media: McsMedia =\n mediaContent instanceof FormData\n ? await this.services.mcsClient.postFormData(mediaContent)\n : await this.services.mcsClient.post(\n mediaContent.contentType ?? \"\",\n mediaContent.media ?? \"\",\n \"media\",\n mediaContent.filename\n );\n\n // emailOptions are currently ignored for media messages.\n return await this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n media_sids: [media.sid],\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n }\n\n /**\n * Returns messages from conversation using paginator interface\n * @param pageSize Number of messages to return in single chunk. By default it's 30.\n * @param anchor Most early message id which is already known, or 'end' by default\n * @param direction Pagination order 'backwards' or 'forward', 'forward' by default\n * @returns Last page of messages by default\n */\n public async getMessages(\n pageSize: number | undefined,\n anchor: number | \"end\" | undefined,\n direction: \"forward\" | \"backwards\" = \"backwards\"\n ): Promise<SyncPaginator<Message>> {\n return this._getMessages(pageSize, anchor, direction);\n }\n\n private _wrapPaginator(order, page, op) {\n // Due to an inconsistency between Sync and Chat conventions, next and\n // previous pages should be swapped.\n const shouldReverse = order === \"desc\";\n\n const nextPage = () =>\n page.nextPage().then((page) => this._wrapPaginator(order, page, op));\n const previousPage = () =>\n page.prevPage().then((page) => this._wrapPaginator(order, page, op));\n\n return op(page.items).then((items) => ({\n items: items.sort((x, y) => {\n return x.index - y.index;\n }),\n hasPrevPage: shouldReverse ? page.hasNextPage : page.hasPrevPage,\n hasNextPage: shouldReverse ? page.hasPrevPage : page.hasNextPage,\n prevPage: shouldReverse ? nextPage : previousPage,\n nextPage: shouldReverse ? previousPage : nextPage,\n }));\n }\n\n private _upsertMessage(index: number, value: MessageData) {\n const cachedMessage = this.messagesByIndex.get(index);\n\n if (cachedMessage) {\n return cachedMessage;\n }\n\n const links = {\n self: `${this.conversation._links.messages}/${value.sid}`,\n conversation: this.conversation._links.self,\n messages_receipts: `${this.conversation._links.messages}/${value.sid}/Receipts`,\n };\n const message = new Message(\n index,\n value,\n this.conversation,\n links,\n this.configuration,\n this.services\n );\n\n this.messagesByIndex.set(message.index, message);\n\n message.on(\"updated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n\n return message;\n }\n\n /**\n * Returns last messages from conversation\n * @param {Number} [pageSize] Number of messages to return in single chunk. By default it's 30.\n * @param {String} [anchor] Most early message id which is already known, or 'end' by default\n * @param {String} [direction] Pagination order 'backwards' or 'forward', or 'forward' by default\n * @returns {Promise<SyncPaginator<Message>>} last page of messages by default\n * @private\n */\n private async _getMessages(\n pageSize = 30,\n anchor: number | \"end\" = \"end\",\n direction: \"forward\" | \"backwards\" = \"forward\"\n ): Promise<SyncPaginator<Message>> {\n const order = direction === \"backwards\" ? \"desc\" : \"asc\";\n const list = await this.messagesListPromise;\n const page = await list?.getItems({\n from: anchor !== \"end\" ? anchor : void 0,\n pageSize,\n order,\n limit: pageSize, // @todo Limit equals pageSize by default in Sync. This is probably not ideal.\n });\n\n return await this._wrapPaginator(order, page, (items) =>\n Promise.all(\n items.map((item) => this._upsertMessage(item.index, item.data))\n )\n );\n }\n}\n\nexport { Messages };\n"],"names":["Logger","ReplayEventEmitter","message","Message","CancellablePromise"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,GAAG,GAAGA,aAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;AASrC;;AAEG;AACH,MAAM,QAAS,SAAQC,qCAAkC,CAAA;AAOvD,IAAA,WAAA,CACE,YAA0B,EAC1B,aAA4B,EAC5B,QAA0B,EAAA;AAE1B,QAAA,KAAK,EAAE,CAAC;AAER,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAEzB,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KACjC;AAED;;;AAGG;IACI,MAAM,SAAS,CAAC,IAAY,EAAA;QACjC,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC;AACjC,SAAA;QAED,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;AACvD,YAAA,EAAE,EAAE,IAAI;AACR,YAAA,IAAI,EAAE,eAAe;AACtB,SAAA,CAAC,CAAC;QAEH,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YAE5C,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,KAAI;AAC5B,gBAAA,GAAG,CAAC,KAAK,CAAC,CAAG,EAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAA,YAAA,EAAe,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC;AAEpE,gBAAA,MAAM,KAAK,GAAG;AACZ,oBAAA,IAAI,EAAE,CAAG,EAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAA;AAClE,oBAAA,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI;AAC3C,oBAAA,iBAAiB,EAAE,CAAG,EAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAW,SAAA,CAAA;iBACzF,CAAC;AACF,gBAAA,MAAMC,SAAO,GAAG,IAAIC,eAAO,CACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EACf,IAAI,CAAC,IAAI,CAAC,IAAI,EACd,IAAI,CAAC,YAAY,EACjB,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,CACd,CAAC;gBAEF,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAACD,SAAO,CAAC,KAAK,CAAC,EAAE;AAC3C,oBAAA,GAAG,CAAC,KAAK,CACP,mDAAmD,EACnD,IAAI,CAAC,YAAY,CAAC,GAAG,EACrBA,SAAO,CAAC,KAAK,CACd,CAAC;oBACF,OAAO;AACR,iBAAA;gBAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAACA,SAAO,CAAC,KAAK,EAAEA,SAAO,CAAC,CAAC;AAEjD,gBAAAA,SAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAA6B,KAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAClC,CAAC;AAEF,gBAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAEA,SAAO,CAAC,CAAC;AACrC,aAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,KAAI;gBAC9B,GAAG,CAAC,KAAK,CAAC,CAAA,sCAAA,EAAyC,IAAI,CAAC,KAAK,CAAE,CAAA,CAAC,CAAC;AAEjE,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBAEzB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;oBACnC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAChD,IAAI,CAAC,OAAO,EAAE;wBACZ,OAAO;AACR,qBAAA;oBAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC3C,oBAAA,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACtC,oBAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;AACtC,iBAAA;AACH,aAAC,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,KAAI;AAC9B,gBAAA,GAAG,CAAC,KAAK,CAAC,CAAG,EAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAA,cAAA,EAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC;AAEtE,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAE1D,gBAAA,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,iBAAA;AACH,aAAC,CAAC,CAAC;AAEH,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAAC,QAAA,OAAO,GAAG,EAAE;AACZ,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAEhC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,KAAK,cAAc,EAAE;AAC/D,gBAAA,GAAG,CAAC,KAAK,CACP,gDAAgD,EAChD,IAAI,CAAC,YAAY,CAAC,GAAG,EACrB,GAAG,CACJ,CAAC;AACH,aAAA;AAED,YAAA,GAAG,CAAC,KAAK,CACP,uDAAuD,EACvD,IAAI,CAAC,YAAY,CAAC,GAAG,EACrB,GAAG,CACJ,CAAC;AAEF,YAAA,MAAM,GAAG,CAAC;AACX,SAAA;KACF;AAEM,IAAA,MAAM,WAAW,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,OAAO;AACR,SAAA;AAED,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;QAC9C,MAAM,CAAC,KAAK,EAAE,CAAC;AACf,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;KACjC;AAED;;;AAGG;AACI,IAAA,MAAM,CAAC,OAAsB,EAAA;AAClC,QAAA,GAAG,CAAC,KAAK,CACP,oBAAoB,EACpB,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,UAAU,EAClB,OAAO,CAAC,YAAY,CACrB,CAAC;QAEF,OAAO,IAAIE,4BAAkB,CAAC,OAAO,OAAO,EAAE,MAAM,EAAE,QAAQ,KAAI;;YAChE,MAAM,KAAK,GAAe,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAmC,EAAE,CAAC;YAEpD,QAAQ,CAAC,MAAK;AACZ,gBAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAClD,aAAC,CAAC,CAAC;YAEH,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE;gBAC3D,IAAI;AACF,oBAAA,GAAG,CAAC,KAAK,CACP,gCACE,YAAY,YAAY,QAAQ,GAAG,UAAU,GAAG,kBAClD,EAAE,EACF,YAAY,CACb,CAAC;AAEF,oBAAA,MAAM,OAAO,GACX,YAAY,YAAY,QAAQ;AAC9B,0BAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC;AAC9D,0BAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAC1B,CAAA,EAAA,GAAA,YAAY,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,EAC9B,CAAA,EAAA,GAAA,YAAY,CAAC,KAAK,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,EACxB,QAAQ,EACR,YAAY,CAAC,QAAQ,CACtB,CAAC;AAER,oBAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEvB,oBAAA,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAC3B,iBAAA;AAAC,gBAAA,OAAO,CAAC,EAAE;oBACV,MAAM,CAAC,CAAC,CAAC,CAAC;oBACV,OAAO;AACR,iBAAA;AACF,aAAA;AAED,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAGtE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;gBAC3C,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,gBAAA,OAAO,EAAE,CAAA,EAAA,GAAA,OAAO,CAAC,YAAY,0CAAE,OAAO;AACtC,gBAAA,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;AACnC,gBAAA,UAAU,EACR,OAAO,OAAO,CAAC,UAAU,KAAK,WAAW;sBACrC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;AACpC,sBAAE,SAAS;AAChB,aAAA,CAAC,CAAC;YAEH,IAAI;AACF,gBAAA,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;AACpC,aAAA;AAAC,YAAA,OAAO,CAAC,EAAE;gBACV,MAAM,CAAC,CAAC,CAAC,CAAC;AACX,aAAA;AACH,SAAC,CAAC,CAAC;KACJ;AAED;;;;;;AAMG;IACI,MAAM,IAAI,CACf,OAAoD,EACpD,UAAwB,GAAA,EAAE,EAC1B,YAA+B,EAAA;QAE/B,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAErE,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAGjD,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;AAC3C,YAAA,IAAI,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,OAAO,GAAI,EAAE;AACnB,YAAA,UAAU,EACR,OAAO,UAAU,KAAK,WAAW;AAC/B,kBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5B,kBAAE,SAAS;AACf,YAAA,OAAO,EAAE,YAAY,KAAA,IAAA,IAAZ,YAAY,KAAZ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,YAAY,CAAE,OAAO;AAC/B,SAAA,CAAC,CAAC;KACJ;AAED;;;;;;AAMG;IACI,MAAM,SAAS,CACpB,YAAyC,EACzC,UAAwB,GAAA,EAAE,EAC1B,YAA+B,EAAA;;QAE/B,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAC3E,GAAG,CAAC,KAAK,CACP,CAAA,yBAAA,EACE,YAAY,YAAY,QAAQ,GAAG,UAAU,GAAG,kBAClD,CAAA,CAAE,EACF,YAAY,EACZ,UAAU,CACX,CAAC;AAEF,QAAA,MAAM,KAAK,GACT,YAAY,YAAY,QAAQ;cAC5B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;AAC1D,cAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAChC,CAAA,EAAA,GAAA,YAAY,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,EAC9B,CAAA,EAAA,GAAA,YAAY,CAAC,KAAK,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,EACxB,OAAO,EACP,YAAY,CAAC,QAAQ,CACtB,CAAC;;AAGR,QAAA,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAGvD,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE;AAC3C,YAAA,UAAU,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;AACvB,YAAA,UAAU,EACR,OAAO,UAAU,KAAK,WAAW;AAC/B,kBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5B,kBAAE,SAAS;AAChB,SAAA,CAAC,CAAC;KACJ;AAED;;;;;;AAMG;IACI,MAAM,WAAW,CACtB,QAA4B,EAC5B,MAAkC,EAClC,YAAqC,WAAW,EAAA;QAEhD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;KACvD;AAEO,IAAA,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAA;;;AAGpC,QAAA,MAAM,aAAa,GAAG,KAAK,KAAK,MAAM,CAAC;AAEvC,QAAA,MAAM,QAAQ,GAAG,MACf,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACvE,QAAA,MAAM,YAAY,GAAG,MACnB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvE,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM;YACrC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACzB,gBAAA,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAC3B,aAAC,CAAC;AACF,YAAA,WAAW,EAAE,aAAa,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AAChE,YAAA,WAAW,EAAE,aAAa,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;YAChE,QAAQ,EAAE,aAAa,GAAG,QAAQ,GAAG,YAAY;YACjD,QAAQ,EAAE,aAAa,GAAG,YAAY,GAAG,QAAQ;AAClD,SAAA,CAAC,CAAC,CAAC;KACL;IAEO,cAAc,CAAC,KAAa,EAAE,KAAkB,EAAA;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEtD,QAAA,IAAI,aAAa,EAAE;AACjB,YAAA,OAAO,aAAa,CAAC;AACtB,SAAA;AAED,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAE,CAAA;AACzD,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI;AAC3C,YAAA,iBAAiB,EAAE,CAAA,EAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAW,SAAA,CAAA;SAChF,CAAC;QACF,MAAMF,SAAO,GAAG,IAAIC,eAAO,CACzB,KAAK,EACL,KAAK,EACL,IAAI,CAAC,YAAY,EACjB,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,CACd,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,GAAG,CAACD,SAAO,CAAC,KAAK,EAAEA,SAAO,CAAC,CAAC;AAEjD,QAAAA,SAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAA6B,KAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAClC,CAAC;AAEF,QAAA,OAAOA,SAAO,CAAC;KAChB;AAED;;;;;;;AAOG;IACK,MAAM,YAAY,CACxB,QAAQ,GAAG,EAAE,EACb,MAAyB,GAAA,KAAK,EAC9B,SAAA,GAAqC,SAAS,EAAA;AAE9C,QAAA,MAAM,KAAK,GAAG,SAAS,KAAK,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC;AACzD,QAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAM,IAAI,KAAJ,IAAA,IAAA,IAAI,KAAJ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,IAAI,CAAE,QAAQ,CAAC;AAChC,YAAA,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;YACxC,QAAQ;YACR,KAAK;YACL,KAAK,EAAE,QAAQ;AAChB,SAAA,CAAC,CAAA,CAAC;AAEH,QAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,KAClD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAChE,CACF,CAAC;KACH;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"messages.js","sources":["../../src/data/messages.ts"],"sourcesContent":["import { Logger } from \"../logger\";\n\nimport {\n Message,\n MessageData,\n MessageUpdatedEventArgs,\n MessageUpdateReason,\n} from \"../message\";\nimport {\n Conversation,\n SendEmailOptions,\n SendMediaOptions,\n} from \"../conversation\";\nimport { UnsentMessage } from \"../unsent-message\";\n\nimport { SyncList, SyncClient } from \"twilio-sync\";\nimport { SyncPaginator } from \"../sync-paginator\";\n\nimport { McsClient, McsMedia, CancellablePromise } from \"@twilio/mcs-client\";\nimport { Network } from \"../services/network\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { SendMessageRequest } from \"../interfaces/commands/send-message\";\nimport { MessageResponse } from \"../interfaces/commands/message-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { JSONValue } from \"../types\";\nimport { ChannelMetadataClient } from \"../channel-metadata-client\";\nimport { MessageRecipientsClient } from \"../message-recipients-client\";\n\ntype MessagesEvents = {\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Messages\");\n\nexport interface MessagesServices {\n mcsClient: McsClient;\n network: Network;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n channelMetadataClient: ChannelMetadataClient;\n messageRecipientsClient: MessageRecipientsClient;\n}\n\n/**\n * Represents the collection of messages in a conversation\n */\nclass Messages extends ReplayEventEmitter<MessagesEvents> {\n public readonly conversation: Conversation;\n private readonly configuration: Configuration;\n private readonly services: MessagesServices;\n private readonly messagesByIndex: Map<number, Message>;\n private messagesListPromise: Promise<SyncList> | null;\n\n public constructor(\n conversation: Conversation,\n configuration: Configuration,\n services: MessagesServices\n ) {\n super();\n\n this.conversation = conversation;\n this.configuration = configuration;\n this.services = services;\n\n this.messagesByIndex = new Map();\n this.messagesListPromise = null;\n }\n\n /**\n * Subscribe to the Messages Event Stream\n * @param arg - Name of the Sync object, or the SyncList itself, that\n * represents the Messages resource.\n */\n public async subscribe(arg: string | SyncList) {\n if (this.messagesListPromise) {\n return this.messagesListPromise;\n }\n\n this.messagesListPromise =\n typeof arg === \"string\"\n ? this.services.syncClient.list({\n id: arg,\n mode: \"open_existing\",\n })\n : Promise.resolve(arg);\n\n try {\n const list = await this.messagesListPromise;\n\n list.on(\"itemAdded\", (args) => {\n log.debug(`${this.conversation.sid} itemAdded: ${args.item.index}`);\n\n const links = {\n self: `${this.conversation._links.messages}/${args.item.data.sid}`,\n conversation: this.conversation._links.self,\n messages_receipts: `${this.conversation._links.messages}/${args.item.data.sid}/Receipts`,\n };\n const message = new Message(\n args.item.index,\n args.item.data,\n this.conversation,\n links,\n this.configuration,\n this.services\n );\n\n if (this.messagesByIndex.has(message.index)) {\n log.debug(\n \"Message arrived, but is already known and ignored\",\n this.conversation.sid,\n message.index\n );\n return;\n }\n\n this.messagesByIndex.set(message.index, message);\n\n message.on(\"updated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n\n this.emit(\"messageAdded\", message);\n });\n\n list.on(\"itemRemoved\", (args) => {\n log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);\n\n const index = args.index;\n\n if (this.messagesByIndex.has(index)) {\n const message = this.messagesByIndex.get(index);\n if (!message) {\n return;\n }\n\n this.messagesByIndex.delete(message.index);\n message.removeAllListeners(\"updated\");\n this.emit(\"messageRemoved\", message);\n }\n });\n\n list.on(\"itemUpdated\", (args) => {\n log.debug(`${this.conversation.sid} itemUpdated: ${args.item.index}`);\n\n const message = this.messagesByIndex.get(args.item.index);\n\n if (message) {\n message._update(args.item.data);\n }\n });\n\n return list;\n } catch (err) {\n this.messagesListPromise = null;\n\n if (this.services.syncClient.connectionState !== \"disconnected\") {\n log.error(\n \"Failed to get messages object for conversation\",\n this.conversation.sid,\n err\n );\n }\n\n log.debug(\n \"ERROR: Failed to get messages object for conversation\",\n this.conversation.sid,\n err\n );\n\n throw err;\n }\n }\n\n public async unsubscribe() {\n if (!this.messagesListPromise) {\n return;\n }\n\n const entity = await this.messagesListPromise;\n entity.close();\n this.messagesListPromise = null;\n }\n\n /**\n * Send a message to the conversation. The message could include text and multiple media attachments.\n * @param message Message to post\n */\n public sendV2(message: UnsentMessage): CancellablePromise<MessageResponse> {\n log.debug(\n \"Sending message V2\",\n message.mediaContent,\n message.attributes,\n message.emailOptions\n );\n\n return new CancellablePromise(async (resolve, reject, onCancel) => {\n const media: McsMedia[] = [];\n const requests: CancellablePromise<McsMedia>[] = [];\n\n onCancel(() => {\n requests.forEach((request) => request.cancel());\n });\n\n for (const [category, mediaContent] of message.mediaContent) {\n try {\n log.debug(\n `Adding media to a message as ${\n mediaContent instanceof FormData ? \"FormData\" : \"SendMediaOptions\"\n }`,\n mediaContent\n );\n\n const request =\n mediaContent instanceof FormData\n ? this.services.mcsClient.postFormData(mediaContent, category)\n : this.services.mcsClient.post(\n mediaContent.contentType ?? \"\",\n mediaContent.media ?? \"\",\n category,\n mediaContent.filename\n );\n\n requests.push(request);\n\n media.push(await request);\n } catch (e) {\n reject(e);\n return;\n }\n }\n\n const messagesPostRequest = this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n body: message.text,\n subject: message.emailOptions?.subject,\n media_sids: media.map((m) => m.sid),\n attributes:\n typeof message.attributes !== \"undefined\"\n ? JSON.stringify(message.attributes)\n : undefined,\n content_sid: message.contentSid,\n content_variables:\n typeof message.contentVariables !== \"undefined\"\n ? JSON.stringify(\n message.contentVariables.reduce<Record<string, string>>(\n (accum, current) => ({\n ...accum,\n [current.name]: current.value,\n }),\n {}\n )\n )\n : undefined,\n });\n\n try {\n resolve(await messagesPostRequest);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Send Message to the conversation\n * @param message Message to post\n * @param attributes Message attributes\n * @param emailOptions Options that modify E-mail integration behaviors.\n * @returns Returns promise which can fail\n */\n public async send(\n message: null | string | FormData | SendMediaOptions,\n attributes: JSONValue = {},\n emailOptions?: SendEmailOptions\n ): Promise<MessageResponse> {\n log.debug(\"Sending text message\", message, attributes, emailOptions);\n\n return this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n body: message ?? \"\",\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n subject: emailOptions?.subject,\n });\n }\n\n /**\n * Send Media Message to the conversation\n * @param mediaContent Media content to post\n * @param attributes Message attributes\n * @param emailOptions Email options\n * @returns Returns promise which can fail\n */\n public async sendMedia(\n mediaContent: FormData | SendMediaOptions,\n attributes: JSONValue = {},\n emailOptions?: SendEmailOptions\n ) {\n log.debug(\"Sending media message\", mediaContent, attributes, emailOptions);\n log.debug(\n `Sending media message as ${\n mediaContent instanceof FormData ? \"FormData\" : \"SendMediaOptions\"\n }`,\n mediaContent,\n attributes\n );\n\n const media: McsMedia =\n mediaContent instanceof FormData\n ? await this.services.mcsClient.postFormData(mediaContent)\n : await this.services.mcsClient.post(\n mediaContent.contentType ?? \"\",\n mediaContent.media ?? \"\",\n \"media\",\n mediaContent.filename\n );\n\n // emailOptions are currently ignored for media messages.\n return await this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n media_sids: [media.sid],\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n }\n\n /**\n * Returns messages from conversation using paginator interface\n * @param pageSize Number of messages to return in single chunk. By default it's 30.\n * @param anchor Most early message id which is already known, or 'end' by default\n * @param direction Pagination order 'backwards' or 'forward', 'forward' by default\n * @returns Last page of messages by default\n */\n public async getMessages(\n pageSize: number | undefined,\n anchor: number | \"end\" | undefined,\n direction: \"forward\" | \"backwards\" = \"backwards\"\n ): Promise<SyncPaginator<Message>> {\n return this._getMessages(pageSize, anchor, direction);\n }\n\n private _wrapPaginator(order, page, op) {\n // Due to an inconsistency between Sync and Chat conventions, next and\n // previous pages should be swapped.\n const shouldReverse = order === \"desc\";\n\n const nextPage = () =>\n page.nextPage().then((page) => this._wrapPaginator(order, page, op));\n const previousPage = () =>\n page.prevPage().then((page) => this._wrapPaginator(order, page, op));\n\n return op(page.items).then((items) => ({\n items: items.sort((x, y) => {\n return x.index - y.index;\n }),\n hasPrevPage: shouldReverse ? page.hasNextPage : page.hasPrevPage,\n hasNextPage: shouldReverse ? page.hasPrevPage : page.hasNextPage,\n prevPage: shouldReverse ? nextPage : previousPage,\n nextPage: shouldReverse ? previousPage : nextPage,\n }));\n }\n\n private _upsertMessage(index: number, value: MessageData) {\n const cachedMessage = this.messagesByIndex.get(index);\n\n if (cachedMessage) {\n return cachedMessage;\n }\n\n const links = {\n self: `${this.conversation._links.messages}/${value.sid}`,\n conversation: this.conversation._links.self,\n messages_receipts: `${this.conversation._links.messages}/${value.sid}/Receipts`,\n };\n const message = new Message(\n index,\n value,\n this.conversation,\n links,\n this.configuration,\n this.services\n );\n\n this.messagesByIndex.set(message.index, message);\n\n message.on(\"updated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n\n return message;\n }\n\n /**\n * Returns last messages from conversation\n * @param {Number} [pageSize] Number of messages to return in single chunk. By default it's 30.\n * @param {String} [anchor] Most early message id which is already known, or 'end' by default\n * @param {String} [direction] Pagination order 'backwards' or 'forward', or 'forward' by default\n * @returns {Promise<SyncPaginator<Message>>} last page of messages by default\n * @private\n */\n private async _getMessages(\n pageSize = 30,\n anchor: number | \"end\" = \"end\",\n direction: \"forward\" | \"backwards\" = \"forward\"\n ): Promise<SyncPaginator<Message>> {\n const order = direction === \"backwards\" ? \"desc\" : \"asc\";\n const list = await this.messagesListPromise;\n const page = await list?.getItems({\n from: anchor !== \"end\" ? anchor : void 0,\n pageSize,\n order,\n limit: pageSize, // @todo Limit equals pageSize by default in Sync. This is probably not ideal.\n });\n\n return await this._wrapPaginator(order, page, (items) =>\n Promise.all(\n items.map((item) => this._upsertMessage(item.index, item.data))\n )\n );\n }\n}\n\nexport { Messages };\n"],"names":[],"mappings":"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"}
|
|
@@ -126,29 +126,35 @@ This software includes platform.js under the following license.
|
|
|
126
126
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
127
127
|
|
|
128
128
|
*/
|
|
129
|
-
|
|
129
|
+
var global =
|
|
130
|
+
typeof global !== "undefined"
|
|
131
|
+
? global
|
|
132
|
+
: typeof self !== "undefined"
|
|
133
|
+
? self
|
|
134
|
+
: typeof window !== "undefined"
|
|
135
|
+
? window
|
|
136
|
+
: {};
|
|
130
137
|
|
|
131
|
-
|
|
138
|
+
import { Participant } from '../participant.js';
|
|
139
|
+
import { Logger } from '../logger.js';
|
|
140
|
+
import { Conversation } from '../conversation.js';
|
|
141
|
+
import { SyncMap } from 'twilio-sync';
|
|
142
|
+
import { ReplayEventEmitter } from '@twilio/replay-event-emitter';
|
|
132
143
|
|
|
133
|
-
|
|
134
|
-
var logger = require('../logger.js');
|
|
135
|
-
var replayEventEmitter = require('@twilio/replay-event-emitter');
|
|
136
|
-
|
|
137
|
-
const log = logger.Logger.scope("Participants");
|
|
144
|
+
const log = Logger.scope("Participants");
|
|
138
145
|
/**
|
|
139
146
|
* @classdesc Represents the collection of participants for the conversation
|
|
140
147
|
* @fires Participants#participantJoined
|
|
141
148
|
* @fires Participants#participantLeft
|
|
142
149
|
* @fires Participants#participantUpdated
|
|
143
150
|
*/
|
|
144
|
-
class Participants extends
|
|
145
|
-
constructor(conversation, participants, links,
|
|
151
|
+
class Participants extends ReplayEventEmitter {
|
|
152
|
+
constructor(conversation, participants, links, services) {
|
|
146
153
|
super();
|
|
147
154
|
this.rosterEntityPromise = null;
|
|
148
155
|
this.conversation = conversation;
|
|
149
156
|
this.participants = participants;
|
|
150
157
|
this.links = links;
|
|
151
|
-
this.configuration = configuration;
|
|
152
158
|
this.services = services;
|
|
153
159
|
}
|
|
154
160
|
async unsubscribe() {
|
|
@@ -158,19 +164,21 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
|
|
|
158
164
|
this.rosterEntityPromise = null;
|
|
159
165
|
}
|
|
160
166
|
}
|
|
161
|
-
subscribe(
|
|
167
|
+
subscribe(arg) {
|
|
168
|
+
const participantsMapPromise = typeof arg === "string"
|
|
169
|
+
? this.services.syncClient.map({ id: arg, mode: "open_existing" })
|
|
170
|
+
: Promise.resolve(arg);
|
|
162
171
|
return (this.rosterEntityPromise =
|
|
163
172
|
this.rosterEntityPromise ||
|
|
164
|
-
|
|
165
|
-
.map({ id: rosterObjectName, mode: "open_existing" })
|
|
173
|
+
participantsMapPromise
|
|
166
174
|
.then((rosterMap) => {
|
|
167
|
-
rosterMap.on(
|
|
175
|
+
rosterMap.on(SyncMap.itemAdded, (args) => {
|
|
168
176
|
log.debug(this.conversation.sid + " itemAdded: " + args.item.key);
|
|
169
177
|
this.upsertParticipant(args.item.key, args.item.data).then((participant) => {
|
|
170
|
-
this.emit(
|
|
178
|
+
this.emit(Conversation.participantJoined, participant);
|
|
171
179
|
});
|
|
172
180
|
});
|
|
173
|
-
rosterMap.on(
|
|
181
|
+
rosterMap.on(SyncMap.itemRemoved, (args) => {
|
|
174
182
|
log.debug(this.conversation.sid + " itemRemoved: " + args.key);
|
|
175
183
|
const participantSid = args.key;
|
|
176
184
|
if (!this.participants.has(participantSid)) {
|
|
@@ -181,11 +189,11 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
|
|
|
181
189
|
if (!leftParticipant) {
|
|
182
190
|
return;
|
|
183
191
|
}
|
|
184
|
-
this.emit(
|
|
192
|
+
this.emit(Conversation.participantLeft, leftParticipant);
|
|
185
193
|
});
|
|
186
|
-
rosterMap.on(
|
|
194
|
+
rosterMap.on(SyncMap.itemUpdated, (args) => {
|
|
187
195
|
log.debug(this.conversation.sid + " itemUpdated: " + args.item.key);
|
|
188
|
-
this.upsertParticipant(args.item.key, args.item.data);
|
|
196
|
+
this.upsertParticipant(args.item.key, args.item.data).catch((e) => log.error(e));
|
|
189
197
|
});
|
|
190
198
|
const participantsPromises = [];
|
|
191
199
|
const rosterMapHandler = (paginator) => {
|
|
@@ -226,17 +234,17 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
|
|
|
226
234
|
});
|
|
227
235
|
}
|
|
228
236
|
async upsertParticipant(participantSid, data) {
|
|
229
|
-
let participant
|
|
230
|
-
if (participant
|
|
231
|
-
return participant
|
|
237
|
+
let participant = this.participants.get(participantSid);
|
|
238
|
+
if (participant) {
|
|
239
|
+
return participant._update(data);
|
|
232
240
|
}
|
|
233
241
|
const links = {
|
|
234
242
|
self: `${this.links.participants}/${participantSid}`,
|
|
235
243
|
};
|
|
236
|
-
participant
|
|
237
|
-
this.participants.set(participantSid, participant
|
|
238
|
-
participant
|
|
239
|
-
return participant
|
|
244
|
+
participant = new Participant(data, participantSid, this.conversation, links, this.services);
|
|
245
|
+
this.participants.set(participantSid, participant);
|
|
246
|
+
participant.on(Participant.updated, (args) => this.emit(Conversation.participantUpdated, args));
|
|
247
|
+
return participant;
|
|
240
248
|
}
|
|
241
249
|
/**
|
|
242
250
|
* @returns {Promise<Array<Participant>>} returns list of participants {@see Participant}
|
|
@@ -289,20 +297,19 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
|
|
|
289
297
|
* Add a chat participant to the conversation
|
|
290
298
|
*/
|
|
291
299
|
async add(identity, attributes) {
|
|
292
|
-
|
|
300
|
+
return await this.services.commandExecutor.mutateResource("post", this.links.participants, {
|
|
293
301
|
identity,
|
|
294
302
|
attributes: typeof attributes !== "undefined"
|
|
295
303
|
? JSON.stringify(attributes)
|
|
296
304
|
: undefined,
|
|
297
305
|
});
|
|
298
|
-
return await this.upsertParticipantFromResponse(participantResponse);
|
|
299
306
|
}
|
|
300
307
|
/**
|
|
301
308
|
* Add a non-chat participant to the conversation.
|
|
302
309
|
*/
|
|
303
310
|
async addNonChatParticipant(proxyAddress, address, attributes = {}, bindingOptions = {}) {
|
|
304
311
|
var _a, _b;
|
|
305
|
-
|
|
312
|
+
return await this.services.commandExecutor.mutateResource("post", this.links.participants, {
|
|
306
313
|
attributes: typeof attributes !== "undefined"
|
|
307
314
|
? JSON.stringify(attributes)
|
|
308
315
|
: undefined,
|
|
@@ -313,13 +320,12 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
|
|
|
313
320
|
level: (_b = bindingOptions === null || bindingOptions === void 0 ? void 0 : bindingOptions.email) === null || _b === void 0 ? void 0 : _b.level,
|
|
314
321
|
},
|
|
315
322
|
});
|
|
316
|
-
return await this.upsertParticipantFromResponse(participantResponse);
|
|
317
323
|
}
|
|
318
324
|
/**
|
|
319
325
|
* Remove the participant with a given identity from a conversation.
|
|
320
326
|
*/
|
|
321
327
|
remove(identity) {
|
|
322
|
-
return this.services.commandExecutor.mutateResource("delete", `${this.links.participants}/${identity}`);
|
|
328
|
+
return this.services.commandExecutor.mutateResource("delete", `${this.links.participants}/${encodeURIComponent(identity)}`);
|
|
323
329
|
}
|
|
324
330
|
}
|
|
325
331
|
/**
|
|
@@ -340,5 +346,5 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
|
|
|
340
346
|
* @property {Participant#UpdateReason[]} updateReasons - Array of Participant's updated event reasons
|
|
341
347
|
*/
|
|
342
348
|
|
|
343
|
-
|
|
349
|
+
export { Participants };
|
|
344
350
|
//# sourceMappingURL=participants.js.map
|