@twilio/conversations 3.0.0-canary.100 → 3.0.0-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/builds/browser.js +599 -436
- package/builds/browser.js.map +1 -1
- package/builds/lib.d.ts +6 -2
- package/builds/lib.js +599 -436
- package/builds/lib.js.map +1 -1
- package/builds/twilio-conversations.js +3599 -2598
- package/builds/twilio-conversations.min.js +1 -1
- package/dist/client.js +6 -7
- package/dist/client.js.map +1 -1
- package/dist/command-executor.js +16 -9
- package/dist/command-executor.js.map +1 -1
- package/dist/conversation.js.map +1 -1
- package/dist/data/conversations.js +1 -4
- package/dist/data/conversations.js.map +1 -1
- package/dist/data/users.js +1 -3
- package/dist/data/users.js.map +1 -1
- package/dist/message.js +0 -1
- package/dist/message.js.map +1 -1
- package/dist/packages/conversations/package.json.js +1 -1
- package/dist/participant.js +33 -33
- package/dist/participant.js.map +1 -1
- package/dist/rest-paginator.js +11 -11
- package/dist/rest-paginator.js.map +1 -1
- package/dist/services/network.js +95 -26
- package/dist/services/network.js.map +1 -1
- package/dist/services/typing-indicator.js +12 -6
- package/dist/services/typing-indicator.js.map +1 -1
- package/package.json +10 -10
package/dist/message.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"message.js","sources":["../src/message.ts"],"sourcesContent":["import { parseAttributes, UriBuilder } from \"./util\";\nimport { Logger } from \"./logger\";\nimport { Conversation } from \"./conversation\";\nimport {\n CancellablePromise,\n McsClient,\n MediaCategory,\n} from \"@twilio/mcs-client\";\nimport { Media, MediaState } from \"./media\";\nimport { Participant } from \"./participant\";\nimport {\n AggregatedDeliveryDescriptor,\n AggregatedDeliveryReceipt,\n} from \"./aggregated-delivery-receipt\";\nimport {\n validateTypes,\n validateTypesAsync,\n nonEmptyString,\n nonEmptyArray,\n} from \"@twilio/declarative-type-validator\";\nimport { attributesValidator } from \"./interfaces/attributes\";\nimport { Network } from \"./services/network\";\nimport { RestPaginator } from \"./rest-paginator\";\nimport { DetailedDeliveryReceipt } from \"./detailed-delivery-receipt\";\nimport { Paginator } from \"./interfaces/paginator\";\nimport { Configuration } from \"./configuration\";\nimport { CommandExecutor } from \"./command-executor\";\nimport { EditMessageRequest } from \"./interfaces/commands/edit-message\";\nimport { MessageResponse } from \"./interfaces/commands/message-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { JSONValue } from \"@twilio/shared\";\nimport { ResponseMeta } from \"./interfaces/commands/response-meta\";\nimport { DeliveryReceiptResponse } from \"./interfaces/commands/delivery-receipt-response\";\n\ntype MessageEvents = {\n updated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Message\");\n\ninterface MessageState {\n sid: string;\n index: number;\n author: string | null;\n subject: string | null;\n body: string | null;\n dateUpdated: Date | null;\n lastUpdatedBy: string | null;\n attributes: JSONValue;\n timestamp: Date | null;\n type: MessageType;\n media: Media | null;\n medias: Media[] | null;\n participantSid: string | null;\n aggregatedDeliveryReceipt: AggregatedDeliveryReceipt | null;\n}\n\ninterface MessageServices {\n mcsClient: McsClient;\n network: Network;\n commandExecutor: CommandExecutor;\n}\n\ninterface MessageLinks {\n self: string;\n conversation: string;\n messages_receipts: string;\n}\n\n/**\n * The reason for the `updated` event being emitted by a message.\n */\ntype MessageUpdateReason =\n | \"body\"\n | \"lastUpdatedBy\"\n | \"dateCreated\"\n | \"dateUpdated\"\n | \"attributes\"\n | \"author\"\n | \"deliveryReceipt\"\n | \"subject\";\n\n/**\n * Type of a message.\n */\ntype MessageType = \"text\" | \"media\";\n\ninterface MessageUpdatedEventArgs {\n message: Message;\n updateReasons: MessageUpdateReason[];\n}\n\nexport interface MessageData {\n sid: string;\n text?: string;\n type?: MessageType;\n author: string | null;\n subject: string | null;\n lastUpdatedBy?: string | null;\n attributes?: JSONValue;\n dateUpdated: string;\n timestamp?: string;\n medias: MediaState[] | null;\n media: MediaState | null;\n memberSid?: string;\n delivery?: AggregatedDeliveryDescriptor;\n}\n\n/**\n * A message in a conversation.\n */\nclass Message extends ReplayEventEmitter<MessageEvents> {\n /**\n * Conversation that the message is in.\n */\n public readonly conversation: Conversation;\n\n private readonly links: MessageLinks;\n private readonly configuration: Configuration;\n private readonly services: MessageServices;\n\n private state: MessageState;\n\n /**\n * @internal\n */\n constructor(\n index: number,\n data: MessageData,\n conversation: Conversation,\n links: MessageLinks,\n configuration: Configuration,\n services: MessageServices\n ) {\n super();\n\n this.conversation = conversation;\n\n this.links = links;\n this.configuration = configuration;\n this.services = services;\n\n this.state = {\n sid: data.sid,\n index: index,\n author: data.author,\n subject: data.subject,\n body: data.text ?? null,\n timestamp: data.timestamp ? new Date(data.timestamp) : null,\n dateUpdated: data.dateUpdated ? new Date(data.dateUpdated) : null,\n lastUpdatedBy: data.lastUpdatedBy ?? null,\n attributes: parseAttributes(\n data.attributes,\n `Got malformed attributes for the message ${data.sid}`,\n log\n ),\n type: data.type ?? \"text\",\n media:\n data.type === \"media\" && data.media\n ? new Media(data.media, this.services)\n : null,\n medias:\n data.type === \"media\" && data.medias\n ? data.medias.map((m) => new Media(m, this.services))\n : data.type === \"media\" && data.media && !data.medias\n ? [\n new Media(\n { ...data.media, category: \"media\" } as Media,\n this.services\n ),\n ]\n : null,\n participantSid: data.memberSid ?? null,\n aggregatedDeliveryReceipt: data.delivery\n ? new AggregatedDeliveryReceipt(data.delivery)\n : null,\n };\n }\n\n /**\n * Fired when the properties or the body of the message has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Message} message - the message in question\n * * {@link MessageUpdateReason}[] updateReasons - array of reasons for the update\n */\n static readonly updated = \"updated\";\n\n /**\n * The server-assigned unique identifier for the message.\n */\n public get sid(): string {\n return this.state.sid;\n }\n\n /**\n * Name of the user that sent the message.\n */\n public get author(): string | null {\n return this.state.author;\n }\n\n /**\n * Message subject. Used only in email conversations.\n */\n public get subject(): string | null {\n return this.state.subject;\n }\n\n /**\n * Body of the message.\n */\n public get body(): string | null {\n return this.state.body;\n }\n\n /**\n * Date this message was last updated on.\n */\n public get dateUpdated(): Date | null {\n return this.state.dateUpdated;\n }\n\n /**\n * Index of this message in the conversation's list of messages.\n *\n * By design, the message indices may have arbitrary gaps between them,\n * that does not necessarily mean they were deleted or otherwise modified - just that\n * messages may have some non-contiguous indices even if they are being sent immediately one after another.\n *\n * Trying to use indices for some calculations is going to be unreliable.\n *\n * To calculate the number of unread messages, it is better to use the Read Horizon API.\n * See {@link Conversation.getUnreadMessagesCount} for details.\n */\n public get index(): number {\n return this.state.index;\n }\n\n /**\n * Identity of the last user that updated the message.\n */\n public get lastUpdatedBy(): string | null {\n return this.state.lastUpdatedBy;\n }\n\n /**\n * Date this message was created on.\n */\n public get dateCreated(): Date | null {\n return this.state.timestamp;\n }\n\n /**\n * Custom attributes of the message.\n */\n public get attributes(): JSONValue {\n return this.state.attributes;\n }\n\n /**\n * Type of the message.\n */\n public get type(): MessageType {\n return this.state.type;\n }\n\n /**\n * One of the attached media (if present).\n * @deprecated Use attachedMedia instead. Note that the latter is now an array.\n */\n public get media(): Media | null {\n return this.state.media;\n }\n\n /**\n * Return all media attachments, except email body/history attachments, without temporary urls.\n */\n public get attachedMedia(): Array<Media> | null {\n return this.getMediaByCategories([\"media\"]);\n }\n\n /**\n * The server-assigned unique identifier of the authoring participant.\n */\n public get participantSid(): string | null {\n return this.state.participantSid;\n }\n\n /**\n * Aggregated information about the message delivery statuses across all participants of a conversation..\n */\n public get aggregatedDeliveryReceipt(): AggregatedDeliveryReceipt | null {\n return this.state.aggregatedDeliveryReceipt;\n }\n\n /**\n * Return a (possibly empty) array of media matching a specific set of categories.\n * Allowed category is so far only 'media'.\n * @param categories Array of categories to match.\n * @returns Array of media descriptors matching given categories.\n */\n public getMediaByCategories(categories: MediaCategory[]): Media[] | null {\n return (this.state.medias ?? []).filter((m) =>\n categories.includes(m.category)\n );\n }\n\n /**\n * Get a media descriptor for an email body attachment of a provided type.\n * Allowed body types are returned in the Conversation.limits().emailBodiesAllowedContentTypes array.\n * @param type Type of email body to request, defaults to `text/plain`.\n */\n @validateTypes([nonEmptyString, \"undefined\"])\n public getEmailBody(type = \"text/plain\"): Media | null {\n return (\n this.getMediaByCategories([\"body\"])\n ?.filter((m) => m.contentType == type)\n .shift() ?? null\n );\n }\n\n /**\n * Get a media descriptor for an email history attachment of a provided type.\n * Allowed body types are returned in the Conversation.limits().emailHistoriesAllowedContentTypes array.\n * @param type Type of email history to request, defaults to `text/plain`.\n */\n @validateTypes([nonEmptyString, \"undefined\"])\n public getEmailHistory(type = \"text/plain\"): Media | null {\n return (\n this.getMediaByCategories([\"history\"])\n ?.filter((m) => m.contentType == type)\n .shift() ?? null\n );\n }\n\n _update(data) {\n const updateReasons: MessageUpdateReason[] = [];\n\n if (\n (data.text || typeof data.text === \"string\") &&\n data.text !== this.state.body\n ) {\n this.state.body = data.text;\n updateReasons.push(\"body\");\n }\n\n if (data.subject && data.subject !== this.state.subject) {\n this.state.subject = data.subject;\n updateReasons.push(\"subject\");\n }\n\n if (data.lastUpdatedBy && data.lastUpdatedBy !== this.state.lastUpdatedBy) {\n this.state.lastUpdatedBy = data.lastUpdatedBy;\n updateReasons.push(\"lastUpdatedBy\");\n }\n\n if (data.author && data.author !== this.state.author) {\n this.state.author = data.author;\n updateReasons.push(\"author\");\n }\n\n if (\n data.dateUpdated &&\n new Date(data.dateUpdated).getTime() !==\n (this.state.dateUpdated && this.state.dateUpdated.getTime())\n ) {\n this.state.dateUpdated = new Date(data.dateUpdated);\n updateReasons.push(\"dateUpdated\");\n }\n\n if (\n data.timestamp &&\n new Date(data.timestamp).getTime() !==\n (this.state.timestamp && this.state.timestamp.getTime())\n ) {\n this.state.timestamp = new Date(data.timestamp);\n updateReasons.push(\"dateCreated\");\n }\n\n const updatedAttributes = parseAttributes(\n data.attributes,\n `Got malformed attributes for the message ${this.sid}`,\n log\n );\n if (!isEqual(this.state.attributes, updatedAttributes)) {\n this.state.attributes = updatedAttributes;\n updateReasons.push(\"attributes\");\n }\n\n const updatedAggregatedDelivery = data.delivery;\n const currentAggregatedDelivery = this.state.aggregatedDeliveryReceipt;\n const isUpdatedAggregateDeliveryValid =\n !!updatedAggregatedDelivery &&\n !!updatedAggregatedDelivery.total &&\n !!updatedAggregatedDelivery.delivered &&\n !!updatedAggregatedDelivery.failed &&\n !!updatedAggregatedDelivery.read &&\n !!updatedAggregatedDelivery.sent &&\n !!updatedAggregatedDelivery.undelivered;\n if (isUpdatedAggregateDeliveryValid) {\n if (!currentAggregatedDelivery) {\n this.state.aggregatedDeliveryReceipt = new AggregatedDeliveryReceipt(\n updatedAggregatedDelivery\n );\n updateReasons.push(\"deliveryReceipt\");\n } else if (\n !currentAggregatedDelivery._isEquals(updatedAggregatedDelivery)\n ) {\n currentAggregatedDelivery._update(updatedAggregatedDelivery);\n updateReasons.push(\"deliveryReceipt\");\n }\n }\n\n if (updateReasons.length > 0) {\n this.emit(\"updated\", { message: this, updateReasons: updateReasons });\n }\n }\n\n /**\n * Get the participant who is the author of the message.\n */\n public async getParticipant(): Promise<Participant> {\n let participant: Participant | null = null;\n if (this.state.participantSid) {\n participant = await this.conversation\n .getParticipantBySid(this.state.participantSid)\n .catch(() => {\n log.debug(\n `Participant with sid \"${this.participantSid}\" not found for message ${this.sid}`\n );\n return null;\n });\n }\n if (!participant && this.state.author) {\n participant = await this.conversation\n .getParticipantByIdentity(this.state.author)\n .catch(() => {\n log.debug(\n `Participant with identity \"${this.author}\" not found for message ${this.sid}`\n );\n return null;\n });\n }\n if (participant) {\n return participant;\n }\n let errorMesage = \"Participant with \";\n if (this.state.participantSid) {\n errorMesage += \"SID '\" + this.state.participantSid + \"' \";\n }\n if (this.state.author) {\n if (this.state.participantSid) {\n errorMesage += \"or \";\n }\n errorMesage += \"identity '\" + this.state.author + \"' \";\n }\n if (errorMesage === \"Participant with \") {\n errorMesage = \"Participant \";\n }\n errorMesage += \"was not found\";\n throw new Error(errorMesage);\n }\n\n /**\n * Get the delivery receipts of the message.\n */\n public async getDetailedDeliveryReceipts(): Promise<\n DetailedDeliveryReceipt[]\n > {\n let paginator: Paginator<DetailedDeliveryReceipt> =\n await this._getDetailedDeliveryReceiptsPaginator();\n let detailedDeliveryReceipts: DetailedDeliveryReceipt[] = paginator.items;\n\n while (paginator.hasNextPage) {\n paginator = await paginator.nextPage();\n detailedDeliveryReceipts = [\n ...detailedDeliveryReceipts,\n ...paginator.items,\n ];\n }\n\n return detailedDeliveryReceipts;\n }\n\n /**\n * Remove the message.\n */\n public async remove(): Promise<Message> {\n await this.services.commandExecutor.mutateResource(\n \"delete\",\n this.links.self\n );\n\n return this;\n }\n\n /**\n * Edit the message body.\n * @param body New body of the message.\n */\n @validateTypesAsync(\"string\")\n public async updateBody(body: string): Promise<Message> {\n await this.services.commandExecutor.mutateResource<\n EditMessageRequest,\n MessageResponse\n >(\"post\", this.links.self, {\n body,\n });\n\n return this;\n }\n\n /**\n * Edit the message attributes.\n * @param attributes New attributes.\n */\n @validateTypesAsync(attributesValidator)\n public async updateAttributes(attributes: JSONValue): Promise<Message> {\n await this.services.commandExecutor.mutateResource<\n EditMessageRequest,\n MessageResponse\n >(\"post\", this.links.self, {\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n\n return this;\n }\n\n /**\n * Get content URLs for all media attachments in the given set using a single operation.\n * @param contentSet Set of media attachments to query content URLs.\n */\n @validateTypesAsync(nonEmptyArray(\"media\", Media))\n public getTemporaryContentUrlsForMedia(\n contentSet: Media[]\n ): CancellablePromise<Map<string, string>> {\n // We ignore existing mcsMedia members of each of the media entries.\n // Instead we just collect their sids and pull new descriptors from a mediaSet GET endpoint.\n const sids = contentSet.map((m) => m.sid);\n return this.getTemporaryContentUrlsForMediaSids(sids);\n }\n\n /**\n * Get content URLs for all media attachments in the given set of media sids using a single operation.\n * @param mediaSids Set of media sids to query for the content URL.\n */\n @validateTypesAsync(nonEmptyArray(\"strings\", \"string\"))\n public getTemporaryContentUrlsForMediaSids(\n mediaSids: string[]\n ): CancellablePromise<Map<string, string>> {\n return new CancellablePromise(async (resolve, reject, onCancel) => {\n const mediaGetRequest = this.services.mcsClient.mediaSetGetContentUrls(\n mediaSids ?? []\n );\n\n if (!this.services.mcsClient || !mediaSids) {\n reject(new Error(\"Media Content Service is unavailable\"));\n return;\n }\n\n onCancel(() => {\n mediaGetRequest.cancel();\n });\n\n try {\n const urls = await mediaGetRequest;\n resolve(urls);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Get content URLs for all media attached to the message.\n */\n public getTemporaryContentUrlsForAttachedMedia(): CancellablePromise<\n Map<string, string>\n > {\n const media = this.attachedMedia;\n const sids = media?.map((m) => m.sid) ?? [];\n return this.getTemporaryContentUrlsForMediaSids(sids);\n }\n\n private async _getDetailedDeliveryReceiptsPaginator(options?: {\n pageToken?: string;\n pageSize?: number;\n }): Promise<Paginator<DetailedDeliveryReceipt>> {\n const messagesReceiptsUrl = this.configuration.links.messagesReceipts\n .replace(\"%s\", this.conversation.sid)\n .replace(\"%s\", this.sid);\n const url = new UriBuilder(messagesReceiptsUrl)\n .arg(\"PageToken\", options?.pageToken as string)\n .arg(\"PageSize\", options?.pageSize as number)\n .build();\n // todo: remove any after the release of new Twilsock\n const response: any = await this.services.network.get<\n { delivery_receipts: DeliveryReceiptResponse[] } & ResponseMeta\n >(url);\n\n return new RestPaginator<DetailedDeliveryReceipt>(\n response.body.delivery_receipts.map(\n (x) => new DetailedDeliveryReceipt(x)\n ),\n (pageToken, pageSize) =>\n this._getDetailedDeliveryReceiptsPaginator({ pageToken, pageSize }),\n response.body.meta.previous_token,\n response.body.meta.next_token\n );\n }\n}\n\nexport {\n Message,\n MessageServices,\n MessageType,\n MessageUpdateReason,\n MessageUpdatedEventArgs,\n};\n"],"names":["Logger","ReplayEventEmitter","index","parseAttributes","Media","AggregatedDeliveryReceipt","isEqual","CancellablePromise","UriBuilder","RestPaginator","DetailedDeliveryReceipt","__decorate","validateTypes","nonEmptyString","validateTypesAsync","attributesValidator","nonEmptyArray"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"message.js","sources":["../src/message.ts"],"sourcesContent":["import { parseAttributes, UriBuilder } from \"./util\";\nimport { Logger } from \"./logger\";\nimport { Conversation } from \"./conversation\";\nimport {\n CancellablePromise,\n McsClient,\n MediaCategory,\n} from \"@twilio/mcs-client\";\nimport { Media, MediaState } from \"./media\";\nimport { Participant } from \"./participant\";\nimport {\n AggregatedDeliveryDescriptor,\n AggregatedDeliveryReceipt,\n} from \"./aggregated-delivery-receipt\";\nimport {\n validateTypes,\n validateTypesAsync,\n nonEmptyString,\n nonEmptyArray,\n} from \"@twilio/declarative-type-validator\";\nimport { attributesValidator } from \"./interfaces/attributes\";\nimport { Network } from \"./services/network\";\nimport { RestPaginator } from \"./rest-paginator\";\nimport { DetailedDeliveryReceipt } from \"./detailed-delivery-receipt\";\nimport { Paginator } from \"./interfaces/paginator\";\nimport { Configuration } from \"./configuration\";\nimport { CommandExecutor } from \"./command-executor\";\nimport { EditMessageRequest } from \"./interfaces/commands/edit-message\";\nimport { MessageResponse } from \"./interfaces/commands/message-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { JSONValue } from \"@twilio/shared\";\n\ntype MessageEvents = {\n updated: (data: {\n message: Message;\n updateReasons: MessageUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Message\");\n\ninterface MessageState {\n sid: string;\n index: number;\n author: string | null;\n subject: string | null;\n body: string | null;\n dateUpdated: Date | null;\n lastUpdatedBy: string | null;\n attributes: JSONValue;\n timestamp: Date | null;\n type: MessageType;\n media: Media | null;\n medias: Media[] | null;\n participantSid: string | null;\n aggregatedDeliveryReceipt: AggregatedDeliveryReceipt | null;\n}\n\ninterface MessageServices {\n mcsClient: McsClient;\n network: Network;\n commandExecutor: CommandExecutor;\n}\n\ninterface MessageLinks {\n self: string;\n conversation: string;\n messages_receipts: string;\n}\n\n/**\n * The reason for the `updated` event being emitted by a message.\n */\ntype MessageUpdateReason =\n | \"body\"\n | \"lastUpdatedBy\"\n | \"dateCreated\"\n | \"dateUpdated\"\n | \"attributes\"\n | \"author\"\n | \"deliveryReceipt\"\n | \"subject\";\n\n/**\n * Type of a message.\n */\ntype MessageType = \"text\" | \"media\";\n\ninterface MessageUpdatedEventArgs {\n message: Message;\n updateReasons: MessageUpdateReason[];\n}\n\nexport interface MessageData {\n sid: string;\n text?: string;\n type?: MessageType;\n author: string | null;\n subject: string | null;\n lastUpdatedBy?: string | null;\n attributes?: JSONValue;\n dateUpdated: string;\n timestamp?: string;\n medias: MediaState[] | null;\n media: MediaState | null;\n memberSid?: string;\n delivery?: AggregatedDeliveryDescriptor;\n}\n\n/**\n * A message in a conversation.\n */\nclass Message extends ReplayEventEmitter<MessageEvents> {\n /**\n * Conversation that the message is in.\n */\n public readonly conversation: Conversation;\n\n private readonly links: MessageLinks;\n private readonly configuration: Configuration;\n private readonly services: MessageServices;\n\n private state: MessageState;\n\n /**\n * @internal\n */\n constructor(\n index: number,\n data: MessageData,\n conversation: Conversation,\n links: MessageLinks,\n configuration: Configuration,\n services: MessageServices\n ) {\n super();\n\n this.conversation = conversation;\n\n this.links = links;\n this.configuration = configuration;\n this.services = services;\n\n this.state = {\n sid: data.sid,\n index: index,\n author: data.author,\n subject: data.subject,\n body: data.text ?? null,\n timestamp: data.timestamp ? new Date(data.timestamp) : null,\n dateUpdated: data.dateUpdated ? new Date(data.dateUpdated) : null,\n lastUpdatedBy: data.lastUpdatedBy ?? null,\n attributes: parseAttributes(\n data.attributes,\n `Got malformed attributes for the message ${data.sid}`,\n log\n ),\n type: data.type ?? \"text\",\n media:\n data.type === \"media\" && data.media\n ? new Media(data.media, this.services)\n : null,\n medias:\n data.type === \"media\" && data.medias\n ? data.medias.map((m) => new Media(m, this.services))\n : data.type === \"media\" && data.media && !data.medias\n ? [\n new Media(\n { ...data.media, category: \"media\" } as Media,\n this.services\n ),\n ]\n : null,\n participantSid: data.memberSid ?? null,\n aggregatedDeliveryReceipt: data.delivery\n ? new AggregatedDeliveryReceipt(data.delivery)\n : null,\n };\n }\n\n /**\n * Fired when the properties or the body of the message has been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Message} message - the message in question\n * * {@link MessageUpdateReason}[] updateReasons - array of reasons for the update\n */\n static readonly updated = \"updated\";\n\n /**\n * The server-assigned unique identifier for the message.\n */\n public get sid(): string {\n return this.state.sid;\n }\n\n /**\n * Name of the user that sent the message.\n */\n public get author(): string | null {\n return this.state.author;\n }\n\n /**\n * Message subject. Used only in email conversations.\n */\n public get subject(): string | null {\n return this.state.subject;\n }\n\n /**\n * Body of the message.\n */\n public get body(): string | null {\n return this.state.body;\n }\n\n /**\n * Date this message was last updated on.\n */\n public get dateUpdated(): Date | null {\n return this.state.dateUpdated;\n }\n\n /**\n * Index of this message in the conversation's list of messages.\n *\n * By design, the message indices may have arbitrary gaps between them,\n * that does not necessarily mean they were deleted or otherwise modified - just that\n * messages may have some non-contiguous indices even if they are being sent immediately one after another.\n *\n * Trying to use indices for some calculations is going to be unreliable.\n *\n * To calculate the number of unread messages, it is better to use the Read Horizon API.\n * See {@link Conversation.getUnreadMessagesCount} for details.\n */\n public get index(): number {\n return this.state.index;\n }\n\n /**\n * Identity of the last user that updated the message.\n */\n public get lastUpdatedBy(): string | null {\n return this.state.lastUpdatedBy;\n }\n\n /**\n * Date this message was created on.\n */\n public get dateCreated(): Date | null {\n return this.state.timestamp;\n }\n\n /**\n * Custom attributes of the message.\n */\n public get attributes(): JSONValue {\n return this.state.attributes;\n }\n\n /**\n * Type of the message.\n */\n public get type(): MessageType {\n return this.state.type;\n }\n\n /**\n * One of the attached media (if present).\n * @deprecated Use attachedMedia instead. Note that the latter is now an array.\n */\n public get media(): Media | null {\n return this.state.media;\n }\n\n /**\n * Return all media attachments, except email body/history attachments, without temporary urls.\n */\n public get attachedMedia(): Array<Media> | null {\n return this.getMediaByCategories([\"media\"]);\n }\n\n /**\n * The server-assigned unique identifier of the authoring participant.\n */\n public get participantSid(): string | null {\n return this.state.participantSid;\n }\n\n /**\n * Aggregated information about the message delivery statuses across all participants of a conversation..\n */\n public get aggregatedDeliveryReceipt(): AggregatedDeliveryReceipt | null {\n return this.state.aggregatedDeliveryReceipt;\n }\n\n /**\n * Return a (possibly empty) array of media matching a specific set of categories.\n * Allowed category is so far only 'media'.\n * @param categories Array of categories to match.\n * @returns Array of media descriptors matching given categories.\n */\n public getMediaByCategories(categories: MediaCategory[]): Media[] | null {\n return (this.state.medias ?? []).filter((m) =>\n categories.includes(m.category)\n );\n }\n\n /**\n * Get a media descriptor for an email body attachment of a provided type.\n * Allowed body types are returned in the Conversation.limits().emailBodiesAllowedContentTypes array.\n * @param type Type of email body to request, defaults to `text/plain`.\n */\n @validateTypes([nonEmptyString, \"undefined\"])\n public getEmailBody(type = \"text/plain\"): Media | null {\n return (\n this.getMediaByCategories([\"body\"])\n ?.filter((m) => m.contentType == type)\n .shift() ?? null\n );\n }\n\n /**\n * Get a media descriptor for an email history attachment of a provided type.\n * Allowed body types are returned in the Conversation.limits().emailHistoriesAllowedContentTypes array.\n * @param type Type of email history to request, defaults to `text/plain`.\n */\n @validateTypes([nonEmptyString, \"undefined\"])\n public getEmailHistory(type = \"text/plain\"): Media | null {\n return (\n this.getMediaByCategories([\"history\"])\n ?.filter((m) => m.contentType == type)\n .shift() ?? null\n );\n }\n\n _update(data) {\n const updateReasons: MessageUpdateReason[] = [];\n\n if (\n (data.text || typeof data.text === \"string\") &&\n data.text !== this.state.body\n ) {\n this.state.body = data.text;\n updateReasons.push(\"body\");\n }\n\n if (data.subject && data.subject !== this.state.subject) {\n this.state.subject = data.subject;\n updateReasons.push(\"subject\");\n }\n\n if (data.lastUpdatedBy && data.lastUpdatedBy !== this.state.lastUpdatedBy) {\n this.state.lastUpdatedBy = data.lastUpdatedBy;\n updateReasons.push(\"lastUpdatedBy\");\n }\n\n if (data.author && data.author !== this.state.author) {\n this.state.author = data.author;\n updateReasons.push(\"author\");\n }\n\n if (\n data.dateUpdated &&\n new Date(data.dateUpdated).getTime() !==\n (this.state.dateUpdated && this.state.dateUpdated.getTime())\n ) {\n this.state.dateUpdated = new Date(data.dateUpdated);\n updateReasons.push(\"dateUpdated\");\n }\n\n if (\n data.timestamp &&\n new Date(data.timestamp).getTime() !==\n (this.state.timestamp && this.state.timestamp.getTime())\n ) {\n this.state.timestamp = new Date(data.timestamp);\n updateReasons.push(\"dateCreated\");\n }\n\n const updatedAttributes = parseAttributes(\n data.attributes,\n `Got malformed attributes for the message ${this.sid}`,\n log\n );\n if (!isEqual(this.state.attributes, updatedAttributes)) {\n this.state.attributes = updatedAttributes;\n updateReasons.push(\"attributes\");\n }\n\n const updatedAggregatedDelivery = data.delivery;\n const currentAggregatedDelivery = this.state.aggregatedDeliveryReceipt;\n const isUpdatedAggregateDeliveryValid =\n !!updatedAggregatedDelivery &&\n !!updatedAggregatedDelivery.total &&\n !!updatedAggregatedDelivery.delivered &&\n !!updatedAggregatedDelivery.failed &&\n !!updatedAggregatedDelivery.read &&\n !!updatedAggregatedDelivery.sent &&\n !!updatedAggregatedDelivery.undelivered;\n if (isUpdatedAggregateDeliveryValid) {\n if (!currentAggregatedDelivery) {\n this.state.aggregatedDeliveryReceipt = new AggregatedDeliveryReceipt(\n updatedAggregatedDelivery\n );\n updateReasons.push(\"deliveryReceipt\");\n } else if (\n !currentAggregatedDelivery._isEquals(updatedAggregatedDelivery)\n ) {\n currentAggregatedDelivery._update(updatedAggregatedDelivery);\n updateReasons.push(\"deliveryReceipt\");\n }\n }\n\n if (updateReasons.length > 0) {\n this.emit(\"updated\", { message: this, updateReasons: updateReasons });\n }\n }\n\n /**\n * Get the participant who is the author of the message.\n */\n public async getParticipant(): Promise<Participant> {\n let participant: Participant | null = null;\n if (this.state.participantSid) {\n participant = await this.conversation\n .getParticipantBySid(this.state.participantSid)\n .catch(() => {\n log.debug(\n `Participant with sid \"${this.participantSid}\" not found for message ${this.sid}`\n );\n return null;\n });\n }\n if (!participant && this.state.author) {\n participant = await this.conversation\n .getParticipantByIdentity(this.state.author)\n .catch(() => {\n log.debug(\n `Participant with identity \"${this.author}\" not found for message ${this.sid}`\n );\n return null;\n });\n }\n if (participant) {\n return participant;\n }\n let errorMesage = \"Participant with \";\n if (this.state.participantSid) {\n errorMesage += \"SID '\" + this.state.participantSid + \"' \";\n }\n if (this.state.author) {\n if (this.state.participantSid) {\n errorMesage += \"or \";\n }\n errorMesage += \"identity '\" + this.state.author + \"' \";\n }\n if (errorMesage === \"Participant with \") {\n errorMesage = \"Participant \";\n }\n errorMesage += \"was not found\";\n throw new Error(errorMesage);\n }\n\n /**\n * Get the delivery receipts of the message.\n */\n public async getDetailedDeliveryReceipts(): Promise<\n DetailedDeliveryReceipt[]\n > {\n let paginator: Paginator<DetailedDeliveryReceipt> =\n await this._getDetailedDeliveryReceiptsPaginator();\n let detailedDeliveryReceipts: DetailedDeliveryReceipt[] = paginator.items;\n\n while (paginator.hasNextPage) {\n paginator = await paginator.nextPage();\n detailedDeliveryReceipts = [\n ...detailedDeliveryReceipts,\n ...paginator.items,\n ];\n }\n\n return detailedDeliveryReceipts;\n }\n\n /**\n * Remove the message.\n */\n public async remove(): Promise<Message> {\n await this.services.commandExecutor.mutateResource(\n \"delete\",\n this.links.self\n );\n\n return this;\n }\n\n /**\n * Edit the message body.\n * @param body New body of the message.\n */\n @validateTypesAsync(\"string\")\n public async updateBody(body: string): Promise<Message> {\n await this.services.commandExecutor.mutateResource<\n EditMessageRequest,\n MessageResponse\n >(\"post\", this.links.self, {\n body,\n });\n\n return this;\n }\n\n /**\n * Edit the message attributes.\n * @param attributes New attributes.\n */\n @validateTypesAsync(attributesValidator)\n public async updateAttributes(attributes: JSONValue): Promise<Message> {\n await this.services.commandExecutor.mutateResource<\n EditMessageRequest,\n MessageResponse\n >(\"post\", this.links.self, {\n attributes:\n typeof attributes !== \"undefined\"\n ? JSON.stringify(attributes)\n : undefined,\n });\n\n return this;\n }\n\n /**\n * Get content URLs for all media attachments in the given set using a single operation.\n * @param contentSet Set of media attachments to query content URLs.\n */\n @validateTypesAsync(nonEmptyArray(\"media\", Media))\n public getTemporaryContentUrlsForMedia(\n contentSet: Media[]\n ): CancellablePromise<Map<string, string>> {\n // We ignore existing mcsMedia members of each of the media entries.\n // Instead we just collect their sids and pull new descriptors from a mediaSet GET endpoint.\n const sids = contentSet.map((m) => m.sid);\n return this.getTemporaryContentUrlsForMediaSids(sids);\n }\n\n /**\n * Get content URLs for all media attachments in the given set of media sids using a single operation.\n * @param mediaSids Set of media sids to query for the content URL.\n */\n @validateTypesAsync(nonEmptyArray(\"strings\", \"string\"))\n public getTemporaryContentUrlsForMediaSids(\n mediaSids: string[]\n ): CancellablePromise<Map<string, string>> {\n return new CancellablePromise(async (resolve, reject, onCancel) => {\n const mediaGetRequest = this.services.mcsClient.mediaSetGetContentUrls(\n mediaSids ?? []\n );\n\n if (!this.services.mcsClient || !mediaSids) {\n reject(new Error(\"Media Content Service is unavailable\"));\n return;\n }\n\n onCancel(() => {\n mediaGetRequest.cancel();\n });\n\n try {\n const urls = await mediaGetRequest;\n resolve(urls);\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Get content URLs for all media attached to the message.\n */\n public getTemporaryContentUrlsForAttachedMedia(): CancellablePromise<\n Map<string, string>\n > {\n const media = this.attachedMedia;\n const sids = media?.map((m) => m.sid) ?? [];\n return this.getTemporaryContentUrlsForMediaSids(sids);\n }\n\n private async _getDetailedDeliveryReceiptsPaginator(options?: {\n pageToken?: string;\n pageSize?: number;\n }): Promise<Paginator<DetailedDeliveryReceipt>> {\n const messagesReceiptsUrl = this.configuration.links.messagesReceipts\n .replace(\"%s\", this.conversation.sid)\n .replace(\"%s\", this.sid);\n const url = new UriBuilder(messagesReceiptsUrl)\n .arg(\"PageToken\", options?.pageToken as string)\n .arg(\"PageSize\", options?.pageSize as number)\n .build();\n const response = await this.services.network.get(url);\n\n return new RestPaginator<DetailedDeliveryReceipt>(\n response.body.delivery_receipts.map(\n (x) => new DetailedDeliveryReceipt(x)\n ),\n (pageToken, pageSize) =>\n this._getDetailedDeliveryReceiptsPaginator({ pageToken, pageSize }),\n response.body.meta.previous_token,\n response.body.meta.next_token\n );\n }\n}\n\nexport {\n Message,\n MessageServices,\n MessageType,\n MessageUpdateReason,\n MessageUpdatedEventArgs,\n};\n"],"names":["Logger","ReplayEventEmitter","index","parseAttributes","Media","AggregatedDeliveryReceipt","isEqual","CancellablePromise","UriBuilder","RestPaginator","DetailedDeliveryReceipt","__decorate","validateTypes","nonEmptyString","validateTypesAsync","attributesValidator","nonEmptyArray"],"mappings":"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"}
|
@@ -130,7 +130,7 @@ This software includes platform.js under the following license.
|
|
130
130
|
|
131
131
|
Object.defineProperty(exports, '__esModule', { value: true });
|
132
132
|
|
133
|
-
var version = "
|
133
|
+
var version = "3.0.0-rc.1";
|
134
134
|
|
135
135
|
exports.version = version;
|
136
136
|
//# sourceMappingURL=package.json.js.map
|
package/dist/participant.js
CHANGED
@@ -147,39 +147,6 @@ const log = logger.Logger.scope("Participant");
|
|
147
147
|
* A participant represents a remote client in a conversation.
|
148
148
|
*/
|
149
149
|
class Participant extends replayEventEmitter.ReplayEventEmitter {
|
150
|
-
/**
|
151
|
-
* @internal
|
152
|
-
*/
|
153
|
-
constructor(data, sid, conversation, links, services) {
|
154
|
-
var _a, _b;
|
155
|
-
super();
|
156
|
-
this.conversation = conversation;
|
157
|
-
this.links = links;
|
158
|
-
this.services = services;
|
159
|
-
this.state = {
|
160
|
-
attributes: index.parseAttributes(data.attributes, "Retrieved malformed attributes from the server for participant: " +
|
161
|
-
sid, log),
|
162
|
-
dateCreated: data.dateCreated ? index.parseTime(data.dateCreated) : null,
|
163
|
-
dateUpdated: data.dateCreated ? index.parseTime(data.dateUpdated) : null,
|
164
|
-
sid: sid,
|
165
|
-
typingTimeout: null,
|
166
|
-
isTyping: false,
|
167
|
-
identity: data.identity,
|
168
|
-
roleSid: (_a = data.roleSid) !== null && _a !== void 0 ? _a : "",
|
169
|
-
lastReadMessageIndex: Number.isInteger(data.lastConsumedMessageIndex)
|
170
|
-
? data.lastConsumedMessageIndex
|
171
|
-
: null,
|
172
|
-
lastReadTimestamp: data.lastConsumptionTimestamp
|
173
|
-
? index.parseTime(data.lastConsumptionTimestamp)
|
174
|
-
: null,
|
175
|
-
type: data.type || "chat",
|
176
|
-
userInfo: data.userInfo,
|
177
|
-
bindings: (_b = data.bindings) !== null && _b !== void 0 ? _b : {},
|
178
|
-
};
|
179
|
-
if (!data.identity && !data.type) {
|
180
|
-
throw new Error("Received invalid Participant object from server: Missing identity or type of Participant.");
|
181
|
-
}
|
182
|
-
}
|
183
150
|
/**
|
184
151
|
* The server-assigned unique identifier for the participant.
|
185
152
|
*/
|
@@ -253,6 +220,39 @@ class Participant extends replayEventEmitter.ReplayEventEmitter {
|
|
253
220
|
var _a;
|
254
221
|
return (_a = this.state.bindings) !== null && _a !== void 0 ? _a : {};
|
255
222
|
}
|
223
|
+
/**
|
224
|
+
* @internal
|
225
|
+
*/
|
226
|
+
constructor(data, sid, conversation, links, services) {
|
227
|
+
var _a, _b;
|
228
|
+
super();
|
229
|
+
this.conversation = conversation;
|
230
|
+
this.links = links;
|
231
|
+
this.services = services;
|
232
|
+
this.state = {
|
233
|
+
attributes: index.parseAttributes(data.attributes, "Retrieved malformed attributes from the server for participant: " +
|
234
|
+
sid, log),
|
235
|
+
dateCreated: data.dateCreated ? index.parseTime(data.dateCreated) : null,
|
236
|
+
dateUpdated: data.dateCreated ? index.parseTime(data.dateUpdated) : null,
|
237
|
+
sid: sid,
|
238
|
+
typingTimeout: null,
|
239
|
+
isTyping: false,
|
240
|
+
identity: data.identity,
|
241
|
+
roleSid: (_a = data.roleSid) !== null && _a !== void 0 ? _a : "",
|
242
|
+
lastReadMessageIndex: Number.isInteger(data.lastConsumedMessageIndex)
|
243
|
+
? data.lastConsumedMessageIndex
|
244
|
+
: null,
|
245
|
+
lastReadTimestamp: data.lastConsumptionTimestamp
|
246
|
+
? index.parseTime(data.lastConsumptionTimestamp)
|
247
|
+
: null,
|
248
|
+
type: data.type || "chat",
|
249
|
+
userInfo: data.userInfo,
|
250
|
+
bindings: (_b = data.bindings) !== null && _b !== void 0 ? _b : {},
|
251
|
+
};
|
252
|
+
if (!data.identity && !data.type) {
|
253
|
+
throw new Error("Received invalid Participant object from server: Missing identity or type of Participant.");
|
254
|
+
}
|
255
|
+
}
|
256
256
|
/**
|
257
257
|
* Internal method used to start or reset the typing indicator timeout (with event emitting).
|
258
258
|
* @internal
|
package/dist/participant.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"participant.js","sources":["../src/participant.ts"],"sourcesContent":["import { Users } from \"./data/users\";\nimport { User } from \"./user\";\nimport { parseTime, parseAttributes } from \"./util\";\nimport { Logger } from \"./logger\";\nimport { Conversation } from \"./conversation\";\nimport { attributesValidator } from \"./interfaces/attributes\";\nimport { validateTypesAsync } from \"@twilio/declarative-type-validator\";\nimport { CommandExecutor } from \"./command-executor\";\nimport { EditParticipantRequest } from \"./interfaces/commands/edit-participant\";\nimport { ParticipantResponse } from \"./interfaces/commands/participant-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { JSONValue } from \"@twilio/shared\";\n\ntype ParticipantEvents = {\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n updated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Participant\");\n\ninterface ParticipantDescriptor {\n attributes?: JSONValue;\n dateCreated: Date | null;\n dateUpdated: Date | null;\n identity: string;\n roleSid?: string;\n lastConsumedMessageIndex: number | null;\n lastConsumptionTimestamp: number | null;\n type: ParticipantType;\n userInfo?: string;\n bindings?: ParticipantBindings;\n}\n\ninterface ParticipantState {\n attributes: JSONValue;\n dateCreated: Date | null;\n dateUpdated: Date | null;\n identity: string;\n isTyping: boolean;\n lastReadMessageIndex: number | null;\n lastReadTimestamp: Date | null;\n roleSid: string;\n sid: string;\n type: ParticipantType;\n typingTimeout: number | null;\n userInfo?: string;\n bindings?: ParticipantBindings;\n}\n\ninterface ParticipantServices {\n users: Users;\n commandExecutor: CommandExecutor;\n}\n\ninterface ParticipantLinks {\n self: string;\n}\n\n/**\n * The reason for the `updated` event being emitted by a participant.\n */\ntype ParticipantUpdateReason =\n | \"attributes\"\n | \"dateCreated\"\n | \"dateUpdated\"\n | \"roleSid\"\n | \"lastReadMessageIndex\"\n | \"lastReadTimestamp\"\n | \"bindings\";\n\n/**\n * Type of a participant.\n */\ntype ParticipantType = \"chat\" | \"sms\" | \"whatsapp\" | \"email\";\n\ninterface ParticipantUpdatedEventArgs {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n}\n\n/**\n * Bindings for conversation participant.\n */\ninterface ParticipantBindings {\n email?: ParticipantEmailBinding;\n}\n\n/**\n * Email participation level.\n * to = to/from\n * cc = cc\n */\ntype ParticipantEmailLevel = \"to\" | \"cc\";\n\n/**\n * Bindings for email participant.\n */\ninterface ParticipantEmailBinding {\n name: string;\n address: string;\n level: ParticipantEmailLevel;\n}\n\n/**\n * A participant represents a remote client in a conversation.\n */\nclass Participant extends ReplayEventEmitter<ParticipantEvents> {\n private state: ParticipantState;\n private readonly links: ParticipantLinks;\n private readonly services: ParticipantServices;\n\n /**\n * Conversation that the remote client is a participant of.\n */\n public readonly conversation: Conversation;\n\n /**\n * The server-assigned unique identifier for the participant.\n */\n public get sid(): string {\n return this.state.sid;\n }\n\n /**\n * Custom attributes of the participant.\n */\n public get attributes(): JSONValue {\n return this.state.attributes;\n }\n\n /**\n * Date this participant was created on.\n */\n public get dateCreated(): Date | null {\n return this.state.dateCreated;\n }\n\n /**\n * Date this participant was last updated on.\n */\n public get dateUpdated(): Date | null {\n return this.state.dateUpdated;\n }\n\n /**\n * Identity of the participant.\n */\n public get identity(): string | null {\n return this.state.identity;\n }\n\n /**\n * Indicates whether the participant is currently typing.\n */\n public get isTyping(): boolean {\n return this.state.isTyping;\n }\n\n /**\n * The index of the last read message by the participant.\n * Note that retrieving messages on a client endpoint does not mean that messages are read,\n * please consider reading about the [Read Horizon feature](https://www.twilio.com/docs/api/chat/guides/consumption-horizon)\n * to find out about the proper way to mark messages as read.\n */\n public get lastReadMessageIndex(): number | null {\n return this.state.lastReadMessageIndex;\n }\n\n /**\n * Date of the most recent read horizon update.\n */\n public get lastReadTimestamp(): Date | null {\n return this.state.lastReadTimestamp;\n }\n\n public get roleSid(): string {\n return this.state.roleSid;\n }\n\n /**\n * Type of the participant.\n */\n public get type(): ParticipantType {\n return this.state.type;\n }\n\n /**\n * Get the bindings mapping for the current participant.\n * Available binding depends on the participant type.\n * You could access it as `participant.bindings.sms?.address` or\n * using the type dynamically `participant.bindings[participant.type]`\n * just be aware that the binding information has different structure for\n * each participant type.\n * See also {ParticipantEmailBinding}, the only available currently binding descriptor.\n */\n public get bindings(): ParticipantBindings {\n return this.state.bindings ?? {};\n }\n\n /**\n * @internal\n */\n constructor(\n data: ParticipantDescriptor,\n sid: string,\n conversation: Conversation,\n links: ParticipantLinks,\n services: ParticipantServices\n ) {\n super();\n\n this.conversation = conversation;\n this.links = links;\n this.services = services;\n this.state = {\n attributes: parseAttributes(\n data.attributes,\n \"Retrieved malformed attributes from the server for participant: \" +\n sid,\n log\n ),\n dateCreated: data.dateCreated ? parseTime(data.dateCreated) : null,\n dateUpdated: data.dateCreated ? parseTime(data.dateUpdated) : null,\n sid: sid,\n typingTimeout: null,\n isTyping: false,\n identity: data.identity,\n roleSid: data.roleSid ?? \"\",\n lastReadMessageIndex: Number.isInteger(data.lastConsumedMessageIndex)\n ? data.lastConsumedMessageIndex\n : null,\n lastReadTimestamp: data.lastConsumptionTimestamp\n ? parseTime(data.lastConsumptionTimestamp)\n : null,\n type: data.type || \"chat\",\n userInfo: data.userInfo,\n bindings: data.bindings ?? {},\n };\n\n if (!data.identity && !data.type) {\n throw new Error(\n \"Received invalid Participant object from server: Missing identity or type of Participant.\"\n );\n }\n }\n\n /**\n * Fired when the participant has started typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant in question\n * @event\n */\n static readonly typingStarted = \"typingStarted\";\n\n /**\n * Fired when the participant has stopped typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant in question\n * @event\n */\n static readonly typingEnded = \"typingEnded\";\n\n /**\n * Fired when the fields of the participant have been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Participant} participant - the participant in question\n * * {@link ParticipantUpdateReason}[] updateReasons - array of reasons for the update\n * @event\n */\n static readonly updated = \"updated\";\n\n /**\n * Internal method used to start or reset the typing indicator timeout (with event emitting).\n * @internal\n */\n _startTyping(timeout) {\n if (this.state.typingTimeout) {\n clearTimeout(this.state.typingTimeout);\n }\n\n this.state.isTyping = true;\n this.emit(\"typingStarted\", this);\n\n this.conversation.emit(\"typingStarted\", this);\n\n this.state.typingTimeout = Number(\n setTimeout(() => this._endTyping(), timeout)\n );\n return this;\n }\n\n /**\n * Internal method function used to stop the typing indicator timeout (with event emitting).\n * @internal\n */\n _endTyping() {\n if (!this.state.typingTimeout) {\n return;\n }\n\n this.state.isTyping = false;\n this.emit(\"typingEnded\", this);\n\n this.conversation.emit(\"typingEnded\", this);\n\n clearInterval(this.state.typingTimeout);\n this.state.typingTimeout = null;\n }\n\n /**\n * Internal method function used update local object's property roleSid with a new value.\n * @internal\n */\n _update(data) {\n const updateReasons: ParticipantUpdateReason[] = [];\n\n const updateAttributes = parseAttributes(\n data.attributes,\n \"Retrieved malformed attributes from the server for participant: \" +\n this.state.sid,\n log\n );\n\n if (data.attributes && !isEqual(this.state.attributes, updateAttributes)) {\n this.state.attributes = updateAttributes;\n updateReasons.push(\"attributes\");\n }\n\n const updatedDateUpdated = parseTime(data.dateUpdated);\n if (\n data.dateUpdated &&\n updatedDateUpdated?.getTime() !==\n (this.state.dateUpdated && this.state.dateUpdated.getTime())\n ) {\n this.state.dateUpdated = updatedDateUpdated;\n updateReasons.push(\"dateUpdated\");\n }\n\n const updatedDateCreated = parseTime(data.dateCreated);\n if (\n data.dateCreated &&\n updatedDateCreated?.getTime() !==\n (this.state.dateCreated && this.state.dateCreated.getTime())\n ) {\n this.state.dateCreated = updatedDateCreated;\n updateReasons.push(\"dateCreated\");\n }\n\n if (data.roleSid && this.state.roleSid !== data.roleSid) {\n this.state.roleSid = data.roleSid;\n updateReasons.push(\"roleSid\");\n }\n\n if (\n (Number.isInteger(data.lastConsumedMessageIndex) ||\n data.lastConsumedMessageIndex === null) &&\n this.state.lastReadMessageIndex !== data.lastConsumedMessageIndex\n ) {\n this.state.lastReadMessageIndex = data.lastConsumedMessageIndex;\n updateReasons.push(\"lastReadMessageIndex\");\n }\n\n if (data.lastConsumptionTimestamp) {\n const lastReadTimestamp = new Date(data.lastConsumptionTimestamp);\n if (\n !this.state.lastReadTimestamp ||\n this.state.lastReadTimestamp.getTime() !== lastReadTimestamp.getTime()\n ) {\n this.state.lastReadTimestamp = lastReadTimestamp;\n updateReasons.push(\"lastReadTimestamp\");\n }\n }\n\n if (data.bindings && !isEqual(this.state.bindings, data.bindings)) {\n this.state.bindings = data.bindings;\n updateReasons.push(\"bindings\");\n }\n\n if (updateReasons.length > 0) {\n this.emit(\"updated\", { participant: this, updateReasons: updateReasons });\n }\n\n return this;\n }\n\n /**\n * Get the user for this participant and subscribes to it. Supported only for participants of type `chat`.\n */\n async getUser(): Promise<User> {\n if (this.type != \"chat\") {\n throw new Error(\n \"Getting User is not supported for this Participant type: \" + this.type\n );\n }\n\n return this.services.users.getUser(\n this.state.identity,\n this.state.userInfo\n );\n }\n\n /**\n * Remove the participant from the conversation.\n */\n async remove() {\n return this.conversation.removeParticipant(this);\n }\n\n /**\n * Update the attributes of the participant.\n * @param attributes New attributes.\n */\n @validateTypesAsync(attributesValidator)\n async updateAttributes(attributes: JSONValue): Promise<Participant> {\n await this.services.commandExecutor.mutateResource<\n EditParticipantRequest,\n ParticipantResponse\n >(\"post\", this.links.self, {\n attributes: JSON.stringify(attributes),\n });\n\n return this;\n }\n}\n\nexport {\n ParticipantDescriptor,\n ParticipantServices,\n Participant,\n ParticipantUpdateReason,\n ParticipantType,\n ParticipantUpdatedEventArgs,\n ParticipantBindings,\n ParticipantEmailBinding,\n ParticipantEmailLevel,\n};\n"],"names":["Logger","ReplayEventEmitter","parseAttributes","parseTime","isEqual","__decorate","validateTypesAsync","attributesValidator"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"participant.js","sources":["../src/participant.ts"],"sourcesContent":["import { Users } from \"./data/users\";\nimport { User } from \"./user\";\nimport { parseTime, parseAttributes } from \"./util\";\nimport { Logger } from \"./logger\";\nimport { Conversation } from \"./conversation\";\nimport { attributesValidator } from \"./interfaces/attributes\";\nimport { validateTypesAsync } from \"@twilio/declarative-type-validator\";\nimport { CommandExecutor } from \"./command-executor\";\nimport { EditParticipantRequest } from \"./interfaces/commands/edit-participant\";\nimport { ParticipantResponse } from \"./interfaces/commands/participant-response\";\nimport { ReplayEventEmitter } from \"@twilio/replay-event-emitter\";\nimport isEqual from \"lodash.isequal\";\nimport { JSONValue } from \"@twilio/shared\";\n\ntype ParticipantEvents = {\n typingEnded: (participant: Participant) => void;\n typingStarted: (participant: Participant) => void;\n updated: (data: {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n }) => void;\n};\n\nconst log = Logger.scope(\"Participant\");\n\ninterface ParticipantDescriptor {\n attributes?: JSONValue;\n dateCreated: Date | null;\n dateUpdated: Date | null;\n identity: string;\n roleSid?: string;\n lastConsumedMessageIndex: number | null;\n lastConsumptionTimestamp: number | null;\n type: ParticipantType;\n userInfo?: string;\n bindings?: ParticipantBindings;\n}\n\ninterface ParticipantState {\n attributes: JSONValue;\n dateCreated: Date | null;\n dateUpdated: Date | null;\n identity: string;\n isTyping: boolean;\n lastReadMessageIndex: number | null;\n lastReadTimestamp: Date | null;\n roleSid: string;\n sid: string;\n type: ParticipantType;\n typingTimeout: number | null;\n userInfo?: string;\n bindings?: ParticipantBindings;\n}\n\ninterface ParticipantServices {\n users: Users;\n commandExecutor: CommandExecutor;\n}\n\ninterface ParticipantLinks {\n self: string;\n}\n\n/**\n * The reason for the `updated` event being emitted by a participant.\n */\ntype ParticipantUpdateReason =\n | \"attributes\"\n | \"dateCreated\"\n | \"dateUpdated\"\n | \"roleSid\"\n | \"lastReadMessageIndex\"\n | \"lastReadTimestamp\"\n | \"bindings\";\n\n/**\n * Type of a participant.\n */\ntype ParticipantType = \"chat\" | \"sms\" | \"whatsapp\" | \"email\";\n\ninterface ParticipantUpdatedEventArgs {\n participant: Participant;\n updateReasons: ParticipantUpdateReason[];\n}\n\n/**\n * Bindings for conversation participant.\n */\ninterface ParticipantBindings {\n email?: ParticipantEmailBinding;\n}\n\n/**\n * Email participation level.\n * to = to/from\n * cc = cc\n */\ntype ParticipantEmailLevel = \"to\" | \"cc\";\n\n/**\n * Bindings for email participant.\n */\ninterface ParticipantEmailBinding {\n name: string;\n address: string;\n level: ParticipantEmailLevel;\n}\n\n/**\n * A participant represents a remote client in a conversation.\n */\nclass Participant extends ReplayEventEmitter<ParticipantEvents> {\n private state: ParticipantState;\n private readonly links: ParticipantLinks;\n private readonly services: ParticipantServices;\n\n /**\n * Conversation that the remote client is a participant of.\n */\n public readonly conversation: Conversation;\n\n /**\n * The server-assigned unique identifier for the participant.\n */\n public get sid(): string {\n return this.state.sid;\n }\n\n /**\n * Custom attributes of the participant.\n */\n public get attributes(): JSONValue {\n return this.state.attributes;\n }\n\n /**\n * Date this participant was created on.\n */\n public get dateCreated(): Date | null {\n return this.state.dateCreated;\n }\n\n /**\n * Date this participant was last updated on.\n */\n public get dateUpdated(): Date | null {\n return this.state.dateUpdated;\n }\n\n /**\n * Identity of the participant.\n */\n public get identity(): string | null {\n return this.state.identity;\n }\n\n /**\n * Indicates whether the participant is currently typing.\n */\n public get isTyping(): boolean {\n return this.state.isTyping;\n }\n\n /**\n * The index of the last read message by the participant.\n * Note that retrieving messages on a client endpoint does not mean that messages are read,\n * please consider reading about the [Read Horizon feature](https://www.twilio.com/docs/api/chat/guides/consumption-horizon)\n * to find out about the proper way to mark messages as read.\n */\n public get lastReadMessageIndex(): number | null {\n return this.state.lastReadMessageIndex;\n }\n\n /**\n * Date of the most recent read horizon update.\n */\n public get lastReadTimestamp(): Date | null {\n return this.state.lastReadTimestamp;\n }\n\n public get roleSid(): string {\n return this.state.roleSid;\n }\n\n /**\n * Type of the participant.\n */\n public get type(): ParticipantType {\n return this.state.type;\n }\n\n /**\n * Get the bindings mapping for the current participant.\n * Available binding depends on the participant type.\n * You could access it as `participant.bindings.sms?.address` or\n * using the type dynamically `participant.bindings[participant.type]`\n * just be aware that the binding information has different structure for\n * each participant type.\n * See also {ParticipantEmailBinding}, the only available currently binding descriptor.\n */\n public get bindings(): ParticipantBindings {\n return this.state.bindings ?? {};\n }\n\n /**\n * @internal\n */\n constructor(\n data: ParticipantDescriptor,\n sid: string,\n conversation: Conversation,\n links: ParticipantLinks,\n services: ParticipantServices\n ) {\n super();\n\n this.conversation = conversation;\n this.links = links;\n this.services = services;\n this.state = {\n attributes: parseAttributes(\n data.attributes,\n \"Retrieved malformed attributes from the server for participant: \" +\n sid,\n log\n ),\n dateCreated: data.dateCreated ? parseTime(data.dateCreated) : null,\n dateUpdated: data.dateCreated ? parseTime(data.dateUpdated) : null,\n sid: sid,\n typingTimeout: null,\n isTyping: false,\n identity: data.identity,\n roleSid: data.roleSid ?? \"\",\n lastReadMessageIndex: Number.isInteger(data.lastConsumedMessageIndex)\n ? data.lastConsumedMessageIndex\n : null,\n lastReadTimestamp: data.lastConsumptionTimestamp\n ? parseTime(data.lastConsumptionTimestamp)\n : null,\n type: data.type || \"chat\",\n userInfo: data.userInfo,\n bindings: data.bindings ?? {},\n };\n\n if (!data.identity && !data.type) {\n throw new Error(\n \"Received invalid Participant object from server: Missing identity or type of Participant.\"\n );\n }\n }\n\n /**\n * Fired when the participant has started typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant in question\n * @event\n */\n static readonly typingStarted = \"typingStarted\";\n\n /**\n * Fired when the participant has stopped typing.\n *\n * Parameters:\n * 1. {@link Participant} `participant` - the participant in question\n * @event\n */\n static readonly typingEnded = \"typingEnded\";\n\n /**\n * Fired when the fields of the participant have been updated.\n *\n * Parameters:\n * 1. object `data` - info object provided with the event. It has the following properties:\n * * {@link Participant} participant - the participant in question\n * * {@link ParticipantUpdateReason}[] updateReasons - array of reasons for the update\n * @event\n */\n static readonly updated = \"updated\";\n\n /**\n * Internal method used to start or reset the typing indicator timeout (with event emitting).\n * @internal\n */\n _startTyping(timeout) {\n if (this.state.typingTimeout) {\n clearTimeout(this.state.typingTimeout);\n }\n\n this.state.isTyping = true;\n this.emit(\"typingStarted\", this);\n\n this.conversation.emit(\"typingStarted\", this);\n\n this.state.typingTimeout = Number(\n setTimeout(() => this._endTyping(), timeout)\n );\n return this;\n }\n\n /**\n * Internal method function used to stop the typing indicator timeout (with event emitting).\n * @internal\n */\n _endTyping() {\n if (!this.state.typingTimeout) {\n return;\n }\n\n this.state.isTyping = false;\n this.emit(\"typingEnded\", this);\n\n this.conversation.emit(\"typingEnded\", this);\n\n clearInterval(this.state.typingTimeout);\n this.state.typingTimeout = null;\n }\n\n /**\n * Internal method function used update local object's property roleSid with a new value.\n * @internal\n */\n _update(data) {\n const updateReasons: ParticipantUpdateReason[] = [];\n\n const updateAttributes = parseAttributes(\n data.attributes,\n \"Retrieved malformed attributes from the server for participant: \" +\n this.state.sid,\n log\n );\n\n if (data.attributes && !isEqual(this.state.attributes, updateAttributes)) {\n this.state.attributes = updateAttributes;\n updateReasons.push(\"attributes\");\n }\n\n const updatedDateUpdated = parseTime(data.dateUpdated);\n if (\n data.dateUpdated &&\n updatedDateUpdated?.getTime() !==\n (this.state.dateUpdated && this.state.dateUpdated.getTime())\n ) {\n this.state.dateUpdated = updatedDateUpdated;\n updateReasons.push(\"dateUpdated\");\n }\n\n const updatedDateCreated = parseTime(data.dateCreated);\n if (\n data.dateCreated &&\n updatedDateCreated?.getTime() !==\n (this.state.dateCreated && this.state.dateCreated.getTime())\n ) {\n this.state.dateCreated = updatedDateCreated;\n updateReasons.push(\"dateCreated\");\n }\n\n if (data.roleSid && this.state.roleSid !== data.roleSid) {\n this.state.roleSid = data.roleSid;\n updateReasons.push(\"roleSid\");\n }\n\n if (\n (Number.isInteger(data.lastConsumedMessageIndex) ||\n data.lastConsumedMessageIndex === null) &&\n this.state.lastReadMessageIndex !== data.lastConsumedMessageIndex\n ) {\n this.state.lastReadMessageIndex = data.lastConsumedMessageIndex;\n updateReasons.push(\"lastReadMessageIndex\");\n }\n\n if (data.lastConsumptionTimestamp) {\n const lastReadTimestamp = new Date(data.lastConsumptionTimestamp);\n if (\n !this.state.lastReadTimestamp ||\n this.state.lastReadTimestamp.getTime() !== lastReadTimestamp.getTime()\n ) {\n this.state.lastReadTimestamp = lastReadTimestamp;\n updateReasons.push(\"lastReadTimestamp\");\n }\n }\n\n if (data.bindings && !isEqual(this.state.bindings, data.bindings)) {\n this.state.bindings = data.bindings;\n updateReasons.push(\"bindings\");\n }\n\n if (updateReasons.length > 0) {\n this.emit(\"updated\", { participant: this, updateReasons: updateReasons });\n }\n\n return this;\n }\n\n /**\n * Get the user for this participant and subscribes to it. Supported only for participants of type `chat`.\n */\n async getUser(): Promise<User> {\n if (this.type != \"chat\") {\n throw new Error(\n \"Getting User is not supported for this Participant type: \" + this.type\n );\n }\n\n return this.services.users.getUser(\n this.state.identity,\n this.state.userInfo\n );\n }\n\n /**\n * Remove the participant from the conversation.\n */\n async remove() {\n return this.conversation.removeParticipant(this);\n }\n\n /**\n * Update the attributes of the participant.\n * @param attributes New attributes.\n */\n @validateTypesAsync(attributesValidator)\n async updateAttributes(attributes: JSONValue): Promise<Participant> {\n await this.services.commandExecutor.mutateResource<\n EditParticipantRequest,\n ParticipantResponse\n >(\"post\", this.links.self, {\n attributes: JSON.stringify(attributes),\n });\n\n return this;\n }\n}\n\nexport {\n ParticipantDescriptor,\n ParticipantServices,\n Participant,\n ParticipantUpdateReason,\n ParticipantType,\n ParticipantUpdatedEventArgs,\n ParticipantBindings,\n ParticipantEmailBinding,\n ParticipantEmailLevel,\n};\n"],"names":["Logger","ReplayEventEmitter","parseAttributes","parseTime","isEqual","__decorate","validateTypesAsync","attributesValidator"],"mappings":"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"}
|
package/dist/rest-paginator.js
CHANGED
@@ -134,17 +134,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
134
134
|
* Pagination helper class.
|
135
135
|
*/
|
136
136
|
class RestPaginator {
|
137
|
-
/**
|
138
|
-
* @internal
|
139
|
-
*/
|
140
|
-
constructor(items, source, prevToken, nextToken) {
|
141
|
-
this.state = {
|
142
|
-
prevToken,
|
143
|
-
nextToken,
|
144
|
-
source,
|
145
|
-
items,
|
146
|
-
};
|
147
|
-
}
|
148
137
|
/**
|
149
138
|
* Indicates the existence of the next page.
|
150
139
|
*/
|
@@ -163,6 +152,17 @@ class RestPaginator {
|
|
163
152
|
get items() {
|
164
153
|
return this.state.items;
|
165
154
|
}
|
155
|
+
/**
|
156
|
+
* @internal
|
157
|
+
*/
|
158
|
+
constructor(items, source, prevToken, nextToken) {
|
159
|
+
this.state = {
|
160
|
+
prevToken,
|
161
|
+
nextToken,
|
162
|
+
source,
|
163
|
+
items,
|
164
|
+
};
|
165
|
+
}
|
166
166
|
/**
|
167
167
|
* Request the next page. Does not modify the existing object.
|
168
168
|
*/
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rest-paginator.js","sources":["../src/rest-paginator.ts"],"sourcesContent":["import { Paginator } from \"./interfaces/paginator\";\n\ninterface PaginatorState<T> {\n source: (token: string) => Promise<RestPaginator<T>>;\n nextToken: string;\n prevToken: string;\n items: T[];\n}\n\n/**\n * Pagination helper class.\n */\nclass RestPaginator<T> implements Paginator<T> {\n private state: PaginatorState<T>;\n\n /**\n * Indicates the existence of the next page.\n */\n public get hasNextPage(): boolean {\n return !!this.state.nextToken;\n }\n\n /**\n * Indicates the existence of the previous page\n */\n public get hasPrevPage(): boolean {\n return !!this.state.prevToken;\n }\n\n /**\n * Array of elements on the current page.\n */\n public get items(): T[] {\n return this.state.items;\n }\n\n /**\n * @internal\n */\n constructor(items, source, prevToken, nextToken) {\n this.state = {\n prevToken,\n nextToken,\n source,\n items,\n };\n }\n\n /**\n * Request the next page. Does not modify the existing object.\n */\n nextPage(): Promise<RestPaginator<T>> {\n return this.hasNextPage\n ? this.state.source(this.state.nextToken)\n : Promise.reject(new Error(\"No next page\"));\n }\n\n /**\n * Request the previous page. Does not modify the existing object.\n */\n prevPage(): Promise<RestPaginator<T>> {\n return this.hasPrevPage\n ? this.state.source(this.state.prevToken)\n : Promise.reject(new Error(\"No previous page\"));\n }\n}\n\nexport { RestPaginator };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA;;AAEG;AACH,MAAM,aAAa,CAAA;
|
1
|
+
{"version":3,"file":"rest-paginator.js","sources":["../src/rest-paginator.ts"],"sourcesContent":["import { Paginator } from \"./interfaces/paginator\";\n\ninterface PaginatorState<T> {\n source: (token: string) => Promise<RestPaginator<T>>;\n nextToken: string;\n prevToken: string;\n items: T[];\n}\n\n/**\n * Pagination helper class.\n */\nclass RestPaginator<T> implements Paginator<T> {\n private state: PaginatorState<T>;\n\n /**\n * Indicates the existence of the next page.\n */\n public get hasNextPage(): boolean {\n return !!this.state.nextToken;\n }\n\n /**\n * Indicates the existence of the previous page\n */\n public get hasPrevPage(): boolean {\n return !!this.state.prevToken;\n }\n\n /**\n * Array of elements on the current page.\n */\n public get items(): T[] {\n return this.state.items;\n }\n\n /**\n * @internal\n */\n constructor(items, source, prevToken, nextToken) {\n this.state = {\n prevToken,\n nextToken,\n source,\n items,\n };\n }\n\n /**\n * Request the next page. Does not modify the existing object.\n */\n nextPage(): Promise<RestPaginator<T>> {\n return this.hasNextPage\n ? this.state.source(this.state.nextToken)\n : Promise.reject(new Error(\"No next page\"));\n }\n\n /**\n * Request the previous page. Does not modify the existing object.\n */\n prevPage(): Promise<RestPaginator<T>> {\n return this.hasPrevPage\n ? this.state.source(this.state.prevToken)\n : Promise.reject(new Error(\"No previous page\"));\n }\n}\n\nexport { RestPaginator };\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA;;AAEG;AACH,MAAM,aAAa,CAAA;AAGjB;;AAEG;AACH,IAAA,IAAW,WAAW,GAAA;AACpB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;KAC/B;AAED;;AAEG;AACH,IAAA,IAAW,WAAW,GAAA;AACpB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;KAC/B;AAED;;AAEG;AACH,IAAA,IAAW,KAAK,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KACzB;AAED;;AAEG;AACH,IAAA,WAAA,CAAY,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAA;QAC7C,IAAI,CAAC,KAAK,GAAG;YACX,SAAS;YACT,SAAS;YACT,MAAM;YACN,KAAK;SACN,CAAC;KACH;AAED;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,WAAW;AACrB,cAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;cACvC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;KAC/C;AAED;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,WAAW;AACrB,cAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;cACvC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;KACnD;AACF;;;;"}
|
package/dist/services/network.js
CHANGED
@@ -131,13 +131,52 @@ This software includes platform.js under the following license.
|
|
131
131
|
Object.defineProperty(exports, '__esModule', { value: true });
|
132
132
|
|
133
133
|
var operationRetrier = require('@twilio/operation-retrier');
|
134
|
+
var twilsock = require('twilsock');
|
135
|
+
var syncerror = require('twilio-sync/src/utils/syncerror');
|
136
|
+
var shared = require('@twilio/shared');
|
134
137
|
|
138
|
+
function messageFromErrorBody(transportError, payload) {
|
139
|
+
if (payload === null || payload === void 0 ? void 0 : payload.message) {
|
140
|
+
return payload.message;
|
141
|
+
}
|
142
|
+
switch (transportError.statusCode) {
|
143
|
+
case 429:
|
144
|
+
return "Throttled by server";
|
145
|
+
case 404:
|
146
|
+
return "Not found from server";
|
147
|
+
default:
|
148
|
+
return "Error from server";
|
149
|
+
}
|
150
|
+
}
|
151
|
+
function codeFromErrorBody(payload) {
|
152
|
+
var _a;
|
153
|
+
return (_a = payload === null || payload === void 0 ? void 0 : payload.code) !== null && _a !== void 0 ? _a : 0;
|
154
|
+
}
|
155
|
+
function mapTransportError(transportError, payload) {
|
156
|
+
var _a, _b;
|
157
|
+
if (transportError.statusCode === 409) {
|
158
|
+
return new syncerror.SyncNetworkError(messageFromErrorBody(transportError, payload), transportError.statusCode, codeFromErrorBody(payload), payload);
|
159
|
+
}
|
160
|
+
else if (transportError.statusCode) {
|
161
|
+
return new syncerror.SyncError(messageFromErrorBody(transportError, payload), transportError.statusCode, codeFromErrorBody(payload));
|
162
|
+
// todo: still idk
|
163
|
+
}
|
164
|
+
else if (transportError instanceof shared.TwilioError &&
|
165
|
+
transportError.errorInfo.reason === "transportDisconnected") {
|
166
|
+
return transportError;
|
167
|
+
}
|
168
|
+
else {
|
169
|
+
return new syncerror.SyncError((_b = (_a = payload === null || payload === void 0 ? void 0 : payload.message) !== null && _a !== void 0 ? _a : transportError.message) !== null && _b !== void 0 ? _b : "Unexpected error", 0, 0);
|
170
|
+
}
|
171
|
+
}
|
135
172
|
class Network {
|
136
173
|
constructor(configuration, services) {
|
174
|
+
this.isShutdownInitiated = false;
|
137
175
|
this.configuration = configuration;
|
138
176
|
this.services = services;
|
139
177
|
this.cache = new Map();
|
140
178
|
this.cacheLifetime = this.configuration.httpCacheInterval * 100;
|
179
|
+
this.pendingRequests = new Set();
|
141
180
|
this.cleanupCache();
|
142
181
|
}
|
143
182
|
isExpired(timestamp) {
|
@@ -158,51 +197,63 @@ class Network {
|
|
158
197
|
this.timer ||
|
159
198
|
setInterval(() => this.cleanupCache(), this.cacheLifetime * 2);
|
160
199
|
}
|
200
|
+
responsePostProcess(response) {
|
201
|
+
let body;
|
202
|
+
try {
|
203
|
+
body = JSON.parse(response.payload);
|
204
|
+
}
|
205
|
+
catch (_a) {
|
206
|
+
body = response.payload;
|
207
|
+
}
|
208
|
+
return {
|
209
|
+
status: {
|
210
|
+
code: response.statusCode,
|
211
|
+
status: response.status,
|
212
|
+
},
|
213
|
+
headers: response.headers,
|
214
|
+
body,
|
215
|
+
};
|
216
|
+
}
|
161
217
|
executeWithRetry(request, retryWhenThrottled = false) {
|
162
218
|
return new Promise((resolve, reject) => {
|
219
|
+
const codesToRetryOn = [502, 503, 504];
|
220
|
+
if (retryWhenThrottled) {
|
221
|
+
codesToRetryOn.push(429);
|
222
|
+
}
|
163
223
|
const retrier = new operationRetrier.Retrier(this.configuration.backoffConfiguration);
|
164
224
|
retrier.on("attempt", () => {
|
165
225
|
request()
|
166
226
|
.then((result) => {
|
167
|
-
const isError = result.statusCode >= 400
|
227
|
+
const isError = result.statusCode >= 400;
|
168
228
|
if (!isError) {
|
169
229
|
retrier.succeeded(result);
|
170
230
|
return;
|
171
231
|
}
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
} else if (parsedPayload.message === 'Twilsock disconnected') {
|
232
|
+
let parsedPayload = {};
|
233
|
+
try {
|
234
|
+
parsedPayload = JSON.parse(result.payload);
|
235
|
+
}
|
236
|
+
catch (_a) { }
|
237
|
+
if (codesToRetryOn.includes(result.statusCode)) {
|
238
|
+
const delayOverride = parseInt(result.headers ? result.headers["Retry-After"] : null);
|
239
|
+
retrier.failed(mapTransportError(result, parsedPayload), isNaN(delayOverride) ? undefined : delayOverride * 1000);
|
240
|
+
}
|
241
|
+
else if (parsedPayload.message === "Twilsock disconnected") {
|
183
242
|
// Ugly hack. We must make a proper exceptions for twilsock
|
184
243
|
retrier.failed(mapTransportError(result, parsedPayload));
|
185
|
-
|
244
|
+
}
|
245
|
+
else {
|
186
246
|
// Fatal error
|
187
247
|
retrier.removeAllListeners();
|
188
248
|
retrier.cancel();
|
189
249
|
reject(mapTransportError(result, parsedPayload));
|
190
|
-
}
|
191
250
|
}
|
192
|
-
*/
|
193
251
|
})
|
194
252
|
.catch((err) => {
|
195
|
-
// if (codesToRetryOn.indexOf(err.status) > -1) {
|
196
|
-
// retrier.failed(err);
|
197
|
-
// } else if (err.message === "Twilsock disconnected") {
|
198
|
-
// // Ugly hack. We must make a proper exceptions for twilsock
|
199
|
-
// retrier.failed(err);
|
200
|
-
// } else {
|
201
253
|
// Fatal error
|
202
254
|
retrier.removeAllListeners();
|
203
255
|
retrier.cancel();
|
204
256
|
reject(err);
|
205
|
-
// }
|
206
257
|
});
|
207
258
|
});
|
208
259
|
retrier.on("succeeded", (result) => {
|
@@ -214,17 +265,35 @@ class Network {
|
|
214
265
|
});
|
215
266
|
}
|
216
267
|
async get(url) {
|
268
|
+
if (this.isShutdownInitiated) {
|
269
|
+
throw new Error("Client has been shut down.");
|
270
|
+
}
|
217
271
|
const cacheEntry = this.cache.get(url);
|
218
272
|
if (cacheEntry && !this.isExpired(cacheEntry.timestamp)) {
|
219
273
|
return cacheEntry.response;
|
220
274
|
}
|
221
|
-
const
|
275
|
+
const responsePromise = this.executeWithRetry(() => this.services.transport.sendRequest(new twilsock.HttpRequest({
|
222
276
|
url,
|
223
277
|
grant: this.configuration.productId,
|
224
|
-
}), this.configuration.retryWhenThrottled);
|
225
|
-
this.
|
278
|
+
})), this.configuration.retryWhenThrottled);
|
279
|
+
this.pendingRequests.add(responsePromise);
|
280
|
+
const response = await responsePromise;
|
281
|
+
this.pendingRequests.delete(responsePromise);
|
282
|
+
const postprocessedResponse = this.responsePostProcess(response);
|
283
|
+
this.cache.set(url, {
|
284
|
+
response: postprocessedResponse,
|
285
|
+
timestamp: Date.now(),
|
286
|
+
});
|
226
287
|
this.pokeTimer();
|
227
|
-
return
|
288
|
+
return postprocessedResponse;
|
289
|
+
}
|
290
|
+
async disconnect() {
|
291
|
+
this.isShutdownInitiated = true;
|
292
|
+
try {
|
293
|
+
await Promise.all([...this.pendingRequests]);
|
294
|
+
}
|
295
|
+
catch (_a) { }
|
296
|
+
await this.services.syncClient.shutdown();
|
228
297
|
}
|
229
298
|
}
|
230
299
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"network.js","sources":["../../src/services/network.ts"],"sourcesContent":["import { Retrier } from \"@twilio/operation-retrier\";\nimport { TwilsockClient, HttpResponse } from \"twilsock\";\nimport { Configuration } from \"../configuration\";\n\nimport Timeout = NodeJS.Timeout;\n\ninterface CacheEntry {\n response: HttpResponse;\n timestamp: number;\n}\n\nexport interface NetworkServices {\n transport: TwilsockClient;\n}\n\nclass Network {\n private readonly configuration: Configuration;\n private readonly services: NetworkServices;\n private cacheLifetime: number;\n\n private readonly cache: Map<string, CacheEntry>;\n private timer!: number | NodeJS.Timeout;\n\n constructor(configuration, services) {\n this.configuration = configuration;\n this.services = services;\n this.cache = new Map<string, CacheEntry>();\n this.cacheLifetime = this.configuration.httpCacheInterval * 100;\n this.cleanupCache();\n }\n\n private isExpired(timestamp: number): boolean {\n return !this.cacheLifetime || Date.now() - timestamp > this.cacheLifetime;\n }\n\n private cleanupCache() {\n for (const [k, v] of this.cache) {\n if (this.isExpired(v.timestamp)) {\n this.cache.delete(k);\n }\n }\n\n if (this.cache.size === 0) {\n clearInterval(this.timer as Timeout);\n }\n }\n\n pokeTimer() {\n this.timer =\n this.timer ||\n setInterval(() => this.cleanupCache(), this.cacheLifetime * 2);\n }\n\n private executeWithRetry<T>(\n request,\n retryWhenThrottled = false\n ): Promise<HttpResponse> {\n return new Promise((resolve, reject) => {\n const codesToRetryOn = [502, 503, 504];\n if (retryWhenThrottled) {\n codesToRetryOn.push(429);\n }\n\n const retrier = new Retrier(this.configuration.backoffConfiguration);\n retrier.on(\"attempt\", () => {\n request()\n .then((result) => {\n const isError = result.statusCode >= 400 && result.statusCode < 500;\n if (!isError) {\n retrier.succeeded(result);\n return;\n }\n\n const parsedPayload = JSON.parse(result.payload);\n retrier.failed(new Error(`${parsedPayload.message}`));\n /*\n const isError = result.statusCode >= 400 && result.statusCode < 500;\n if (isError) {\n const parsedPayload = JSON.parse(result.payload);\n if (codesToRetryOn.includes(parsedPayload.status)) {\n let delayOverride = parseInt(result.headers ? result.headers['Retry-After'] : null);\n retrier.failed(mapTransportError(result, parsedPayload),\n isNaN(delayOverride) ? null : delayOverride * 1000);\n } else if (parsedPayload.message === 'Twilsock disconnected') {\n // Ugly hack. We must make a proper exceptions for twilsock\n retrier.failed(mapTransportError(result, parsedPayload));\n } else {\n // Fatal error\n retrier.removeAllListeners();\n retrier.cancel();\n reject(mapTransportError(result, parsedPayload));\n }\n }\n */\n })\n .catch((err) => {\n // if (codesToRetryOn.indexOf(err.status) > -1) {\n // retrier.failed(err);\n // } else if (err.message === \"Twilsock disconnected\") {\n // // Ugly hack. We must make a proper exceptions for twilsock\n // retrier.failed(err);\n // } else {\n // Fatal error\n retrier.removeAllListeners();\n retrier.cancel();\n reject(err);\n // }\n });\n });\n\n retrier.on(\"succeeded\", (result) => {\n resolve(result);\n });\n retrier.on(\"cancelled\", (err) => reject(err));\n retrier.on(\"failed\", (err) => reject(err));\n\n retrier.start();\n });\n }\n\n async get<T>(url: string): Promise<HttpResponse> {\n const cacheEntry = this.cache.get(url);\n if (cacheEntry && !this.isExpired(cacheEntry.timestamp)) {\n return cacheEntry.response;\n }\n\n const response = await this.executeWithRetry<T>(\n () =>\n this.services.transport.get({\n url,\n grant: this.configuration.productId,\n }),\n this.configuration.retryWhenThrottled\n );\n this.cache.set(url, { response, timestamp: Date.now() });\n this.pokeTimer();\n return response;\n }\n}\n\nexport { Network };\n"],"names":["Retrier"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"network.js","sources":["../../src/services/network.ts"],"sourcesContent":["import { Retrier } from \"@twilio/operation-retrier\";\nimport { TwilsockClient, HttpResponse, HttpRequest } from \"twilsock\";\nimport { Configuration } from \"../configuration\";\n\nimport Timeout = NodeJS.Timeout;\nimport { SyncClient } from \"twilio-sync\";\nimport { SyncError, SyncNetworkError } from \"twilio-sync/src/utils/syncerror\";\nimport { TwilioError } from \"@twilio/shared\";\n\ninterface CacheEntry {\n response: HttpResponse;\n timestamp: number;\n}\n\nexport interface NetworkServices {\n transport: TwilsockClient;\n syncClient: SyncClient;\n}\n\nfunction messageFromErrorBody(transportError, payload): string {\n if (payload?.message) {\n return payload.message;\n }\n switch (transportError.statusCode) {\n case 429:\n return \"Throttled by server\";\n case 404:\n return \"Not found from server\";\n default:\n return \"Error from server\";\n }\n}\n\nfunction codeFromErrorBody(payload): number {\n return payload?.code ?? 0;\n}\n\nfunction mapTransportError(transportError, payload): Error {\n if (transportError.statusCode === 409) {\n return new SyncNetworkError(\n messageFromErrorBody(transportError, payload),\n transportError.statusCode,\n codeFromErrorBody(payload),\n payload\n );\n } else if (transportError.statusCode) {\n return new SyncError(\n messageFromErrorBody(transportError, payload),\n transportError.statusCode,\n codeFromErrorBody(payload)\n );\n // todo: still idk\n } else if (\n transportError instanceof TwilioError &&\n transportError.errorInfo.reason === \"transportDisconnected\"\n ) {\n return transportError;\n } else {\n return new SyncError(\n payload?.message ?? transportError.message ?? \"Unexpected error\",\n 0,\n 0\n );\n }\n}\n\nclass Network {\n private readonly configuration: Configuration;\n private readonly services: NetworkServices;\n private cacheLifetime: number;\n\n private readonly cache: Map<string, CacheEntry>;\n private timer!: number | NodeJS.Timeout;\n private pendingRequests: Set<Promise<HttpResponse<unknown>>>;\n private isShutdownInitiated = false;\n\n constructor(configuration, services) {\n this.configuration = configuration;\n this.services = services;\n this.cache = new Map<string, CacheEntry>();\n this.cacheLifetime = this.configuration.httpCacheInterval * 100;\n this.pendingRequests = new Set();\n this.cleanupCache();\n }\n\n private isExpired(timestamp: number): boolean {\n return !this.cacheLifetime || Date.now() - timestamp > this.cacheLifetime;\n }\n\n private cleanupCache() {\n for (const [k, v] of this.cache) {\n if (this.isExpired(v.timestamp)) {\n this.cache.delete(k);\n }\n }\n\n if (this.cache.size === 0) {\n clearInterval(this.timer as Timeout);\n }\n }\n\n pokeTimer() {\n this.timer =\n this.timer ||\n setInterval(() => this.cleanupCache(), this.cacheLifetime * 2);\n }\n\n private responsePostProcess(response): any {\n let body;\n\n try {\n body = JSON.parse(response.payload);\n } catch {\n body = response.payload;\n }\n\n return {\n status: {\n code: response.statusCode,\n status: response.status,\n },\n headers: response.headers,\n body,\n };\n }\n\n private executeWithRetry<T>(\n request,\n retryWhenThrottled = false\n ): Promise<HttpResponse> {\n return new Promise((resolve, reject) => {\n const codesToRetryOn = [502, 503, 504];\n if (retryWhenThrottled) {\n codesToRetryOn.push(429);\n }\n\n const retrier = new Retrier(this.configuration.backoffConfiguration);\n retrier.on(\"attempt\", () => {\n request()\n .then((result) => {\n const isError = result.statusCode >= 400;\n if (!isError) {\n retrier.succeeded(result);\n return;\n }\n\n let parsedPayload: Record<string, unknown> = {};\n try {\n parsedPayload = JSON.parse(result.payload);\n } catch {}\n if (codesToRetryOn.includes(result.statusCode)) {\n const delayOverride = parseInt(\n result.headers ? result.headers[\"Retry-After\"] : null\n );\n retrier.failed(\n mapTransportError(result, parsedPayload),\n isNaN(delayOverride) ? undefined : delayOverride * 1000\n );\n } else if (parsedPayload.message === \"Twilsock disconnected\") {\n // Ugly hack. We must make a proper exceptions for twilsock\n retrier.failed(mapTransportError(result, parsedPayload));\n } else {\n // Fatal error\n retrier.removeAllListeners();\n retrier.cancel();\n reject(mapTransportError(result, parsedPayload));\n }\n })\n .catch((err) => {\n // Fatal error\n retrier.removeAllListeners();\n retrier.cancel();\n reject(err);\n });\n });\n\n retrier.on(\"succeeded\", (result) => {\n resolve(result);\n });\n retrier.on(\"cancelled\", (err) => reject(err));\n retrier.on(\"failed\", (err) => reject(err));\n\n retrier.start();\n });\n }\n\n async get(url: string): Promise<any> {\n if (this.isShutdownInitiated) {\n throw new Error(\"Client has been shut down.\");\n }\n\n const cacheEntry = this.cache.get(url);\n if (cacheEntry && !this.isExpired(cacheEntry.timestamp)) {\n return cacheEntry.response;\n }\n\n const responsePromise = this.executeWithRetry(\n () =>\n this.services.transport.sendRequest(\n new HttpRequest({\n url,\n grant: this.configuration.productId,\n })\n ),\n this.configuration.retryWhenThrottled\n );\n\n this.pendingRequests.add(responsePromise);\n const response = await responsePromise;\n this.pendingRequests.delete(responsePromise);\n\n const postprocessedResponse = this.responsePostProcess(response);\n this.cache.set(url, {\n response: postprocessedResponse,\n timestamp: Date.now(),\n });\n this.pokeTimer();\n return postprocessedResponse;\n }\n\n async disconnect() {\n this.isShutdownInitiated = true;\n try {\n await Promise.all([...this.pendingRequests]);\n } catch {}\n await this.services.syncClient.shutdown();\n }\n}\n\nexport { Network };\n"],"names":["SyncNetworkError","SyncError","TwilioError","Retrier","HttpRequest"],"mappings":"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"}
|