@twilio/conversations 3.0.0-rc.8 → 3.0.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +38 -28
  2. package/builds/browser.js +4327 -7903
  3. package/builds/browser.js.map +1 -1
  4. package/builds/lib.d.ts +629 -102
  5. package/builds/lib.js +4319 -7904
  6. package/builds/lib.js.map +1 -1
  7. package/builds/twilio-conversations.js +27540 -41958
  8. package/builds/twilio-conversations.min.js +200 -1
  9. package/dist/aggregated-delivery-receipt.js +10 -1
  10. package/dist/aggregated-delivery-receipt.js.map +1 -1
  11. package/dist/channel-metadata-client.js +192 -0
  12. package/dist/channel-metadata-client.js.map +1 -0
  13. package/dist/client.js +75 -123
  14. package/dist/client.js.map +1 -1
  15. package/dist/command-executor.js +81 -20
  16. package/dist/command-executor.js.map +1 -1
  17. package/dist/configuration.js +14 -3
  18. package/dist/configuration.js.map +1 -1
  19. package/dist/content-client.js +184 -0
  20. package/dist/content-client.js.map +1 -0
  21. package/dist/content-template.js +310 -0
  22. package/dist/content-template.js.map +1 -0
  23. package/dist/conversation.js +105 -22
  24. package/dist/conversation.js.map +1 -1
  25. package/dist/data/conversations.js +43 -5
  26. package/dist/data/conversations.js.map +1 -1
  27. package/dist/data/messages.js +26 -19
  28. package/dist/data/messages.js.map +1 -1
  29. package/dist/data/participants.js +15 -4
  30. package/dist/data/participants.js.map +1 -1
  31. package/dist/data/users.js +11 -2
  32. package/dist/data/users.js.map +1 -1
  33. package/dist/detailed-delivery-receipt.js +9 -0
  34. package/dist/detailed-delivery-receipt.js.map +1 -1
  35. package/dist/index.js +20 -2
  36. package/dist/index.js.map +1 -1
  37. package/dist/interfaces/notification-types.js +9 -0
  38. package/dist/interfaces/notification-types.js.map +1 -1
  39. package/dist/interfaces/{attributes.js → rules.js} +26 -7
  40. package/dist/interfaces/rules.js.map +1 -0
  41. package/dist/logger.js +9 -0
  42. package/dist/logger.js.map +1 -1
  43. package/dist/media.js +9 -0
  44. package/dist/media.js.map +1 -1
  45. package/dist/message-builder.js +77 -6
  46. package/dist/message-builder.js.map +1 -1
  47. package/dist/message.js +115 -22
  48. package/dist/message.js.map +1 -1
  49. package/dist/node_modules/quick-lru/index.js +265 -0
  50. package/dist/node_modules/quick-lru/index.js.map +1 -0
  51. package/dist/node_modules/tslib/tslib.es6.js +9 -0
  52. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  53. package/dist/packages/conversations/package.json.js +10 -1
  54. package/dist/packages/conversations/package.json.js.map +1 -1
  55. package/dist/participant.js +45 -36
  56. package/dist/participant.js.map +1 -1
  57. package/dist/push-notification.js +9 -0
  58. package/dist/push-notification.js.map +1 -1
  59. package/dist/rest-paginator.js +20 -11
  60. package/dist/rest-paginator.js.map +1 -1
  61. package/dist/services/network.js +110 -11
  62. package/dist/services/network.js.map +1 -1
  63. package/dist/services/typing-indicator.js +22 -5
  64. package/dist/services/typing-indicator.js.map +1 -1
  65. package/dist/unsent-message.js +9 -0
  66. package/dist/unsent-message.js.map +1 -1
  67. package/dist/user.js +20 -3
  68. package/dist/user.js.map +1 -1
  69. package/dist/util/deferred.js +9 -0
  70. package/dist/util/deferred.js.map +1 -1
  71. package/dist/util/index.js +9 -0
  72. package/dist/util/index.js.map +1 -1
  73. package/docs/.nojekyll +1 -0
  74. package/docs/assets/highlight.css +113 -0
  75. package/docs/assets/main.js +58 -0
  76. package/docs/assets/search.js +1 -0
  77. package/docs/assets/style.css +1279 -0
  78. package/docs/classes/AggregatedDeliveryReceipt.html +144 -3182
  79. package/docs/classes/CancellablePromise.html +224 -3209
  80. package/docs/classes/CancellationError.html +112 -0
  81. package/docs/classes/ChannelMetadata.html +67 -0
  82. package/docs/classes/Client.html +701 -4237
  83. package/docs/classes/ContentTemplate.html +97 -0
  84. package/docs/classes/ContentTemplateVariable.html +90 -0
  85. package/docs/classes/Conversation.html +768 -4352
  86. package/docs/classes/DetailedDeliveryReceipt.html +116 -3162
  87. package/docs/classes/Media.html +119 -3165
  88. package/docs/classes/Message.html +417 -3730
  89. package/docs/classes/MessageBuilder.html +208 -3274
  90. package/docs/classes/Participant.html +258 -3442
  91. package/docs/classes/PushNotification.html +101 -3129
  92. package/docs/classes/RestPaginator.html +120 -3158
  93. package/docs/classes/UnsentMessage.html +63 -3040
  94. package/docs/classes/User.html +209 -3347
  95. package/docs/index.html +146 -3502
  96. package/docs/interfaces/ClientOptions.html +66 -3033
  97. package/docs/interfaces/ConversationBindings.html +109 -3000
  98. package/docs/interfaces/ConversationEmailBinding.html +109 -3000
  99. package/docs/interfaces/ConversationLimits.html +87 -3097
  100. package/docs/interfaces/ConversationState.html +66 -3049
  101. package/docs/interfaces/ConversationUpdatedEventArgs.html +109 -3000
  102. package/docs/interfaces/CreateConversationOptions.html +73 -3065
  103. package/docs/interfaces/LastMessage.html +66 -3049
  104. package/docs/interfaces/Paginator.html +110 -3139
  105. package/docs/interfaces/ParticipantBindingOptions.html +110 -0
  106. package/docs/interfaces/ParticipantBindings.html +109 -3000
  107. package/docs/interfaces/ParticipantEmailBinding.html +109 -3000
  108. package/docs/interfaces/PushNotificationData.html +94 -3113
  109. package/docs/interfaces/SendEmailOptions.html +59 -3033
  110. package/docs/interfaces/SendMediaOptions.html +75 -3067
  111. package/docs/modules.html +180 -3509
  112. package/docs/types/ChannelType.html +106 -0
  113. package/docs/types/ConnectionState.html +115 -0
  114. package/docs/types/ContentData.html +106 -0
  115. package/docs/types/ContentDataAction.html +107 -0
  116. package/docs/types/ContentDataActionOther.html +121 -0
  117. package/docs/types/ContentDataActionPhone.html +128 -0
  118. package/docs/types/ContentDataActionReply.html +133 -0
  119. package/docs/types/ContentDataActionUrl.html +128 -0
  120. package/docs/types/ContentDataCallToAction.html +131 -0
  121. package/docs/types/ContentDataCard.html +137 -0
  122. package/docs/types/ContentDataListItem.html +121 -0
  123. package/docs/types/ContentDataListPicker.html +134 -0
  124. package/docs/types/ContentDataLocation.html +134 -0
  125. package/docs/types/ContentDataMedia.html +129 -0
  126. package/docs/types/ContentDataOther.html +121 -0
  127. package/docs/types/ContentDataQuickReply.html +131 -0
  128. package/docs/types/ContentDataReply.html +119 -0
  129. package/docs/types/ContentDataText.html +125 -0
  130. package/docs/types/ConversationStatus.html +107 -0
  131. package/docs/types/ConversationUpdateReason.html +106 -0
  132. package/docs/types/DeliveryAmount.html +106 -0
  133. package/docs/types/DeliveryStatus.html +106 -0
  134. package/docs/types/JSONArray.html +106 -0
  135. package/docs/types/JSONObject.html +111 -0
  136. package/docs/types/JSONValue.html +106 -0
  137. package/docs/types/LogLevel.html +106 -0
  138. package/docs/types/MediaCategory.html +106 -0
  139. package/docs/types/MessageType.html +106 -0
  140. package/docs/types/MessageUpdateReason.html +106 -0
  141. package/docs/types/NotificationLevel.html +109 -0
  142. package/docs/types/NotificationsChannelType.html +110 -0
  143. package/docs/types/ParticipantEmailLevel.html +108 -0
  144. package/docs/types/ParticipantType.html +107 -0
  145. package/docs/types/ParticipantUpdateReason.html +106 -0
  146. package/docs/types/PushNotificationType.html +106 -0
  147. package/docs/types/State.html +110 -0
  148. package/docs/types/UserUpdateReason.html +106 -0
  149. package/package.json +22 -17
  150. package/CHANGELOG.md +0 -501
  151. package/dist/interfaces/attributes.js.map +0 -1
  152. package/docs/assets/css/main.css +0 -2660
  153. package/docs/assets/images/icons.png +0 -0
  154. package/docs/assets/images/icons@2x.png +0 -0
  155. package/docs/assets/images/widgets.png +0 -0
  156. package/docs/assets/images/widgets@2x.png +0 -0
  157. package/docs/assets/js/main.js +0 -248
  158. package/docs/assets/js/search.js +0 -1
