@twilio/conversations 2.5.0 → 2.6.0-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.
Files changed (80) hide show
  1. package/README.md +2 -2
  2. package/builds/browser.esm.js +10713 -0
  3. package/builds/browser.esm.js.map +1 -0
  4. package/builds/browser.js +158 -1
  5. package/builds/browser.js.map +1 -1
  6. package/builds/lib.esm.d.ts +3166 -0
  7. package/builds/lib.esm.js +10712 -0
  8. package/builds/lib.js +167 -1
  9. package/builds/lib.js.map +1 -1
  10. package/builds/twilio-conversations.js +309 -322
  11. package/builds/twilio-conversations.min.js +1 -1
  12. package/dist/aggregated-delivery-receipt.js +3 -5
  13. package/dist/aggregated-delivery-receipt.js.map +1 -1
  14. package/dist/channel-metadata-client.js +7 -9
  15. package/dist/channel-metadata-client.js.map +1 -1
  16. package/dist/client.js +189 -154
  17. package/dist/client.js.map +1 -1
  18. package/dist/command-executor.js +8 -8
  19. package/dist/command-executor.js.map +1 -1
  20. package/dist/configuration.js +12 -9
  21. package/dist/configuration.js.map +1 -1
  22. package/dist/content-client.js +11 -8
  23. package/dist/content-client.js.map +1 -1
  24. package/dist/content-template.js +3 -5
  25. package/dist/content-template.js.map +1 -1
  26. package/dist/conversation.js +113 -87
  27. package/dist/conversation.js.map +1 -1
  28. package/dist/data/conversations.js +34 -42
  29. package/dist/data/conversations.js.map +1 -1
  30. package/dist/data/messages.js +23 -21
  31. package/dist/data/messages.js.map +1 -1
  32. package/dist/data/participants.js +25 -23
  33. package/dist/data/participants.js.map +1 -1
  34. package/dist/data/users.js +15 -13
  35. package/dist/data/users.js.map +1 -1
  36. package/dist/detailed-delivery-receipt.js +3 -5
  37. package/dist/detailed-delivery-receipt.js.map +1 -1
  38. package/dist/index.js +17 -49
  39. package/dist/index.js.map +1 -1
  40. package/dist/interfaces/notification-types.js +1 -5
  41. package/dist/interfaces/notification-types.js.map +1 -1
  42. package/dist/interfaces/rules.js +13 -10
  43. package/dist/interfaces/rules.js.map +1 -1
  44. package/dist/logger.js +25 -26
  45. package/dist/logger.js.map +1 -1
  46. package/dist/media.js +11 -8
  47. package/dist/media.js.map +1 -1
  48. package/dist/message-builder.js +48 -40
  49. package/dist/message-builder.js.map +1 -1
  50. package/dist/message-recipients-client.js +10 -12
  51. package/dist/message-recipients-client.js.map +1 -1
  52. package/dist/message.js +88 -75
  53. package/dist/message.js.map +1 -1
  54. package/dist/node_modules/quick-lru/index.js +1 -5
  55. package/dist/node_modules/quick-lru/index.js.map +1 -1
  56. package/dist/node_modules/tslib/tslib.es6.js +1 -7
  57. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  58. package/dist/packages/conversations/package.json.js +2 -6
  59. package/dist/packages/conversations/package.json.js.map +1 -1
  60. package/dist/participant.js +34 -29
  61. package/dist/participant.js.map +1 -1
  62. package/dist/push-notification.js +5 -4
  63. package/dist/push-notification.js.map +1 -1
  64. package/dist/rest-paginator.js +6 -4
  65. package/dist/rest-paginator.js.map +1 -1
  66. package/dist/services/network.js +3 -7
  67. package/dist/services/network.js.map +1 -1
  68. package/dist/services/typing-indicator.js +11 -8
  69. package/dist/services/typing-indicator.js.map +1 -1
  70. package/dist/unsent-message.js +9 -8
  71. package/dist/unsent-message.js.map +1 -1
  72. package/dist/user.js +27 -24
  73. package/dist/user.js.map +1 -1
  74. package/dist/util/deferred.js +6 -4
  75. package/dist/util/deferred.js.map +1 -1
  76. package/dist/util/index.js +1 -9
  77. package/dist/util/index.js.map +1 -1
  78. package/docs/index.html +3 -3
  79. package/docs/modules.html +2 -2
  80. package/package.json +7 -7
