@twilio/conversations 3.0.0-canary.9 → 3.0.0-canary2.100

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 (42) hide show
  1. package/README.md +22 -18
  2. package/builds/browser.js +1018 -2070
  3. package/builds/browser.js.map +1 -1
  4. package/builds/lib.d.ts +69 -67
  5. package/builds/lib.js +1018 -2070
  6. package/builds/lib.js.map +1 -1
  7. package/builds/twilio-conversations.js +24737 -25259
  8. package/builds/twilio-conversations.min.js +1 -1
  9. package/dist/aggregated-delivery-receipt.js +1 -1
  10. package/dist/aggregated-delivery-receipt.js.map +1 -1
  11. package/dist/client.js +85 -69
  12. package/dist/client.js.map +1 -1
  13. package/dist/command-executor.js +30 -12
  14. package/dist/command-executor.js.map +1 -1
  15. package/dist/conversation.js +87 -19
  16. package/dist/conversation.js.map +1 -1
  17. package/dist/data/conversations.js +20 -4
  18. package/dist/data/conversations.js.map +1 -1
  19. package/dist/data/messages.js +13 -19
  20. package/dist/data/messages.js.map +1 -1
  21. package/dist/data/participants.js +6 -4
  22. package/dist/data/participants.js.map +1 -1
  23. package/dist/data/users.js +4 -2
  24. package/dist/data/users.js.map +1 -1
  25. package/dist/index.js +5 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/message-builder.js.map +1 -1
  28. package/dist/message.js +15 -12
  29. package/dist/message.js.map +1 -1
  30. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  31. package/dist/packages/conversations/package.json.js +1 -1
  32. package/dist/participant.js.map +1 -1
  33. package/dist/push-notification.js.map +1 -1
  34. package/dist/services/network.js +38 -15
  35. package/dist/services/network.js.map +1 -1
  36. package/dist/services/typing-indicator.js +7 -5
  37. package/dist/services/typing-indicator.js.map +1 -1
  38. package/dist/unsent-message.js.map +1 -1
  39. package/dist/user.js +1 -1
  40. package/dist/user.js.map +1 -1
  41. package/dist/util/index.js.map +1 -1
  42. package/package.json +18 -16
@@ -150,33 +150,25 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
150
150
  }
151
151
  /**
152
152
  * Subscribe to the Messages Event Stream
153
- * @param name - The name of Sync object for the Messages resource.
153
+ * @param arg - Name of the Sync object, or the SyncList itself, that
154
+ * represents the Messages resource.
154
155
  */