@@ -128,6 +128,15 @@ This software includes platform.js under the following license.
128
128
  */
129
129
  'use strict';
130
130
 
131
+ var global =
132
+ typeof global !== "undefined"
133
+ ? global
134
+ : typeof self !== "undefined"
135
+ ? self
136
+ : typeof window !== "undefined"
137
+ ? window
138
+ : {};
139
+
131
140
  Object.defineProperty(exports, '__esModule', { value: true });
132
141
 
133
142
  var logger = require('../logger.js');
@@ -309,7 +318,7 @@ class Conversations extends replayEventEmitter.ReplayEventEmitter {
309
318
  async _wrapPaginator(page, op) {
310
319
  const items = await op(page.items);
311
320
  return {
312
- items,
321
+ items: items.filter((item) => item !== null),
313
322
  hasNextPage: page.hasNextPage,
314
323
  hasPrevPage: page.hasPrevPage,
315
324
  nextPage: () => page.nextPage().then((x) => this._wrapPaginator(x, op)),
@@ -366,13 +375,29 @@ class Conversations extends replayEventEmitter.ReplayEventEmitter {
366
375
  log.trace(`upsertConversation: the conversation ${conversation$1.sid} is known;` +
367
376
  `its status is known from the source ${conversation$1._statusSource} ` +
368
377
  `and the update came from the source ${source}`, conversation$1);
369
- await this._updateConversation(source, conversation$1, data);
370
- await conversation$1._subscribe();
378
+ try {
379
+ await this._updateConversation(source, conversation$1, data);
380
+ await conversation$1._subscribe();
381
+ }
382
+ catch (error) {
383
+ if (error.name !== "SyncError") {
384
+ throw error;
385
+ }
386
+ // This case is possible when two async calls of _upsertConversation are
387
+ // going at the same time. A case where the conversation was put into
388
+ // the cache by the function that didn't go far enough to realize that
389
+ // this conversation is broken (and therefore removed from the cache) is
390
+ // possible when it gets asynchronously interrupted and another call to
391
+ // the same function happens during the interrupt of the first one.
392
+ log.trace("upsertChannel: the conversation is missing some Sync entity(ies), ignoring", sid, error);
393
+ this.conversations.delete(sid);
394
+ return null;
395
+ }
371
396
  return conversation$1;
372
397
  }
373
398
  // If the conversations is deleted, ignore it
374
399
  if (source === "rest" && this.tombstones.has(sid)) {
375
- log.trace("upsertChannel: the channel is deleted but reappeared again from REST, ignoring", sid);
400
+ log.trace("upsertChannel: the conversation is deleted but reappeared again from REST, ignoring", sid);
376
401
  return null;
377
402
  }
378
403
  // If the conversation is unknown, fetch it
@@ -386,7 +411,20 @@ class Conversations extends replayEventEmitter.ReplayEventEmitter {
386
411
  };
387
412
  const newConversation = new conversation.Conversation(data, sid, links, this.configuration, this.services);
388
413
  this.conversations.set(sid, newConversation);
389
- await newConversation._subscribe();
414
+ try {
415
+ await newConversation._subscribe();
416
+ if (data.status === "joined") {
417
+ await newConversation._fetchStreams();
418
+ }
419
+ }
420
+ catch (error) {
421
+ if (error.name !== "SyncError") {
422
+ throw error;
423
+ }
424
+ log.trace("upsertChannel: the conversation is missing some Sync entity(ies), ignoring", sid, error);
425
+ this.conversations.delete(sid);
426
+ return null;
427
+ }
390
428
  this._registerForEvents(newConversation);
391
429
  this.emit("conversationAdded", newConversation);
392
430
  if (data.status === "joined") {
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.js","sources":["../../src/data/conversations.ts"],"sourcesContent":["import { Logger } from \"../logger\";\nimport {\n Conversation,\n ConversationDescriptor,\n ConversationUpdatedEventArgs,\n ConversationUpdateReason,\n} from \"../conversation\";\nimport { SyncMap, SyncClient, SyncMapItem } from \"twilio-sync\";\nimport { Users } from \"./users\";\nimport { Network } from \"../services/network\";\nimport { TypingIndicator } from \"../services/typing-indicator\";\nimport { McsClient } from \"@twilio/mcs-client\";\nimport { Deferred } from \"../util/deferred\";\nimport {\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason,\n} from \"../participant\";\nimport {\n Message,\n MessageUpdatedEventArgs,\n MessageUpdateReason,\n} from \"../message\";\nimport { UriBuilder } from \"../util\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { CreateConversationRequest } from \"../interfaces/commands/create-conversation\";\nimport { ConversationResponse } from \"../interfaces/commands/conversation-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { ResponseMeta } from \"../interfaces/commands/response-meta\";\n\ntype ConversationsEvents = {\n conversationAdded: (conversation: Conversation) => void;\n conversationJoined: (conversation: Conversation) => void;\n conversationLeft: (conversation: Conversation) => void;\n conversationRemoved: (conversation: Conversation) => void;\n conversationUpdated: (data: {\n conversation: Conversation;\n updateReasons: ConversationUpdateReason[];\n }) => void;\n participantJoined: (participant: Participant) => void;\n participantLeft: (participant: Participant) => void;\n participantUpdated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n};\n\ntype ConversationsDataSource = \"sync\" | \"rest\";\n\ninterface ConversationsServices {\n syncClient: SyncClient;\n users: Users;\n typingIndicator: TypingIndicator;\n network: Network;\n mcsClient: McsClient;\n commandExecutor: CommandExecutor;\n}\n\ntype ConversationRestData = {\n roster: string;\n notificationLevel: \"default\" | \"muted\";\n lastConsumedMessageIndex: number;\n channel: string;\n messages: string;\n descriptor: ConversationResponse;\n channel_sid: string;\n status: string;\n};\n\nconst log = Logger.scope(\"Conversations\");\n\n/**\n * Represents conversations collection\n * {@see Conversation}\n */\nclass Conversations extends ReplayEventEmitter<ConversationsEvents> {\n public readonly conversations: Map<string, Conversation> = new Map();\n public readonly myConversationsRead: Deferred<boolean> = new Deferred();\n private readonly configuration: Configuration;\n private readonly services: ConversationsServices;\n private readonly tombstones: Set<string> = new Set();\n private myConversationsFetched = false;\n\n public constructor(\n configuration: Configuration,\n services: ConversationsServices\n ) {\n super();\n\n this.configuration = configuration;\n this.services = services;\n }\n\n public async addConversation(options): Promise<Conversation> {\n const attributes =\n typeof options?.attributes !== \"undefined\" ? options.attributes : {};\n\n const response = await this.services.commandExecutor.mutateResource<\n CreateConversationRequest,\n ConversationResponse\n >(\"post\", this.configuration.links.conversations, {\n friendly_name: options.friendlyName,\n unique_name: options.uniqueName,\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n\n const conversationSid = response.sid ?? null;\n const conversationDocument = response.sync_objects?.conversation ?? null;\n const links = {\n self: response.url,\n ...response.links,\n };\n const existingConversation = this.conversations.get(conversationSid);\n\n if (existingConversation) {\n await existingConversation._subscribe();\n return existingConversation;\n }\n\n const conversation = new Conversation(\n {\n channel: conversationDocument,\n entityName: \"\",\n uniqueName: \"\",\n attributes: null,\n createdBy: \"\",\n friendlyName: \"\",\n lastConsumedMessageIndex: 0,\n dateCreated: null,\n dateUpdated: null,\n },\n conversationSid,\n links,\n this.configuration,\n this.services\n );\n\n this.conversations.set(conversation.sid, conversation);\n this._registerForEvents(conversation);\n\n await conversation._subscribe();\n this.emit(\"conversationAdded\", conversation);\n\n return conversation;\n }\n\n /**\n * Fetch conversations list and instantiate all necessary objects\n */\n public async fetchConversations(): Promise<Conversations> {\n try {\n const map = await this._getMap();\n\n map.on(\"itemAdded\", (args) => {\n log.debug(`itemAdded: ${args.item.key}`);\n\n this._upsertConversation(\"sync\", args.item.key, args.item.data);\n });\n\n map.on(\"itemRemoved\", (args) => {\n log.debug(`itemRemoved: ${args.key}`);\n\n const sid = args.key;\n\n if (!this.myConversationsFetched) {\n this.tombstones.add(sid);\n }\n\n const conversation = this.conversations.get(sid);\n\n if (!conversation) {\n return;\n }\n\n if (conversation.status === \"joined\") {\n conversation._setStatus(\"notParticipating\", \"sync\");\n this.emit(\"conversationLeft\", conversation);\n }\n\n this.conversations.delete(sid);\n this.emit(\"conversationRemoved\", conversation);\n conversation.emit(\"removed\", conversation);\n });\n\n map.on(\"itemUpdated\", (args) => {\n log.debug(`itemUpdated: ${args.item.key}`);\n\n this._upsertConversation(\"sync\", args.item.key, args.item.data);\n });\n\n const myConversations: ConversationRestData[] =\n await this._fetchMyConversations();\n const upserts: Promise<Conversation | null>[] = [];\n\n for (const conversation of myConversations) {\n upserts.push(\n this._upsertConversation(\n \"rest\",\n conversation[\"channel_sid\"],\n conversation\n )\n );\n }\n\n this.myConversationsRead.set(true);\n\n await Promise.all(upserts);\n\n this.myConversationsFetched = true;\n this.tombstones.clear();\n\n log.debug(\"The conversations list has been successfully fetched\");\n\n return this;\n } catch (error) {\n const errorMessage = \"Failed to fetch the conversations list\";\n\n if (this.services.syncClient.connectionState !== \"disconnected\") {\n log.error(errorMessage, error);\n }\n\n log.debug(`ERROR: ${errorMessage}`, error);\n\n throw error;\n }\n }\n\n public async getConversations() {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems();\n\n return this._wrapPaginator(page, (items) =>\n Promise.all(\n items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n )\n )\n );\n }\n\n public async getConversation(\n sid: string\n ): Promise<Conversation | undefined | null> {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems({ key: sid });\n const items = page.items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n );\n\n return items.length > 0 ? items[0] : null;\n }\n\n public async getConversationByUniqueName(\n uniqueName: string\n ): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(uniqueName)\n .build();\n const response = await this.services.network.get<ConversationResponse>(url);\n const body = response.body;\n\n const sid = body.conversation_sid;\n const data = {\n entityName: null,\n lastConsumedMessageIndex: body.last_read_message_index,\n status: body?.status || \"unknown\",\n friendlyName: body.friendly_name,\n dateUpdated: body.date_updated,\n dateCreated: body.date_created,\n uniqueName: body.unique_name,\n createdBy: body.created_by,\n attributes: body.attributes,\n channel: body.sync_objects.conversation,\n notificationLevel: body?.notification_level,\n sid,\n };\n\n return sid ? this._upsertConversation(\"sync\", sid, data) : null;\n }\n\n public async peekConversation(sid: string): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.conversations)\n .path(sid)\n .build();\n const response = await this.services.network.get<ConversationResponse>(url);\n const body = response.body;\n\n const data = {\n entityName: null,\n // lastConsumedMessageIndex: body.last_read_message_index,\n status: body?.status || \"unknown\",\n friendlyName: body.friendly_name,\n dateUpdated: body.date_updated,\n dateCreated: body.date_created,\n uniqueName: body.unique_name,\n createdBy: body.created_by,\n attributes: body.attributes,\n channel: `${sid}.channel`,\n // notificationLevel: body?.notification_level,\n sid,\n };\n\n return this._upsertConversation(\"sync\", sid, data);\n }\n\n private async _getMap(): Promise<SyncMap> {\n return await this.services.syncClient.map({\n id: this.configuration.myConversations,\n mode: \"open_existing\",\n });\n }\n\n private async _wrapPaginator(page, op) {\n const items = await op(page.items);\n\n return {\n items,\n hasNextPage: page.hasNextPage,\n hasPrevPage: page.hasPrevPage,\n nextPage: () => page.nextPage().then((x) => this._wrapPaginator(x, op)),\n prevPage: () => page.prevPage().then((x) => this._wrapPaginator(x, op)),\n };\n }\n\n private async _updateConversation(\n source: ConversationsDataSource,\n conversation: Conversation,\n data\n ): Promise<void> {\n const areSourcesDifferent =\n conversation._statusSource !== undefined &&\n source !== conversation._statusSource;\n const isChannelSourceSync =\n source !== \"rest\" || conversation._statusSource === \"sync\";\n\n if (areSourcesDifferent && isChannelSourceSync && source !== \"sync\") {\n log.trace(\n \"upsertConversation: conversation is known from sync and came from REST, ignoring\",\n {\n sid: conversation.sid,\n data: data.status,\n conversation: conversation.status,\n }\n );\n\n return;\n }\n\n if (data.status === \"joined\" && conversation.status !== \"joined\") {\n conversation._setStatus(\"joined\", source);\n\n const updateData: Partial<ConversationDescriptor> = {};\n\n if (typeof data.notificationLevel !== \"undefined\") {\n updateData.notificationLevel = data.notificationLevel;\n }\n\n if (typeof data.lastConsumedMessageIndex !== \"undefined\") {\n updateData.lastConsumedMessageIndex = data.lastConsumedMessageIndex;\n }\n\n if (!isEqual(updateData, {})) {\n conversation._update(updateData);\n }\n\n await conversation._subscribe();\n this.emit(\"conversationJoined\", conversation);\n\n return;\n }\n\n if (\n data.status === \"notParticipating\" &&\n conversation.status === \"joined\"\n ) {\n conversation._setStatus(\"notParticipating\", source);\n conversation._update(data);\n\n await conversation._subscribe();\n this.emit(\"conversationLeft\", conversation);\n\n return;\n }\n\n if (data.status === \"notParticipating\") {\n await conversation._subscribe();\n\n return;\n }\n\n conversation._update(data);\n }\n\n private async _upsertConversation(\n source: ConversationsDataSource,\n sid: string,\n data\n ): Promise<Conversation | null> {\n log.trace(`upsertConversation called for ${sid}`, data);\n\n const conversation = this.conversations.get(sid);\n\n // If the channel is known, update it\n if (conversation) {\n log.trace(\n `upsertConversation: the conversation ${conversation.sid} is known;` +\n `its status is known from the source ${conversation._statusSource} ` +\n `and the update came from the source ${source}`,\n conversation\n );\n\n await this._updateConversation(source, conversation, data);\n await conversation._subscribe();\n\n return conversation;\n }\n\n // If the conversations is deleted, ignore it\n if (source === \"rest\" && this.tombstones.has(sid)) {\n log.trace(\n \"upsertChannel: the channel is deleted but reappeared again from REST, ignoring\",\n sid\n );\n return null;\n }\n\n // If the conversation is unknown, fetch it\n log.trace(\n \"upsertConversation: creating a local conversation object with sid \" +\n sid,\n data\n );\n\n const baseLink = `${this.configuration.links.conversations}/${sid}`;\n const links = {\n self: baseLink,\n messages: `${baseLink}/Messages`,\n participants: `${baseLink}/Participants`,\n };\n const newConversation = new Conversation(\n data,\n sid,\n links,\n this.configuration,\n this.services\n );\n this.conversations.set(sid, newConversation);\n\n await newConversation._subscribe();\n this._registerForEvents(newConversation);\n this.emit(\"conversationAdded\", newConversation);\n\n if (data.status === \"joined\") {\n newConversation._setStatus(\"joined\", source);\n this.emit(\"conversationJoined\", newConversation);\n }\n\n return newConversation;\n }\n private async _fetchMyConversations(): Promise<ConversationRestData[]> {\n let conversations: ConversationRestData[] = [];\n let pageToken: null | string = null;\n\n do {\n const url = new UriBuilder(this.configuration.links.myConversations);\n\n if (pageToken) {\n url.arg(\"PageToken\", pageToken);\n }\n\n const response = await this.services.network.get<\n { conversations: ConversationResponse[] } & ResponseMeta\n >(url.build());\n const receivedConversations = response.body?.conversations.map(\n (conversationDescriptor) => ({\n descriptor: conversationDescriptor,\n channel_sid: conversationDescriptor.conversation_sid,\n status: conversationDescriptor.status,\n channel: conversationDescriptor.sync_objects.conversation,\n messages: conversationDescriptor.sync_objects.messages,\n roster: `${conversationDescriptor.conversation_sid}.roster`,\n lastConsumedMessageIndex:\n conversationDescriptor.last_read_message_index,\n notificationLevel: conversationDescriptor.notification_level,\n })\n );\n\n pageToken = response.body.meta.next_token;\n conversations = [...conversations, ...receivedConversations];\n } while (pageToken);\n\n return conversations;\n }\n\n private _onConversationRemoved(sid: string) {\n const conversation = this.conversations.get(sid);\n\n if (conversation) {\n this.conversations.delete(sid);\n this.emit(\"conversationRemoved\", conversation);\n }\n }\n\n private _registerForEvents(conversation) {\n conversation.on(\"removed\", () =>\n this._onConversationRemoved(conversation.sid)\n );\n conversation.on(\"updated\", (args: ConversationUpdatedEventArgs) =>\n this.emit(\"conversationUpdated\", args)\n );\n conversation.on(\"participantJoined\", (participant) =>\n this.emit(\"participantJoined\", participant)\n );\n conversation.on(\"participantLeft\", (participant) =>\n this.emit(\"participantLeft\", participant)\n );\n conversation.on(\"participantUpdated\", (args: ParticipantUpdatedEventArgs) =>\n this.emit(\"participantUpdated\", args)\n );\n conversation.on(\"messageAdded\", (message) =>\n this.emit(\"messageAdded\", message)\n );\n conversation.on(\"messageUpdated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n conversation.on(\"messageRemoved\", (message) =>\n this.emit(\"messageRemoved\", message)\n );\n conversation.on(\"typingStarted\", (participant) =>\n this.emit(\"typingStarted\", participant)\n );\n conversation.on(\"typingEnded\", (participant) =>\n this.emit(\"typingEnded\", participant)\n );\n }\n}\n\nexport {\n ConversationsServices,\n ConversationsDataSource,\n Conversation,\n Conversations,\n};\n"],"names":["Logger","ReplayEventEmitter","Deferred","conversation","Conversation","UriBuilder","isEqual"],"mappings":"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"}
1
+ {"version":3,"file":"conversations.js","sources":["../../src/data/conversations.ts"],"sourcesContent":["import { Logger } from \"../logger\";\nimport {\n Conversation,\n ConversationDescriptor,\n ConversationUpdatedEventArgs,\n ConversationUpdateReason,\n} from \"../conversation\";\nimport { SyncMap, SyncClient, SyncMapItem } from \"twilio-sync\";\nimport { Users } from \"./users\";\nimport { Network } from \"../services/network\";\nimport { TypingIndicator } from \"../services/typing-indicator\";\nimport { McsClient } from \"@twilio/mcs-client\";\nimport { Deferred } from \"../util/deferred\";\nimport {\n Participant,\n ParticipantUpdatedEventArgs,\n ParticipantUpdateReason,\n} from \"../participant\";\nimport {\n Message,\n MessageUpdatedEventArgs,\n MessageUpdateReason,\n} from \"../message\";\nimport { UriBuilder } from \"../util\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { CreateConversationRequest } from \"../interfaces/commands/create-conversation\";\nimport { ConversationResponse } from \"../interfaces/commands/conversation-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { ChannelMetadataClient } from \"../channel-metadata-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}\n\ntype ConversationRestData = {\n roster: string;\n notificationLevel: \"default\" | \"muted\";\n lastConsumedMessageIndex: number;\n channel: string;\n messages: string;\n descriptor: ConversationResponse;\n channel_sid: string;\n status: string;\n};\n\nconst log = Logger.scope(\"Conversations\");\n\n/**\n * Represents conversations collection\n * {@see Conversation}\n */\nclass Conversations extends ReplayEventEmitter<ConversationsEvents> {\n public readonly conversations: Map<string, Conversation> = new Map();\n public readonly myConversationsRead: Deferred<boolean> = new Deferred();\n private readonly configuration: Configuration;\n private readonly services: ConversationsServices;\n private readonly tombstones: Set<string> = new Set();\n private myConversationsFetched = false;\n\n public constructor(\n configuration: Configuration,\n services: ConversationsServices\n ) {\n super();\n\n this.configuration = configuration;\n this.services = services;\n }\n\n public async addConversation(options): Promise<Conversation> {\n const attributes =\n typeof options?.attributes !== \"undefined\" ? options.attributes : {};\n\n const response = await this.services.commandExecutor.mutateResource<\n CreateConversationRequest,\n ConversationResponse\n >(\"post\", this.configuration.links.conversations, {\n friendly_name: options.friendlyName,\n unique_name: options.uniqueName,\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n\n const conversationSid = response.sid ?? null;\n const conversationDocument = response.sync_objects?.conversation ?? null;\n const links = {\n self: response.url,\n ...response.links,\n };\n const existingConversation = this.conversations.get(conversationSid);\n\n if (existingConversation) {\n await existingConversation._subscribe();\n return existingConversation;\n }\n\n const conversation = new Conversation(\n {\n channel: conversationDocument,\n entityName: \"\",\n uniqueName: \"\",\n attributes: null,\n createdBy: \"\",\n friendlyName: \"\",\n lastConsumedMessageIndex: 0,\n dateCreated: null,\n dateUpdated: null,\n },\n conversationSid,\n links,\n this.configuration,\n this.services\n );\n\n this.conversations.set(conversation.sid, conversation);\n this._registerForEvents(conversation);\n\n await conversation._subscribe();\n this.emit(\"conversationAdded\", conversation);\n\n return conversation;\n }\n\n /**\n * Fetch conversations list and instantiate all necessary objects\n */\n public async fetchConversations(): Promise<Conversations> {\n try {\n const map = await this._getMap();\n\n map.on(\"itemAdded\", (args) => {\n log.debug(`itemAdded: ${args.item.key}`);\n\n this._upsertConversation(\"sync\", args.item.key, args.item.data);\n });\n\n map.on(\"itemRemoved\", (args) => {\n log.debug(`itemRemoved: ${args.key}`);\n\n const sid = args.key;\n\n if (!this.myConversationsFetched) {\n this.tombstones.add(sid);\n }\n\n const conversation = this.conversations.get(sid);\n\n if (!conversation) {\n return;\n }\n\n if (conversation.status === \"joined\") {\n conversation._setStatus(\"notParticipating\", \"sync\");\n this.emit(\"conversationLeft\", conversation);\n }\n\n this.conversations.delete(sid);\n this.emit(\"conversationRemoved\", conversation);\n conversation.emit(\"removed\", conversation);\n });\n\n map.on(\"itemUpdated\", (args) => {\n log.debug(`itemUpdated: ${args.item.key}`);\n\n this._upsertConversation(\"sync\", args.item.key, args.item.data);\n });\n\n const myConversations: ConversationRestData[] =\n await this._fetchMyConversations();\n const upserts: Promise<Conversation | null>[] = [];\n\n for (const conversation of myConversations) {\n upserts.push(\n this._upsertConversation(\n \"rest\",\n conversation[\"channel_sid\"],\n conversation\n )\n );\n }\n\n this.myConversationsRead.set(true);\n\n await Promise.all(upserts);\n\n this.myConversationsFetched = true;\n this.tombstones.clear();\n\n log.debug(\"The conversations list has been successfully fetched\");\n\n return this;\n } catch (error) {\n const errorMessage = \"Failed to fetch the conversations list\";\n\n if (this.services.syncClient.connectionState !== \"disconnected\") {\n log.error(errorMessage, error);\n }\n\n log.debug(`ERROR: ${errorMessage}`, error);\n\n throw error;\n }\n }\n\n public async getConversations() {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems();\n\n return this._wrapPaginator(page, (items) =>\n Promise.all(\n items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n )\n )\n );\n }\n\n public async getConversation(\n sid: string\n ): Promise<Conversation | undefined | null> {\n const conversationsMap = await this._getMap();\n const page = await conversationsMap.getItems({ key: sid });\n const items = page.items.map((item: SyncMapItem) =>\n this._upsertConversation(\"sync\", item.key, item.data)\n );\n\n return items.length > 0 ? items[0] : null;\n }\n\n public async getConversationByUniqueName(\n uniqueName: string\n ): Promise<Conversation | null> {\n const url = new UriBuilder(this.configuration.links.myConversations)\n .path(uniqueName)\n .build();\n const response = await this.services.network.get(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(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();\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 try {\n await this._updateConversation(source, conversation, data);\n await conversation._subscribe();\n } catch (error) {\n if (error.name !== \"SyncError\") {\n throw error;\n }\n\n // This case is possible when two async calls of _upsertConversation are\n // going at the same time. A case where the conversation was put into\n // the cache by the function that didn't go far enough to realize that\n // this conversation is broken (and therefore removed from the cache) is\n // possible when it gets asynchronously interrupted and another call to\n // the same function happens during the interrupt of the first one.\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 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(url.build());\n const receivedConversations = response.body?.conversations.map(\n (conversationDescriptor) => ({\n descriptor: conversationDescriptor,\n channel_sid: conversationDescriptor.conversation_sid,\n status: conversationDescriptor.status,\n channel: conversationDescriptor.sync_objects.conversation,\n messages: conversationDescriptor.sync_objects.messages,\n roster: `${conversationDescriptor.conversation_sid}.roster`,\n lastConsumedMessageIndex:\n conversationDescriptor.last_read_message_index,\n notificationLevel: conversationDescriptor.notification_level,\n })\n );\n\n pageToken = response.body.meta.next_token;\n conversations = [...conversations, ...receivedConversations];\n } while (pageToken);\n\n return conversations;\n }\n\n private _onConversationRemoved(sid: string) {\n const conversation = this.conversations.get(sid);\n\n if (conversation) {\n this.conversations.delete(sid);\n this.emit(\"conversationRemoved\", conversation);\n }\n }\n\n private _registerForEvents(conversation) {\n conversation.on(\"removed\", () =>\n this._onConversationRemoved(conversation.sid)\n );\n conversation.on(\"updated\", (args: ConversationUpdatedEventArgs) =>\n this.emit(\"conversationUpdated\", args)\n );\n conversation.on(\"participantJoined\", (participant) =>\n this.emit(\"participantJoined\", participant)\n );\n conversation.on(\"participantLeft\", (participant) =>\n this.emit(\"participantLeft\", participant)\n );\n conversation.on(\"participantUpdated\", (args: ParticipantUpdatedEventArgs) =>\n this.emit(\"participantUpdated\", args)\n );\n conversation.on(\"messageAdded\", (message) =>\n this.emit(\"messageAdded\", message)\n );\n conversation.on(\"messageUpdated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n conversation.on(\"messageRemoved\", (message) =>\n this.emit(\"messageRemoved\", message)\n );\n conversation.on(\"typingStarted\", (participant) =>\n this.emit(\"typingStarted\", participant)\n );\n conversation.on(\"typingEnded\", (participant) =>\n this.emit(\"typingEnded\", participant)\n );\n }\n}\n\nexport {\n ConversationsServices,\n ConversationsDataSource,\n Conversation,\n Conversations,\n};\n"],"names":["Logger","ReplayEventEmitter","Deferred","conversation","Conversation","UriBuilder","isEqual"],"mappings":"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"}
@@ -128,6 +128,15 @@ This software includes platform.js under the following license.
128
128
  */
129
129
  'use strict';
130
130
 
131
+ var global =
132
+ typeof global !== "undefined"
133
+ ? global
134
+ : typeof self !== "undefined"
135
+ ? self
136
+ : typeof window !== "undefined"
137
+ ? window
138
+ : {};
139
+
131
140
  Object.defineProperty(exports, '__esModule', { value: true });
132
141
 
133
142
  var logger = require('../logger.js');
@@ -150,33 +159,25 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
150
159
  }
151
160
  /**
152
161
  * Subscribe to the Messages Event Stream
153
- * @param name - The name of Sync object for the Messages resource.
162
+ * @param arg - Name of the Sync object, or the SyncList itself, that
163
+ * represents the Messages resource.
154
164
  */
155
- async subscribe(name) {
165
+ async subscribe(arg) {
156
166
  if (this.messagesListPromise) {
157
167
  return this.messagesListPromise;
158
168
  }
159
- this.messagesListPromise = this.services.syncClient.list({
160
- id: name,
161
- mode: "open_existing",
162
- });
169
+ this.messagesListPromise =
170
+ typeof arg === "string"
171
+ ? this.services.syncClient.list({
172
+ id: arg,
173
+ mode: "open_existing",
174
+ })
175
+ : Promise.resolve(arg);
163
176
  try {
164
177
  const list = await this.messagesListPromise;
165
178
  list.on("itemAdded", (args) => {
166
179
  log.debug(`${this.conversation.sid} itemAdded: ${args.item.index}`);
167
- const links = {
168
- self: `${this.conversation._links.messages}/${args.item.data.sid}`,
169
- conversation: this.conversation._links.self,
170
- messages_receipts: `${this.conversation._links.messages}/${args.item.data.sid}/Receipts`,
171
- };
172
- const message$1 = new message.Message(args.item.index, args.item.data, this.conversation, links, this.configuration, this.services);
173
- if (this.messagesByIndex.has(message$1.index)) {
174
- log.debug("Message arrived, but is already known and ignored", this.conversation.sid, message$1.index);
175
- return;
176
- }
177
- this.messagesByIndex.set(message$1.index, message$1);
178
- message$1.on("updated", (args) => this.emit("messageUpdated", args));
179
- this.emit("messageAdded", message$1);
180
+ this._upsertMessage(args.item.index, args.item.data);
180
181
  });
181
182
  list.on("itemRemoved", (args) => {
182
183
  log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);
@@ -251,6 +252,10 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
251
252
  attributes: typeof message.attributes !== "undefined"
252
253
  ? JSON.stringify(message.attributes)
253
254
  : undefined,
255
+ content_sid: message.contentSid,
256
+ content_variables: typeof message.contentVariables !== "undefined"
257
+ ? JSON.stringify(message.contentVariables.reduce((accum, current) => (Object.assign(Object.assign({}, accum), { [current.name]: current.value })), {}))
258
+ : undefined,
254
259
  });
255
260
  try {
256
261
  resolve(await messagesPostRequest);
@@ -328,6 +333,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
328
333
  _upsertMessage(index, value) {
329
334
  const cachedMessage = this.messagesByIndex.get(index);
330
335
  if (cachedMessage) {
336
+ log.debug("Attempted to upsert a message, but it is already known and therefore ignored", this.conversation.sid);
331
337
  return cachedMessage;
332
338
  }
333
339
  const links = {
@@ -338,6 +344,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
338
344
  const message$1 = new message.Message(index, value, this.conversation, links, this.configuration, this.services);
339
345
  this.messagesByIndex.set(message$1.index, message$1);
340
346
  message$1.on("updated", (args) => this.emit("messageUpdated", args));
347
+ this.emit("messageAdded", message$1);
341
348
  return message$1;
342
349
  }
343
350
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sources":["../../src/data/messages.ts"],"sourcesContent":["import { Logger } from \"../logger\";\n\nimport {\n Message,\n MessageData,\n MessageUpdatedEventArgs,\n MessageUpdateReason,\n} from \"../message\";\nimport {\n Conversation,\n SendEmailOptions,\n SendMediaOptions,\n} from \"../conversation\";\nimport { UnsentMessage } from \"../unsent-message\";\n\nimport { SyncList, SyncClient } from \"twilio-sync\";\nimport { SyncPaginator } from \"../sync-paginator\";\n\nimport { McsClient, McsMedia, CancellablePromise } from \"@twilio/mcs-client\";\nimport { Network } from \"../services/network\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { SendMessageRequest } from \"../interfaces/commands/send-message\";\nimport { MessageResponse } from \"../interfaces/commands/message-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { JSONValue } from \"../types\";\n\ntype MessagesEvents = {\n messageAdded: (message: Message) => void;\n messageRemoved: (message: Message) => void;\n messageUpdated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Messages\");\n\nexport interface MessagesServices {\n mcsClient: McsClient;\n network: Network;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n}\n\n/**\n * Represents the collection of messages in a conversation\n */\nclass Messages extends ReplayEventEmitter<MessagesEvents> {\n public readonly conversation: Conversation;\n private readonly configuration: Configuration;\n private readonly services: MessagesServices;\n private readonly messagesByIndex: Map<number, Message>;\n private messagesListPromise: Promise<SyncList> | null;\n\n public constructor(\n conversation: Conversation,\n configuration: Configuration,\n services: MessagesServices\n ) {\n super();\n\n this.conversation = conversation;\n this.configuration = configuration;\n this.services = services;\n\n this.messagesByIndex = new Map();\n this.messagesListPromise = null;\n }\n\n /**\n * Subscribe to the Messages Event Stream\n * @param name - The name of Sync object for the Messages resource.\n */\n public async subscribe(name: string) {\n if (this.messagesListPromise) {\n return this.messagesListPromise;\n }\n\n this.messagesListPromise = this.services.syncClient.list({\n id: name,\n mode: \"open_existing\",\n });\n\n try {\n const list = await this.messagesListPromise;\n\n list.on(\"itemAdded\", (args) => {\n log.debug(`${this.conversation.sid} itemAdded: ${args.item.index}`);\n\n const links = {\n self: `${this.conversation._links.messages}/${args.item.data.sid}`,\n conversation: this.conversation._links.self,\n messages_receipts: `${this.conversation._links.messages}/${args.item.data.sid}/Receipts`,\n };\n const message = new Message(\n args.item.index,\n args.item.data,\n this.conversation,\n links,\n this.configuration,\n this.services\n );\n\n if (this.messagesByIndex.has(message.index)) {\n log.debug(\n \"Message arrived, but is already known and ignored\",\n this.conversation.sid,\n message.index\n );\n return;\n }\n\n this.messagesByIndex.set(message.index, message);\n\n message.on(\"updated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n\n this.emit(\"messageAdded\", message);\n });\n\n list.on(\"itemRemoved\", (args) => {\n log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);\n\n const index = args.index;\n\n if (this.messagesByIndex.has(index)) {\n const message = this.messagesByIndex.get(index);\n if (!message) {\n return;\n }\n\n this.messagesByIndex.delete(message.index);\n message.removeAllListeners(\"updated\");\n this.emit(\"messageRemoved\", message);\n }\n });\n\n list.on(\"itemUpdated\", (args) => {\n log.debug(`${this.conversation.sid} itemUpdated: ${args.item.index}`);\n\n const message = this.messagesByIndex.get(args.item.index);\n\n if (message) {\n message._update(args.item.data);\n }\n });\n\n return list;\n } catch (err) {\n this.messagesListPromise = null;\n\n if (this.services.syncClient.connectionState !== \"disconnected\") {\n log.error(\n \"Failed to get messages object for conversation\",\n this.conversation.sid,\n err\n );\n }\n\n log.debug(\n \"ERROR: Failed to get messages object for conversation\",\n this.conversation.sid,\n err\n );\n\n throw err;\n }\n }\n\n public async unsubscribe() {\n if (!this.messagesListPromise) {\n return;\n }\n\n const entity = await this.messagesListPromise;\n entity.close();\n this.messagesListPromise = null;\n }\n\n /**\n * Send a message to the conversation. The message could include text and multiple media attachments.\n * @param message Message to post\n */\n public sendV2(message: UnsentMessage): CancellablePromise<MessageResponse> {\n log.debug(\n \"Sending message V2\",\n message.mediaContent,\n message.attributes,\n message.emailOptions\n );\n\n return new CancellablePromise(async (resolve, reject, onCancel) => {\n const media: McsMedia[] = [];\n const requests: CancellablePromise<McsMedia>[] = [];\n\n onCancel(() => {\n requests.forEach((request) => request.cancel());\n });\n\n for (const [category, mediaContent] of message.mediaContent) {\n try {\n log.debug(\n `Adding media to a message as ${\n mediaContent instanceof FormData ? \"FormData\" : \"SendMediaOptions\"\n }`,\n mediaContent\n );\n\n const request =\n mediaContent instanceof FormData\n ? this.services.mcsClient.postFormData(mediaContent, category)\n : this.services.mcsClient.post(\n mediaContent.contentType ?? \"\",\n mediaContent.media ?? \"\",\n category,\n mediaContent.filename\n );\n\n requests.push(request);\n\n media.push(await request);\n } catch (e) {\n reject(e);\n return;\n }\n }\n\n const messagesPostRequest = this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n body: message.text,\n subject: message.emailOptions?.subject,\n media_sids: media.map((m) => m.sid),\n attributes:\n typeof message.attributes !== \"undefined\"\n ? JSON.stringify(message.attributes)\n : undefined,\n });\n\n try {\n resolve(await messagesPostRequest);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Send Message to the conversation\n * @param message Message to post\n * @param attributes Message attributes\n * @param emailOptions Options that modify E-mail integration behaviors.\n * @returns Returns promise which can fail\n */\n public async send(\n message: null | string | FormData | SendMediaOptions,\n attributes: JSONValue = {},\n emailOptions?: SendEmailOptions\n ): Promise<MessageResponse> {\n log.debug(\"Sending text message\", message, attributes, emailOptions);\n\n return this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n body: message ?? \"\",\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n subject: emailOptions?.subject,\n });\n }\n\n /**\n * Send Media Message to the conversation\n * @param mediaContent Media content to post\n * @param attributes Message attributes\n * @param emailOptions Email options\n * @returns Returns promise which can fail\n */\n public async sendMedia(\n mediaContent: FormData | SendMediaOptions,\n attributes: JSONValue = {},\n emailOptions?: SendEmailOptions\n ) {\n log.debug(\"Sending media message\", mediaContent, attributes, emailOptions);\n log.debug(\n `Sending media message as ${\n mediaContent instanceof FormData ? \"FormData\" : \"SendMediaOptions\"\n }`,\n mediaContent,\n attributes\n );\n\n const media: McsMedia =\n mediaContent instanceof FormData\n ? await this.services.mcsClient.postFormData(mediaContent)\n : await this.services.mcsClient.post(\n mediaContent.contentType ?? \"\",\n mediaContent.media ?? \"\",\n \"media\",\n mediaContent.filename\n );\n\n // emailOptions are currently ignored for media messages.\n return await this.services.commandExecutor.mutateResource<\n SendMessageRequest,\n MessageResponse\n >(\"post\", this.conversation._links.messages, {\n media_sids: [media.sid],\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n }\n\n /**\n * Returns messages from conversation using paginator interface\n * @param pageSize Number of messages to return in single chunk. By default it's 30.\n * @param anchor Most early message id which is already known, or 'end' by default\n * @param direction Pagination order 'backwards' or 'forward', 'forward' by default\n * @returns Last page of messages by default\n */\n public async getMessages(\n pageSize: number | undefined,\n anchor: number | \"end\" | undefined,\n direction: \"forward\" | \"backwards\" = \"backwards\"\n ): Promise<SyncPaginator<Message>> {\n return this._getMessages(pageSize, anchor, direction);\n }\n\n private _wrapPaginator(order, page, op) {\n // Due to an inconsistency between Sync and Chat conventions, next and\n // previous pages should be swapped.\n const shouldReverse = order === \"desc\";\n\n const nextPage = () =>\n page.nextPage().then((page) => this._wrapPaginator(order, page, op));\n const previousPage = () =>\n page.prevPage().then((page) => this._wrapPaginator(order, page, op));\n\n return op(page.items).then((items) => ({\n items: items.sort((x, y) => {\n return x.index - y.index;\n }),\n hasPrevPage: shouldReverse ? page.hasNextPage : page.hasPrevPage,\n hasNextPage: shouldReverse ? page.hasPrevPage : page.hasNextPage,\n prevPage: shouldReverse ? nextPage : previousPage,\n nextPage: shouldReverse ? previousPage : nextPage,\n }));\n }\n\n private _upsertMessage(index: number, value: MessageData) {\n const cachedMessage = this.messagesByIndex.get(index);\n\n if (cachedMessage) {\n return cachedMessage;\n }\n\n const links = {\n self: `${this.conversation._links.messages}/${value.sid}`,\n conversation: this.conversation._links.self,\n messages_receipts: `${this.conversation._links.messages}/${value.sid}/Receipts`,\n };\n const message = new Message(\n index,\n value,\n this.conversation,\n links,\n this.configuration,\n this.services\n );\n\n this.messagesByIndex.set(message.index, message);\n\n message.on(\"updated\", (args: MessageUpdatedEventArgs) =>\n this.emit(\"messageUpdated\", args)\n );\n\n return message;\n }\n\n /**\n * Returns last messages from conversation\n * @param {Number} [pageSize] Number of messages to return in single chunk. By default it's 30.\n * @param {String} [anchor] Most early message id which is already known, or 'end' by default\n * @param {String} [direction] Pagination order 'backwards' or 'forward', or 'forward' by default\n * @returns {Promise<SyncPaginator<Message>>} last page of messages by default\n * @private\n */\n private async _getMessages(\n pageSize = 30,\n anchor: number | \"end\" = \"end\",\n direction: \"forward\" | \"backwards\" = \"forward\"\n ): Promise<SyncPaginator<Message>> {\n const order = direction === \"backwards\" ? \"desc\" : \"asc\";\n const list = await this.messagesListPromise;\n const page = await list?.getItems({\n from: anchor !== \"end\" ? anchor : void 0,\n pageSize,\n order,\n limit: pageSize, // @todo Limit equals pageSize by default in Sync. This is probably not ideal.\n });\n\n return await this._wrapPaginator(order, page, (items) =>\n Promise.all(\n items.map((item) => this._upsertMessage(item.index, item.data))\n )\n );\n }\n}\n\nexport { Messages };\n"],"names":["Logger","ReplayEventEmitter","message","Message","CancellablePromise"],"mappings":"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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 \"@twilio/shared\";\nimport { ChannelMetadataClient } from \"../channel-metadata-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}\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 this._upsertMessage(args.item.index, args.item.data);\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 ): Promise<MessageResponse> {\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 public _upsertMessage(index: number, value: MessageData) {\n const cachedMessage = this.messagesByIndex.get(index);\n\n if (cachedMessage) {\n log.debug(\n \"Attempted to upsert a message, but it is already known and therefore ignored\",\n this.conversation.sid\n );\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 this.emit(\"messageAdded\", message);\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","CancellablePromise","message","Message"],"mappings":"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"}
@@ -128,6 +128,15 @@ This software includes platform.js under the following license.
128
128
  */
129
129
  'use strict';
130
130
 
131
+ var global =
132
+ typeof global !== "undefined"
133
+ ? global
134
+ : typeof self !== "undefined"
135
+ ? self
136
+ : typeof window !== "undefined"
137
+ ? window
138
+ : {};
139
+
131
140
  Object.defineProperty(exports, '__esModule', { value: true });
132
141
 
133
142
  var participant = require('../participant.js');
@@ -158,11 +167,13 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
158
167
  this.rosterEntityPromise = null;
159
168
  }
160
169
  }