@@ -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\";\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 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 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: 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: `${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","SyncMap","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 \"lodash.isequal\";\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 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 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: 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: `${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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFA,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAE1C;;;AAGG;AACH,MAAM,aAAc,SAAQ,kBAAuC,CAAA;IAQjE,WACE,CAAA,aAA4B,EAC5B,QAA+B,EAAA;AAE/B,QAAA,KAAK,EAAE,CAAC;AAXM,QAAA,IAAA,CAAA,aAAa,GAA8B,IAAI,GAAG,EAAE,CAAC;AACrD,QAAA,IAAA,CAAA,mBAAmB,GAAsB,IAAI,QAAQ,EAAE,CAAC;AAGvD,QAAA,IAAA,CAAA,UAAU,GAAgB,IAAI,GAAG,EAAE,CAAC;QAC7C,IAAsB,CAAA,sBAAA,GAAG,KAAK,CAAC;AAQrC,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC1B;IAEM,MAAM,eAAe,CAAC,OAAO,EAAA;;QAClC,MAAM,UAAU,GACd,QAAO,OAAO,aAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,UAAU,CAAA,KAAK,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAGjE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,EAAE;YAChD,aAAa,EAAE,OAAO,CAAC,YAAY;YACnC,WAAW,EAAE,OAAO,CAAC,UAAU;AAC/B,YAAA,UAAU,EACR,OAAO,UAAU,KAAK,WAAW;AAC/B,kBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5B,kBAAE,SAAS;AAChB,SAAA,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC;QAC7C,MAAM,oBAAoB,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,YAAY,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,YAAY,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,IAAI,CAAC;AACzE,QAAA,MAAM,KAAK,GAAA,MAAA,CAAA,MAAA,CAAA,EACT,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAA,EACf,QAAQ,CAAC,KAAK,CAClB,CAAC;QACF,MAAM,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAErE,QAAA,IAAI,oBAAoB,EAAE;AACxB,YAAA,MAAM,oBAAoB,CAAC,UAAU,EAAE,CAAC;AACxC,YAAA,OAAO,oBAAoB,CAAC;AAC7B,SAAA;AAED,QAAA,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC;AACE,YAAA,OAAO,EAAE,oBAAoB;AAC7B,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,UAAU,EAAE,EAAE;AACd,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,wBAAwB,EAAE,CAAC;AAC3B,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,WAAW,EAAE,IAAI;AAClB,SAAA,EACD,eAAe,EACf,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,CACd,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAEtC,QAAA,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;AAE7C,QAAA,OAAO,YAAY,CAAC;KACrB;AAED;;AAEG;AACI,IAAA,MAAM,kBAAkB,GAAA;QAC7B,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAEjC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,KAAI;gBACjC,GAAG,CAAC,KAAK,CAAC,CAAc,WAAA,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAA,CAAC,CAAC;AAEzC,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,aAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,KAAI;gBACnC,GAAG,CAAC,KAAK,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAC,GAAG,CAAE,CAAA,CAAC,CAAC;AAEtC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;AAErB,gBAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;AAChC,oBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC1B,iBAAA;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEjD,IAAI,CAAC,YAAY,EAAE;oBACjB,OAAO;AACR,iBAAA;AAED,gBAAA,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;AACpC,oBAAA,YAAY,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACpD,oBAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAC7C,iBAAA;AAED,gBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/B,gBAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;AAC/C,gBAAA,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAC7C,aAAC,CAAC,CAAC;YAEH,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,KAAI;gBACnC,GAAG,CAAC,KAAK,CAAC,CAAgB,aAAA,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAA,CAAC,CAAC;AAE3C,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,aAAC,CAAC,CAAC;AAEH,YAAA,MAAM,eAAe,GACnB,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAmC,EAAE,CAAC;AAEnD,YAAA,KAAK,MAAM,YAAY,IAAI,eAAe,EAAE;AAC1C,gBAAA,OAAO,CAAC,IAAI,CACV,IAAI,CAAC,mBAAmB,CACtB,MAAM,EACN,YAAY,CAAC,aAAa,CAAC,EAC3B,YAAY,CACb,CACF,CAAC;AACH,aAAA;AAED,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAEnC,YAAA,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE3B,YAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;AAExB,YAAA,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAElE,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;YACd,MAAM,YAAY,GAAG,wCAAwC,CAAC;YAE9D,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,KAAK,cAAc,EAAE;AAC/D,gBAAA,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;AAChC,aAAA;YAED,GAAG,CAAC,KAAK,CAAC,CAAA,OAAA,EAAU,YAAY,CAAE,CAAA,EAAE,KAAK,CAAC,CAAC;AAE3C,YAAA,MAAM,KAAK,CAAC;AACb,SAAA;KACF;AAEM,IAAA,MAAM,gBAAgB,GAAA;AAC3B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC;AAE/C,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,KAAK,KACrC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,CAAC,IAAiB,KAC1B,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CACtD,CACF,CACF,CAAC;KACH;IAEM,MAAM,eAAe,CAC1B,GAAW,EAAA;AAEX,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AAC9C,QAAA,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAiB,KAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CACtD,CAAC;AAEF,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KAC3C;IAEM,MAAM,2BAA2B,CACtC,UAAkB,EAAA;AAElB,QAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC;aACjE,IAAI,CAAC,UAAU,CAAC;AAChB,aAAA,KAAK,EAAE,CAAC;AACX,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAuB,GAAG,CAAC,CAAC;AAC5E,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;AAE3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAClC,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,UAAU,EAAE,IAAI;YAChB,wBAAwB,EAAE,IAAI,CAAC,uBAAuB;YACtD,MAAM,EAAE,CAAA,IAAI,KAAJ,IAAA,IAAA,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;AAC3B,YAAA,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,YAAY;AACvC,YAAA,iBAAiB,EAAE,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAJ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,IAAI,CAAE,kBAAkB;YAC3C,GAAG;SACJ,CAAC;AAEF,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC;KACjE;IAEM,MAAM,gBAAgB,CAAC,GAAW,EAAA;AACvC,QAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC;aAC/D,IAAI,CAAC,GAAG,CAAC;AACT,aAAA,KAAK,EAAE,CAAC;AACX,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAuB,GAAG,CAAC,CAAC;AAC5E,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;AAE3B,QAAA,MAAM,IAAI,GAAG;AACX,YAAA,UAAU,EAAE,IAAI;;YAEhB,MAAM,EAAE,CAAA,IAAI,KAAJ,IAAA,IAAA,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,CAAG,EAAA,GAAG,CAAU,QAAA,CAAA;;YAEzB,GAAG;SACJ,CAAC;QAEF,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;KACpD;AAEO,IAAA,MAAM,OAAO,GAAA;QACnB,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;AACxC,YAAA,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,eAAe;AACtC,YAAA,IAAI,EAAE,eAAe;AACtB,SAAA,CAAC,CAAC;KACJ;AAEO,IAAA,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,EAAA;QACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnC,OAAO;AACL,YAAA,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;YAC5C,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvE,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACxE,CAAC;KACH;AAEO,IAAA,MAAM,mBAAmB,CAC/B,MAA+B,EAC/B,YAA0B,EAC1B,IAAI,EAAA;AAEJ,QAAA,MAAM,mBAAmB,GACvB,YAAY,CAAC,aAAa,KAAK,SAAS;AACxC,YAAA,MAAM,KAAK,YAAY,CAAC,aAAa,CAAC;QACxC,MAAM,mBAAmB,GACvB,MAAM,KAAK,MAAM,IAAI,YAAY,CAAC,aAAa,KAAK,MAAM,CAAC;AAE7D,QAAA,IAAI,mBAAmB,IAAI,mBAAmB,IAAI,MAAM,KAAK,MAAM,EAAE;AACnE,YAAA,GAAG,CAAC,KAAK,CACP,kFAAkF,EAClF;gBACE,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,IAAI,EAAE,IAAI,CAAC,MAAM;gBACjB,YAAY,EAAE,YAAY,CAAC,MAAM;AAClC,aAAA,CACF,CAAC;YAEF,OAAO;AACR,SAAA;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE;AAChE,YAAA,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAoC,EAAE,CAAC;AAEvD,YAAA,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,WAAW,EAAE;AACjD,gBAAA,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;AACvD,aAAA;AAED,YAAA,IAAI,OAAO,IAAI,CAAC,wBAAwB,KAAK,WAAW,EAAE;AACxD,gBAAA,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC;AACrE,aAAA;AAED,YAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE;AAC5B,gBAAA,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAClC,aAAA;AAED,YAAA,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;YAE9C,OAAO;AACR,SAAA;AAED,QAAA,IACE,IAAI,CAAC,MAAM,KAAK,kBAAkB;AAClC,YAAA,YAAY,CAAC,MAAM,KAAK,QAAQ,EAChC;AACA,YAAA,YAAY,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACpD,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B,YAAA,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;YAE5C,OAAO;AACR,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,kBAAkB,EAAE;AACtC,YAAA,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAEhC,OAAO;AACR,SAAA;AAED,QAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5B;AAEO,IAAA,MAAM,mBAAmB,CAC/B,MAA+B,EAC/B,GAAW,EACX,IAAI,EAAA;QAEJ,GAAG,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,GAAG,CAAE,CAAA,EAAE,IAAI,CAAC,CAAC;QAExD,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;;AAGjD,QAAA,IAAI,YAAY,EAAE;AAChB,YAAA,GAAG,CAAC,KAAK,CACP,wCAAwC,YAAY,CAAC,GAAG,CAAY,UAAA,CAAA;gBAClE,CAAuC,oCAAA,EAAA,YAAY,CAAC,aAAa,CAAG,CAAA,CAAA;AACpE,gBAAA,CAAA,oCAAA,EAAuC,MAAM,CAAA,CAAE,EACjD,YAAY,CACb,CAAC;YAEF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;AAC3D,YAAA,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;AAEhC,YAAA,OAAO,YAAY,CAAC;AACrB,SAAA;;AAGD,QAAA,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACjD,YAAA,GAAG,CAAC,KAAK,CACP,qFAAqF,EACrF,GAAG,CACJ,CAAC;AACF,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;;QAGD,GAAG,CAAC,KAAK,CACP,oEAAoE;YAClE,GAAG,EACL,IAAI,CACL,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAG,CAAG,EAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAI,CAAA,EAAA,GAAG,EAAE,CAAC;AACpE,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,CAAG,EAAA,QAAQ,CAAW,SAAA,CAAA;YAChC,YAAY,EAAE,CAAG,EAAA,QAAQ,CAAe,aAAA,CAAA;SACzC,CAAC;AACF,QAAA,MAAM,eAAe,GAAG,IAAI,YAAY,CACtC,IAAI,EACJ,GAAG,EACH,KAAK,EACL,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,QAAQ,CACd,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAE7C,IAAI;AACF,YAAA,MAAM,eAAe,CAAC,UAAU,EAAE,CAAC;AAEnC,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC5B,gBAAA,MAAM,eAAe,CAAC,aAAa,EAAE,CAAC;AACvC,aAAA;AACF,SAAA;AAAC,QAAA,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;AAC9B,gBAAA,MAAM,KAAK,CAAC;AACb,aAAA;YAED,GAAG,CAAC,KAAK,CACP,4EAA4E,EAC5E,GAAG,EACH,KAAK,CACN,CAAC;AAEF,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/B,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAED,QAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;AAEhD,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE;AAC5B,YAAA,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC7C,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AAClD,SAAA;AAED,QAAA,OAAO,eAAe,CAAC;KACxB;AAEO,IAAA,MAAM,qBAAqB,GAAA;;QACjC,IAAI,aAAa,GAA2B,EAAE,CAAC;QAC/C,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,GAAG;AACD,YAAA,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAErE,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AACjC,aAAA;AAED,YAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAE9C,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AACf,YAAA,MAAM,qBAAqB,GAAG,CAAA,EAAA,GAAA,QAAQ,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,aAAa,CAAC,GAAG,CAC5D,CAAC,sBAAsB,MAAM;AAC3B,gBAAA,UAAU,EAAE,sBAAsB;gBAClC,WAAW,EAAE,sBAAsB,CAAC,gBAAgB;gBACpD,MAAM,EAAE,sBAAsB,CAAC,MAAM;AACrC,gBAAA,OAAO,EAAE,sBAAsB,CAAC,YAAY,CAAC,YAAY;AACzD,gBAAA,QAAQ,EAAE,sBAAsB,CAAC,YAAY,CAAC,QAAQ;AACtD,gBAAA,MAAM,EAAE,CAAA,EAAG,sBAAsB,CAAC,gBAAgB,CAAS,OAAA,CAAA;gBAC3D,wBAAwB,EACtB,sBAAsB,CAAC,uBAAuB;gBAChD,iBAAiB,EAAE,sBAAsB,CAAC,kBAAkB;AAC7D,aAAA,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;AAC9D,SAAA,QAAQ,SAAS,EAAE;AAEpB,QAAA,OAAO,aAAa,CAAC;KACtB;AAEO,IAAA,sBAAsB,CAAC,GAAW,EAAA;QACxC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEjD,QAAA,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;AAChD,SAAA;KACF;AAEO,IAAA,kBAAkB,CAAC,YAAY,EAAA;AACrC,QAAA,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MACzB,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,GAAG,CAAC,CAC9C,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAkC,KAC5D,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,CACvC,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,WAAW,KAC/C,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAC5C,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,WAAW,KAC7C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAC1C,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,IAAiC,KACtE,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CACtC,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,KACtC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CACnC,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,IAA6B,KAC9D,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAClC,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,OAAO,KACxC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CACrC,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,WAAW,KAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CACxC,CAAC;AACF,QAAA,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,WAAW,KACzC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CACtC,CAAC;KACH;AACF;;;;"}
@@ -126,8 +126,6 @@ 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
- 'use strict';
130
-
131
129
  var global =
