UNPKG

@microsoft/teams.api

Version:

<p> <a href="https://www.npmjs.com/package/@microsoft/teams.api" target="_blank"> <img src="https://img.shields.io/npm/v/@microsoft/teams.api/latest" /> </a> <a href="https://www.npmjs.com/package/@microsoft/teams.api?activeTab=code" t

1 lines • 19.4 kB
{"version":3,"sources":["../../../src/clients/conversation/activity.ts"],"names":["HttpClient"],"mappings":"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","file":"activity.mjs","sourcesContent":["import type { Span } from '@opentelemetry/api';\nimport type { AxiosResponse } from 'axios';\n\nimport {\n Client as HttpClient,\n type ClientOptions as HttpClientOptions\n} from '@microsoft/teams.common';\n\nimport {\n toActivityParams,\n type IMessageActivityInput,\n type ITypingActivityInput\n} from '../../activities';\nimport {\n API_ATTRIBUTE_NAMES,\n OUTBOUND_OPERATIONS,\n type ConversationActivityOperation\n} from '../../diagnostics/constants';\nimport {\n getPlanInfo,\n resolveAadObjectId,\n type DeprecatedInputActivity,\n type Resource,\n type TeamsChannelAccount\n} from '../../models';\nimport { ApiClientSettings, mergeApiClientSettings } from '../api-client-settings';\nimport {\n ensureApiOutboundTelemetryMiddleware,\n withApiOutboundTelemetry\n} from '../api-outbound-middleware';\nimport { normalizeServiceUrl } from '../service-url';\n\n/**\n * Payload accepted by the low-level conversation activity client.\n *\n * The OUTBOUND activity union: an app only sends message or typing activity inputs.\n * Kept as a named export for backwards compatibility.\n */\nexport type ActivityParams = IMessageActivityInput | ITypingActivityInput;\ntype ActivityParamsLike = ActivityParams | DeprecatedInputActivity;\n\nfunction requireId(name: string, value: string) {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`${name} must be a non-empty string`);\n }\n\n // A dot segment is not percent-encoded, so HTTP clients collapse it and the request leaves the replyChains route.\n if (value === '.' || value === '..') {\n throw new Error(`${name} must not be a dot segment`);\n }\n}\n\nfunction apiOutboundTelemetryConfig(\n operation: ConversationActivityOperation,\n serviceUrl: string,\n conversationId: string,\n activity: ActivityParams | undefined,\n options?: {\n readonly activityId?: string;\n readonly captureResponseActivityId?: boolean;\n }\n) {\n return {\n extensions: withApiOutboundTelemetry({\n operation,\n attributes: {\n [API_ATTRIBUTE_NAMES.operation]: operation,\n [API_ATTRIBUTE_NAMES.serviceUrl]: serviceUrl,\n [API_ATTRIBUTE_NAMES.conversationId]: conversationId,\n ...(activity?.type !== undefined ? { [API_ATTRIBUTE_NAMES.activityType]: activity.type } : {}),\n ...(options?.activityId !== undefined ? { [API_ATTRIBUTE_NAMES.activityId]: options.activityId } : {}),\n },\n ...(options?.captureResponseActivityId ? { onResponse: setResponseActivityId } : {}),\n }),\n };\n}\n\nfunction setResponseActivityId(span: Span, res: AxiosResponse): void {\n const id = getResponseActivityId(res.data);\n if (id) {\n span.setAttribute(API_ATTRIBUTE_NAMES.activityId, id);\n }\n}\n\nfunction getResponseActivityId(data: unknown): string | undefined {\n if (!data || typeof data !== 'object') {\n return undefined;\n }\n\n const id = (data as { id?: unknown }).id;\n return typeof id === 'string' && id ? id : undefined;\n}\n\nexport class ConversationActivityClient {\n readonly serviceUrl: string;\n\n get http() {\n return this._http;\n }\n set http(v) {\n ensureApiOutboundTelemetryMiddleware(v);\n this._http = v;\n }\n protected _http: HttpClient;\n protected _apiClientSettings: Partial<ApiClientSettings>;\n\n constructor(serviceUrl: string, options?: HttpClient | HttpClientOptions, apiClientSettings?: Partial<ApiClientSettings>) {\n this.serviceUrl = normalizeServiceUrl(serviceUrl);\n\n if (!options) {\n this._http = new HttpClient();\n } else if ('request' in options) {\n this._http = options;\n } else {\n this._http = new HttpClient(options);\n }\n ensureApiOutboundTelemetryMiddleware(this._http);\n\n this._apiClientSettings = mergeApiClientSettings(apiClientSettings);\n }\n\n /**\n * @deprecated Use MessageActivityInput or TypingActivityInput instead.\n */\n async create(conversationId: string, params: DeprecatedInputActivity): Promise<Resource>;\n async create(conversationId: string, params: ActivityParams): Promise<Resource>;\n async create(conversationId: string, params: ActivityParamsLike): Promise<Resource>;\n async create(conversationId: string, params: ActivityParamsLike) {\n // TODO: Will be deprecated alongside accessor in ConversationClient\n const activity = toActivityParams(params);\n const plan = getPlanInfo(activity);\n const res = await this.http.post<Resource>(\n `${this.serviceUrl}/v3/conversations/${conversationId}/activities`,\n activity,\n apiOutboundTelemetryConfig(OUTBOUND_OPERATIONS.create, this.serviceUrl, conversationId, activity, {\n captureResponseActivityId: true,\n })\n );\n if (plan && plan.planType !== 'complete') {\n /** Plan returns `DO_NOT_USE_PLACEHOLDER_ID`, not a message ID. */\n return { id: 'DO_NOT_USE_PLACEHOLDER_ID' };\n }\n return res.data;\n }\n\n /**\n * @deprecated Use MessageActivityInput or TypingActivityInput instead.\n */\n async update(conversationId: string, id: string, params: DeprecatedInputActivity): Promise<Resource>;\n async update(conversationId: string, id: string, params: ActivityParams): Promise<Resource>;\n async update(conversationId: string, id: string, params: ActivityParamsLike): Promise<Resource>;\n async update(conversationId: string, id: string, params: ActivityParamsLike) {\n // TODO: Will be deprecated alongside accessor in ConversationClient\n const activity = toActivityParams(params);\n const res = await this.http.put<Resource>(\n `${this.serviceUrl}/v3/conversations/${conversationId}/activities/${id}`,\n activity,\n apiOutboundTelemetryConfig(OUTBOUND_OPERATIONS.update, this.serviceUrl, conversationId, activity, {\n activityId: id,\n captureResponseActivityId: true,\n })\n );\n return res.data;\n }\n\n /**\n * @deprecated Use MessageActivityInput or TypingActivityInput instead.\n */\n async reply(conversationId: string, id: string, params: DeprecatedInputActivity): Promise<Resource>;\n async reply(conversationId: string, id: string, params: ActivityParams): Promise<Resource>;\n async reply(conversationId: string, id: string, params: ActivityParamsLike): Promise<Resource>;\n async reply(conversationId: string, id: string, params: ActivityParamsLike) {\n // TODO: Will be deprecated alongside accessor in ConversationClient\n const activity = { ...toActivityParams(params), replyToId: id };\n const plan = getPlanInfo(activity);\n const res = await this.http.post<Resource>(\n `${this.serviceUrl}/v3/conversations/${conversationId}/activities`,\n activity,\n apiOutboundTelemetryConfig(OUTBOUND_OPERATIONS.reply, this.serviceUrl, conversationId, activity, {\n captureResponseActivityId: true,\n })\n );\n if (plan && plan.planType !== 'complete') {\n /** Plan returns `DO_NOT_USE_PLACEHOLDER_ID`, not a message ID. */\n return { id: 'DO_NOT_USE_PLACEHOLDER_ID' };\n }\n return res.data;\n }\n\n /**\n * Create an activity inside a reply chain (thread).\n *\n * @param conversationId the id of the chat or channel: `channelData.chat.id` or `channelData.channel.id`, **not** `conversation.id`.\n * @param id the id of the message at the root of the reply chain: `channelData.replyChain.id`\n * @param params the activity to send\n * @throws Error when `conversationId` or `id` is empty or blank\n * @throws Error when `conversationId` or `id` is a dot segment (`.` or `..`)\n *\n * @experimental This API is in preview and may change in the future. Diagnostic: ExperimentalTeamsThreading\n */\n async createReplyChain(conversationId: string, id: string, params: ActivityParams): Promise<Resource>;\n async createReplyChain(conversationId: string, id: string, params: ActivityParams) {\n return this.sendInReplyChain(conversationId, id, params, false);\n }\n\n /**\n * Create an activity inside a reply chain (thread) that is visible only to the specified recipient.\n *\n * @param conversationId the id of the chat or channel: `channelData.chat.id` or `channelData.channel.id`, **not** `conversation.id`.\n * @param id the id of the message at the root of the reply chain: `channelData.replyChain.id`\n * @param params the activity to send\n * @throws Error when `conversationId` or `id` is empty or blank\n * @throws Error when `conversationId` or `id` is a dot segment (`.` or `..`)\n *\n * @experimental This API is in preview and may change in the future. Diagnostic: ExperimentalTeamsThreading\n */\n async createTargetedReplyChain(conversationId: string, id: string, params: ActivityParams): Promise<Resource>;\n async createTargetedReplyChain(conversationId: string, id: string, params: ActivityParams) {\n return this.sendInReplyChain(conversationId, id, params, true);\n }\n\n async delete(conversationId: string, id: string) {\n const url = `${this.serviceUrl}/v3/conversations/${conversationId}/activities/${id}`;\n const res = await this.http.delete<void>(\n url,\n apiOutboundTelemetryConfig(\n OUTBOUND_OPERATIONS.delete,\n this.serviceUrl,\n conversationId,\n undefined,\n { activityId: id }\n )\n );\n return res.data;\n }\n\n async getMembers(conversationId: string, id: string): Promise<TeamsChannelAccount[]> {\n const url = `${this.serviceUrl}/v3/conversations/${conversationId}/activities/${id}/members`;\n const res = await this.http.get<TeamsChannelAccount[]>(url);\n return (res.data ?? []).map(resolveAadObjectId);\n }\n\n /**\n * @deprecated Use MessageActivityInput or TypingActivityInput instead.\n */\n async createTargeted(conversationId: string, params: DeprecatedInputActivity): Promise<Resource>;\n async createTargeted(conversationId: string, params: ActivityParams): Promise<Resource>;\n async createTargeted(conversationId: string, params: ActivityParamsLike): Promise<Resource>;\n async createTargeted(conversationId: string, params: ActivityParamsLike) {\n // TODO: Will be deprecated alongside accessor in ConversationClient\n const activity = toActivityParams(params);\n const res = await this.http.post<Resource>(\n `${this.serviceUrl}/v3/conversations/${conversationId}/activities?isTargetedActivity=true`,\n activity,\n apiOutboundTelemetryConfig(OUTBOUND_OPERATIONS.createTargeted, this.serviceUrl, conversationId, activity, {\n captureResponseActivityId: true,\n })\n );\n return res.data;\n }\n\n /**\n * @deprecated Use MessageActivityInput or TypingActivityInput instead.\n */\n async updateTargeted(conversationId: string, id: string, params: DeprecatedInputActivity): Promise<Resource>;\n async updateTargeted(conversationId: string, id: string, params: ActivityParams): Promise<Resource>;\n async updateTargeted(conversationId: string, id: string, params: ActivityParamsLike): Promise<Resource>;\n async updateTargeted(conversationId: string, id: string, params: ActivityParamsLike) {\n // TODO: Will be deprecated alongside accessor in ConversationClient\n const activity = toActivityParams(params);\n const res = await this.http.put<Resource>(\n `${this.serviceUrl}/v3/conversations/${conversationId}/activities/${id}?isTargetedActivity=true`,\n activity,\n apiOutboundTelemetryConfig(OUTBOUND_OPERATIONS.updateTargeted, this.serviceUrl, conversationId, activity, {\n activityId: id,\n captureResponseActivityId: true,\n })\n );\n return res.data;\n }\n\n async deleteTargeted(conversationId: string, id: string) {\n const url = `${this.serviceUrl}/v3/conversations/${conversationId}/activities/${id}?isTargetedActivity=true`;\n const res = await this.http.delete<void>(\n url,\n apiOutboundTelemetryConfig(\n OUTBOUND_OPERATIONS.deleteTargeted,\n this.serviceUrl,\n conversationId,\n undefined,\n { activityId: id }\n )\n );\n return res.data;\n }\n\n private async sendInReplyChain(conversationId: string, id: string, params: ActivityParams, targeted: boolean) {\n requireId('conversationId', conversationId);\n requireId('id', id);\n\n const activity = toActivityParams(params);\n const query = targeted ? '?isTargetedActivity=true' : '';\n const res = await this.http.post<Resource>(\n `${this.serviceUrl}/v3/conversations/${encodeURIComponent(conversationId)}/replyChains/${encodeURIComponent(id)}${query}`,\n activity,\n apiOutboundTelemetryConfig(\n targeted ? OUTBOUND_OPERATIONS.createTargetedReplyChain : OUTBOUND_OPERATIONS.createReplyChain,\n this.serviceUrl,\n conversationId,\n activity,\n { captureResponseActivityId: true }\n )\n );\n return res.data;\n }\n}\n"]}