155
- async subscribe(name) {
156
+ async subscribe(arg) {
156
157
  if (this.messagesListPromise) {
157
158
  return this.messagesListPromise;
158
159
  }
159
- this.messagesListPromise = this.services.syncClient.list({
160
- id: name,
161
- mode: "open_existing",
162
- });
160
+ this.messagesListPromise =
161
+ typeof arg === "string"
162
+ ? this.services.syncClient.list({
163
+ id: arg,
164
+ mode: "open_existing",
165
+ })
166
+ : Promise.resolve(arg);
163
167
  try {
164
168
  const list = await this.messagesListPromise;
165
169
  list.on("itemAdded", (args) => {
166
170
  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);
171
+ this._upsertMessage(args.item.index, args.item.data);
180
172
  });
181
173
  list.on("itemRemoved", (args) => {
182
174
  log.debug(`#{this.conversation.sid} itemRemoved: ${args.index}`);
@@ -328,6 +320,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
328
320
  _upsertMessage(index, value) {
329
321
  const cachedMessage = this.messagesByIndex.get(index);
330
322
  if (cachedMessage) {
323
+ log.debug("Attempted to upsert a message, but it is already known and therefore ignored", this.conversation.sid);
331
324
  return cachedMessage;
332
325
  }
333
326
  const links = {
@@ -338,6 +331,7 @@ class Messages extends replayEventEmitter.ReplayEventEmitter {
338
331
  const message$1 = new message.Message(index, value, this.conversation, links, this.configuration, this.services);
339
332
  this.messagesByIndex.set(message$1.index, message$1);
340
333
  message$1.on("updated", (args) => this.emit("messageUpdated", args));
334
+ this.emit("messageAdded", message$1);
341
335
  return message$1;
342
336
  }
343
337
  /**
@@ -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\";\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 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 });\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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"}
@@ -158,11 +158,13 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
158
158
  this.rosterEntityPromise = null;
159
159
  }
160
160
  }
161
- subscribe(rosterObjectName) {
161
+ subscribe(arg) {
162
+ const participantsMapPromise = typeof arg === "string"
163
+ ? this.services.syncClient.map({ id: arg, mode: "open_existing" })
164
+ : Promise.resolve(arg);
162
165
  return (this.rosterEntityPromise =
163
166
  this.rosterEntityPromise ||
164
- this.services.syncClient
165
- .map({ id: rosterObjectName, mode: "open_existing" })
167
+ participantsMapPromise
166
168
  .then((rosterMap) => {
167
169
  rosterMap.on("itemAdded", (args) => {
168
170
  log.debug(this.conversation.sid + " itemAdded: " + args.item.key);
@@ -215,7 +217,7 @@ class Participants extends replayEventEmitter.ReplayEventEmitter {
215
217
  var _a;
216
218
  const { sid, attributes: responseAttributes, date_created: dateCreated, date_updated: dateUpdated, identity: responseIdentity, role_sid: roleSid, messaging_binding: messagingBinding, } = data;
217
219
  return await this.upsertParticipant(sid, {
218
- attributes: JSON.parse(responseAttributes),
220
+ attributes: responseAttributes,
219
221
  dateCreated: new Date(dateCreated),
220
222
  dateUpdated: new Date(dateUpdated),
221
223
  identity: responseIdentity,
@@ -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: JSON.parse(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\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}/${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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"}
@@ -217,12 +217,14 @@ class Users extends replayEventEmitter.ReplayEventEmitter {
217
217
  * @returns {Promise<string>} User's sync unique name
218
218
  */
219
219
  async getSyncUniqueName(identity) {
220
- var _a, _b;
220
+ var _a;
221
221
  const url = new index.UriBuilder(this.configuration.links.users)
222
222
  .path(identity)
223
223
  .build();
224
+ // todo: remove any after the release of new Twilsock
224
225
  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 : "";
226
+ const body = JSON.parse(response.payload || "null");
227
+ return (_a = body === null || body === void 0 ? void 0 : body.sync_objects.user_info_map) !== null && _a !== void 0 ? _a : "";
226
228
  }
227
229
  }
228
230
 
@@ -1 +1 @@
1
- {"version":3,"file":"users.js","sources":["../../src/data/users.ts"],"sourcesContent":["import { User, UserUpdatedEventArgs, UserUpdateReason } from \"../user\";\nimport { Network } from \"../services/network\";\nimport { SyncClient } from \"twilio-sync\";\nimport { UriBuilder } from \"../util\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { UserResponse } from \"../interfaces/commands/user\";\n\ntype UsersEvents = {\n userUpdated: (data: {\n user: User;\n updateReasons: UserUpdateReason[];\n }) => void;\n userSubscribed: (user: User) => void;\n userUnsubscribed: (user: User) => void;\n};\n\nexport interface UsersServices {\n network: Network;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n}\n\n/**\n * Container for known users\n */\nclass Users extends ReplayEventEmitter<UsersEvents> {\n private readonly configuration: Configuration;\n private readonly services: UsersServices;\n\n private subscribedUsers: Map<string, User>;\n private fifoStack: string[];\n public readonly myself: User;\n\n constructor(\n myself: User,\n configuration: Configuration,\n services: UsersServices\n ) {\n super();\n\n this.configuration = configuration;\n this.services = services;\n\n this.fifoStack = [];\n this.myself = myself;\n this.myself.on(\"updated\", (args: UserUpdatedEventArgs) =>\n this.emit(\"userUpdated\", args)\n );\n this.myself.on(\"userSubscribed\", () =>\n this.emit(\"userSubscribed\", this.myself)\n );\n this.myself.on(\"userUnsubscribed\", () => {\n this.emit(\"userUnsubscribed\", this.myself);\n this.myself._ensureFetched();\n });\n\n this.subscribedUsers = new Map<string, User>();\n }\n\n private handleUnsubscribeUser(user: User): void {\n if (this.subscribedUsers.has(user.identity)) {\n this.subscribedUsers.delete(user.identity);\n }\n let foundItemIndex = 0;\n const foundItem = this.fifoStack.find((item, index) => {\n if (item == user.identity) {\n foundItemIndex = index;\n return true;\n }\n return false;\n });\n if (foundItem) {\n this.fifoStack.splice(foundItemIndex, 1);\n }\n this.emit(\"userUnsubscribed\", user);\n }\n\n private handleSubscribeUser(user: User): void {\n if (this.subscribedUsers.has(user.identity)) {\n return;\n }\n if (this.fifoStack.length >= this.configuration.userInfosToSubscribe) {\n const item = this.fifoStack.shift() as string;\n this.subscribedUsers?.get(item)?.unsubscribe();\n }\n this.fifoStack.push(user.identity);\n this.subscribedUsers.set(user.identity, user);\n this.emit(\"userSubscribed\", user);\n }\n\n /**\n * Gets user, if it's in subscribed list - then return the user object from it,\n * if not - then subscribes and adds user to the FIFO stack\n * @returns {Promise<User>} Fully initialized user\n */\n async getUser(identity: string, entityName?: string): Promise<User> {\n await this.myself._ensureFetched();\n\n if (identity == this.myself.identity) {\n return this.myself;\n }\n\n const user = this.subscribedUsers.get(identity);\n\n if (user) {\n return user;\n }\n\n entityName ??= await this.getSyncUniqueName(identity);\n\n const newUser = new User(\n identity,\n entityName,\n this.configuration,\n this.services\n );\n\n newUser.on(\"updated\", (args: UserUpdatedEventArgs) =>\n this.emit(\"userUpdated\", args)\n );\n newUser.on(\"userSubscribed\", () => this.handleSubscribeUser(newUser));\n newUser.on(\"userUnsubscribed\", () => this.handleUnsubscribeUser(newUser));\n await newUser._ensureFetched();\n\n return newUser;\n }\n\n /**\n * @returns {Promise<Array<User>>} returns list of subscribed User objects {@see User}\n */\n async getSubscribedUsers(): Promise<Array<User>> {\n await this.myself._ensureFetched();\n\n const users = [this.myself];\n this.subscribedUsers.forEach((user) => users.push(user));\n\n return users;\n }\n\n /**\n * @returns {Promise<string>} User's sync unique name\n */\n private async getSyncUniqueName(identity: string): Promise<string> {\n const url = new UriBuilder(this.configuration.links.users)\n .path(identity)\n .build();\n const response = await this.services.network.get<UserResponse>(url);\n return response.body?.sync_objects.user_info_map ?? \"\";\n }\n}\n\nexport { Users };\n"],"names":["ReplayEventEmitter","user","User","UriBuilder"],"mappings":"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"}
1
+ {"version":3,"file":"users.js","sources":["../../src/data/users.ts"],"sourcesContent":["import { User, UserUpdatedEventArgs, UserUpdateReason } from \"../user\";\nimport { Network } from \"../services/network\";\nimport { SyncClient } from \"twilio-sync\";\nimport { UriBuilder } from \"../util\";\nimport { Configuration } from \"../configuration\";\nimport { CommandExecutor } from \"../command-executor\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport { UserResponse } from \"../interfaces/commands/user\";\n\ntype UsersEvents = {\n userUpdated: (data: {\n user: User;\n updateReasons: UserUpdateReason[];\n }) => void;\n userSubscribed: (user: User) => void;\n userUnsubscribed: (user: User) => void;\n};\n\nexport interface UsersServices {\n network: Network;\n syncClient: SyncClient;\n commandExecutor: CommandExecutor;\n}\n\n/**\n * Container for known users\n */\nclass Users extends ReplayEventEmitter<UsersEvents> {\n private readonly configuration: Configuration;\n private readonly services: UsersServices;\n\n private subscribedUsers: Map<string, User>;\n private fifoStack: string[];\n public readonly myself: User;\n\n constructor(\n myself: User,\n configuration: Configuration,\n services: UsersServices\n ) {\n super();\n\n this.configuration = configuration;\n this.services = services;\n\n this.fifoStack = [];\n this.myself = myself;\n this.myself.on(\"updated\", (args: UserUpdatedEventArgs) =>\n this.emit(\"userUpdated\", args)\n );\n this.myself.on(\"userSubscribed\", () =>\n this.emit(\"userSubscribed\", this.myself)\n );\n this.myself.on(\"userUnsubscribed\", () => {\n this.emit(\"userUnsubscribed\", this.myself);\n this.myself._ensureFetched();\n });\n\n this.subscribedUsers = new Map<string, User>();\n }\n\n private handleUnsubscribeUser(user: User): void {\n if (this.subscribedUsers.has(user.identity)) {\n this.subscribedUsers.delete(user.identity);\n }\n let foundItemIndex = 0;\n const foundItem = this.fifoStack.find((item, index) => {\n if (item == user.identity) {\n foundItemIndex = index;\n return true;\n }\n return false;\n });\n if (foundItem) {\n this.fifoStack.splice(foundItemIndex, 1);\n }\n this.emit(\"userUnsubscribed\", user);\n }\n\n private handleSubscribeUser(user: User): void {\n if (this.subscribedUsers.has(user.identity)) {\n return;\n }\n if (this.fifoStack.length >= this.configuration.userInfosToSubscribe) {\n const item = this.fifoStack.shift() as string;\n this.subscribedUsers?.get(item)?.unsubscribe();\n }\n this.fifoStack.push(user.identity);\n this.subscribedUsers.set(user.identity, user);\n this.emit(\"userSubscribed\", user);\n }\n\n /**\n * Gets user, if it's in subscribed list - then return the user object from it,\n * if not - then subscribes and adds user to the FIFO stack\n * @returns {Promise<User>} Fully initialized user\n */\n async getUser(identity: string, entityName?: string): Promise<User> {\n await this.myself._ensureFetched();\n\n if (identity == this.myself.identity) {\n return this.myself;\n }\n\n const user = this.subscribedUsers.get(identity);\n\n if (user) {\n return user;\n }\n\n entityName ??= await this.getSyncUniqueName(identity);\n\n const newUser = new User(\n identity,\n entityName,\n this.configuration,\n this.services\n );\n\n newUser.on(\"updated\", (args: UserUpdatedEventArgs) =>\n this.emit(\"userUpdated\", args)\n );\n newUser.on(\"userSubscribed\", () => this.handleSubscribeUser(newUser));\n newUser.on(\"userUnsubscribed\", () => this.handleUnsubscribeUser(newUser));\n await newUser._ensureFetched();\n\n return newUser;\n }\n\n /**\n * @returns {Promise<Array<User>>} returns list of subscribed User objects {@see User}\n */\n async getSubscribedUsers(): Promise<Array<User>> {\n await this.myself._ensureFetched();\n\n const users = [this.myself];\n this.subscribedUsers.forEach((user) => users.push(user));\n\n return users;\n }\n\n /**\n * @returns {Promise<string>} User's sync unique name\n */\n private async getSyncUniqueName(identity: string): Promise<string> {\n const url = new UriBuilder(this.configuration.links.users)\n .path(identity)\n .build();\n // todo: remove any after the release of new Twilsock\n const response = await this.services.network.get<UserResponse>(url);\n const body = JSON.parse(response.payload || \"null\");\n return body?.sync_objects.user_info_map ?? \"\";\n }\n}\n\nexport { Users };\n"],"names":["ReplayEventEmitter","user","User","UriBuilder"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -131,6 +131,7 @@ This software includes platform.js under the following license.
131
131
  Object.defineProperty(exports, '__esModule', { value: true });
132
132
 
133
133
  var client = require('./client.js');
134
+ var mcsClient = require('@twilio/mcs-client');
134
135
  var conversation = require('./conversation.js');
135
136
  var participant = require('./participant.js');
136
137
  var message = require('./message.js');
@@ -150,6 +151,10 @@ Object.defineProperty(exports, 'Client', {
150
151
  enumerable: true,
151
152
  get: function () { return client.Client; }
152
153
  });
154
+ Object.defineProperty(exports, 'CancellablePromise', {
155
+ enumerable: true,
156
+ get: function () { return mcsClient.CancellablePromise; }
157
+ });
153
158
  exports.Conversation = conversation.Conversation;
154
159
  exports.Participant = participant.Participant;
155
160
  exports.Message = message.Message;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-builder.js","sources":["../src/message-builder.ts"],"sourcesContent":["import { CancellablePromise } from \"@twilio/mcs-client\";\nimport { ConversationLimits } from \"./interfaces/conversation-limits\";\nimport { SendMediaOptions } from \"./conversation\";\nimport { UnsentMessage } from \"./unsent-message\";\nimport { JSONValue } from \"./types\";\nimport { Messages } from \"./data/messages\";\n\n/**\n * Message builder. Allows the message to be built and sent via method chaining.\n *\n * Example:\n *\n * ```ts\n * await testConversation.prepareMessage()\n * .setBody('Hello!')\n * .setAttributes({foo: 'bar'})\n * .addMedia(media1)\n * .addMedia(media2)\n * .build()\n * .send();\n * ```\n */\nclass MessageBuilder {\n private readonly message: UnsentMessage;\n private emailBodies: Map<string, FormData | SendMediaOptions>;\n private emailHistories: Map<string, FormData | SendMediaOptions>;\n\n /**\n * @internal\n */\n constructor(\n private readonly limits: ConversationLimits,\n messagesEntity: Messages\n ) {\n this.message = new UnsentMessage(messagesEntity);\n this.emailBodies = new Map<string, FormData | SendMediaOptions>();\n this.emailHistories = new Map<string, FormData | SendMediaOptions>();\n }\n\n /**\n * Sets the message body.\n * @param text Contents of the body.\n */\n setBody(text: string): MessageBuilder {\n this.message.text = text;\n return this;\n }\n\n /**\n * Sets the message subject.\n * @param subject Contents of the subject.\n */\n setSubject(subject: string): MessageBuilder {\n this.message.emailOptions.subject = subject;\n return this;\n }\n\n /**\n * Sets the message attributes.\n * @param attributes Message attributes.\n */\n setAttributes(attributes: JSONValue): MessageBuilder {\n this.message.attributes = attributes;\n return this;\n }\n\n /**\n * Set the email body with a given content type.\n * @param contentType Format of the body to set (text/plain or text/html).\n * @param body Body payload in the selected format.\n */\n setEmailBody(\n contentType: string,\n body: FormData | SendMediaOptions\n ): MessageBuilder {\n this.emailBodies.set(contentType, body);\n return this;\n }\n\n /**\n * Set the email history with a given content type.\n * @param contentType Format of the history to set (text/plain or text/html).\n * @param history History payload in the selected format.\n */\n setEmailHistory(\n contentType: string,\n history: FormData | SendMediaOptions\n ): MessageBuilder {\n this.emailHistories.set(contentType, history);\n return this;\n }\n\n /**\n * Adds media to the message.\n * @param payload Media to add.\n */\n addMedia(payload: FormData | SendMediaOptions): MessageBuilder {\n if (typeof FormData === \"undefined\" && payload instanceof FormData) {\n throw new Error(\"Could not add FormData content whilst not in a browser\");\n }\n if (!(payload instanceof FormData)) {\n const mediaOptions = payload as SendMediaOptions;\n if (!mediaOptions.contentType || !mediaOptions.media) {\n throw new Error(\n \"Media content in SendMediaOptions must contain non-empty contentType and media\"\n );\n }\n }\n this.message.mediaContent.push([\"media\", payload]);\n return this;\n }\n\n /**\n * Builds the message, making it ready to be sent.\n */\n build(): UnsentMessage {\n this.emailBodies.forEach((_, key) => {\n if (!this.limits.emailBodiesAllowedContentTypes.includes(key)) {\n throw new Error(`Unsupported email body content type ${key}`);\n }\n });\n this.emailHistories.forEach((_, key) => {\n if (!this.limits.emailHistoriesAllowedContentTypes.includes(key)) {\n throw new Error(`Unsupported email history content type ${key}`);\n }\n });\n if (\n this.emailBodies.size > this.limits.emailBodiesAllowedContentTypes.length\n ) {\n throw new Error(\n `Too many email bodies attached to the message (${this.emailBodies.size} > ${this.limits.emailBodiesAllowedContentTypes.length})`\n );\n }\n if (\n this.emailHistories.size >\n this.limits.emailHistoriesAllowedContentTypes.length\n ) {\n throw new Error(\n `Too many email histories attached to the message (${this.emailHistories.size} > ${this.limits.emailHistoriesAllowedContentTypes.length})`\n );\n }\n\n if (\n this.message.mediaContent.length > this.limits.mediaAttachmentsCountLimit\n ) {\n throw new Error(\n `Too many media attachments in the message (${this.message.mediaContent.length} > ${this.limits.mediaAttachmentsCountLimit})`\n );\n }\n\n // @todo we don't know the sizes of the attachments in FormData\n // @todo insertion below makes build() method non-repeatable - probably move to UnsentMessage.send() or even sendV2()?\n\n this.emailBodies.forEach((body) => {\n this.message.mediaContent.push([\"body\", body]);\n });\n\n this.emailHistories.forEach((history) => {\n this.message.mediaContent.push([\"history\", history]);\n });\n\n return this.message;\n }\n\n /**\n * Prepares a message and sends it to the conversation.\n */\n buildAndSend(): CancellablePromise<number | null> {\n return this.build().send();\n }\n\n private getPayloadContentType(\n payload: FormData | SendMediaOptions\n ): string | null {\n if (typeof FormData !== \"undefined\" && payload instanceof FormData) {\n return payload.get(\"Content-Type\") as string;\n }\n return (payload as SendMediaOptions).contentType;\n }\n}\n\nexport { MessageBuilder };\n"],"names":["UnsentMessage"],"mappings":"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"}
1
+ {"version":3,"file":"message-builder.js","sources":["../src/message-builder.ts"],"sourcesContent":["import { CancellablePromise } from \"@twilio/mcs-client\";\nimport { ConversationLimits } from \"./interfaces/conversation-limits\";\nimport { SendMediaOptions } from \"./conversation\";\nimport { UnsentMessage } from \"./unsent-message\";\nimport { JSONValue } from \"@twilio/shared\";\nimport { Messages } from \"./data/messages\";\n\n/**\n * Message builder. Allows the message to be built and sent via method chaining.\n *\n * Example:\n *\n * ```ts\n * await testConversation.prepareMessage()\n * .setBody('Hello!')\n * .setAttributes({foo: 'bar'})\n * .addMedia(media1)\n * .addMedia(media2)\n * .build()\n * .send();\n * ```\n */\nclass MessageBuilder {\n private readonly message: UnsentMessage;\n private emailBodies: Map<string, FormData | SendMediaOptions>;\n private emailHistories: Map<string, FormData | SendMediaOptions>;\n\n /**\n * @internal\n */\n constructor(\n private readonly limits: ConversationLimits,\n messagesEntity: Messages\n ) {\n this.message = new UnsentMessage(messagesEntity);\n this.emailBodies = new Map<string, FormData | SendMediaOptions>();\n this.emailHistories = new Map<string, FormData | SendMediaOptions>();\n }\n\n /**\n * Sets the message body.\n * @param text Contents of the body.\n */\n setBody(text: string): MessageBuilder {\n this.message.text = text;\n return this;\n }\n\n /**\n * Sets the message subject.\n * @param subject Contents of the subject.\n */\n setSubject(subject: string): MessageBuilder {\n this.message.emailOptions.subject = subject;\n return this;\n }\n\n /**\n * Sets the message attributes.\n * @param attributes Message attributes.\n */\n setAttributes(attributes: JSONValue): MessageBuilder {\n this.message.attributes = attributes;\n return this;\n }\n\n /**\n * Set the email body with a given content type.\n * @param contentType Format of the body to set (text/plain or text/html).\n * @param body Body payload in the selected format.\n */\n setEmailBody(\n contentType: string,\n body: FormData | SendMediaOptions\n ): MessageBuilder {\n this.emailBodies.set(contentType, body);\n return this;\n }\n\n /**\n * Set the email history with a given content type.\n * @param contentType Format of the history to set (text/plain or text/html).\n * @param history History payload in the selected format.\n */\n setEmailHistory(\n contentType: string,\n history: FormData | SendMediaOptions\n ): MessageBuilder {\n this.emailHistories.set(contentType, history);\n return this;\n }\n\n /**\n * Adds media to the message.\n * @param payload Media to add.\n */\n addMedia(payload: FormData | SendMediaOptions): MessageBuilder {\n if (typeof FormData === \"undefined\" && payload instanceof FormData) {\n throw new Error(\"Could not add FormData content whilst not in a browser\");\n }\n if (!(payload instanceof FormData)) {\n const mediaOptions = payload as SendMediaOptions;\n if (!mediaOptions.contentType || !mediaOptions.media) {\n throw new Error(\n \"Media content in SendMediaOptions must contain non-empty contentType and media\"\n );\n }\n }\n this.message.mediaContent.push([\"media\", payload]);\n return this;\n }\n\n /**\n * Builds the message, making it ready to be sent.\n */\n build(): UnsentMessage {\n this.emailBodies.forEach((_, key) => {\n if (!this.limits.emailBodiesAllowedContentTypes.includes(key)) {\n throw new Error(`Unsupported email body content type ${key}`);\n }\n });\n this.emailHistories.forEach((_, key) => {\n if (!this.limits.emailHistoriesAllowedContentTypes.includes(key)) {\n throw new Error(`Unsupported email history content type ${key}`);\n }\n });\n if (\n this.emailBodies.size > this.limits.emailBodiesAllowedContentTypes.length\n ) {\n throw new Error(\n `Too many email bodies attached to the message (${this.emailBodies.size} > ${this.limits.emailBodiesAllowedContentTypes.length})`\n );\n }\n if (\n this.emailHistories.size >\n this.limits.emailHistoriesAllowedContentTypes.length\n ) {\n throw new Error(\n `Too many email histories attached to the message (${this.emailHistories.size} > ${this.limits.emailHistoriesAllowedContentTypes.length})`\n );\n }\n\n if (\n this.message.mediaContent.length > this.limits.mediaAttachmentsCountLimit\n ) {\n throw new Error(\n `Too many media attachments in the message (${this.message.mediaContent.length} > ${this.limits.mediaAttachmentsCountLimit})`\n );\n }\n\n // @todo we don't know the sizes of the attachments in FormData\n // @todo insertion below makes build() method non-repeatable - probably move to UnsentMessage.send() or even sendV2()?\n\n this.emailBodies.forEach((body) => {\n this.message.mediaContent.push([\"body\", body]);\n });\n\n this.emailHistories.forEach((history) => {\n this.message.mediaContent.push([\"history\", history]);\n });\n\n return this.message;\n }\n\n /**\n * Prepares a message and sends it to the conversation.\n */\n buildAndSend(): CancellablePromise<number | null> {\n return this.build().send();\n }\n\n private getPayloadContentType(\n payload: FormData | SendMediaOptions\n ): string | null {\n if (typeof FormData !== \"undefined\" && payload instanceof FormData) {\n return payload.get(\"Content-Type\") as string;\n }\n return (payload as SendMediaOptions).contentType;\n }\n}\n\nexport { MessageBuilder };\n"],"names":["UnsentMessage"],"mappings":"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"}
package/dist/message.js CHANGED
@@ -173,12 +173,16 @@ class Message extends replayEventEmitter.ReplayEventEmitter {
173
173
  lastUpdatedBy: (_b = data.lastUpdatedBy) !== null && _b !== void 0 ? _b : null,
174
174
  attributes: index.parseAttributes(data.attributes, `Got malformed attributes for the message ${data.sid}`, log),
175
175
  type: (_c = data.type) !== null && _c !== void 0 ? _c : "text",
176
- media: data.type && data.type === "media" && data.media
176
+ media: data.type === "media" && data.media
177
177
  ? new media.Media(data.media, this.services)
178
178
  : null,
179
- medias: data.type && data.type === "media" && data.medias
179
+ medias: data.type === "media" && data.medias
180
180
  ? data.medias.map((m) => new media.Media(m, this.services))
181
- : null,
181
+ : data.type === "media" && data.media && !data.medias
182
+ ? [
183
+ new media.Media(Object.assign(Object.assign({}, data.media), { category: "media" }), this.services),
184
+ ]
185
+ : null,
182
186
  participantSid: (_d = data.memberSid) !== null && _d !== void 0 ? _d : null,
183
187
  aggregatedDeliveryReceipt: data.delivery
184
188
  ? new aggregatedDeliveryReceipt.AggregatedDeliveryReceipt(data.delivery)
@@ -216,14 +220,15 @@ class Message extends replayEventEmitter.ReplayEventEmitter {
216
220
  return this.state.dateUpdated;
217
221
  }
218
222
  /**
219
- * Index of the message in the conversation's messages list.
220
- * By design of the Conversations system, the message indices may have arbitrary gaps between them,
223
+ * Index of this message in the conversation's list of messages.
224
+ *
225
+ * By design, the message indices may have arbitrary gaps between them,
221
226
  * that does not necessarily mean they were deleted or otherwise modified - just that
222
227
  * messages may have some non-contiguous indices even if they are being sent immediately one after another.
223
228
  *
224
229
  * Trying to use indices for some calculations is going to be unreliable.
225
230
  *
226
- * To calculate the number of unread messages it is better to use the read horizon API.
231
+ * To calculate the number of unread messages, it is better to use the Read Horizon API.
227
232
  * See {@link Conversation.getUnreadMessagesCount} for details.
228
233
  */
229
234
  get index() {
@@ -410,16 +415,13 @@ class Message extends replayEventEmitter.ReplayEventEmitter {
410
415
  */
411
416
  async getDetailedDeliveryReceipts() {
412
417
  let paginator = await this._getDetailedDeliveryReceiptsPaginator();
413
- let detailedDeliveryReceipts = [];
414
- while (true) {
418
+ let detailedDeliveryReceipts = paginator.items;
419
+ while (paginator.hasNextPage) {
420
+ paginator = await paginator.nextPage();
415
421
  detailedDeliveryReceipts = [
416
422
  ...detailedDeliveryReceipts,
417
423
  ...paginator.items,
418
424
  ];
419
- if (!paginator.hasNextPage) {
420
- break;
421
- }
422
- paginator = await paginator.nextPage();
423
425
  }
424
426
  return detailedDeliveryReceipts;
425
427
  }
@@ -502,6 +504,7 @@ class Message extends replayEventEmitter.ReplayEventEmitter {
502
504
  .arg("PageToken", options === null || options === void 0 ? void 0 : options.pageToken)
503
505
  .arg("PageSize", options === null || options === void 0 ? void 0 : options.pageSize)
504
506
  .build();
507
+ // todo: remove any after the release of new Twilsock
505
508
  const response = await this.services.network.get(url);
506
509
  return new restPaginator.RestPaginator(response.body.delivery_receipts.map((x) => new detailedDeliveryReceipt.DetailedDeliveryReceipt(x)), (pageToken, pageSize) => this._getDetailedDeliveryReceiptsPaginator({ pageToken, pageSize }), response.body.meta.previous_token, response.body.meta.next_token);
507
510
  }