161
- subscribe(rosterObjectName) {
170
+ subscribe(arg) {
171
+ const participantsMapPromise = typeof arg === "string"
172
+ ? this.services.syncClient.map({ id: arg, mode: "open_existing" })
173
+ : Promise.resolve(arg);
162
174
  return (this.rosterEntityPromise =
163
175
  this.rosterEntityPromise ||
164
- this.services.syncClient
165
- .map({ id: rosterObjectName, mode: "open_existing" })
176
+ participantsMapPromise
166
177
  .then((rosterMap) => {
167
178
  rosterMap.on("itemAdded", (args) => {
168
179
  log.debug(this.conversation.sid + " itemAdded: " + args.item.key);
@@ -319,7 +330,7 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
319
330
  * Remove the participant with a given identity from a conversation.
320
331
  */
321
332
  remove(identity) {
322
- return this.services.commandExecutor.mutateResource("delete", `${this.links.participants}/${identity}`);
333
+ return this.services.commandExecutor.mutateResource("delete", `${this.links.participants}/${encodeURIComponent(identity)}`);
323
334
  }
324
335
  }
325
336
  /**
@@ -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 { Configuration } from \"../configuration\";\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 configuration: Configuration;\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>;\n\n constructor(\n conversation: Conversation,\n participants: Map<string, Participant>,\n links: ParticipantsLinks,\n configuration: Configuration,\n services: ParticipantsServices\n ) {\n super();\n this.conversation = conversation;\n this.participants = participants;\n this.links = links;\n this.configuration = configuration;\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(rosterObjectName: string) {\n return (this.rosterEntityPromise =\n this.rosterEntityPromise ||\n this.services.syncClient\n .map({ id: rosterObjectName, mode: \"open_existing\" })\n .then((rosterMap) => {\n rosterMap.on(\"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(\"participantJoined\", participant);\n }\n );\n });\n\n rosterMap.on(\"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(\"participantLeft\", leftParticipant);\n });\n\n rosterMap.on(\"itemUpdated\", (args) => {\n log.debug(this.conversation.sid + \" itemUpdated: \" + args.item.key);\n this.upsertParticipant(args.item.key, args.item.data);\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(\"updated\", (args: ParticipantUpdatedEventArgs) =>\n this.emit(\"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(identity: string, attributes: JSONValue): Promise<Participant> {\n const participantResponse =\n 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 return await this.upsertParticipantFromResponse(participantResponse);\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<Participant> {\n const participantResponse =\n 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 return await this.upsertParticipantFromResponse(participantResponse);\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}/${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","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 { Configuration } from \"../configuration\";\nimport { ParticipantResponse } from \"../interfaces/commands/participant-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { JSONValue } from \"@twilio/shared\";\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\n/**\n * Participant binding options\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 configuration: Configuration;\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>;\n\n constructor(\n conversation: Conversation,\n participants: Map<string, Participant>,\n links: ParticipantsLinks,\n configuration: Configuration,\n services: ParticipantsServices\n ) {\n super();\n this.conversation = conversation;\n this.participants = participants;\n this.links = links;\n this.configuration = configuration;\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(\"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(\"participantJoined\", participant);\n }\n );\n });\n\n rosterMap.on(\"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(\"participantLeft\", leftParticipant);\n });\n\n rosterMap.on(\"itemUpdated\", (args) => {\n log.debug(this.conversation.sid + \" itemUpdated: \" + args.item.key);\n this.upsertParticipant(args.item.key, args.item.data);\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(\"updated\", (args: ParticipantUpdatedEventArgs) =>\n this.emit(\"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(identity: string, attributes: JSONValue): Promise<Participant> {\n const participantResponse =\n 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 return await this.upsertParticipantFromResponse(participantResponse);\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<Participant> {\n const participantResponse =\n 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 return await this.upsertParticipantFromResponse(participantResponse);\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","participant","Participant"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,MAAM,GAAG,GAAGA,aAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;AAmBzC;;;;;AAKG;AACH,MAAM,YAAa,SAAQC,qCAAsC,CAAA;IAU/D,WACE,CAAA,YAA0B,EAC1B,YAAsC,EACtC,KAAwB,EACxB,aAA4B,EAC5B,QAA8B,EAAA;AAE9B,QAAA,KAAK,EAAE,CAAC;QAZV,IAAmB,CAAA,mBAAA,GAA4B,IAAI,CAAC;AAalD,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;AACnB,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACnC,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;KAC1B;AAED,IAAA,MAAM,WAAW,GAAA;QACf,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YAC9C,MAAM,CAAC,KAAK,EAAE,CAAC;AACf,YAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;AACjC,SAAA;KACF;AAED,IAAA,SAAS,CAAC,GAAqB,EAAA;AAC7B,QAAA,MAAM,sBAAsB,GAC1B,OAAO,GAAG,KAAK,QAAQ;AACrB,cAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AAClE,cAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE3B,QAAQ,IAAI,CAAC,mBAAmB;AAC9B,YAAA,IAAI,CAAC,mBAAmB;gBACxB,sBAAsB;AACnB,qBAAA,IAAI,CAAC,CAAC,SAAS,KAAI;oBAClB,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,KAAI;AACjC,wBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAClE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACxD,CAAC,WAAW,KAAI;AACd,4BAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAC9C,yBAAC,CACF,CAAC;AACJ,qBAAC,CAAC,CAAC;oBAEH,SAAS,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,KAAI;AACnC,wBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/D,wBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC;wBAChC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;4BAC1C,OAAO;AACR,yBAAA;wBACD,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC9D,wBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;wBACzC,IAAI,CAAC,eAAe,EAAE;4BACpB,OAAO;AACR,yBAAA;AACD,wBAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;AAChD,qBAAC,CAAC,CAAC;oBAEH,SAAS,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,KAAI;AACnC,wBAAA,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpE,wBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,qBAAC,CAAC,CAAC;oBAEH,MAAM,oBAAoB,GAA2B,EAAE,CAAC;AACxD,oBAAA,MAAM,gBAAgB,GAAG,CAAC,SAAS,KAAI;wBACrC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC/B,4BAAA,oBAAoB,CAAC,IAAI,CACvB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;AACJ,yBAAC,CAAC,CAAC;wBACH,OAAO,SAAS,CAAC,WAAW;8BACxB,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC;8BAC3C,IAAI,CAAC;AACX,qBAAC,CAAC;AAEF,oBAAA,OAAO,SAAS;AACb,yBAAA,QAAQ,EAAE;yBACV,IAAI,CAAC,gBAAgB,CAAC;yBACtB,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC7C,yBAAA,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AAC3B,iBAAC,CAAC;AACD,qBAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,oBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;oBAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,IAAI,cAAc,EAAE;AAC9D,wBAAA,GAAG,CAAC,KAAK,CACP,8CAA8C,EAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,EACrB,GAAG,CACJ,CAAC;AACH,qBAAA;AACD,oBAAA,GAAG,CAAC,KAAK,CACP,qDAAqD,EACrD,IAAI,CAAC,YAAY,CAAC,GAAG,EACrB,GAAG,CACJ,CAAC;AACF,oBAAA,MAAM,GAAG,CAAC;iBACX,CAAC,EAAE;KACT;IAED,MAAM,6BAA6B,CACjC,IAAyB,EAAA;;AAEzB,QAAA,MAAM,EACJ,GAAG,EACH,UAAU,EAAE,kBAAkB,EAC9B,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,WAAW,EACzB,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,gBAAgB,GACpC,GAAG,IAAI,CAAC;AAET,QAAA,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE;AACvC,YAAA,UAAU,EAAE,kBAAkB;AAC9B,YAAA,WAAW,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC;AAClC,YAAA,WAAW,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC;AAClC,YAAA,QAAQ,EAAE,gBAAgB;YAC1B,OAAO;AACP,YAAA,wBAAwB,EAAE,IAAI;AAC9B,YAAA,wBAAwB,EAAE,IAAI;YAC9B,IAAI,EAAE,CAAA,EAAA,GAAA,gBAAgB,KAAhB,IAAA,IAAA,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,MAAM;AACvC,SAAA,CAAC,CAAC;KACJ;AAED,IAAA,MAAM,iBAAiB,CACrB,cAAsB,EACtB,IAA2B,EAAA;QAE3B,IAAIC,aAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AACxD,QAAA,IAAIA,aAAW,EAAE;AACf,YAAA,OAAOA,aAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAClC,SAAA;AAED,QAAA,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAI,CAAA,EAAA,cAAc,CAAE,CAAA;SACrD,CAAC;AAEF,QAAAA,aAAW,GAAG,IAAIC,uBAAW,CAC3B,IAAI,EACJ,cAAc,EACd,IAAI,CAAC,YAAY,EACjB,KAAK,EACL,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAED,aAAW,CAAC,CAAC;AACnD,QAAAA,aAAW,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAiC,KAC1D,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CACtC,CAAC;AACF,QAAA,OAAOA,aAAW,CAAC;KACpB;AAED;;AAEG;AACH,IAAA,MAAM,eAAe,GAAA;QACnB,OAAO,IAAI,CAAC,mBAAmB;cAC3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAK;gBACjC,MAAM,YAAY,GAAkB,EAAE,CAAC;AACvC,gBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KACpC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAC/B,CAAC;AACF,gBAAA,OAAO,YAAY,CAAC;AACtB,aAAC,CAAC;cACF,EAAE,CAAC;KACR;AAED;;;AAGG;IACH,MAAM,mBAAmB,CACvB,cAAsB,EAAA;QAEtB,OAAO,IAAI,CAAC,mBAAmB;cAC3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAK;gBACjC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC1D,IAAI,CAAC,WAAW,EAAE;oBAChB,MAAM,IAAI,KAAK,CACb,uBAAuB,GAAG,cAAc,GAAG,gBAAgB,CAC5D,CAAC;AACH,iBAAA;AACD,gBAAA,OAAO,WAAW,CAAC;AACrB,aAAC,CAAC;cACF,IAAI,CAAC;KACV;AAED;;;AAGG;IACH,MAAM,wBAAwB,CAC5B,QAAgB,EAAA;QAEhB,IAAI,gBAAgB,GAAuB,IAAI,CAAC;QAChD,OAAO,IAAI,CAAC,mBAAmB;cAC3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAK;gBACjC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AACxC,oBAAA,IAAI,WAAW,CAAC,QAAQ,KAAK,QAAQ,EAAE;wBACrC,gBAAgB,GAAG,WAAW,CAAC;AAChC,qBAAA;AACH,iBAAC,CAAC,CAAC;gBACH,IAAI,CAAC,gBAAgB,EAAE;oBACrB,MAAM,IAAI,KAAK,CACb,4BAA4B,GAAG,QAAQ,GAAG,gBAAgB,CAC3D,CAAC;AACH,iBAAA;AACD,gBAAA,OAAO,gBAAgB,CAAC;AAC1B,aAAC,CAAC;cACF,IAAI,CAAC;KACV;AAED;;AAEG;AACH,IAAA,MAAM,GAAG,CAAC,QAAgB,EAAE,UAAqB,EAAA;AAC/C,QAAA,MAAM,mBAAmB,GACvB,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAGhD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YACjC,QAAQ;AACR,YAAA,UAAU,EACR,OAAO,UAAU,KAAK,WAAW;AAC/B,kBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5B,kBAAE,SAAS;AAChB,SAAA,CAAC,CAAC;AAEL,QAAA,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,CAAC,CAAC;KACtE;AAED;;AAEG;IACH,MAAM,qBAAqB,CACzB,YAAoB,EACpB,OAAe,EACf,UAAwB,GAAA,EAAE,EAC1B,cAAA,GAA4C,EAAE,EAAA;;AAE9C,QAAA,MAAM,mBAAmB,GACvB,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAGhD,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AACjC,YAAA,UAAU,EACR,OAAO,UAAU,KAAK,WAAW;AAC/B,kBAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AAC5B,kBAAE,SAAS;AACf,YAAA,iBAAiB,EAAE;gBACjB,OAAO;AACP,gBAAA,aAAa,EAAE,YAAY;gBAC3B,IAAI,EAAE,CAAA,EAAA,GAAA,cAAc,KAAd,IAAA,IAAA,cAAc,uBAAd,cAAc,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI;gBACjC,KAAK,EAAE,CAAA,EAAA,GAAA,cAAc,KAAd,IAAA,IAAA,cAAc,uBAAd,cAAc,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK;AACpC,aAAA;AACF,SAAA,CAAC,CAAC;AAEL,QAAA,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,mBAAmB,CAAC,CAAC;KACtE;AAED;;AAEG;AACH,IAAA,MAAM,CAAC,QAAgB,EAAA;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CACjD,QAAQ,EACR,CAAA,EAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAI,CAAA,EAAA,kBAAkB,CAAC,QAAQ,CAAC,CAAE,CAAA,CAC7D,CAAC;KACH;AACF,CAAA;AAID;;;;AAIG;AAEH;;;;AAIG;AAEH;;;;;;AAMG;;;;"}
@@ -128,6 +128,15 @@ This software includes platform.js under the following license.
128
128
  */
129
129
  'use strict';
130
130
 
131
+ var global =
132
+ typeof global !== "undefined"
133
+ ? global
134
+ : typeof self !== "undefined"
135
+ ? self
136
+ : typeof window !== "undefined"
137
+ ? window
138
+ : {};
139
+
131
140
  Object.defineProperty(exports, '__esModule', { value: true });
132
141
 
133
142
  var user = require('../user.js');
@@ -217,12 +226,12 @@ class Users extends replayEventEmitter.ReplayEventEmitter {
217
226
  * @returns {Promise<string>} User's sync unique name
218
227
  */
219
228
  async getSyncUniqueName(identity) {
220
- var _a, _b;
229
+ var _a;
221
230
  const url = new index.UriBuilder(this.configuration.links.users)
222
231
  .path(identity)
223
232
  .build();
224
233
  const response = await this.services.network.get(url);
225
- return (_b = (_a = response.body) === null || _a === void 0 ? void 0 : _a.sync_objects.user_info_map) !== null && _b !== void 0 ? _b : "";
234
+ return (_a = response.body.sync_objects.user_info_map) !== null && _a !== void 0 ? _a : "";
226
235
  }
227
236
  }
228
237