132
130
  typeof global !== "undefined"
133
131
  ? global
@@ -137,18 +135,16 @@ var global =
137
135
  ? window
138
136
  : {};
139
137
 
140
- Object.defineProperty(exports, '__esModule', { value: true });
141
-
142
- var logger = require('../logger.js');
143
- var message = require('../message.js');
144
- var mcsClient = require('@twilio/mcs-client');
145
- var replayEventEmitter = require('@twilio/replay-event-emitter');
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';
146
142
 
147
- const log = logger.Logger.scope("Messages");
143
+ const log = Logger.scope("Messages");
148
144
  /**
149
145
  * Represents the collection of messages in a conversation
150
146
  */
151
- class Messages extends replayEventEmitter.ReplayEventEmitter {
147
+ class Messages extends ReplayEventEmitter {
152
148
  constructor(conversation, configuration, services) {
153
149
  super();
154
150
  this.conversation = conversation;
@@ -182,14 +178,14 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
182
178
  conversation: this.conversation._links.self,
183
179
  messages_receipts: `${this.conversation._links.messages}/${args.item.data.sid}/Receipts`,
184
180
  };
185
- const message$1 = new message.Message(args.item.index, args.item.data, this.conversation, links, this.configuration, this.services);
186
- if (this.messagesByIndex.has(message$1.index)) {
187
- log.debug("Message arrived, but is already known and ignored", this.conversation.sid, message$1.index);
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);
188
184
  return;
189
185
  }
190
- this.messagesByIndex.set(message$1.index, message$1);
191
- message$1.on("updated", (args) => this.emit("messageUpdated", args));
192
- this.emit("messageAdded", message$1);
186
+ this.messagesByIndex.set(message.index, message);
187
+ message.on("updated", (args) => this.emit("messageUpdated", args));
188
+ this.emit("messageAdded", message);
193
189
  });
194
190
  list.on("itemRemoved", (args) => {
195
191
  log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);
@@ -236,7 +232,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
236
232
  */
237
233
  sendV2(message) {
238
234
  log.debug("Sending message V2", message.mediaContent, message.attributes, message.emailOptions);
239
- return new mcsClient.CancellablePromise(async (resolve, reject, onCancel) => {
235
+ return new CancellablePromise(async (resolve, reject, onCancel) => {
240
236
  var _a, _b, _c;
241
237
  const media = [];
242
238
  const requests = [];
@@ -352,10 +348,10 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
352
348
  conversation: this.conversation._links.self,
353
349
  messages_receipts: `${this.conversation._links.messages}/${value.sid}/Receipts`,
354
350
  };
355
- const message$1 = new message.Message(index, value, this.conversation, links, this.configuration, this.services);
356
- this.messagesByIndex.set(message$1.index, message$1);
357
- message$1.on("updated", (args) => this.emit("messageUpdated", args));
358
- return message$1;
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;
359
355
  }
360
356
  /**
361
357
  * Returns last messages from conversation
@@ -378,5 +374,11 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
378
374
  }
379
375
  }
380
376
 
377
+ export { Messages };
378
+ //# sourceMappingURL=messages.js.map
379
+ ise.all(items.map((item) => this._upsertMessage(item.index, item.data))));
380
+ }
381
+ }
382
+
381
383
  exports.Messages = Messages;
382
384
  //# 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\";\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":["Logger","ReplayEventEmitter","message","Message","CancellablePromise"],"mappings":"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"}
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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"}CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAChE,CACF,CAAC;KACH;AACF;;;;"}
@@ -126,8 +126,6 @@ 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
- 'use strict';
130
-
131
129
  var global =
132
130
  typeof global !== "undefined"
133
131
  ? global
@@ -137,22 +135,20 @@ var global =
137
135
  ? window
138
136
  : {};
139
137
 
140
- Object.defineProperty(exports, '__esModule', { value: true });
141
-
142
- var participant = require('../participant.js');
143
- var logger = require('../logger.js');
144
- var conversation = require('../conversation.js');
145
- var twilioSync = require('twilio-sync');
146
- var replayEventEmitter = require('@twilio/replay-event-emitter');
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';
147
143
 
148
- const log = logger.Logger.scope("Participants");
144
+ const log = Logger.scope("Participants");
149
145
  /**
150
146
  * @classdesc Represents the collection of participants for the conversation
151
147
  * @fires Participants#participantJoined
152
148
  * @fires Participants#participantLeft
153
149
  * @fires Participants#participantUpdated
154
150
  */
155
- class Participants extends replayEventEmitter.ReplayEventEmitter {
151
+ class Participants extends ReplayEventEmitter {
156
152
  constructor(conversation, participants, links, services) {
157
153
  super();
158
154
  this.rosterEntityPromise = null;
@@ -176,13 +172,13 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
176
172
  this.rosterEntityPromise ||
177
173
  participantsMapPromise
178
174
  .then((rosterMap) => {
179
- rosterMap.on(twilioSync.SyncMap.itemAdded, (args) => {
175
+ rosterMap.on(SyncMap.itemAdded, (args) => {
180
176
  log.debug(this.conversation.sid + " itemAdded: " + args.item.key);
181
177
  this.upsertParticipant(args.item.key, args.item.data).then((participant) => {
182
- this.emit(conversation.Conversation.participantJoined, participant);
178
+ this.emit(Conversation.participantJoined, participant);
183
179
  });
184
180
  });
185
- rosterMap.on(twilioSync.SyncMap.itemRemoved, (args) => {
181
+ rosterMap.on(SyncMap.itemRemoved, (args) => {
186
182
  log.debug(this.conversation.sid + " itemRemoved: " + args.key);
187
183
  const participantSid = args.key;
188
184
  if (!this.participants.has(participantSid)) {
@@ -193,9 +189,9 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
193
189
  if (!leftParticipant) {
194
190
  return;
195
191
  }
196
- this.emit(conversation.Conversation.participantLeft, leftParticipant);
192
+ this.emit(Conversation.participantLeft, leftParticipant);
197
193
  });
198
- rosterMap.on(twilioSync.SyncMap.itemUpdated, (args) => {
194
+ rosterMap.on(SyncMap.itemUpdated, (args) => {
199
195
  log.debug(this.conversation.sid + " itemUpdated: " + args.item.key);
200
196
  this.upsertParticipant(args.item.key, args.item.data).catch((e) => log.error(e));
201
197
  });
@@ -238,17 +234,17 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
238
234
  });
239
235
  }
240
236
  async upsertParticipant(participantSid, data) {
241
- let participant$1 = this.participants.get(participantSid);
242
- if (participant$1) {
243
- return participant$1._update(data);
237
+ let participant = this.participants.get(participantSid);
238
+ if (participant) {
239
+ return participant._update(data);
244
240
  }
245
241
  const links = {
246
242
  self: `${this.links.participants}/${participantSid}`,
247
243
  };
248
- participant$1 = new participant.Participant(data, participantSid, this.conversation, links, this.services);
249
- this.participants.set(participantSid, participant$1);
250
- participant$1.on(participant.Participant.updated, (args) => this.emit(conversation.Conversation.participantUpdated, args));
251
- return participant$1;
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;
252
248
  }
253
249
  /**
254
250
  * @returns {Promise<Array<Participant>>} returns list of participants {@see Participant}
@@ -350,5 +346,11 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
350
346
  * @property {Participant#UpdateReason[]} updateReasons - Array of Participant's updated event reasons
351
347
  */
352
348
 
349
+ export { Participants };
350
+ //# sourceMappingURL=participants.js.map
351
+ ant} participant - Updated Participant
352
+ * @property {Participant#UpdateReason[]} updateReasons - Array of Participant's updated event reasons
353
+ */
354
+
353
355
  exports.Participants = Participants;
354
356
  //# sourceMappingURL=participants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"participants.js","sources":["../../src/data/participants.ts"],"sourcesContent":["import {\n ParticipantDescriptor,\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason,\n ParticipantEmailBinding,\n} from \"../participant\";\nimport { Logger } from \"../logger\";\n\nimport { Conversation } from \"../conversation\";\n\nimport { SyncMap, SyncClient } from \"twilio-sync\";\nimport { Users } from \"./users\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { AddParticipantRequest } from \"../interfaces/commands/add-participant\";\nimport { ParticipantResponse } from \"../interfaces/commands/participant-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { JSONValue } from \"../types\";\n\ntype ParticipantsEvents = {\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Participants\");\n\nexport interface ParticipantsServices {\n syncClient: SyncClient;\n users: Users;\n commandExecutor: CommandExecutor;\n}\n\ninterface ParticipantsLinks {\n participants: string;\n}\n\nexport interface ParticipantBindingOptions {\n email?: ParticipantEmailBinding;\n}\n\n/**\n * @classdesc Represents the collection of participants for the conversation\n * @fires Participants#participantJoined\n * @fires Participants#participantLeft\n * @fires Participants#participantUpdated\n */\nclass Participants extends ReplayEventEmitter<ParticipantsEvents> {\n private readonly services: ParticipantsServices;\n private readonly links: ParticipantsLinks;\n\n rosterEntityPromise: Promise<SyncMap> | null = null;\n\n public readonly conversation: Conversation;\n public readonly participants: Map<string, Participant>; // passed in from Conversation\n\n constructor(\n conversation: Conversation,\n participants: Map<string, Participant>,\n links: ParticipantsLinks,\n services: ParticipantsServices\n ) {\n super();\n this.conversation = conversation;\n this.participants = participants;\n this.links = links;\n this.services = services;\n }\n\n async unsubscribe(): Promise<void> {\n if (this.rosterEntityPromise) {\n const entity = await this.rosterEntityPromise;\n entity.close();\n this.rosterEntityPromise = null;\n }\n }\n\n subscribe(arg: string | SyncMap) {\n const participantsMapPromise =\n typeof arg === \"string\"\n ? this.services.syncClient.map({ id: arg, mode: \"open_existing\" })\n : Promise.resolve(arg);\n\n return (this.rosterEntityPromise =\n this.rosterEntityPromise ||\n participantsMapPromise\n .then((rosterMap) => {\n rosterMap.on(SyncMap.itemAdded, (args) => {\n log.debug(this.conversation.sid + \" itemAdded: \" + args.item.key);\n this.upsertParticipant(args.item.key, args.item.data).then(\n (participant) => {\n this.emit(Conversation.participantJoined, participant);\n }\n );\n });\n\n rosterMap.on(SyncMap.itemRemoved, (args) => {\n log.debug(this.conversation.sid + \" itemRemoved: \" + args.key);\n const participantSid = args.key;\n if (!this.participants.has(participantSid)) {\n return;\n }\n const leftParticipant = this.participants.get(participantSid);\n this.participants.delete(participantSid);\n if (!leftParticipant) {\n return;\n }\n this.emit(Conversation.participantLeft, leftParticipant);\n });\n\n rosterMap.on(SyncMap.itemUpdated, (args) => {\n log.debug(this.conversation.sid + \" itemUpdated: \" + args.item.key);\n this.upsertParticipant(args.item.key, args.item.data).catch((e) =>\n log.error(e)\n );\n });\n\n const participantsPromises: Promise<Participant>[] = [];\n const rosterMapHandler = (paginator) => {\n paginator.items.forEach((item) => {\n participantsPromises.push(\n this.upsertParticipant(item.key, item.data)\n );\n });\n return paginator.hasNextPage\n ? paginator.nextPage().then(rosterMapHandler)\n : null;\n };\n\n return rosterMap\n .getItems()\n .then(rosterMapHandler)\n .then(() => Promise.all(participantsPromises))\n .then(() => rosterMap);\n })\n .catch((err) => {\n this.rosterEntityPromise = null;\n if (this.services.syncClient.connectionState != \"disconnected\") {\n log.error(\n \"Failed to get roster object for conversation\",\n this.conversation.sid,\n err\n );\n }\n log.debug(\n \"ERROR: Failed to get roster object for conversation\",\n this.conversation.sid,\n err\n );\n throw err;\n }));\n }\n\n async upsertParticipantFromResponse(\n data: ParticipantResponse\n ): Promise<Participant> {\n const {\n sid,\n attributes: responseAttributes,\n date_created: dateCreated,\n date_updated: dateUpdated,\n identity: responseIdentity,\n role_sid: roleSid,\n messaging_binding: messagingBinding,\n } = data;\n\n return await this.upsertParticipant(sid, {\n attributes: responseAttributes,\n dateCreated: new Date(dateCreated),\n dateUpdated: new Date(dateUpdated),\n identity: responseIdentity,\n roleSid,\n lastConsumedMessageIndex: null,\n lastConsumptionTimestamp: null,\n type: messagingBinding?.type ?? \"chat\",\n });\n }\n\n async upsertParticipant(\n participantSid: string,\n data: ParticipantDescriptor\n ): Promise<Participant> {\n let participant = this.participants.get(participantSid);\n if (participant) {\n return participant._update(data);\n }\n\n const links = {\n self: `${this.links.participants}/${participantSid}`,\n };\n\n participant = new Participant(\n data,\n participantSid,\n this.conversation,\n links,\n this.services\n );\n this.participants.set(participantSid, participant);\n participant.on(Participant.updated, (args: ParticipantUpdatedEventArgs) =>\n this.emit(Conversation.participantUpdated, args)\n );\n return participant;\n }\n\n /**\n * @returns {Promise<Array<Participant>>} returns list of participants {@see Participant}\n */\n async getParticipants(): Promise<Participant[]> {\n return this.rosterEntityPromise\n ? this.rosterEntityPromise.then(() => {\n const participants: Participant[] = [];\n this.participants.forEach((participant) =>\n participants.push(participant)\n );\n return participants;\n })\n : [];\n }\n\n /**\n * Get participant by SID from conversation\n * @returns {Promise<Participant>}\n */\n async getParticipantBySid(\n participantSid: string\n ): Promise<Participant | null> {\n return this.rosterEntityPromise\n ? this.rosterEntityPromise.then(() => {\n const participant = this.participants.get(participantSid);\n if (!participant) {\n throw new Error(\n \"Participant with SID \" + participantSid + \" was not found\"\n );\n }\n return participant;\n })\n : null;\n }\n\n /**\n * Get participant by identity from conversation\n * @returns {Promise<Participant>}\n */\n async getParticipantByIdentity(\n identity: string\n ): Promise<Participant | null> {\n let foundParticipant: Participant | null = null;\n return this.rosterEntityPromise\n ? this.rosterEntityPromise.then(() => {\n this.participants.forEach((participant) => {\n if (participant.identity === identity) {\n foundParticipant = participant;\n }\n });\n if (!foundParticipant) {\n throw new Error(\n \"Participant with identity \" + identity + \" was not found\"\n );\n }\n return foundParticipant;\n })\n : null;\n }\n\n /**\n * Add a chat participant to the conversation\n */\n async add(\n identity: string,\n attributes: JSONValue\n ): Promise<ParticipantResponse> {\n return await this.services.commandExecutor.mutateResource<\n AddParticipantRequest,\n ParticipantResponse\n >(\"post\", this.links.participants, {\n identity,\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n }\n\n /**\n * Add a non-chat participant to the conversation.\n */\n async addNonChatParticipant(\n proxyAddress: string,\n address: string,\n attributes: JSONValue = {},\n bindingOptions: ParticipantBindingOptions = {}\n ): Promise<ParticipantResponse> {\n return await this.services.commandExecutor.mutateResource<\n AddParticipantRequest,\n ParticipantResponse\n >(\"post\", this.links.participants, {\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n messaging_binding: {\n address,\n proxy_address: proxyAddress,\n name: bindingOptions?.email?.name,\n level: bindingOptions?.email?.level,\n },\n });\n }\n\n /**\n * Remove the participant with a given identity from a conversation.\n */\n remove(identity: string): Promise<void> {\n return this.services.commandExecutor.mutateResource(\n \"delete\",\n `${this.links.participants}/${encodeURIComponent(identity)}`\n );\n }\n}\n\nexport { Participants };\n\n/**\n * Fired when participant joined conversation\n * @event Participants#participantJoined\n * @type {Participant}\n */\n\n/**\n * Fired when participant left conversation\n * @event Participants#participantLeft\n * @type {Participant}\n */\n\n/**\n * Fired when participant updated\n * @event Participants#participantUpdated\n * @type {Object}\n * @property {Participant} participant - Updated Participant\n * @property {Participant#UpdateReason[]} updateReasons - Array of Participant's updated event reasons\n */\n"],"names":["Logger","ReplayEventEmitter","SyncMap","Conversation","participant","Participant"],"mappings":"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"}
1
+ {"version":3,"file":"participants.js","sources":["../../src/data/participants.ts"],"sourcesContent":["import {\n ParticipantDescriptor,\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason,\n ParticipantEmailBinding,\n} from \"../participant\";\nimport { Logger } from \"../logger\";\n\nimport { Conversation } from \"../conversation\";\n\nimport { SyncMap, SyncClient } from \"twilio-sync\";\nimport { Users } from \"./users\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { AddParticipantRequest } from \"../interfaces/commands/add-participant\";\nimport { ParticipantResponse } from \"../interfaces/commands/participant-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { JSONValue } from \"../types\";\n\ntype ParticipantsEvents = {\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Participants\");\n\nexport interface ParticipantsServices {\n syncClient: SyncClient;\n users: Users;\n commandExecutor: CommandExecutor;\n}\n\ninterface ParticipantsLinks {\n participants: string;\n}\n\nexport interface ParticipantBindingOptions {\n email?: ParticipantEmailBinding;\n}\n\n/**\n * @classdesc Represents the collection of participants for the conversation\n * @fires Participants#participantJoined\n * @fires Participants#participantLeft\n * @fires Participants#participantUpdated\n */\nclass Participants extends ReplayEventEmitter<ParticipantsEvents> {\n private readonly services: ParticipantsServices;\n private readonly links: ParticipantsLinks;\n\n rosterEntityPromise: Promise<SyncMap> | null = null;\n\n public readonly conversation: Conversation;\n public readonly participants: Map<string, Participant>; // passed in from Conversation\n\n constructor(\n conversation: Conversation,\n participants: Map<string, Participant>,\n links: ParticipantsLinks,\n services: ParticipantsServices\n ) {\n super();\n this.conversation = conversation;\n this.participants = participants;\n this.links = links;\n this.services = services;\n }\n\n async unsubscribe(): Promise<void> {\n if (this.rosterEntityPromise) {\n const entity = await this.rosterEntityPromise;\n entity.close();\n this.rosterEntityPromise = null;\n }\n }\n\n subscribe(arg: string | SyncMap) {\n const participantsMapPromise =\n typeof arg === \"string\"\n ? this.services.syncClient.map({ id: arg, mode: \"open_existing\" })\n : Promise.resolve(arg);\n\n return (this.rosterEntityPromise =\n this.rosterEntityPromise ||\n participantsMapPromise\n .then((rosterMap) => {\n rosterMap.on(SyncMap.itemAdded, (args) => {\n log.debug(this.conversation.sid + \" itemAdded: \" + args.item.key);\n this.upsertParticipant(args.item.key, args.item.data).then(\n (participant) => {\n this.emit(Conversation.participantJoined, participant);\n }\n );\n });\n\n rosterMap.on(SyncMap.itemRemoved, (args) => {\n log.debug(this.conversation.sid + \" itemRemoved: \" + args.key);\n const participantSid = args.key;\n if (!this.participants.has(participantSid)) {\n return;\n }\n const leftParticipant = this.participants.get(participantSid);\n this.participants.delete(participantSid);\n if (!leftParticipant) {\n return;\n }\n this.emit(Conversation.participantLeft, leftParticipant);\n });\n\n rosterMap.on(SyncMap.itemUpdated, (args) => {\n log.debug(this.conversation.sid + \" itemUpdated: \" + args.item.key);\n this.upsertParticipant(args.item.key, args.item.data).catch((e) =>\n log.error(e)\n );\n });\n\n const participantsPromises: Promise<Participant>[] = [];\n const rosterMapHandler = (paginator) => {\n paginator.items.forEach((item) => {\n participantsPromises.push(\n this.upsertParticipant(item.key, item.data)\n );\n });\n return paginator.hasNextPage\n ? paginator.nextPage().then(rosterMapHandler)\n : null;\n };\n\n return rosterMap\n .getItems()\n .then(rosterMapHandler)\n .then(() => Promise.all(participantsPromises))\n .then(() => rosterMap);\n })\n .catch((err) => {\n this.rosterEntityPromise = null;\n if (this.services.syncClient.connectionState != \"disconnected\") {\n log.error(\n \"Failed to get roster object for conversation\",\n this.conversation.sid,\n err\n );\n }\n log.debug(\n \"ERROR: Failed to get roster object for conversation\",\n this.conversation.sid,\n err\n );\n throw err;\n }));\n }\n\n async upsertParticipantFromResponse(\n data: ParticipantResponse\n ): Promise<Participant> {\n const {\n sid,\n attributes: responseAttributes,\n date_created: dateCreated,\n date_updated: dateUpdated,\n identity: responseIdentity,\n role_sid: roleSid,\n messaging_binding: messagingBinding,\n } = data;\n\n return await this.upsertParticipant(sid, {\n attributes: responseAttributes,\n dateCreated: new Date(dateCreated),\n dateUpdated: new Date(dateUpdated),\n identity: responseIdentity,\n roleSid,\n lastConsumedMessageIndex: null,\n lastConsumptionTimestamp: null,\n type: messagingBinding?.type ?? \"chat\",\n });\n }\n\n async upsertParticipant(\n participantSid: string,\n data: ParticipantDescriptor\n ): Promise<Participant> {\n let participant = this.participants.get(participantSid);\n if (participant) {\n return participant._update(data);\n }\n\n const links = {\n self: `${this.links.participants}/${participantSid}`,\n };\n\n participant = new Participant(\n data,\n participantSid,\n this.conversation,\n links,\n this.services\n );\n this.participants.set(participantSid, participant);\n participant.on(Participant.updated, (args: ParticipantUpdatedEventArgs) =>\n this.emit(Conversation.participantUpdated, args)\n );\n return participant;\n }\n\n /**\n * @returns {Promise<Array<Participant>>} returns list of participants {@see Participant}\n */\n async getParticipants(): Promise<Participant[]> {\n return this.rosterEntityPromise\n ? this.rosterEntityPromise.then(() => {\n const participants: Participant[] = [];\n this.participants.forEach((participant) =>\n participants.push(participant)\n );\n return participants;\n })\n : [];\n }\n\n /**\n * Get participant by SID from conversation\n * @returns {Promise<Participant>}\n */\n async getParticipantBySid(\n participantSid: string\n ): Promise<Participant | null> {\n return this.rosterEntityPromise\n ? this.rosterEntityPromise.then(() => {\n const participant = this.participants.get(participantSid);\n if (!participant) {\n throw new Error(\n \"Participant with SID \" + participantSid + \" was not found\"\n );\n }\n return participant;\n })\n : null;\n }\n\n /**\n * Get participant by identity from conversation\n * @returns {Promise<Participant>}\n */\n async getParticipantByIdentity(\n identity: string\n ): Promise<Participant | null> {\n let foundParticipant: Participant | null = null;\n return this.rosterEntityPromise\n ? this.rosterEntityPromise.then(() => {\n this.participants.forEach((participant) => {\n if (participant.identity === identity) {\n foundParticipant = participant;\n }\n });\n if (!foundParticipant) {\n throw new Error(\n \"Participant with identity \" + identity + \" was not found\"\n );\n }\n return foundParticipant;\n })\n : null;\n }\n\n /**\n * Add a chat participant to the conversation\n */\n async add(\n identity: string,\n attributes: JSONValue\n ): Promise<ParticipantResponse> {\n return await this.services.commandExecutor.mutateResource<\n AddParticipantRequest,\n ParticipantResponse\n >(\"post\", this.links.participants, {\n identity,\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n }\n\n /**\n * Add a non-chat participant to the conversation.\n */\n async addNonChatParticipant(\n proxyAddress: string,\n address: string,\n attributes: JSONValue = {},\n bindingOptions: ParticipantBindingOptions = {}\n ): Promise<ParticipantResponse> {\n return await this.services.commandExecutor.mutateResource<\n AddParticipantRequest,\n ParticipantResponse\n >(\"post\", this.links.participants, {\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n messaging_binding: {\n address,\n proxy_address: proxyAddress,\n name: bindingOptions?.email?.name,\n level: bindingOptions?.email?.level,\n },\n });\n }\n\n /**\n * Remove the participant with a given identity from a conversation.\n */\n remove(identity: string): Promise<void> {\n return this.services.commandExecutor.mutateResource(\n \"delete\",\n `${this.links.participants}/${encodeURIComponent(identity)}`\n );\n }\n}\n\nexport { Participants };\n\n/**\n * Fired when participant joined conversation\n * @event Participants#participantJoined\n * @type {Participant}\n */\n\n/**\n * Fired when participant left conversation\n * @event Participants#participantLeft\n * @type {Participant}\n */\n\n/**\n * Fired when participant updated\n * @event Participants#participantUpdated\n * @type {Object}\n * @property {Participant} participant - Updated Participant\n * @property {Participant#UpdateReason[]} updateReasons - Array of Participant's updated event reasons\n */\n"],"names":[],"mappings":"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"}A,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA,CAC7D,CAAC;KACH;AACF,CAAA;AAID;;;;AAIG;AAEH;;;;AAIG;AAEH;;;;;;AAMG;;;;"}