easemob-websdk 5.1.2 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/bundle/im-sdk-web.iife.js +1 -1
  2. package/cache/cache-manager.d.ts +11 -3
  3. package/cache/cache-types.d.ts +15 -4
  4. package/chat-client.d.ts +23 -2
  5. package/chunks/chat-manager-BB7wYWYG.js +2 -0
  6. package/chunks/chat-manager-auF_3s3R.cjs +1 -0
  7. package/chunks/common-Cg-lTASK.cjs +1 -0
  8. package/chunks/common-gbNWJrBc.js +1 -0
  9. package/chunks/{event-system-B62vbKqG.js → event-system-DguqwFpc.js} +1 -1
  10. package/chunks/{group-user-info-resolver-B-dyr__b.cjs → group-user-info-resolver-BNwtC7dY.cjs} +1 -1
  11. package/chunks/{group-user-info-resolver-DMccCqez.js → group-user-info-resolver-rs5Fnr0l.js} +1 -1
  12. package/chunks/index-BUNbI8gf.cjs +1 -0
  13. package/chunks/index-BxMCMoWN.js +1 -0
  14. package/chunks/index-C7fO2X0x.cjs +1 -0
  15. package/chunks/index-C_EMU0-3.js +1 -0
  16. package/chunks/index-CsqE2tfH.js +1 -0
  17. package/chunks/index-DeJuR3uW.cjs +1 -0
  18. package/chunks/index-Dknccp9Q.js +1 -0
  19. package/chunks/index-P1vnLSK2.cjs +1 -0
  20. package/chunks/multibody-content-BHb-Au8Q.js +1 -0
  21. package/chunks/multibody-content-BmdQukoX.cjs +1 -0
  22. package/chunks/push-manager-BO3xq-7O.js +1 -0
  23. package/chunks/push-manager-DMI0G9v9.cjs +1 -0
  24. package/chunks/reflection-proto-codec-B1apL0ws.js +1 -0
  25. package/chunks/reflection-proto-codec-CYglS_mx.cjs +1 -0
  26. package/chunks/session-list-query-DMe2GZ4v.cjs +1 -0
  27. package/chunks/session-list-query-Inseic9m.js +1 -0
  28. package/chunks/{user-info-DH3aE1gm.cjs → user-info-B5St7axd.cjs} +1 -1
  29. package/chunks/{user-info-AlshAvdy.js → user-info-BkqJHgja.js} +1 -1
  30. package/core/index.d.ts +1 -1
  31. package/core/message/attachment-downloader.d.ts +4 -1
  32. package/core/message/message-sender.d.ts +19 -4
  33. package/core/message/prepare-text-translation.d.ts +7 -0
  34. package/core/session-list-sync/session-list-message-events.d.ts +9 -0
  35. package/index.cjs +1 -1
  36. package/index.d.ts +3 -2
  37. package/index.js +2 -2
  38. package/managers/chat/index.cjs +1 -1
  39. package/managers/chat/index.js +1 -1
  40. package/managers/chat-manager.d.ts +128 -7
  41. package/managers/chat-thread/index.cjs +1 -1
  42. package/managers/chat-thread/index.js +1 -1
  43. package/managers/chatroom/index.cjs +1 -1
  44. package/managers/chatroom/index.js +1 -1
  45. package/managers/contact/index.cjs +1 -1
  46. package/managers/contact/index.js +1 -1
  47. package/managers/group/index.cjs +1 -1
  48. package/managers/group/index.js +1 -1
  49. package/managers/presence/index.cjs +1 -1
  50. package/managers/presence/index.js +1 -1
  51. package/managers/push/index.cjs +1 -1
  52. package/managers/push/index.js +1 -1
  53. package/managers/user-info/index.cjs +1 -1
  54. package/managers/user-info/index.js +1 -1
  55. package/message/combine-payload-codec.d.ts +2 -2
  56. package/message/combine-payload-file.d.ts +11 -0
  57. package/message/create-message.d.ts +16 -4
  58. package/message/create-multibody-message.d.ts +31 -0
  59. package/message/message-snapshot.d.ts +9 -0
  60. package/message/multibody-content.d.ts +35 -0
  61. package/message/translations.d.ts +7 -0
  62. package/package.json +1 -1
  63. package/platform/image/miniapp-image-processor.d.ts +10 -6
  64. package/protocol/msync/codec.d.ts +4 -21
  65. package/protocol/msync/message-identity.d.ts +2 -0
  66. package/protocol/msync/message-payload-decoder.d.ts +39 -0
  67. package/protocol/session-list/gateway.d.ts +8 -1
  68. package/protocol/session-list/payload-decoder.d.ts +13 -1
  69. package/types/chat-manager.d.ts +2 -2
  70. package/types/conversation.d.ts +28 -21
  71. package/types/index.d.ts +33 -9
  72. package/types/message-create.d.ts +130 -2
  73. package/upload/attachment-uploader.d.ts +8 -0
  74. package/utils/session-message-recipient.d.ts +11 -0
  75. package/validators/message-create.d.ts +25 -2
  76. package/chunks/chat-manager-BFd2Z4oY.cjs +0 -1
  77. package/chunks/chat-manager-CId_M_e5.js +0 -2
  78. package/chunks/common-BvlDAw4a.js +0 -1
  79. package/chunks/common-tHGz9VBk.cjs +0 -1
  80. package/chunks/index-BBFJYOM8.js +0 -1
  81. package/chunks/index-DJPAjXAp.cjs +0 -1
  82. package/chunks/index-DtWkVcfb.cjs +0 -1
  83. package/chunks/index-l_BUKi77.js +0 -1
  84. package/chunks/reflection-proto-codec-7r8Sei3y.js +0 -1
  85. package/chunks/reflection-proto-codec-CwrIKT1L.cjs +0 -1
  86. package/chunks/session-list-query-Cvr6rlme.js +0 -1
  87. package/chunks/session-list-query-Dslj2k3t.cjs +0 -1
@@ -2,7 +2,7 @@
2
2
  * [zh-CN] 创建消息方法的入参类型定义。
3
3
  * [en-US] Parameter type definitions for message creation APIs.
4
4
  */
5
- import type { ChatConversationType, CompatibleFile, Message, MessagePriority } from './index';
5
+ import type { ChatConversationType, CompatibleFile, MultiBodySegment, Message, MessagePriority } from './index';
6
6
  /**
7
7
  * [zh-CN] 创建消息的通用入参。
8
8
  * [en-US] Common parameters for creating messages.
@@ -36,7 +36,7 @@ export interface CreateMessageBaseParams {
36
36
  export interface CreateTextMessageParams extends CreateMessageBaseParams {
37
37
  /** [zh-CN] 文本消息内容。 [en-US] Text message content. */
38
38
  content: string;
39
- /** [zh-CN] 发送时需要翻译到的目标语言列表。 [en-US] List of target languages to translate the message into upon sending. */
39
+ /** [zh-CN] 发送前自动翻译的目标语言列表;不传或空数组不翻译,翻译失败不发送。 [en-US] Target languages for automatic translation before sending; omitted or empty arrays disable translation, and translation failure prevents sending. */
40
40
  targetLanguages?: string[];
41
41
  }
42
42
  /**
@@ -157,6 +157,134 @@ export interface CreateCustomMessageParams extends CreateMessageBaseParams {
157
157
  /** [zh-CN] 自定义参数。 [en-US] Custom parameters. */
158
158
  params?: Record<string, string>;
159
159
  }
160
+ /**
161
+ * [zh-CN] 创建文本分段的入参。
162
+ * [en-US] Parameters for creating a text segment.
163
+ */
164
+ export interface CreateTextMessageBodyParams {
165
+ /** [zh-CN] 文本内容,不能为空。 [en-US] Text content. An empty string is not allowed. */
166
+ content: string;
167
+ /** [zh-CN] 复合消息发送时不生效,这段文本不会被翻译。 [en-US] Has no effect when sending a multi_body message. This text segment is not translated. */
168
+ targetLanguages?: string[];
169
+ }
170
+ /**
171
+ * [zh-CN] 创建图片分段的入参。`data` 与 `originalUrl` 至少传一个。
172
+ * [en-US] Parameters for creating an image segment. Either `data` or `originalUrl` is required.
173
+ */
174
+ export interface CreateImageMessageBodyParams {
175
+ /** [zh-CN] 本地图片文件。传入后必须把返回的同一个分段对象放进复合消息。 [en-US] Local image file. The returned segment object must be passed unchanged into the multi_body message. */
176
+ data?: CompatibleFile;
177
+ /** [zh-CN] 远程原图地址。 [en-US] Remote original image URL. */
178
+ originalUrl?: string;
179
+ /** [zh-CN] 文件名。传 `data` 时可由 SDK 在发送前补齐。 [en-US] File name. The SDK can fill it before sending when `data` is provided. */
180
+ filename?: string;
181
+ /** [zh-CN] 文件 MIME 类型。 [en-US] MIME type. */
182
+ filetype?: string;
183
+ /** [zh-CN] 图片宽度,单位像素。 [en-US] Image width in pixels. */
184
+ width?: number;
185
+ /** [zh-CN] 图片高度,单位像素。 [en-US] Image height in pixels. */
186
+ height?: number;
187
+ /** [zh-CN] 是否为 GIF。 [en-US] Whether the image is a GIF. */
188
+ isGif?: boolean;
189
+ /** [zh-CN] 是否按原图语义发送。 [en-US] Whether to send the original image. */
190
+ isOriginalImage?: boolean;
191
+ /** [zh-CN] 文件大小,单位字节。 [en-US] File size in bytes. */
192
+ fileLength?: number;
193
+ /** [zh-CN] 缩略图地址。 [en-US] Thumbnail URL. */
194
+ thumbnailUrl?: string;
195
+ }
196
+ /**
197
+ * [zh-CN] 创建文件分段的入参。`data` 与 `originalUrl` 至少传一个。
198
+ * [en-US] Parameters for creating a file segment. Either `data` or `originalUrl` is required.
199
+ */
200
+ export interface CreateFileMessageBodyParams {
201
+ /** [zh-CN] 本地文件。 [en-US] Local file. */
202
+ data?: CompatibleFile;
203
+ /** [zh-CN] 远程文件地址。 [en-US] Remote file URL. */
204
+ originalUrl?: string;
205
+ /** [zh-CN] 文件名。 [en-US] File name. */
206
+ filename?: string;
207
+ /** [zh-CN] 文件 MIME 类型。 [en-US] MIME type. */
208
+ filetype?: string;
209
+ /** [zh-CN] 待发送文件大小,单位字节。 [en-US] File size in bytes. */
210
+ fileSize?: number;
211
+ /** [zh-CN] 文件长度,单位字节。 [en-US] File length in bytes. */
212
+ fileLength?: number;
213
+ }
214
+ /**
215
+ * [zh-CN] 创建语音分段的入参。`data` 与 `originalUrl` 至少传一个。
216
+ * [en-US] Parameters for creating a voice segment. Either `data` or `originalUrl` is required.
217
+ */
218
+ export interface CreateVoiceMessageBodyParams {
219
+ /** [zh-CN] 本地语音文件。 [en-US] Local voice file. */
220
+ data?: CompatibleFile;
221
+ /** [zh-CN] 远程语音地址。 [en-US] Remote voice URL. */
222
+ originalUrl?: string;
223
+ /** [zh-CN] 文件名。 [en-US] File name. */
224
+ filename?: string;
225
+ /** [zh-CN] 文件 MIME 类型。 [en-US] MIME type. */
226
+ filetype?: string;
227
+ /** [zh-CN] 语音时长,单位秒。 [en-US] Voice duration in seconds. */
228
+ duration: number;
229
+ /** [zh-CN] 文件大小,单位字节。 [en-US] File size in bytes. */
230
+ fileLength?: number;
231
+ }
232
+ /**
233
+ * [zh-CN] 创建视频分段的入参。`data` 与 `originalUrl` 至少传一个。
234
+ * [en-US] Parameters for creating a video segment. Either `data` or `originalUrl` is required.
235
+ */
236
+ export interface CreateVideoMessageBodyParams {
237
+ /** [zh-CN] 本地视频文件。 [en-US] Local video file. */
238
+ data?: CompatibleFile;
239
+ /** [zh-CN] 远程视频地址。 [en-US] Remote video URL. */
240
+ originalUrl?: string;
241
+ /** [zh-CN] 文件名。 [en-US] File name. */
242
+ filename?: string;
243
+ /** [zh-CN] 文件 MIME 类型。 [en-US] MIME type. */
244
+ filetype?: string;
245
+ /** [zh-CN] 视频时长,单位秒。 [en-US] Video duration in seconds. */
246
+ duration: number;
247
+ /** [zh-CN] 视频宽度,单位像素。 [en-US] Video width in pixels. */
248
+ width?: number;
249
+ /** [zh-CN] 视频高度,单位像素。 [en-US] Video height in pixels. */
250
+ height?: number;
251
+ /** [zh-CN] 文件大小,单位字节。 [en-US] File size in bytes. */
252
+ fileLength?: number;
253
+ /** [zh-CN] 视频缩略图地址。 [en-US] Video thumbnail URL. */
254
+ thumbnailUrl?: string;
255
+ }
256
+ /**
257
+ * [zh-CN] 创建位置分段的入参。
258
+ * [en-US] Parameters for creating a location segment.
259
+ */
260
+ export interface CreateLocationMessageBodyParams {
261
+ /** [zh-CN] 纬度。 [en-US] Latitude. */
262
+ latitude: number;
263
+ /** [zh-CN] 经度。 [en-US] Longitude. */
264
+ longitude: number;
265
+ /** [zh-CN] 地址描述。 [en-US] Address description. */
266
+ address?: string;
267
+ /** [zh-CN] 建筑名称。 [en-US] Building name. */
268
+ buildingName?: string;
269
+ }
270
+ /**
271
+ * [zh-CN] 创建自定义分段的入参。
272
+ * [en-US] Parameters for creating a custom segment.
273
+ */
274
+ export interface CreateCustomMessageBodyParams {
275
+ /** [zh-CN] 自定义事件名称。 [en-US] Custom event name. */
276
+ event: string;
277
+ /** [zh-CN] 自定义字符串参数。 [en-US] Custom string parameters. */
278
+ params?: Record<string, string>;
279
+ }
280
+ /**
281
+ * [zh-CN] 创建复合消息的入参。`bodies` 必须是分段工厂返回的对象,且为 2 到 20 段。
282
+ * [en-US] Parameters for creating a multi_body message. `bodies` must be the objects returned by segment factories and contain 2 to 20 segments.
283
+ */
284
+ export interface CreateMultiBodyMessageParams extends CreateMessageBaseParams {
285
+ /** [zh-CN] 有序分段,2 到 20 项。不能包含命令、合并、复合消息或流式内容。 [en-US] Ordered segments, from 2 to 20. Command, combined, multi_body, and stream content is not allowed. */
286
+ bodies: ReadonlyArray<MultiBodySegment>;
287
+ }
160
288
  /**
161
289
  * [zh-CN] 创建合并消息的入参。
162
290
  * [en-US] Parameters for creating a combined message.
@@ -11,6 +11,14 @@ export declare class AttachmentUploader {
11
11
  * 这里会串起 029 的主流程:解析本地文件、决定图片发送语义、按门槛做预检、命中则复用远端资源,未命中再进入实际上传。
12
12
  */
13
13
  prepareMessage(message: Message, options?: SendMessageOptions): Promise<Message>;
14
+ /**
15
+ * 按段串行准备复合消息的附件。文本、位置、自定义段跳过。
16
+ * 附件段的 msgLocalId 改成 `msgLocalId:bodyIndex`,才能取到组装时放入的文件。
17
+ * 任一段失败就整条不发送,已经传完的段不会单独提交。
18
+ */
19
+ private prepareMultiBodyMessage;
20
+ /** 失败回调补上复合消息的 msgLocalId。进度、完成和取消都不带分段序号。 */
21
+ private withSegmentCallbacks;
14
22
  private resolveUploadUrl;
15
23
  private hasUploadedRemoteResource;
16
24
  private prepareAttachmentUpload;
@@ -0,0 +1,11 @@
1
+ import type { MessageDirect } from '../types';
2
+ import type { ConversationType } from '../types/conversation';
3
+ /** 会话摘要仅暴露接收者用户 ID,完整 Message 继续保留设备路由信息。 */
4
+ export declare const resolveSessionMessageTo: (options: {
5
+ readonly conversationId: string;
6
+ readonly conversationType: ConversationType;
7
+ readonly currentUserId: string;
8
+ readonly from: string;
9
+ readonly to?: string;
10
+ readonly direct?: MessageDirect;
11
+ }) => string;
@@ -346,6 +346,29 @@ export declare const createCustomMessageSchema: z.ZodType<{
346
346
  isChatThread?: boolean | undefined;
347
347
  params?: Record<string, string> | undefined;
348
348
  }>;
349
+ export declare const createMessageEnvelopeSchema: z.ZodType<{
350
+ conversationId: string;
351
+ conversationType: "singleChat" | "groupChat" | "chatRoom";
352
+ ext?: Record<string, unknown> | undefined;
353
+ timestamp?: number | undefined;
354
+ receiverList?: [string, ...string[]] | undefined;
355
+ deliverOnlineOnly?: boolean | undefined;
356
+ webhookEnv?: string | undefined;
357
+ priority?: "normal" | "high" | "low" | undefined;
358
+ needReadReceipt?: boolean | undefined;
359
+ isChatThread?: boolean | undefined;
360
+ }, z.ZodTypeDef, {
361
+ conversationId: string;
362
+ conversationType: "singleChat" | "groupChat" | "chatRoom";
363
+ ext?: Record<string, unknown> | undefined;
364
+ timestamp?: number | undefined;
365
+ receiverList?: [string, ...string[]] | undefined;
366
+ deliverOnlineOnly?: boolean | undefined;
367
+ webhookEnv?: string | undefined;
368
+ priority?: "normal" | "high" | "low" | undefined;
369
+ needReadReceipt?: boolean | undefined;
370
+ isChatThread?: boolean | undefined;
371
+ }>;
349
372
  export declare const createCombineMessageSchema: z.ZodType<{
350
373
  conversationId: string;
351
374
  conversationType: "singleChat" | "groupChat" | "chatRoom";
@@ -369,7 +392,7 @@ export declare const createCombineMessageSchema: z.ZodType<{
369
392
  conversationId: z.ZodString;
370
393
  conversationType: z.ZodEnum<["singleChat", "groupChat", "chatRoom"]>;
371
394
  timestamp: z.ZodNumber;
372
- body: z.ZodRecord<z.ZodString, z.ZodUnknown>;
395
+ body: z.ZodUnion<[z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">]>;
373
396
  combineLevel: z.ZodOptional<z.ZodNumber>;
374
397
  }, z.ZodTypeAny, "passthrough">[];
375
398
  ext?: Record<string, unknown> | undefined;
@@ -404,7 +427,7 @@ export declare const createCombineMessageSchema: z.ZodType<{
404
427
  conversationId: z.ZodString;
405
428
  conversationType: z.ZodEnum<["singleChat", "groupChat", "chatRoom"]>;
406
429
  timestamp: z.ZodNumber;
407
- body: z.ZodRecord<z.ZodString, z.ZodUnknown>;
430
+ body: z.ZodUnion<[z.ZodRecord<z.ZodString, z.ZodUnknown>, z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">]>;
408
431
  combineLevel: z.ZodOptional<z.ZodNumber>;
409
432
  }, z.ZodTypeAny, "passthrough">[];
410
433
  ext?: Record<string, unknown> | undefined;
@@ -1 +0,0 @@
1
- "use strict";const e=require("./common-tHGz9VBk.cjs"),t=require("./cache-utils-gowrxNr8.cjs"),r=require("./session-list-query-Dslj2k3t.cjs"),a=require("./group-user-info-resolver-B-dyr__b.cjs"),i=require("zod"),s=require("./light-BcQg8h2W.cjs"),o=require("./query-params-BHyPuD2k.cjs"),n={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnectFailed"},d=new WeakMap;const l=new class{constructor(){this.store=new Map}set(e,t){e&&this.store.set(e,t)}get(e){if(e)return this.store.get(e)}consume(e){const t=this.get(e);return t&&this.store.delete(e),t}delete(e){e&&this.store.delete(e)}clear(){this.store.clear()}},c=e=>{if((e=>"undefined"!=typeof File&&e instanceof File)(e)){if("undefined"==typeof URL||"function"!=typeof URL.createObjectURL)return;return URL.createObjectURL(e)}return(e=>"object"==typeof e&&null!==e&&"path"in e&&"string"==typeof e.path)(e)?e.path:(e=>"object"==typeof e&&null!==e&&"uri"in e&&"string"==typeof e.uri)(e)?e.uri:void 0},g=()=>{const t=e.getRuntimeGlobal().crypto;return t&&"function"==typeof t.randomUUID?t.randomUUID():`${Date.now()}-${Math.random().toString(16).slice(2)}`},u=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),m=(t,r,a)=>{throw new e.ValidationError(t,{code:a,details:{fields:[{path:r,message:t,rule:"invalid_format"}]}})},p=e=>{if("combine"!==e.type)return 0;const t=e.combineLevel;return"number"==typeof t?t:u(e.body)&&"number"==typeof e.body.combineLevel?e.body.combineLevel:0},h=(t,r)=>{if(t.sender.userId||m(`messageList[${r}] sender.userId is required`,`messageList[${r}].sender.userId`,e.ERROR_CODES.COMBINE_INVALID_INPUT),t.conversationId&&["singleChat","groupChat","chatRoom"].includes(t.conversationType)||m(`messageList[${r}] conversation is invalid`,`messageList[${r}].conversationId`,e.ERROR_CODES.COMBINE_INVALID_INPUT),(!Number.isInteger(t.timestamp)||t.timestamp<=0)&&m(`messageList[${r}] timestamp must be positive integer`,`messageList[${r}].timestamp`,e.ERROR_CODES.COMBINE_INVALID_INPUT),u(t.body)||m(`messageList[${r}] body must be object`,`messageList[${r}].body`,e.ERROR_CODES.COMBINE_INVALID_INPUT),"combine"===t.type){const a=p(t);(!Number.isInteger(a)||a<0)&&m(`messageList[${r}] combineLevel is invalid`,`messageList[${r}].combineLevel`,e.ERROR_CODES.COMBINE_INVALID_INPUT),a>10&&m(`messageList[${r}] combineLevel exceeds limit`,`messageList[${r}].combineLevel`,e.ERROR_CODES.COMBINE_LEVEL_EXCEEDED)}},y=(t,r=300)=>{(!Number.isInteger(t)||t<=0)&&m("messageList must not be empty","messageList",e.ERROR_CODES.COMBINE_INVALID_INPUT),(!Number.isInteger(r)||r<=0||r>300)&&m("max items is invalid","maxItems",e.ERROR_CODES.COMBINE_INVALID_INPUT),t>r&&m(`messageList max length is ${r}`,"messageList",e.ERROR_CODES.COMBINE_ITEM_LIMIT_EXCEEDED)},v=t=>{y(t.length);for(let r=0;r<t.length;r+=1){const a=t[r];void 0!==a?h(a,r):m(`messageList[${r}] is required`,`messageList[${r}]`,e.ERROR_CODES.COMBINE_INVALID_INPUT)}},I=e=>{let t=0;for(const r of e){if("combine"!==r.type)continue;const e=p(r);e>t&&(t=e)}return t+1},E=t=>{(!Number.isInteger(t)||t<=0)&&m("combineLevel must be positive integer","combineLevel",e.ERROR_CODES.COMBINE_INVALID_INPUT),t>10&&m("combineLevel must be <= 10","combineLevel",e.ERROR_CODES.COMBINE_LEVEL_EXCEEDED)};class _{static validate(t,r){try{return{success:!0,data:t.parse(r)}}catch(a){if(a instanceof i.ZodError){const t=a.errors.map(e=>({path:e.path.length>0?e.path.join("."):"root",message:e.message,rule:e.code})),r=`Validation failed: ${t.map(e=>`${e.path}: ${e.message}`).join("; ")}`,i=a.errors.some(e=>"invalid_type"===e.code&&"undefined"===e.received)?e.ERROR_CODES.VALIDATION_REQUIRED:e.ERROR_CODES.VALIDATION_INVALID_FORMAT;return{success:!1,error:new e.ValidationError(r,{code:i,details:{fields:t}})}}return{success:!1,error:new e.ValidationError("Unknown validation error",{code:e.ERROR_CODES.VALIDATION_UNKNOWN,details:{fields:[]}})}}}static validateOrThrow(t,r){const a=this.validate(t,r);if(a.success&&void 0!==a.data)return a.data;if(a.error)throw a.error;throw new e.ValidationError("Unknown validation error",{code:e.ERROR_CODES.VALIDATION_UNKNOWN,details:{fields:[]}})}static safeParse(e,t){return this.validate(e,t)}}const f=(t,r)=>new e.ValidationError(r,{code:e.ERROR_CODES.VALIDATION_INVALID_FORMAT,details:{fields:[{path:t,message:r,rule:"invalid_format"}]}}),R=(t,r)=>{if("string"!=typeof t||0===t.trim().length)throw(t=>new e.ValidationError(`${t} is required`,{code:e.ERROR_CODES.VALIDATION_REQUIRED,details:{fields:[{path:t,message:`${t} is required`,rule:"required"}]}}))(r);return t.trim()},b=e=>`mark_${String(e)}`,C=(e,t)=>{if("singleChat"===e||"groupChat"===e||"chatRoom"===e)return e;throw f(t,`${t} must be one of singleChat, groupChat, chatRoom`)},T=e=>"singleChat"===e?"chat":"groupChat"===e?"groupchat":"chatroom",O=e=>"string"==typeof e&&e.length>0?e:void 0,L=e=>{if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e&&e.length>0){const t=Number(e);return Number.isFinite(t)?t:void 0}},N=e=>t.isRecord(e)?e:void 0,S=(e,r)=>{const a=N(e);if(!a)return;const i=(e=>"string"==typeof e?t.safeJsonParse(e,{}):N(e)??{})(a.payload),s=Array.isArray(i.bodies)?i.bodies:[],o=N(s[0])??N(i.body),n=(e=>"txt"===e||"text"===e?"text":"custom"===e?"custom":"cmd"===e?"cmd":"image"===e||"file"===e||"voice"===e||"video"===e||"location"===e||"combine"===e?e:null)(o?.type??i.type);if(!o||!n)return;const d=((e,t)=>{if("text"===e)return{content:O(t.msg)??O(t.content)??""};if("custom"===e){const e=N(t.customExts)??N(t.params)??{},r={};for(const[t,a]of Object.entries(e))"string"==typeof a&&(r[t]=a);return{event:O(t.customEvent)??O(t.event)??"",params:r}}if("cmd"===e)return{action:O(t.action)??""};if("image"===e){const e=O(t.url)??O(t.remotePath)??"";return{localUrl:"",filename:O(t.filename)??O(t.displayName),filetype:O(t.filetype)??"application/octet-stream",width:L(t.width),height:L(t.height),isGif:!0===t.isGif||1===t.subType,isOriginalImage:!0===t.isOriginalImage,originalImageUrl:e,bigImageUrl:O(t.bigImageUrl),thumbnailUrl:O(t.thumbnailUrl)??O(t.thumbnailRemotePath),secret:O(t.secret)??O(t.secretKey),fileLength:L(t.fileLength)}}return"file"===e?{url:O(t.url)??O(t.remotePath),filename:O(t.filename)??O(t.displayName),filetype:O(t.filetype)??"application/octet-stream",fileSize:L(t.fileSize),fileLength:L(t.fileLength),secret:O(t.secret)??O(t.secretKey)}:"voice"===e?{url:O(t.url)??O(t.remotePath),filename:O(t.filename)??O(t.displayName),filetype:O(t.filetype)??"application/octet-stream",duration:L(t.duration)??0,fileLength:L(t.fileLength),secret:O(t.secret)??O(t.secretKey)}:"video"===e?{url:O(t.url)??O(t.remotePath),filename:O(t.filename)??O(t.displayName),filetype:O(t.filetype)??"application/octet-stream",duration:L(t.duration)??0,width:L(t.width),height:L(t.height),fileLength:L(t.fileLength),secret:O(t.secret)??O(t.secretKey),thumbnailUrl:O(t.thumbnailUrl)??O(t.thumbnailRemotePath)}:"location"===e?{latitude:L(t.latitude)??0,longitude:L(t.longitude)??0,address:O(t.address),buildingName:O(t.buildingName)}:null})(n,o);if(!d)return;const l=O(i.from)??O(a.from)??"",c=O(i.to)??r.conversationId,g=N(i.sender),u={userId:O(g?.userId)??l,nickname:O(g?.nickname),avatarUrl:O(g?.avatarUrl)},m=N(i.ext)??{},p=(e=>{const t=N(e);if(!t)return;const r=O(t.operatorId)??O(t.operator),a=L(t.operationCount)??L(t.count),i=L(t.operationTime)??L(t.edit_time);return r&&void 0!==a&&void 0!==i?{operatorId:r,operationCount:a,operationTime:i}:void 0})(i.modifiedInfo??N(i.meta)?.edit_msg);return{msgServerId:O(a.id)??r.messageId,msgLocalId:O(a.msgLocalId)??"",from:l,to:c,sender:u,conversationId:r.conversationId,conversationType:r.conversationType,type:n,sendStatus:"sent",ext:m,timestamp:L(a.timestamp)??r.timestamp,body:d,direct:l===r.currentUserId?"SEND":"RECEIVE",...p?{modifiedInfo:p}:{}}},w=e=>`${e.conversationType}:${e.conversationId}`,M=t=>{const{orgName:r,appName:a}=e.parseAppKey(t.appKey);return{orgName:r,appName:a,encodedUserId:encodeURIComponent(t.userId),encodedResource:encodeURIComponent(t.clientResource)}},A=async(e,r,a,i)=>{const s=M(r),o=(e=>{const r=e,a=r.conversations;if(void 0!==a){if(!Array.isArray(a)||0===a.length)throw f("params.conversations","params.conversations must be a non-empty array");return a.map((e,r)=>{if(!t.isRecord(e))throw f(`params.conversations.${String(r)}`,`params.conversations.${String(r)} must be an object`);return{conversationId:R(e.conversationId,`params.conversations.${String(r)}.conversationId`),conversationType:C(e.conversationType,`params.conversations.${String(r)}.conversationType`)}})}return[{conversationId:R(r.conversationId,"params.conversationId"),conversationType:C(r.conversationType,"params.conversationType")}]})(a),n=((e,t)=>{if("number"!=typeof e||!Number.isInteger(e)||e<0||e>19)throw f(t,`${t} must be an integer between 0 and 19`);return e})(a.mark,"params.mark"),d=await e.request(`/${s.orgName}/${s.appName}/sdk/user/${s.encodedUserId}/user_channels/mark?resource=${s.encodedResource}`,{method:i?"POST":"DELETE",body:{mark:b(n),targets:o.map(e=>({to:e.conversationId,type:T(e.conversationType)}))},operation:i?"addConversationMark":"removeConversationMark"}),l=(e=>{if(!Array.isArray(e))return new Set;const r=new Set;return e.forEach(e=>{if(!t.isRecord(e))return;const a="string"==typeof e.to?e.to.trim():"",i=(e=>"chat"===e||"singleChat"===e?"singleChat":"groupchat"===e||"groupChat"===e?"groupChat":"chatroom"===e||"chatRoom"===e?"chatRoom":null)(e.type);a&&i&&r.add(w({conversationId:a,conversationType:i}))}),r})((t.isRecord(d)&&t.isRecord(d.data)?d.data:{}).ignore),c=[],g=[];for(const t of o){const e={conversationId:t.conversationId,conversationType:t.conversationType};l.has(w(t))?g.push({...e,reason:"ignored_by_server"}):c.push(e)}return{succeeded:c,failed:g,mark:n,operation:i?"addMark":"removeMark"}},D=async(e,t,r,a)=>{const i=M(t),s=R(r.conversationId,"params.conversationId"),o=C(r.conversationType,"params.conversationType"),n=R(r.messageId,"params.messageId");return await e.request(`/${i.orgName}/${i.appName}/sdk/user/${i.encodedUserId}/user_channel/pin?resource=${i.encodedResource}`,{method:a?"POST":"DELETE",body:{to:s,type:T(o),pin_msg_id:n},operation:a?"pinMessage":"unpinMessage"}),{conversationId:s,conversationType:o,messageId:n,operation:a?"pin":"unpin"}},U=i.z.enum(["singleChat","groupChat","chatRoom"]),x=i.z.record(i.z.unknown()).refine(e=>(e=>"object"==typeof e&&null!==e&&!Array.isArray(e))(e),"ext must be an object").refine(e=>(e=>{try{return JSON.stringify(e),!0}catch{return!1}})(e),"ext must be JSON serializable"),z=i.z.object({path:i.z.string().min(1,"data.path is required"),size:i.z.number().optional(),name:i.z.string().optional(),type:i.z.string().optional()}),$=i.z.object({uri:i.z.string().min(1,"data.uri is required"),size:i.z.number().optional(),name:i.z.string().optional(),type:i.z.string().optional()}),V="undefined"!=typeof File?i.z.instanceof(File):i.z.never(),k=i.z.union([V,z,$]),P=i.z.object({conversationId:i.z.string().min(1,"conversationId is required"),conversationType:U,ext:x.optional(),timestamp:i.z.number().int().positive("timestamp must be a positive integer").optional(),receiverList:i.z.array(i.z.string().min(1,"receiverList item is required")).nonempty("receiverList must not be empty").optional(),deliverOnlineOnly:i.z.boolean().optional(),webhookEnv:i.z.string().optional(),priority:i.z.enum(["high","normal","low"]).optional(),needReadReceipt:i.z.boolean().optional(),isChatThread:i.z.boolean().optional()}),q=i.z.object({type:i.z.string().min(1,"messageList.type is required"),sender:i.z.object({userId:i.z.string().min(1,"messageList.sender.userId is required"),nickname:i.z.string().optional(),avatarUrl:i.z.string().optional()}),conversationId:i.z.string().min(1,"messageList.conversationId is required"),conversationType:U,timestamp:i.z.number().int().positive("messageList.timestamp must be positive"),body:i.z.record(i.z.unknown()),combineLevel:i.z.number().int().min(0).max(10).optional()}).passthrough(),F=e=>e.superRefine((e,t)=>{e.receiverList&&"singleChat"===e.conversationType&&t.addIssue({code:i.z.ZodIssueCode.custom,message:"receiverList is only allowed for group or chat room conversation",path:["receiverList"]}),e.isChatThread&&"groupChat"!==e.conversationType&&t.addIssue({code:i.z.ZodIssueCode.custom,message:"isChatThread is only allowed for group conversation",path:["isChatThread"]}),e.needReadReceipt&&"chatRoom"===e.conversationType&&t.addIssue({code:i.z.ZodIssueCode.custom,message:"needReadReceipt is not allowed for chatRoom conversation",path:["needReadReceipt"]})}),B=F(P.extend({content:i.z.string().min(1,"content is required"),targetLanguages:i.z.array(i.z.string().min(1)).optional()})),G=F(P.extend({originalUrl:i.z.string().min(1,"originalUrl is required").optional(),filename:i.z.string().min(1,"filename is required").optional(),filetype:i.z.string().min(1,"filetype is required").optional(),width:i.z.number().positive("width must be positive").optional(),height:i.z.number().positive("height must be positive").optional(),isGif:i.z.boolean().optional(),isOriginalImage:i.z.boolean().optional(),fileLength:i.z.number().positive("fileLength must be positive").optional(),data:k.optional(),thumbnailUrl:i.z.string().min(1).optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),K=F(P.extend({originalUrl:i.z.string().min(1,"originalUrl is required").optional(),filename:i.z.string().min(1,"filename is required").optional(),filetype:i.z.string().min(1,"filetype is required").optional(),fileSize:i.z.number().positive("fileSize must be positive").optional(),fileLength:i.z.number().positive("fileLength must be positive").optional(),data:k.optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),j=F(P.extend({originalUrl:i.z.string().min(1,"originalUrl is required").optional(),filename:i.z.string().min(1,"filename is required").optional(),filetype:i.z.string().min(1,"filetype is required").optional(),duration:i.z.number().positive("duration must be positive"),fileLength:i.z.number().positive("fileLength must be positive").optional(),data:k.optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),H=F(P.extend({originalUrl:i.z.string().min(1,"originalUrl is required").optional(),filename:i.z.string().min(1,"filename is required").optional(),filetype:i.z.string().min(1,"filetype is required").optional(),duration:i.z.number().positive("duration must be positive"),width:i.z.number().positive("width must be positive").optional(),height:i.z.number().positive("height must be positive").optional(),fileLength:i.z.number().positive("fileLength must be positive").optional(),thumbnailUrl:i.z.string().min(1).optional(),data:k.optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),X=F(P.extend({latitude:i.z.number(),longitude:i.z.number(),address:i.z.string().min(1).optional(),buildingName:i.z.string().min(1).optional()})),Q=F(P.extend({action:i.z.string().min(1,"action is required")})),W=F(P.extend({event:i.z.string().min(1,"event is required"),params:i.z.record(i.z.string()).optional()})),Y=F(P.extend({title:i.z.string().min(1,"title is required"),summary:i.z.string().min(1,"summary is required"),compatibleText:i.z.string().min(1).optional(),messageList:i.z.array(q).min(1,"messageList must not be empty").max(300,"messageList max length is 300")})),Z=t=>{const r=t?.userId?.trim();if(!r)throw new e.ValidationError("sender.userId is required",{code:e.ERROR_CODES.VALIDATION_REQUIRED,details:{fields:[{path:"sender.userId",message:"sender.userId is required",rule:"required"}]}});return{userId:r,nickname:t?.nickname,avatarUrl:t?.avatarUrl}},J=()=>g(),ee=(t,r)=>{if(t)return t;if(!r)throw new e.ValidationError("url or data is required",{code:e.ERROR_CODES.VALIDATION_REQUIRED,details:{fields:[{path:"url",message:"url or data is required",rule:"required"}]}});const a=c(r);if(!a)throw new e.ValidationError("Failed to resolve local url",{code:e.ERROR_CODES.VALIDATION_INVALID_FORMAT,details:{fields:[{path:"url",message:"Failed to resolve local url",rule:"invalid_format"}]}});return a},te=e=>!!e.isGif||(e.isOriginalImage??!1),re=(e,t,r,a,i)=>({msgServerId:"",msgLocalId:i??g(),from:t.userId,to:e.conversationId,sender:t,conversationId:e.conversationId,conversationType:e.conversationType,type:r,sendStatus:"sending",ext:e.ext??{},timestamp:e.timestamp??Date.now(),body:a,direct:"SEND",isOnline:!0,receiverList:e.receiverList,deliverOnlineOnly:e.deliverOnlineOnly,webhookEnv:e.webhookEnv,priority:e.priority,needReadReceipt:e.needReadReceipt,isPeerRead:"singleChat"!==e.conversationType&&void 0,isChatThread:e.isChatThread}),ae=(e,t)=>{const r=_.validateOrThrow(Y,e),a=r.messageList,i=Z(t);v(a);const s=I(a);E(s);const o={title:r.title,summary:r.summary,messageList:a,filename:"combine",filetype:"application/octet-stream",combineLevel:s},n=re(r,i,"combine",o);return((e,t)=>{t&&d.set(e,t)})(n,r.compatibleText),n},ie=t=>{const{orgName:r,appName:a}=e.parseAppKey(t.appKey);return`/${r}/${a}`},se=e=>{const t=new Uint8Array(s.lightExports.util.base64.length(e));return s.lightExports.util.base64.decode(e,t,0),t},oe=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),ne=async t=>{try{return await t()}catch(r){if(!(r instanceof e.RestBusinessError))throw r;const t=(t=>{const r="string"==typeof t.details?.serverMessage?t.details.serverMessage:void 0;switch(t.code){case e.ERROR_CODES.SERVICE_NOT_ENABLED:case e.ERROR_CODES.TRANSLATE_SERVICE_NOT_ENABLED:return"Translation service is not enabled";case e.ERROR_CODES.TRANSLATE_PARAM_INVALID:return r?.includes("too long")?"Translation text is too long":r?.includes("target language")?"Invalid target language":"Invalid translation request";case e.ERROR_CODES.TRANSLATE_USAGE_LIMIT:return"Translation quota has been reached";case e.ERROR_CODES.TRANSLATE_FAILED:return"Translation service error";default:return}})(r);if(!t)throw r;throw new e.RestBusinessError(`REST business error: ${t}`,{code:r.code,details:r.details})}},de=e=>"string"==typeof e?e:"number"==typeof e||"boolean"==typeof e||"bigint"==typeof e?String(e):"",le=e=>{if("string"!=typeof e)return"";const t=e.trim();return t&&"undefined"!==t&&"null"!==t?t:""},ce=e=>({userId:e}),ge=(t,r)=>{if(!oe(t)||!oe(t.data))throw e.createRestBusinessError({apiName:r,message:`${r} response data is invalid`,mapped:!1});return t.data},ue=(t,r)=>{if(!oe(t)||!Array.isArray(t.data))throw e.createRestBusinessError({apiName:r,message:`${r} response data is invalid`,mapped:!1});return t.data},me=(e,t)=>Array.isArray(e)?e:ue(e,t),pe={txt:"text",img:"image",video:"video",file:"file",loc:"location",custom:"custom",combine:"combine"},he={text:"txt",image:"img",video:"video",file:"file",location:"loc",custom:"custom",combine:"combine"},ye={chat:"singleChat",chatroom:"chatRoom",groupchat:"groupChat",singleChat:"singleChat",chatRoom:"chatRoom",groupChat:"groupChat"},ve=(t,r,a)=>{if(!r)return"";if(r.includes("em-redirect"))return r;const{orgName:i,appName:s}=e.parseAppKey(t.appKey),o=r.indexOf("/chatfiles/"),n=o>=0?r.slice(o):r,d=`${t.restBaseUrl}/${i}/${s}${n}`;return e.appendAttachUrlParams(d,a)},Ie=e=>{if(!e||"object"!=typeof e)return;if(Array.isArray(e))return e;const t=Object.values(e),r=[];for(const a of t)Array.isArray(a)&&r.push(...a);return r.length>0?r:void 0},Ee=(e,t,r)=>{const a=de(r.contentType??r.type),i=he[a];if(!i)return null;const s=oe(r.content)?r.content:{},o=((e,t)=>{const r=de(t.conversationType);if("groupchat"===r||"chatroom"===r)return de(t.receiverId);const a=de(t.senderId);return a===e?de(t.receiverId):a})(t,r),n=ye[de(r.conversationType)]??"singleChat",d={msgServerId:de(r.messageId),msgLocalId:de(r.messageId),from:de(r.senderId),to:de(r.receiverId),conversationId:o,conversationType:n,type:i,ext:oe(r.ext)?r.ext:{},timestamp:"number"==typeof r.sentTime?r.sentTime:new Date(de(r.sentTime)).getTime(),sender:{userId:de(r.senderId)},highlight:Ie(r.highlight),text:"string"==typeof r.text?r.text:void 0};let l;const c=de(s.remotePath??s.url),g=de(s.secret??s.secretKey);switch(i){case"txt":l={type:"txt",content:de(s.message??r.text)};break;case"img":{const t=ve(e,c,g);l={type:"img",url:t,thumb:s.thumb?ve(e,de(s.thumb),de(s.thumb_secret??s.thumbnailSecretKey)):`${t}&thumbnail=true`,secret:g,width:Number(s.width??(oe(s.size)?s.size.width:0))||0,height:Number(s.height??(oe(s.size)?s.size.height:0))||0,fileLength:Number(s.file_length??s.fileLength??0)};break}case"video":l={type:"video",url:ve(e,c,g),thumb:s.thumb||s.thumbnailRemotePath?ve(e,de(s.thumb??s.thumbnailRemotePath),de(s.thumb_secret??s.thumbnailSecretKey)):"",secret:g,filename:de(s.filename??s.displayName),duration:Number(s.length??s.duration??0),fileLength:Number(s.file_length??s.fileLength??0)};break;case"file":l={type:"file",url:ve(e,c,g),secret:g,filename:de(s.filename??s.displayName),fileLength:Number(s.file_length??s.fileLength??0)};break;case"loc":l={type:"loc",latitude:Number(s.lat??s.latitude??0),longitude:Number(s.lng??s.longitude??0),address:de(s.addr??s.address),buildingName:de(s.buildingName)};break;case"custom":l={type:"custom",customEvent:de(s.customEvent),customExts:oe(s.customExts)?s.customExts:{}};break;default:return null}return{...d,body:l}},_e=async(e,t,r)=>{const a=`${ie(t)}/users/${t.userId}/messages/search/get`,i=((e,t)=>{const{option:r,pageNum:a=1,pageSize:i=20}=e,s=r.keywordList.map(e=>e.trim()).filter(e=>e.length>0),o={searchMode:"default",highlightEnable:!0,page:a,size:i};return 1===s.length?o.keyword=s[0]:(o.keywords=s,o.keywordMatch="and"===r.keywordListMatchType?"all":"any"),r.conversationId&&("singleChat"===r.conversationType?o.participantPairs=[{userId1:t,userId2:r.conversationId}]:"groupChat"===r.conversationType?o.groupIds=[r.conversationId]:"chatRoom"===r.conversationType&&(o.chatroomIds=[r.conversationId])),r.msgTypes&&r.msgTypes.length>0&&(o.contentType=r.msgTypes.map(e=>pe[e]??e).join(",")),void 0!==r.startTime&&(o.startTime=r.startTime),void 0!==r.endTime&&(o.endTime=r.endTime),r.searchScope&&(o.searchExt=r.searchScope),r.direction&&(o.sort="up"===r.direction?"sentTime:asc":"sentTime:desc"),{data:o}})(r,t.userId),s=await e.post(a,i,{operation:"searchMessages"}),o=oe(s)?s:{},n=oe(o.data)?o.data:o,d=oe(n.data)?n.data:n,l=Array.isArray(d.items)?d.items:Array.isArray(d.list)?d.list:[],c=oe(d.pagination)?d.pagination:d,g=Number(c.pageNum??c.page??r.pageNum??1),u=Number(c.pageSize??c.size??r.pageSize??20),m=Number(c.totalPages??0),p=1===c.isFinished||g>=m,h=[];for(const y of l){if(!oe(y))continue;const e=Ee(t,t.userId,y);e&&h.push(e)}return{messages:h,pageNum:g,pageSize:u,totalPages:m,isLast:p}},fe=t=>{const{orgName:r,appName:a}=e.parseAppKey(t.appKey);return`/api/sdk/v1/${r}/${a}`},Re=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),be=e=>Re(e)&&"string"==typeof e.path&&e.path.trim().length>0,Ce=e=>(e=>"undefined"!=typeof File&&e instanceof File)(e)||be(e),Te=e=>{if(!Re(e))return;return{data:Re(e.data)?e.data:void 0,error:Re(e.error)?e.error:void 0}},Oe=(t,r)=>{const a=Te(t),i=a?.data?.text;if("string"!=typeof i)throw new e.SDKError(`${r} response data is invalid`,e.ERROR_CODES.REST_BUSINESS_UNKNOWN,{details:{api:r,response:t}});return i},Le=(t,r,a,i="sdk")=>"auth"===i?new e.AuthenticationError(t,{code:r,details:a}):"validation"===i?new e.ValidationError(t,{code:r,details:a}):new e.SDKError(t,r,{details:a}),Ne=e=>!(void 0===e||Re(e)&&!Array.isArray(e))||(void 0!==e?.format&&"string"!=typeof e.format||(void 0!==e?.sampleRate&&"number"!=typeof e.sampleRate||(void 0!==e?.bitsPerSample&&"number"!=typeof e.bitsPerSample||void 0!==e?.channels&&"number"!=typeof e.channels))),Se=e=>{if(!e)return;const t=(e.split("#")[0]?.split("?")[0]??"").split("/").filter(Boolean);return t.length>0?t[t.length-1]:void 0},we=t=>{const{serviceCode:r,serviceMessage:a}=(t=>{const r=t instanceof e.SDKError&&Re(t.details)?t.details:void 0,a=Te(r?.rawResponse??r?.response??t),i=r?.serverCode??a?.error?.code,s=r?.serverMessage??a?.error?.message;return{serviceCode:"string"==typeof i||"number"==typeof i?String(i):void 0,serviceMessage:"string"==typeof s?s:void 0}})(t);if(t instanceof e.UploadError)return Le("File upload failed",e.ERROR_CODES.UPLOAD_REQUEST_FAILED,{cause:t.details});if(t instanceof e.SDKError&&!r)return t;if(r)switch(r){case"4041001":return Le("File not found",e.ERROR_CODES.VOICE_TO_TEXT_FILE_NOT_FOUND,{serviceCode:r,serviceMessage:a});case"4001002":return Le("Invalid file",e.ERROR_CODES.VOICE_TO_TEXT_FILE_INVALID,{serviceCode:r,serviceMessage:a},"validation");case"5021001":return Le("File upload failed",e.ERROR_CODES.UPLOAD_REQUEST_FAILED,{serviceCode:r,serviceMessage:a});case"4001003":return Le("Voice duration exceeds 60 seconds",e.ERROR_CODES.VOICE_TO_TEXT_FILE_DURATION_TOO_LONG,{serviceCode:r,serviceMessage:a},"validation");case"4031001":return Le("Voice-to-text service is not enabled",e.ERROR_CODES.SERVICE_NOT_ENABLED,{serviceCode:r,serviceMessage:a});case"4031002":return Le("Beta service usage limit exceeded",e.ERROR_CODES.SERVICE_LIMIT_EXCEEDED,{serviceCode:r,serviceMessage:a});case"4001001":return"string"==typeof(i=a)&&i.toLowerCase().includes("uploaded file exceeds")?Le("File too large",e.ERROR_CODES.VOICE_TO_TEXT_FILE_TOO_LARGE,{serviceCode:r,serviceMessage:a}):Le(a||"Missing or invalid request parameter",e.ERROR_CODES.VALIDATION_REQUIRED,{serviceCode:r,serviceMessage:a},"validation");case"5021003":case"5001003":return Le("Voice-to-text failed",e.ERROR_CODES.VOICE_TO_TEXT_FAILED,{serviceCode:r,serviceMessage:a});case"4011001":return Le(a||"Unauthorized or invalid token",e.ERROR_CODES.AUTH_UNAUTHORIZED,{serviceCode:r,serviceMessage:a},"auth");default:return Le(a||(t instanceof Error?t.message:"Voice-to-text failed"),e.ERROR_CODES.VOICE_TO_TEXT_FAILED,{serviceCode:r,serviceMessage:a})}var i;return t instanceof e.SDKError?Le(t.message,t.code,t.details):Le(t instanceof Error?t.message:"Voice-to-text failed",e.ERROR_CODES.VOICE_TO_TEXT_FAILED)},Me=(t,r)=>{if(!Re(a=t)||"string"!=typeof a.filename||"string"!=typeof a.filetype||"number"!=typeof a.duration||"type"in a&&void 0!==a.type&&"voice"!==a.type)throw Le("Invalid file",e.ERROR_CODES.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceMessageBody"},"validation");var a;if(Ne(r))throw Le("Invalid file",e.ERROR_CODES.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceParams"},"validation");if(!t.url)throw Le("File not found",e.ERROR_CODES.VOICE_TO_TEXT_FILE_NOT_FOUND,{path:"voiceMessageBody.url"});if(!Se(t.url))throw Le("Invalid file",e.ERROR_CODES.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceMessageBody.url"},"validation");return t},Ae=(t,r)=>{if(Ne(r))throw Le("Invalid file",e.ERROR_CODES.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceParams"},"validation");if(!Ce(t))throw Le("Invalid file",e.ERROR_CODES.VOICE_TO_TEXT_FILE_INVALID,{path:"file"},"validation");return t},De=async(t,r,a,i)=>{const s=Me(a,i),o=Se(s.url);if(!o)throw((t,r,a,i="invalid")=>new e.ValidationError(t,{code:r,details:{fields:[{path:a,message:t,rule:i}]}}))("File not found",e.ERROR_CODES.VOICE_TO_TEXT_FILE_NOT_FOUND,"voiceMessageBody.url");try{const e=await t.post(`${fe(r)}/speech/transcriptions`,{data:{fileId:o,username:r.userId,...i?{audio:i}:{}}},{operation:"voiceMessageToText"});return{text:Oe(e,"voiceMessageToText")}}catch(n){throw we(n)}},Ue=i.z.object({keywordList:i.z.array(i.z.string()).min(1,"keywordList must not be empty").max(5,"keywordList must have at most 5 keywords").refine(e=>e.map(e=>e.trim()).filter(e=>e.length>0).length>0,"keywordList must contain at least one non-empty keyword"),keywordListMatchType:i.z.enum(["or","and"]).optional(),conversationId:i.z.string().min(1).optional(),conversationType:i.z.enum(["singleChat","groupChat","chatRoom"]).optional(),msgTypes:i.z.array(i.z.enum(["txt","img","video","file","loc","custom","combine"])).optional(),startTime:i.z.number().optional(),endTime:i.z.number().optional(),searchScope:i.z.enum(["none","with","only"]).optional(),direction:i.z.enum(["up","down"]).optional()}).refine(e=>void 0!==e.conversationId===(void 0!==e.conversationType),{message:"conversationId and conversationType must be provided together"}).refine(e=>void 0!==e.startTime===(void 0!==e.endTime),{message:"startTime and endTime must be provided together"}).refine(e=>void 0===e.startTime||void 0===e.endTime||e.endTime>=e.startTime,{message:"endTime must be >= startTime"}),xe=i.z.object({option:Ue,pageNum:i.z.number().int().min(1).default(1),pageSize:i.z.number().int().min(1).max(100).default(20)}),ze=e.mergeRuntimeErrorMaps(e.COMMON_ERROR_MAP,{common:{},apis:{sendMessage:{range:"1,4,100,108,110,202,210,213-215,219-222,300-301,303,305,402,405-406,500-501,505-510,602-603,606-607,1200,1299",localErrors:{sendMessage:{operation_cancelled:{code:1,retryable:!1},upload_invalid_appkey:{code:100,retryable:!1},validation_invalid:{code:110,retryable:!1},not_connected:{code:300,retryable:!0},request_timeout:{code:301,retryable:!0},send_failed:{code:303,retryable:!1},upload_failed:{code:402,retryable:!0},file_too_large:{code:405,retryable:!1},file_content_improper:{code:406,retryable:!1},encode_failed:{code:500,retryable:!1}}},errors:{SERVICE_LIMIT_EXCEEDED:{code:4,retryable:!1},TOKEN_EXPIRED:{code:108,retryable:!1},AUTH_FAILED:{code:202,retryable:!1},PERMISSION_DENIED:{code:210,retryable:!1},BIND_ANOTHER_DEVICE:{code:213,retryable:!1},TOO_MANY_DEVICES:{code:214,retryable:!1},USER_MUTED:{code:215,retryable:!1},USER_MUTED_BY_ADMIN:{code:219,retryable:!1},USER_DEVICE_CHANGED:{code:220,retryable:!1},USER_NOT_ON_ROSTER:{code:221,retryable:!1},BLOCKED_BY_RECIPIENT:{code:222,retryable:!1,aliases:["blocked"]},SERVER_SERVING_DISABLED:{code:305,retryable:!1},MESSAGE_INCLUDE_ILLEGAL_CONTENT:{code:501,retryable:!1},SERVICE_NOT_ENABLED:{code:505,retryable:!1},MESSAGE_EXPIRED:{code:506,retryable:!1},MESSAGE_ILLEGAL_WHITELIST:{code:507,retryable:!1},MESSAGE_EXTERNAL_LOGIC_BLOCKED:{code:508,retryable:!1},MESSAGE_CURRENT_LIMITING:{code:509,retryable:!0},MESSAGE_SIZE_LIMIT:{code:510,retryable:!1},GROUP_NOT_JOINED:{code:602,retryable:!1},GROUP_PERMISSION_DENIED:{code:603,retryable:!1},GROUP_NOT_EXIST:{code:606,retryable:!1},GROUP_DISABLED:{code:607,retryable:!1},MESSAGE_BLOCKED:{code:1200,retryable:!1},THIRD_DEFAULT_FAILED:{code:1299,retryable:!1}}},getHistoryMessages:{range:"4,110,202,505",localErrors:{getHistoryMessages:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},page_size_exceeded:{code:110,aliases:["pull number cannot be greater","limit is to large"],retryable:!1}}},removeHistoryMessages:{range:"110,112,202,505",localErrors:{removeHistoryMessages:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},query_param_reaches_limit:{code:112,aliases:["delete msg list limit"],retryable:!1}}},getGroupMessageReadUsers:{range:"4,110,500",localErrors:{getGroupMessageReadUsers:{validation_invalid:{code:110,retryable:!1}}},errors:{message_not_found:{code:500,retryable:!1}}},recallMessage:{range:"110,201,300,504,505",localErrors:{recallMessage:{validation_invalid:{code:110,retryable:!1}}},errors:{message_invalid:{code:110,retryable:!1},not_login:{code:201,retryable:!0},not_connected:{code:300,retryable:!0},recall_time_limit:{code:504,retryable:!1},recall_disabled:{code:505,retryable:!1}}},updateMessage:{range:"110,111,201,210,300,511",localErrors:{modifyMessage:{validation_invalid:{code:110,retryable:!1},unsupported_type:{code:111,retryable:!1}}},errors:{message_invalid:{code:110,retryable:!1},unsupported_type:{code:111,retryable:!1},not_login:{code:201,retryable:!0},permission_denied:{code:210,retryable:!1},not_connected:{code:300,retryable:!0},edit_failed:{code:511,retryable:!0}}},downloadMessageAttachment:{range:"400,401,403,407",localErrors:{downloadAttachment:{validation_invalid:{code:401,retryable:!1}}},errors:{not_found:{code:400,httpStatus:404,retryable:!1},invalid:{code:401,retryable:!1},download_failed:{code:403,retryable:!0},expired:{code:407,httpStatus:404,retryable:!1}}},downloadAndParseCombineMessage:{range:"110,401,403,500",localErrors:{downloadAndParseCombineMessage:{validation_invalid:{code:110,retryable:!1}}},errors:{invalid_param:{code:110,retryable:!1},invalid_type:{code:500,retryable:!1},parse_failed:{code:401,retryable:!0},download_failed:{code:403,retryable:!0}}},addReaction:{range:"110,302,505,600,602,1300-1302",localErrors:{addReaction:{validation_invalid:{code:110,retryable:!1}}},errors:{reaction_already_operated:{code:1301,retryable:!1},reaction_reach_limit:{code:1300,retryable:!1},group_not_joined:{code:602,retryable:!1},reaction_operation_illegal:{code:1302,retryable:!1},service_not_enabled:{code:505,retryable:!1},server_busy:{code:302,retryable:!0}}},removeReaction:{range:"110,505,1301,1302",localErrors:{removeReaction:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},reaction_operation_illegal:{code:1302,retryable:!1}}},getReactionList:{range:"110,505,600",localErrors:{getReactionList:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},group_invalid_id:{code:600,retryable:!1}}},getReactionDetail:{range:"110,505,1302",localErrors:{getReactionDetail:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},reaction_operation_illegal:{code:1302,retryable:!1}}},pinMessage:{range:"4,110",errors:{pin_msg_id_illegal:{code:110,retryable:!1},pin_message_limit:{code:4,aliases:["91101"],retryable:!1},pin_message_not_found:{code:110,aliases:["91102"],retryable:!1}}},unpinMessage:{range:"110",errors:{pin_msg_id_illegal:{code:110,retryable:!1},pin_message_not_found:{code:110,aliases:["91102","user session pin message not exist"],retryable:!1}}},getPinnedMessageList:{range:"110,111",errors:{operation_unsupported:{code:111,aliases:["15002"],retryable:!1},pin_message_not_found:{code:110,aliases:["91102","user session pin message not exist"],retryable:!1}}},getSupportedTranslationLanguages:{range:"505",errors:{service_not_enabled:{code:505,aliases:["service not open!"],retryable:!1}}},translateMessage:{range:"505,1110-1113",localErrors:{translateMessage:{validation_invalid:{code:1110,retryable:!1}}},errors:{translate_text_too_long:{code:1110,runtimeMessage:"Translation text is too long",retryable:!1},translate_param_invalid:{code:1110,runtimeMessage:"Invalid target language",retryable:!1},service_not_enabled:{code:1111,runtimeMessage:"Translation service is not enabled",aliases:["service not open!"],retryable:!1},translate_usage_limit:{code:1112,runtimeMessage:"Translation quota has been reached",aliases:["The request has reached the maximum limit"],retryable:!1},translate_failed:{code:1113,runtimeMessage:"Translation service error",aliases:["The request failed, please try again later."],retryable:!1}}},voiceMessageToText:{range:"4,110,202,407-411,505",localErrors:{voiceMessageToText:{validation_invalid:{code:407,retryable:!1},file_not_found:{code:410,retryable:!1}}},errors:{unauthorized:{code:202,retryable:!0},file_not_found:{code:410,retryable:!1,aliases:["4041001"]},file_invalid:{code:407,retryable:!1,aliases:["4001002"]},duration_too_long:{code:408,retryable:!1,aliases:["4001003"]},file_too_large:{code:411,retryable:!1,aliases:["4001001"]},service_not_enabled:{code:505,retryable:!1,aliases:["4031001"]},service_limit_exceeded:{code:4,retryable:!0,aliases:["4031002"]},voice_to_text_failed:{code:409,retryable:!0,aliases:["5021003","5001003"]}}},voiceFileToText:{range:"4,110,202,402,407-411,505",localErrors:{voiceFileToText:{validation_invalid:{code:407,retryable:!1},upload_required:{code:110,retryable:!1}}},errors:{unauthorized:{code:202,retryable:!0},upload_failed:{code:402,retryable:!0,aliases:["5021001"]},file_invalid:{code:407,retryable:!1,aliases:["4001002"]},duration_too_long:{code:408,retryable:!1,aliases:["4001003"]},file_too_large:{code:411,retryable:!1,aliases:["4001001"]},service_not_enabled:{code:505,retryable:!1,aliases:["4031001"]},service_limit_exceeded:{code:4,retryable:!0,aliases:["4031002"]},voice_to_text_failed:{code:409,retryable:!0,aliases:["5021003","5001003"]}}},getConversationList:{range:"110",localErrors:{getConversationList:{validation_invalid:{code:110,retryable:!1}}},errors:{}},getPinnedConversationList:{range:"110",localErrors:{getPinnedConversationList:{validation_invalid:{code:110,retryable:!1}}},errors:{}},getConversationListByMark:{range:"110",localErrors:{getConversationListByMark:{validation_invalid:{code:110,retryable:!1}}},errors:{}},deleteConversation:{range:"110",localErrors:{deleteConversation:{validation_invalid:{code:110,retryable:!1}}},errors:{}},clearConversationUnreadMessageCount:{range:"110,201,300,500",localErrors:{clearConversationUnreadMessageCount:{validation_invalid:{code:110,retryable:!1}}},errors:{not_login:{code:201,retryable:!0},not_connected:{code:300,retryable:!0},message_invalid:{code:500,retryable:!1}}},clearAllConversationUnreadMessageCount:{range:"201,300,500",errors:{not_login:{code:201,retryable:!0},not_connected:{code:300,retryable:!0},message_invalid:{code:500,retryable:!1}}},sendMessageReadReceipts:{range:"110,300",localErrors:{sendMessageReadReceipts:{validation_invalid:{code:110,retryable:!1}}},errors:{invalid_direction:{code:110,retryable:!1},not_connected:{code:300,retryable:!0}}},getGroupMessageReadReceipts:{range:"110,202,210,303",localErrors:{getGroupMessageReadReceipts:{validation_invalid:{code:110,retryable:!1}}},errors:{illegal_argument:{code:110,httpStatus:400,retryable:!1},auth_bad_access_token:{code:202,httpStatus:401,retryable:!1},forbidden_op:{code:210,httpStatus:403,retryable:!1},unknown_exception_error:{code:303,httpStatus:500,retryable:!0}}},setConversationPinned:{range:"110",localErrors:{setConversationPinned:{validation_invalid:{code:110,retryable:!1}}},errors:{}},addConversationMark:{range:"110",localErrors:{addConversationMark:{validation_invalid:{code:110,retryable:!1}}},errors:{}},removeConversationMark:{range:"110",localErrors:{removeConversationMark:{validation_invalid:{code:110,retryable:!1}}},errors:{}},clearAllMessagesAndConversations:{range:"",errors:{}},searchMessages:{range:"110,202,303,505",localErrors:{searchMessages:{validation_invalid:{code:110,retryable:!1}}},errors:{parameter_error:{code:110,httpStatus:400,retryable:!1,aliases:["4000005","4000006"]},token_invalid:{code:202,httpStatus:401,retryable:!1,aliases:["4010101"]},service_not_enabled:{code:505,httpStatus:403,retryable:!1,aliases:["4030204"]},app_not_found:{code:110,httpStatus:404,retryable:!1,aliases:["4040302"]},server_error:{code:303,httpStatus:500,retryable:!0,aliases:["5000701","5020801"]}}}}}),$e=class{constructor(){this.client=null,this.eventContext=null,this.restClient=null,this.restBaseUrl=null,this.restToken=null}bind(e,t){this.client=e,this.eventContext=t??null,this.restClient=null,this.restBaseUrl=null,this.restToken=null}async sendMessage(e,t){return this.getClientOrThrow().sendMessage(e,t)}createTextMessage(e){return((e,t)=>{const r=_.validateOrThrow(B,e),a=Z(t),i=J(),s={content:r.content};return r.targetLanguages&&(s.targetLanguages=r.targetLanguages),re(r,a,"text",s,i)})(e,this.buildMessageSenderOrThrow())}createImageMessage(t){return((t,r,a)=>{const i=_.validateOrThrow(G,t),s=Z(r),o=J(),n=i.data?ee(void 0,i.data):"",d=i.originalUrl?e.deriveImageUrls(i.originalUrl,{deriveVariants:!a?.useCustomAttachmentUpload}):void 0;i.data&&l.set(o,i.data);const c=i.isGif??!1,g={localUrl:n,filename:i.filename,filetype:i.filetype,width:i.width,height:i.height,isGif:c,isOriginalImage:te({isGif:c,isOriginalImage:i.isOriginalImage})};return d?.originalImageUrl&&(g.originalImageUrl=d.originalImageUrl,g.bigImageUrl=d.bigImageUrl,g.thumbnailUrl=d.thumbnailUrl),void 0!==i.fileLength&&(g.fileLength=i.fileLength),i.thumbnailUrl&&(g.thumbnailUrl=i.thumbnailUrl),re(i,s,"image",g,o)})(t,this.buildMessageSenderOrThrow(),this.getClientOrThrow().getMessageCreationOptions())}createFileMessage(e){return((e,t)=>{const r=_.validateOrThrow(K,e),a=Z(t),i=J(),s=ee(r.originalUrl,r.data);r.data&&l.set(i,r.data);const o={url:s,filename:r.filename,filetype:r.filetype};return void 0!==r.fileSize&&(o.fileSize=r.fileSize),void 0!==r.fileLength&&(o.fileLength=r.fileLength),re(r,a,"file",o,i)})(e,this.buildMessageSenderOrThrow())}createVoiceMessage(e){return((e,t)=>{const r=_.validateOrThrow(j,e),a=Z(t),i=J(),s=ee(r.originalUrl,r.data);r.data&&l.set(i,r.data);const o={url:s,filename:r.filename,filetype:r.filetype,duration:r.duration};return void 0!==r.fileLength&&(o.fileLength=r.fileLength),re(r,a,"voice",o,i)})(e,this.buildMessageSenderOrThrow())}createVideoMessage(e){return((e,t)=>{const r=_.validateOrThrow(H,e),a=Z(t),i=J(),s=ee(r.originalUrl,r.data);r.data&&l.set(i,r.data);const o={url:s,filename:r.filename,filetype:r.filetype,duration:r.duration};return void 0!==r.width&&(o.width=r.width),void 0!==r.height&&(o.height=r.height),void 0!==r.fileLength&&(o.fileLength=r.fileLength),r.thumbnailUrl&&(o.thumbnailUrl=r.thumbnailUrl),re(r,a,"video",o,i)})(e,this.buildMessageSenderOrThrow())}createLocationMessage(e){return((e,t)=>{const r=_.validateOrThrow(X,e),a=Z(t),i={latitude:r.latitude,longitude:r.longitude};return r.address&&(i.address=r.address),r.buildingName&&(i.buildingName=r.buildingName),re(r,a,"location",i)})(e,this.buildMessageSenderOrThrow())}createCmdMessage(e){return((e,t)=>{const r=_.validateOrThrow(Q,e),a=Z(t),i={action:r.action};return void 0!==r.deliverOnlineOnly&&(i.deliverOnlineOnly=r.deliverOnlineOnly),re(r,a,"cmd",i)})(e,this.buildMessageSenderOrThrow())}createCustomMessage(e){return((e,t)=>{const r=_.validateOrThrow(W,e),a=Z(t),i={event:r.event};return r.params&&(i.params=r.params),re(r,a,"custom",i)})(e,this.buildMessageSenderOrThrow())}createCombineMessage(e){return ae(e,this.buildMessageSenderOrThrow())}getConversationList(t){if(void 0!==t?.mark&&(!Number.isInteger(t.mark)||t.mark<0||t.mark>19))throw new e.ValidationError("filter.mark must be an integer between 0 and 19",{code:e.ERROR_CODES.VALIDATION_INVALID_FORMAT,details:{fields:[{path:"filter.mark",message:"filter.mark must be an integer between 0 and 19",rule:"invalid_format"}]}});const a=(this.getClientOrThrow().getCacheManager()?.loadSessionList()??[]).filter(e=>null!==e.lastMessage&&((void 0===t?.isPinned||e.isPinned===t.isPinned)&&!(void 0!==t?.mark&&!r.hasSessionMark(e,t.mark)))).map(r.toConversationItem);return this.getClientOrThrow().markConversationAccess(a.map(e=>({conversationId:e.conversationId,type:e.conversationType}))),a}setCurrentConversation(e){this.validateConversationLocator(e),this.getClientOrThrow().getCacheManager()?.setCurrentConversation({conversationId:e.conversationId,type:e.conversationType})}resetCurrentConversation(){this.getClientOrThrow().getCacheManager()?.resetCurrentConversation()}getCurrentConversation(){const e=this.getClientOrThrow().getCacheManager()?.getCurrentConversation()??null;return e?{conversationId:e.conversationId,conversationType:e.type}:null}refreshSessionList(e){return this.getClientOrThrow().refreshSessionList(e)}async deleteConversation(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>{const a=M(t),i=R(r.conversationId,"params.conversationId"),s=C(r.conversationType,"params.conversationType"),o=r.deleteRoamingMessages??!1;if("boolean"!=typeof o)throw f("params.deleteRoamingMessages","params.deleteRoamingMessages must be a boolean");return await e.request(`/${a.orgName}/${a.appName}/user/${a.encodedUserId}/user_channel?resource=${a.encodedResource}`,{method:"DELETE",body:{channel:i,type:"groupChat"===s?"groupChat":T(s),delete_roam:o},operation:"deleteConversation"}),{conversationId:i,conversationType:s,operation:"delete"}})(this.getRestClient(t),t,e),a=this.getClientOrThrow(),i=a.getCacheManager()?.deleteConversation({conversationId:r.conversationId,type:r.conversationType});return i?.changed&&a.emitConversationListUpdate("local"),r}async setConversationPinned(e){const r=this.getRestContextOrThrow(),a=await(async(e,r,a)=>{const i=M(r),s=R(a.conversationId,"params.conversationId"),o=C(a.conversationType,"params.conversationType");if("boolean"!=typeof a.pinned)throw f("params.pinned","params.pinned must be a boolean");const n="groupChat"===o?"groupChat":T(o),d=a.pinned?await e.post(`/${i.orgName}/${i.appName}/sdk/user/${i.encodedUserId}/user_channel/top?resource=${i.encodedResource}`,{type:n,to:s},{operation:"setConversationPinned"}):await e.delete(`/${i.orgName}/${i.appName}/sdk/user/${i.encodedUserId}/user_channel/top?type=${encodeURIComponent(n)}&to=${encodeURIComponent(s)}&resource=${i.encodedResource}`,{operation:"setConversationPinned"}),l=t.isRecord(d)&&t.isRecord(d.data)?d.data:{};return{conversationId:s,conversationType:o,operation:"setPinned",isPinned:"boolean"==typeof l.is_top?l.is_top:a.pinned,pinnedTime:"number"==typeof l.update_top_status_time?l.update_top_status_time:a.pinned?Date.now():0}})(this.getRestClient(r),r,e),i=this.getClientOrThrow().getCacheManager(),s=i?.applyConversationPinnedMutation({conversationId:a.conversationId,type:a.conversationType,isPinned:a.isPinned??e.pinned,pinnedTime:a.pinnedTime});return s?.changed&&this.getClientOrThrow().emitConversationListUpdate("local"),a}async addConversationMark(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>A(e,t,r,!0))(this.getRestClient(t),t,e),a=this.getClientOrThrow().getCacheManager(),i=a?.applyConversationMarkMutation({conversations:[...r.succeeded.map(e=>({...e,applied:!0})),...r.failed.map(e=>({...e,applied:!1}))],mark:r.mark,operation:r.operation});return i?.changed&&this.getClientOrThrow().emitConversationListUpdate("local"),r}async removeConversationMark(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>A(e,t,r,!1))(this.getRestClient(t),t,e),a=this.getClientOrThrow().getCacheManager(),i=a?.applyConversationMarkMutation({conversations:[...r.succeeded.map(e=>({...e,applied:!0})),...r.failed.map(e=>({...e,applied:!1}))],mark:r.mark,operation:r.operation});return i?.changed&&this.getClientOrThrow().emitConversationListUpdate("local"),r}async clearAllMessagesAndConversations(){const e=this.getRestContextOrThrow();await(async(e,t)=>{const r=M(t);await e.post(`/${r.orgName}/${r.appName}/sdk/message/roaming/user/${r.encodedUserId}/delete/all?resource=${r.encodedResource}`,void 0,{operation:"clearAllMessagesAndConversations"})})(this.getRestClient(e),e);const t=this.getClientOrThrow(),r=t.getCacheManager()?.clearConversations();r?.changed&&t.emitConversationListUpdate("local")}async pinMessage(e){const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>D(e,t,r,!0))(this.getRestClient(t),t,e))}async unpinMessage(e){const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>D(e,t,r,!1))(this.getRestClient(t),t,e))}async getPinnedMessageList(e){const r=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,r,a)=>{const i=M(r),s=R(a.conversationId,"params.conversationId"),o=C(a.conversationType,"params.conversationType"),n=await e.get(`/${i.orgName}/${i.appName}/sdk/user/${i.encodedUserId}/user_channel/pin?to=${encodeURIComponent(s)}&type=${encodeURIComponent(T(o))}&limit=${String(20)}`,{operation:"getPinnedMessageList"}),d=t.isRecord(n)&&t.isRecord(n.data)?n.data:{};return{items:(Array.isArray(d.msg_infos)?d.msg_infos:[]).reduce((e,a)=>{if(!t.isRecord(a))return e;const i="string"==typeof a.pin_msg_id?a.pin_msg_id:t.isRecord(a.message)&&"string"==typeof a.message.id?a.message.id:"";if(!i)return e;const n="number"==typeof a.pin_opt_at?a.pin_opt_at:0,d=S(a.message,{messageId:i,conversationId:s,conversationType:o,currentUserId:r.userId,timestamp:n});return d?(e.push({messageId:i,conversationId:s,conversationType:o,operatorId:"string"==typeof a.pin_operator?a.pin_operator:void 0,pinnedAt:n,message:d}),e):e},[])}})(this.getRestClient(r),r,e))}addEventHandler(e,t){this.getEventContextOrThrow().addEventHandler(e,t)}removeEventHandler(e){this.getEventContextOrThrow().removeEventHandler(e)}async clearConversationUnreadMessageCount(t){this.validateUnreadConversationLocator(t);const r=this.getClientOrThrow(),a=r.getCacheManager()?.clearConversationUnreadMessageCount({conversationId:t.conversationId,type:t.conversationType});a?.changed&&r.emitConversationListUpdate("local");try{await this.requireConnectedClient().sendMessageAction({kind:"clearConversationUnreadMessageCount",conversationId:t.conversationId,conversationType:t.conversationType,sendToPeer:!1},(e,t)=>this.buildActionError(e,t))}catch(i){if(!a?.matched)throw i;e.logger.warn("Conversation unread remote sync failed after local clear",{conversationId:t.conversationId,conversationType:t.conversationType,error:i})}}async sendMessageReadReceipts(e){this.validateSendMessageReadReceiptsParams(e),await this.requireConnectedClient().sendMessageAction({kind:"sendMessageReadReceipts",conversationId:e.conversationId,conversationType:e.conversationType,messageIds:e.messageIds},(e,t)=>this.buildActionError(e,t))}async clearAllConversationUnreadMessageCount(){await this.requireConnectedClient().sendMessageAction({kind:"clearAllConversationUnreadMessageCount",conversationId:this.getCurrentUserIdOrThrow(),conversationType:"singleChat",sendToPeer:!1,clearAllUnreadMessageCount:!0},(e,t)=>this.buildActionError(e,t));const e=this.getClientOrThrow(),t=e.getCacheManager()?.clearAllConversationUnreadMessageCount();t?.changed&&e.emitConversationListUpdate("local")}async recallMessage(e){this.validateConversationLocator(e),this.requireNonEmptyString(e.messageId,"messageId"),await this.requireConnectedClient().sendMessageAction({kind:"recall",conversationId:e.conversationId,conversationType:e.conversationType,messageId:e.messageId,ext:e.ext},(e,t)=>this.buildActionError(e,t));return{messageId:e.messageId,conversationId:e.conversationId,conversationType:e.conversationType,timestamp:Date.now()}}async modifyMessage(t){if(this.validateConversationLocator(t),this.requireNonEmptyString(t.messageId,"messageId"),"text"!==t.message.type&&"custom"!==t.message.type)throw new e.ValidationError("only text and custom messages are editable",{code:e.ERROR_CODES.OPERATION_UNSUPPORTED});await this.requireConnectedClient().sendMessageAction({kind:"update",conversationId:t.conversationId,conversationType:t.conversationType,messageId:t.messageId,body:t.message.body,messageType:t.message.type,ext:t.message.ext},(e,t)=>this.buildActionError(e,t));const r=Date.now(),a=this.getCurrentUserIdOrThrow(),i={operatorId:a,operationCount:1,operationTime:r};return{msgServerId:t.messageId,msgLocalId:"",from:a,to:t.conversationId,sender:{userId:a},conversationId:t.conversationId,conversationType:t.conversationType,type:t.message.type,sendStatus:"sent",ext:t.message.ext,timestamp:r,body:t.message.body,direct:"SEND",modifiedInfo:i}}async getHistoryMessages(e){if(this.validateConversationLocator(e),void 0!==e.pageSize&&(!Number.isInteger(e.pageSize)||e.pageSize<=0))throw this.buildValidationError("pageSize must be a positive integer","pageSize");const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r,a)=>{const i=`${ie(t)}/users/${t.userId}/messageroaming`,s=await e.post(i,{queue:"singleChat"===r.conversationType?`${r.conversationId}@easemob.com`:`${r.conversationId}@conference.easemob.com`,start:r.cursor&&r.cursor.length>0?r.cursor:-1,pull_number:r.pageSize??20,is_positive:"down"===r.searchDirection,msgType:(r.messageTypes??[]).join(","),end:-1,startTime:r.startTime??null,endTime:r.endTime??null,userIds:"singleChat"===r.conversationType?null:r.senderIds&&r.senderIds.length>0?r.senderIds:null},{operation:"getHistoryMessages"}),o=ge(s,"getHistoryMessages"),n=Array.isArray(o.msgs)?o.msgs:[],d=[];for(const l of n){if(!oe(l)||"string"!=typeof l.msg||0===l.msg.length)continue;const e=a(se(l.msg));e&&d.push(e)}return{items:d,cursor:le(o.next_key),hasMore:!0!==o.is_last&&d.length>0}})(this.getRestClient(t),t,e,e=>this.getClientOrThrow().decodeServerMessageMeta(e)))}async searchMessages(e){const t=_.validateOrThrow(xe,e),r=this.getRestContextOrThrow();return this.executeRestOperation(()=>_e(this.getRestClient(r),r,t))}async downloadAttachment(e){return this.getClientOrThrow().downloadAttachment(e.message)}async downloadAndParseCombineMessage(e){return this.getClientOrThrow().downloadAndParseCombinePayload(this.resolveDownloadCombineMessageParams(e))}async removeHistoryMessages(e){if(this.validateConversationLocator(e),!e.messageIds&&!e.beforeTimestamp)throw this.buildValidationError("messageIds or beforeTimestamp is required","removeHistoryMessages");if(e.messageIds&&0===e.messageIds.length)throw this.buildValidationError("messageIds cannot be empty","messageIds");if(void 0!==e.beforeTimestamp&&(!Number.isInteger(e.beforeTimestamp)||e.beforeTimestamp<=0))throw this.buildValidationError("beforeTimestamp must be a positive integer","beforeTimestamp");const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>{const a="singleChat"===r.conversationType?"userId":"groupId",i="singleChat"===r.conversationType?"chat":"group",s=encodeURIComponent(t.clientResource),o=r.messageIds?`${ie(t)}/sdk/message/roaming/${i}/user/${t.userId}?${a}=${encodeURIComponent(r.conversationId)}&msgIdList=${encodeURIComponent(r.messageIds.join(","))}&resource=${s}`:`${ie(t)}/sdk/message/roaming/${i}/user/${t.userId}/time?${a}=${encodeURIComponent(r.conversationId)}&delTime=${r.beforeTimestamp}&resource=${s}`;await e.delete(o,{operation:"removeHistoryMessages"})})(this.getRestClient(t),t,e))}async getGroupMessageReadUsers(e){if(this.requireNonEmptyString(e.groupId,"groupId"),this.requireNonEmptyString(e.messageId,"messageId"),void 0!==e.pageSize&&(!Number.isInteger(e.pageSize)||e.pageSize<=0))throw this.buildValidationError("pageSize must be a positive integer","pageSize");const t=this.getRestContextOrThrow(),r=await this.executeRestOperation(()=>(async(e,t,r)=>{const a=o.createQueryParams();a.set("limit",String(r.pageSize??10)),r.cursor&&a.set("key",r.cursor);const i=`${ie(t)}/chatgroups/${encodeURIComponent(r.groupId)}/acks/${encodeURIComponent(r.messageId)}?${a.toString()}`,s=await e.get(i,{operation:"getGroupMessageReadUsers"}),n=ge(s,"getGroupMessageReadUsers"),d=oe(n.group_ack)?n.group_ack:n,l=(Array.isArray(d.userlist)?d.userlist:[]).map(e=>oe(e)&&"string"==typeof e.username?{userId:e.username,user:ce(e.username),ackId:"string"==typeof e.meta_id?e.meta_id:void 0,timestamp:"number"==typeof e.timestamp?e.timestamp:void 0,ackContent:"string"==typeof e.ack_content?e.ack_content:void 0}:null).filter(e=>null!==e);return{groupId:r.groupId,messageId:"string"==typeof n.ackmid?n.ackmid:r.messageId,users:l,count:"number"==typeof d.total?d.total:l.length,cursor:le(d.next_key),hasMore:!0!==d.is_last&&l.length>0}})(this.getRestClient(t),t,e));return await this.hydrateGroupMessageReadUsers(e.groupId,r)}async getGroupMessageReadReceipts(e){this.requireNonEmptyString(e.groupId,"groupId");const t=this.validateMessageIdList(e.messageIds,"messageIds"),r=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=`${ie(t)}/chatgroups/${encodeURIComponent(r.groupId)}/acks/batch`,i=await e.post(a,{messageIds:r.messageIds},{operation:"getGroupMessageReadReceipts"});return ue(i,"getGroupMessageReadReceipts").map(e=>oe(e)&&"string"==typeof e.ackmid&&"number"==typeof e.total?{messageId:e.ackmid,count:e.total}:null).filter(e=>null!==e)})(this.getRestClient(r),r,{groupId:e.groupId.trim(),messageIds:t}))}async addReaction(e){this.validateReactionParams(e);const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>{await e.post(`${ie(t)}/reaction/user/${t.userId}`,{msgId:r.messageId,message:r.reaction},{operation:"addReaction"})})(this.getRestClient(t),t,e))}async removeReaction(e){this.validateReactionParams(e);const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>{const a=`${ie(t)}/reaction/user/${t.userId}?msgId=${encodeURIComponent(r.messageId)}&message=${encodeURIComponent(r.reaction)}`;await e.delete(a,{operation:"removeReaction"})})(this.getRestClient(t),t,e))}async getReactionList(e){if(!e.messageId||Array.isArray(e.messageId)&&0===e.messageId.length)throw this.buildValidationError("messageId is required","messageId");"groupChat"===e.conversationType&&this.requireNonEmptyString(e.groupId??"","groupId");const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=o.createQueryParams(),i="string"==typeof r.messageId?r.messageId:[...r.messageId].join(",");a.set("msgIdList",i),a.set("msgType","groupChat"===r.conversationType?"group":"chat"),r.groupId&&a.set("groupId",r.groupId);const s=await e.get(`${ie(t)}/reaction/user/${t.userId}?${a.toString()}`,{operation:"getReactionList"});return ue(s,"getReactionList").map(e=>{if(!oe(e)||"string"!=typeof e.msgId)return null;const t=Array.isArray(e.reactionList)?e.reactionList:[];return{messageId:e.msgId,reactions:t.map(e=>oe(e)&&"string"==typeof e.reaction?{reaction:e.reaction,count:"number"==typeof e.count?e.count:0,isAddedBySelf:!0===e.state,userIds:Array.isArray(e.userList)?e.userList.filter(e=>"string"==typeof e):[]}:null).filter(e=>null!==e)}}).filter(e=>null!==e)})(this.getRestClient(t),t,e))}async getReactionDetail(e){if(this.validateReactionParams(e),void 0!==e.pageSize&&(!Number.isInteger(e.pageSize)||e.pageSize<=0))throw this.buildValidationError("pageSize must be a positive integer","pageSize");const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=o.createQueryParams();a.set("msgId",r.messageId),a.set("message",r.reaction),a.set("cursor",r.cursor??""),a.set("limit",String(r.pageSize??20));const i=await e.get(`${ie(t)}/reaction/user/${t.userId}/detail?${a.toString()}`,{operation:"getReactionDetail"}),s=ge(i,"getReactionDetail"),n=Array.isArray(s.reactionUserList)?s.reactionUserList.map(e=>oe(e)&&"string"==typeof e.userId?{userId:e.userId,user:ce(e.userId),createdAt:"string"==typeof e.createdAt?e.createdAt:void 0}:null).filter(e=>null!==e):[],d=Array.isArray(s.userList)?s.userList.filter(e=>"string"==typeof e).map(e=>({userId:e,user:ce(e)})):[],l=n.length>0?n:d;return{reaction:"string"==typeof s.reaction?s.reaction:r.reaction,count:"number"==typeof s.count?s.count:l.length,isAddedBySelf:!0===s.state,reactionUsers:l,cursor:le(s.cursor),hasMore:le(s.cursor).length>0,createdAt:"string"==typeof s.createdAt?s.createdAt:void 0}})(this.getRestClient(t),t,e))}async getSupportedTranslationLanguages(){const e=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t)=>{const r=await ne(()=>e.get(`${ie(t)}/users/${t.userId}/translate/support/language`,{operation:"getSupportedTranslationLanguages"}));return me(r,"getSupportedTranslationLanguages").map(e=>oe(e)&&"string"==typeof e.code?{code:e.code,name:"string"==typeof e.name?e.name:e.code,nativeName:"string"==typeof e.nativeName?e.nativeName:e.code}:null).filter(e=>null!==e)})(this.getRestClient(e),e))}async translateMessage(t){if("text"!==t.message.type)throw new e.ValidationError("only text messages can be translated",{code:e.ERROR_CODES.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"message.type",message:"must be text",rule:"message_type"}]}});const r=t.message.body.content.trim();if(0===r.length)throw new e.ValidationError("message text is required",{code:e.ERROR_CODES.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"message.body.content",message:"is required",rule:"required"}]}});if(!Array.isArray(t.targetLanguages)||0===t.targetLanguages.length)throw new e.ValidationError("targetLanguages is required",{code:e.ERROR_CODES.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"targetLanguages",message:"is required",rule:"required"}]}});if(t.targetLanguages.some(e=>"string"!=typeof e||0===e.trim().length))throw new e.ValidationError("targetLanguages contains invalid language code",{code:e.ERROR_CODES.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"targetLanguages",message:"contains invalid language code",rule:"language_code"}]}});const a=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(t,r,a)=>{const i=await ne(()=>t.post(`${ie(r)}/users/${r.userId}/translate`,{text:a.text,to:[...a.targetLanguages]},{operation:"translateMessage"})),s=me(i,"translateMessage"),o=oe(s[0])?s[0]:null;if(!o)throw e.createRestBusinessError({apiName:"translateMessage",message:"translateMessage response data is invalid",mapped:!1});const n=Array.isArray(o.translations)?o.translations:[],d=oe(o.detectedLanguage)?o.detectedLanguage:void 0;return{detectedLanguage:d&&"string"==typeof d.language?{language:d.language,score:"number"==typeof d.score?d.score:Number(d.score??0)}:void 0,translations:n.map(e=>oe(e)&&"string"==typeof e.text&&"string"==typeof e.to?{text:e.text,to:e.to}:null).filter(e=>null!==e)}})(this.getRestClient(a),a,{text:r,targetLanguages:t.targetLanguages}))}async voiceMessageToText(e,t){Me(e,t);const r=this.getRestContextOrThrow();return this.executeRestOperation(()=>De(this.getRestClient(r),r,e,t))}async voiceFileToText(t,r){Ae(t,r);const i=this.getRestContextOrThrow(),s=this.getClientOrThrow().getUploadAdapter();if(!s)throw new e.SDKError("Upload capability is missing for current platform",e.ERROR_CODES.UPLOAD_REQUIRED_FIELD_MISSING);return this.executeRestOperation(()=>(async(t,r,i,s)=>{const o=Ae(i,s),n=e.normalizeUploadSource({file:o,fallbackName:be(o)?"voice.amr":void 0,fallbackMimeType:"audio/amr"});try{const a=await t.upload({url:`${r.restBaseUrl}${fe(r)}/speech/recognitions`,headers:{Authorization:`Bearer ${r.token}`,Accept:"application/json",[e.REQUEST_ID_HEADER]:e.createTraceId()},source:n.source,fields:{username:r.userId,...s?.format?{format:s.format}:{},...void 0!==s?.sampleRate?{sampleRate:String(s.sampleRate)}:{},...void 0!==s?.bitsPerSample?{bitsPerSample:String(s.bitsPerSample)}:{},...void 0!==s?.channels?{channels:String(s.channels)}:{}}});let i=a.body;try{i=JSON.parse(a.body)}catch{i=a.body}if(a.status<200||a.status>=300)throw new e.SDKError("Voice-to-text failed",e.ERROR_CODES.VOICE_TO_TEXT_FAILED,{details:{httpStatus:a.status,rawResponse:i}});return{text:Oe(i,"voiceFileToText")}}catch(d){if(d instanceof e.SDKError)throw we(d);throw we(a.mapUploadAdapterError(d))}})(s,i,t,r))}validateConversationLocator(e){if(this.requireNonEmptyString(e.conversationId,"conversationId"),"singleChat"!==e.conversationType&&"groupChat"!==e.conversationType&&"chatRoom"!==e.conversationType)throw this.buildValidationError("conversationType is invalid","conversationType")}validateUnreadConversationLocator(e){if(this.requireNonEmptyString(e.conversationId,"conversationId"),"singleChat"!==e.conversationType&&"groupChat"!==e.conversationType)throw this.buildValidationError("conversationType must be singleChat or groupChat","conversationType")}validateSendMessageReadReceiptsParams(e){if(this.requireNonEmptyString(e.conversationId,"conversationId"),"singleChat"!==e.conversationType&&"groupChat"!==e.conversationType)throw this.buildValidationError("conversationType is invalid","conversationType");if(e.messageIds.length>50)throw this.buildValidationError("messageIds cannot contain more than 50 items","messageIds");return this.validateMessageIdList(e.messageIds,"messageIds")}validateMessageIdList(e,t){if(!Array.isArray(e)||0===e.length)throw this.buildValidationError(`${t} cannot be empty`,t);return e.map((e,r)=>{if("string"!=typeof e||0===e.trim().length)throw this.buildValidationError(`${t}.${r} is invalid`,`${t}.${r}`);return e.trim()})}resolveDownloadCombineMessageParams(t){if("message"in t){if("combine"!==t.message.type)throw new e.ValidationError("message must be a combine message",{code:e.ERROR_CODES.VALIDATION_INVALID_FORMAT});const r=t.message.body;return{url:r.url??"",secret:r.secret,timeoutMs:t.timeoutMs,maxItems:t.maxItems}}return{url:t.url,secret:t.secret,timeoutMs:t.timeoutMs,maxItems:t.maxItems}}validateReactionParams(e){this.requireNonEmptyString(e.messageId,"messageId"),this.requireNonEmptyString(e.reaction,"reaction")}buildActionError(t,r){return t===e.ERROR_CODES.AUTH_NOT_LOGIN||t===e.ERROR_CODES.AUTH_UNAUTHORIZED?new e.AuthenticationError(r??"authentication failed",{code:t}):t===e.ERROR_CODES.CONNECTION_WEBSOCKET_ERROR||t===e.ERROR_CODES.CONNECTION_TIMEOUT?new e.ConnectionError(r??"connection unavailable",{code:t}):107===t||110===t||205===t||500===t||t===e.ERROR_CODES.VALIDATION_REQUIRED||t===e.ERROR_CODES.VALIDATION_INVALID_FORMAT?new e.ValidationError(r??"invalid parameter",{code:t}):t===e.ERROR_CODES.MESSAGE_RECALL_TIME_LIMIT?new e.SDKError(r??"message recall time limit reached",t):t===e.ERROR_CODES.MESSAGE_EDIT_FAILED?new e.SDKError(r??"message update failed",t):t===e.ERROR_CODES.OPERATION_UNSUPPORTED?new e.ValidationError(r??"operation unsupported",{code:t}):new e.SDKError(r??"message action failed",t)}requireNonEmptyString(e,t){if("string"!=typeof e||0===e.trim().length)throw this.buildValidationError(`${t} is required`,t)}buildValidationError(t,r){return new e.ValidationError(t,{code:e.ERROR_CODES.VALIDATION_INVALID_FORMAT,details:{fields:[{path:r,message:t,rule:"required"}]}})}getEventContextOrThrow(){if(!this.eventContext)throw new e.ValidationError("ChatManager is not bound to event context",{code:e.ERROR_CODES.VALIDATION_REQUIRED});return this.eventContext}getClientOrThrow(){if(!this.client)throw new e.ValidationError("ChatManager is not bound to client",{code:e.ERROR_CODES.VALIDATION_REQUIRED});return this.client}getRestContextOrThrow(){return this.getClientOrThrow().getRestContext()}getRestClient(t){return this.restClient&&this.restBaseUrl===t.restBaseUrl&&this.restToken===t.token||(this.restClient=new e.RestClient(t.restBaseUrl,{errorMap:ze,requestAdapter:this.getClientOrThrow().getRequestAdapter?.(),includeRequestId:!0}),this.restClient.setAuthToken(t.token),this.restBaseUrl=t.restBaseUrl,this.restToken=t.token),this.restClient}requireConnectedClient(){const t=this.getClientOrThrow();if(t.getConnectionState()!==n.CONNECTED)throw new e.ConnectionError("client is not connected",{code:e.ERROR_CODES.CONNECTION_WEBSOCKET_ERROR});return t}getCurrentUserIdOrThrow(){const t=this.getClientOrThrow().getCurrentUserId();if(!t)throw new e.AuthenticationError("user is not logged in",{code:e.ERROR_CODES.AUTH_NOT_LOGIN});return t}buildMessageSenderOrThrow(){const e=this.getClientOrThrow(),t=this.getCurrentUserIdOrThrow(),r=e.getCacheManager()?.getUserInfoSummaries([t],!1)[0];return{userId:t,nickname:r?.nickname,avatarUrl:r?.avatarUrl}}async hydrateGroupMessageReadUsers(e,t){const r=this.getClientOrThrow();if(!r.isUserInfoSyncEnabled()||0===t.users.length)return t;const i=r.getCacheManager(),s=await a.resolveGroupUserInfoMap({groupId:e,users:t.users.map(e=>e.user),includeNameCard:!0,cacheManager:i,fetchUserInfos:async({userIds:e})=>{const t=this.getUserInfoReadCapability(r);return t?await t.getUserInfoByUserId({userIds:e}):[]},hydrateGroupNamecards:async(e,t)=>{const a=this.getGroupNamecardHydrationCapability(r);a&&await a.hydrateMessageProfileGroupNamecards(e,t.map(e=>({userId:e})))}});return this.dispatchFetchedUserInfoUpdates(r,s.fetchedUserInfos),{...t,users:t.users.map(e=>{const t=s.usersById.get(e.userId)??e.user;return{...e,user:t}})}}getUserInfoReadCapability(e){const t=e.getManagerByCapability("userInfo:read");return t&&"function"==typeof t.getUserInfoByUserId?t:null}getGroupNamecardHydrationCapability(e){const t=e.getManagerByCapability("group:namecard");return t&&"function"==typeof t.hydrateMessageProfileGroupNamecards?t:null}dispatchFetchedUserInfoUpdates(e,t){if(0===t.length)return;const r=e.getCurrentUserId(),a=t.find(e=>e.userId===r),i=t.filter(e=>e.userId!==r);a&&e.dispatchOwnInfoUpdated(a),e.dispatchUserInfoUpdated(i),t.length>0&&e.refreshConversationDisplayFromUserInfos(t.map(e=>({userId:e.userId})),"profile")}async executeRestOperation(e){try{return await e()}catch(t){throw this.mapRestError(t)}}mapRestError(t){return t instanceof e.ValidationError||t instanceof e.AuthenticationError||t instanceof e.ConnectionError||t instanceof e.NetworkError?t:t instanceof e.RestTransportError?new e.NetworkError(t.message,{code:t.code,details:t.details}):t instanceof e.RestBusinessError||t instanceof e.SDKError?t:new e.SDKError(String(t),e.ERROR_CODES.UNKNOWN)}};$e.key="chatManager";let Ve=$e;exports.ChatManager=Ve,exports.ConnectionEventName={CONNECTING:"onConnecting",CONNECTED:"onConnected",DISCONNECTED:"onDisconnected",RECONNECT_FAILED:"onReconnectFailed",TOKEN_WILL_EXPIRE:"onTokenWillExpire",TOKEN_EXPIRED:"onTokenExpired",OFFLINE_MESSAGE_SYNC_START:"onOfflineMessageSyncStart",OFFLINE_MESSAGE_SYNC_FINISH:"onOfflineMessageSyncFinish"},exports.ConnectionEventReason={LOGIN:"login",RECONNECT:"reconnect",ONLINE:"online",OFFLINE_RECOVER:"offline-recover",HEARTBEAT_FAILED:"heartbeat-failed",SEND_TIMEOUT:"send-timeout",CLOSE:"close",ERROR:"error",TIMEOUT:"timeout",LIMIT:"limit",OFFLINE:"offline",TOKEN_EXPIRED:"token-expired"},exports.ConnectionStatus=n,exports.InternalEventName={SEND_TIMEOUT:"onSendTimeout",GROUP_NOTIFY:"onGroupNotify",CHATROOM_NOTIFY:"onChatRoomNotify",CHAT_THREAD_NOTIFY:"onChatThreadNotify",USER_INFO_NOTIFY:"onUserInfoNotify",MESSAGE_SENT:"__internal:onMessageSent"},exports.MAX_COMBINE_MESSAGE_COUNT=300,exports.Validator=_,exports.attachmentFileStore=l,exports.calculateCombineLevel=I,exports.copyCombineCompatibleTextSidecar=(e,t)=>{const r=d.get(e);r&&d.set(t,r)},exports.createLocalFileUrl=c,exports.ensureCombineItemLimit=y,exports.ensureCombineLevel=E,exports.generateMsgLocalId=g,exports.getCombineCompatibleTextSidecar=e=>d.get(e),exports.validateCombineMessageList=v;
@@ -1,2 +0,0 @@
1
- import{g as e,V as t,E as r,p as a,d as s,c as i,R as n,b as o,n as d,e as l,f as c,S as g,A as u,U as m,l as p,C as h,h as y,N as v,i as I,m as f,j as b}from"./common-BvlDAw4a.js";import{i as T,s as _}from"./cache-utils-B99glc0H.js";import{h as C,t as E}from"./session-list-query-Cvr6rlme.js";import{m as L,r as w}from"./group-user-info-resolver-DMccCqez.js";import{ZodError as O,z as R}from"zod";import{l as N}from"./light-DImBnNes.js";import{c as M}from"./query-params-Bu3Xq4b6.js";const A={DISCONNECTED:"disconnected",CONNECTING:"connecting",CONNECTED:"connected",RECONNECTING:"reconnecting",RECONNECT_FAILED:"reconnectFailed"},U={CONNECTING:"onConnecting",CONNECTED:"onConnected",DISCONNECTED:"onDisconnected",RECONNECT_FAILED:"onReconnectFailed",TOKEN_WILL_EXPIRE:"onTokenWillExpire",TOKEN_EXPIRED:"onTokenExpired",OFFLINE_MESSAGE_SYNC_START:"onOfflineMessageSyncStart",OFFLINE_MESSAGE_SYNC_FINISH:"onOfflineMessageSyncFinish"},S={SEND_TIMEOUT:"onSendTimeout",GROUP_NOTIFY:"onGroupNotify",CHATROOM_NOTIFY:"onChatRoomNotify",CHAT_THREAD_NOTIFY:"onChatThreadNotify",USER_INFO_NOTIFY:"onUserInfoNotify",MESSAGE_SENT:"__internal:onMessageSent"},x={LOGIN:"login",RECONNECT:"reconnect",ONLINE:"online",OFFLINE_RECOVER:"offline-recover",HEARTBEAT_FAILED:"heartbeat-failed",SEND_TIMEOUT:"send-timeout",CLOSE:"close",ERROR:"error",TIMEOUT:"timeout",LIMIT:"limit",OFFLINE:"offline",TOKEN_EXPIRED:"token-expired"},D=/* @__PURE__ */new WeakMap,$=e=>D.get(e),k=(e,t)=>{const r=D.get(e);r&&D.set(t,r)};const V=new class{constructor(){this.store=/* @__PURE__ */new Map}set(e,t){e&&this.store.set(e,t)}get(e){if(e)return this.store.get(e)}consume(e){const t=this.get(e);return t&&this.store.delete(e),t}delete(e){e&&this.store.delete(e)}clear(){this.store.clear()}},P=e=>{if((e=>"undefined"!=typeof File&&e instanceof File)(e)){if("undefined"==typeof URL||"function"!=typeof URL.createObjectURL)return;return URL.createObjectURL(e)}return(e=>"object"==typeof e&&null!==e&&"path"in e&&"string"==typeof e.path)(e)?e.path:(e=>"object"==typeof e&&null!==e&&"uri"in e&&"string"==typeof e.uri)(e)?e.uri:void 0},q=()=>{const t=e().crypto;return t&&"function"==typeof t.randomUUID?t.randomUUID():`${Date.now()}-${Math.random().toString(16).slice(2)}`},F=300,G=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),B=(e,r,a)=>{throw new t(e,{code:a,details:{fields:[{path:r,message:e,rule:"invalid_format"}]}})},z=e=>{if("combine"!==e.type)return 0;const t=e.combineLevel;return"number"==typeof t?t:G(e.body)&&"number"==typeof e.body.combineLevel?e.body.combineLevel:0},j=(e,t)=>{if(e.sender.userId||B(`messageList[${t}] sender.userId is required`,`messageList[${t}].sender.userId`,r.COMBINE_INVALID_INPUT),e.conversationId&&["singleChat","groupChat","chatRoom"].includes(e.conversationType)||B(`messageList[${t}] conversation is invalid`,`messageList[${t}].conversationId`,r.COMBINE_INVALID_INPUT),(!Number.isInteger(e.timestamp)||e.timestamp<=0)&&B(`messageList[${t}] timestamp must be positive integer`,`messageList[${t}].timestamp`,r.COMBINE_INVALID_INPUT),G(e.body)||B(`messageList[${t}] body must be object`,`messageList[${t}].body`,r.COMBINE_INVALID_INPUT),"combine"===e.type){const a=z(e);(!Number.isInteger(a)||a<0)&&B(`messageList[${t}] combineLevel is invalid`,`messageList[${t}].combineLevel`,r.COMBINE_INVALID_INPUT),a>10&&B(`messageList[${t}] combineLevel exceeds limit`,`messageList[${t}].combineLevel`,r.COMBINE_LEVEL_EXCEEDED)}},H=(e,t=300)=>{(!Number.isInteger(e)||e<=0)&&B("messageList must not be empty","messageList",r.COMBINE_INVALID_INPUT),(!Number.isInteger(t)||t<=0||t>300)&&B("max items is invalid","maxItems",r.COMBINE_INVALID_INPUT),e>t&&B(`messageList max length is ${t}`,"messageList",r.COMBINE_ITEM_LIMIT_EXCEEDED)},X=e=>{H(e.length);for(let t=0;t<e.length;t+=1){const a=e[t];void 0!==a?j(a,t):B(`messageList[${t}] is required`,`messageList[${t}]`,r.COMBINE_INVALID_INPUT)}},K=e=>{let t=0;for(const r of e){if("combine"!==r.type)continue;const e=z(r);e>t&&(t=e)}return t+1},Q=e=>{(!Number.isInteger(e)||e<=0)&&B("combineLevel must be positive integer","combineLevel",r.COMBINE_INVALID_INPUT),e>10&&B("combineLevel must be <= 10","combineLevel",r.COMBINE_LEVEL_EXCEEDED)};class W{static validate(e,a){try{return{success:!0,data:e.parse(a)}}catch(s){if(s instanceof O){const e=s.errors.map(e=>({path:e.path.length>0?e.path.join("."):"root",message:e.message,rule:e.code})),a=`Validation failed: ${e.map(e=>`${e.path}: ${e.message}`).join("; ")}`,i=s.errors.some(e=>"invalid_type"===e.code&&"undefined"===e.received)?r.VALIDATION_REQUIRED:r.VALIDATION_INVALID_FORMAT;return{success:!1,error:new t(a,{code:i,details:{fields:e}})}}return{success:!1,error:new t("Unknown validation error",{code:r.VALIDATION_UNKNOWN,details:{fields:[]}})}}}static validateOrThrow(e,a){const s=this.validate(e,a);if(s.success&&void 0!==s.data)return s.data;if(s.error)throw s.error;throw new t("Unknown validation error",{code:r.VALIDATION_UNKNOWN,details:{fields:[]}})}static safeParse(e,t){return this.validate(e,t)}}const Y=(e,a)=>new t(a,{code:r.VALIDATION_INVALID_FORMAT,details:{fields:[{path:e,message:a,rule:"invalid_format"}]}}),Z=(e,a)=>{if("string"!=typeof e||0===e.trim().length)throw(e=>new t(`${e} is required`,{code:r.VALIDATION_REQUIRED,details:{fields:[{path:e,message:`${e} is required`,rule:"required"}]}}))(a);return e.trim()},J=e=>`mark_${String(e)}`,ee=(e,t)=>{if("singleChat"===e||"groupChat"===e||"chatRoom"===e)return e;throw Y(t,`${t} must be one of singleChat, groupChat, chatRoom`)},te=e=>"singleChat"===e?"chat":"groupChat"===e?"groupchat":"chatroom",re=e=>"string"==typeof e&&e.length>0?e:void 0,ae=e=>{if("number"==typeof e&&Number.isFinite(e))return e;if("string"==typeof e&&e.length>0){const t=Number(e);return Number.isFinite(t)?t:void 0}},se=e=>T(e)?e:void 0,ie=(e,t)=>{const r=se(e);if(!r)return;const a=(e=>"string"==typeof e?_(e,{}):se(e)??{})(r.payload),s=Array.isArray(a.bodies)?a.bodies:[],i=se(s[0])??se(a.body),n=(e=>"txt"===e||"text"===e?"text":"custom"===e?"custom":"cmd"===e?"cmd":"image"===e||"file"===e||"voice"===e||"video"===e||"location"===e||"combine"===e?e:null)(i?.type??a.type);if(!i||!n)return;const o=((e,t)=>{if("text"===e)return{content:re(t.msg)??re(t.content)??""};if("custom"===e){const e=se(t.customExts)??se(t.params)??{},r={};for(const[t,a]of Object.entries(e))"string"==typeof a&&(r[t]=a);return{event:re(t.customEvent)??re(t.event)??"",params:r}}if("cmd"===e)return{action:re(t.action)??""};if("image"===e){const e=re(t.url)??re(t.remotePath)??"";return{localUrl:"",filename:re(t.filename)??re(t.displayName),filetype:re(t.filetype)??"application/octet-stream",width:ae(t.width),height:ae(t.height),isGif:!0===t.isGif||1===t.subType,isOriginalImage:!0===t.isOriginalImage,originalImageUrl:e,bigImageUrl:re(t.bigImageUrl),thumbnailUrl:re(t.thumbnailUrl)??re(t.thumbnailRemotePath),secret:re(t.secret)??re(t.secretKey),fileLength:ae(t.fileLength)}}return"file"===e?{url:re(t.url)??re(t.remotePath),filename:re(t.filename)??re(t.displayName),filetype:re(t.filetype)??"application/octet-stream",fileSize:ae(t.fileSize),fileLength:ae(t.fileLength),secret:re(t.secret)??re(t.secretKey)}:"voice"===e?{url:re(t.url)??re(t.remotePath),filename:re(t.filename)??re(t.displayName),filetype:re(t.filetype)??"application/octet-stream",duration:ae(t.duration)??0,fileLength:ae(t.fileLength),secret:re(t.secret)??re(t.secretKey)}:"video"===e?{url:re(t.url)??re(t.remotePath),filename:re(t.filename)??re(t.displayName),filetype:re(t.filetype)??"application/octet-stream",duration:ae(t.duration)??0,width:ae(t.width),height:ae(t.height),fileLength:ae(t.fileLength),secret:re(t.secret)??re(t.secretKey),thumbnailUrl:re(t.thumbnailUrl)??re(t.thumbnailRemotePath)}:"location"===e?{latitude:ae(t.latitude)??0,longitude:ae(t.longitude)??0,address:re(t.address),buildingName:re(t.buildingName)}:null})(n,i);if(!o)return;const d=re(a.from)??re(r.from)??"",l=re(a.to)??t.conversationId,c=se(a.sender),g={userId:re(c?.userId)??d,nickname:re(c?.nickname),avatarUrl:re(c?.avatarUrl)},u=se(a.ext)??{},m=(e=>{const t=se(e);if(!t)return;const r=re(t.operatorId)??re(t.operator),a=ae(t.operationCount)??ae(t.count),s=ae(t.operationTime)??ae(t.edit_time);return r&&void 0!==a&&void 0!==s?{operatorId:r,operationCount:a,operationTime:s}:void 0})(a.modifiedInfo??se(a.meta)?.edit_msg);return{msgServerId:re(r.id)??t.messageId,msgLocalId:re(r.msgLocalId)??"",from:d,to:l,sender:g,conversationId:t.conversationId,conversationType:t.conversationType,type:n,sendStatus:"sent",ext:u,timestamp:ae(r.timestamp)??t.timestamp,body:o,direct:d===t.currentUserId?"SEND":"RECEIVE",...m?{modifiedInfo:m}:{}}},ne=e=>`${e.conversationType}:${e.conversationId}`,oe=e=>{const{orgName:t,appName:r}=a(e.appKey);return{orgName:t,appName:r,encodedUserId:encodeURIComponent(e.userId),encodedResource:encodeURIComponent(e.clientResource)}},de=async(e,t,r,a)=>{const s=oe(t),i=(e=>{const t=e,r=t.conversations;if(void 0!==r){if(!Array.isArray(r)||0===r.length)throw Y("params.conversations","params.conversations must be a non-empty array");return r.map((e,t)=>{if(!T(e))throw Y(`params.conversations.${String(t)}`,`params.conversations.${String(t)} must be an object`);return{conversationId:Z(e.conversationId,`params.conversations.${String(t)}.conversationId`),conversationType:ee(e.conversationType,`params.conversations.${String(t)}.conversationType`)}})}return[{conversationId:Z(t.conversationId,"params.conversationId"),conversationType:ee(t.conversationType,"params.conversationType")}]})(r),n=((e,t)=>{if("number"!=typeof e||!Number.isInteger(e)||e<0||e>19)throw Y(t,`${t} must be an integer between 0 and 19`);return e})(r.mark,"params.mark"),o=await e.request(`/${s.orgName}/${s.appName}/sdk/user/${s.encodedUserId}/user_channels/mark?resource=${s.encodedResource}`,{method:a?"POST":"DELETE",body:{mark:J(n),targets:i.map(e=>({to:e.conversationId,type:te(e.conversationType)}))},operation:a?"addConversationMark":"removeConversationMark"}),d=(e=>{if(!Array.isArray(e))/* @__PURE__ */
2
- return new Set;const t=/* @__PURE__ */new Set;return e.forEach(e=>{if(!T(e))return;const r="string"==typeof e.to?e.to.trim():"",a=(e=>"chat"===e||"singleChat"===e?"singleChat":"groupchat"===e||"groupChat"===e?"groupChat":"chatroom"===e||"chatRoom"===e?"chatRoom":null)(e.type);r&&a&&t.add(ne({conversationId:r,conversationType:a}))}),t})((T(o)&&T(o.data)?o.data:{}).ignore),l=[],c=[];for(const g of i){const e={conversationId:g.conversationId,conversationType:g.conversationType};d.has(ne(g))?c.push({...e,reason:"ignored_by_server"}):l.push(e)}return{succeeded:l,failed:c,mark:n,operation:a?"addMark":"removeMark"}},le=async(e,t,r,a)=>{const s=oe(t),i=Z(r.conversationId,"params.conversationId"),n=ee(r.conversationType,"params.conversationType"),o=Z(r.messageId,"params.messageId");return await e.request(`/${s.orgName}/${s.appName}/sdk/user/${s.encodedUserId}/user_channel/pin?resource=${s.encodedResource}`,{method:a?"POST":"DELETE",body:{to:i,type:te(n),pin_msg_id:o},operation:a?"pinMessage":"unpinMessage"}),{conversationId:i,conversationType:n,messageId:o,operation:a?"pin":"unpin"}},ce=R.enum(["singleChat","groupChat","chatRoom"]),ge=R.record(R.unknown()).refine(e=>(e=>"object"==typeof e&&null!==e&&!Array.isArray(e))(e),"ext must be an object").refine(e=>(e=>{try{return JSON.stringify(e),!0}catch{return!1}})(e),"ext must be JSON serializable"),ue=R.object({path:R.string().min(1,"data.path is required"),size:R.number().optional(),name:R.string().optional(),type:R.string().optional()}),me=R.object({uri:R.string().min(1,"data.uri is required"),size:R.number().optional(),name:R.string().optional(),type:R.string().optional()}),pe="undefined"!=typeof File?R.instanceof(File):R.never(),he=R.union([pe,ue,me]),ye=R.object({conversationId:R.string().min(1,"conversationId is required"),conversationType:ce,ext:ge.optional(),timestamp:R.number().int().positive("timestamp must be a positive integer").optional(),receiverList:R.array(R.string().min(1,"receiverList item is required")).nonempty("receiverList must not be empty").optional(),deliverOnlineOnly:R.boolean().optional(),webhookEnv:R.string().optional(),priority:R.enum(["high","normal","low"]).optional(),needReadReceipt:R.boolean().optional(),isChatThread:R.boolean().optional()}),ve=R.object({type:R.string().min(1,"messageList.type is required"),sender:R.object({userId:R.string().min(1,"messageList.sender.userId is required"),nickname:R.string().optional(),avatarUrl:R.string().optional()}),conversationId:R.string().min(1,"messageList.conversationId is required"),conversationType:ce,timestamp:R.number().int().positive("messageList.timestamp must be positive"),body:R.record(R.unknown()),combineLevel:R.number().int().min(0).max(10).optional()}).passthrough(),Ie=e=>e.superRefine((e,t)=>{e.receiverList&&"singleChat"===e.conversationType&&t.addIssue({code:R.ZodIssueCode.custom,message:"receiverList is only allowed for group or chat room conversation",path:["receiverList"]}),e.isChatThread&&"groupChat"!==e.conversationType&&t.addIssue({code:R.ZodIssueCode.custom,message:"isChatThread is only allowed for group conversation",path:["isChatThread"]}),e.needReadReceipt&&"chatRoom"===e.conversationType&&t.addIssue({code:R.ZodIssueCode.custom,message:"needReadReceipt is not allowed for chatRoom conversation",path:["needReadReceipt"]})}),fe=Ie(ye.extend({content:R.string().min(1,"content is required"),targetLanguages:R.array(R.string().min(1)).optional()})),be=Ie(ye.extend({originalUrl:R.string().min(1,"originalUrl is required").optional(),filename:R.string().min(1,"filename is required").optional(),filetype:R.string().min(1,"filetype is required").optional(),width:R.number().positive("width must be positive").optional(),height:R.number().positive("height must be positive").optional(),isGif:R.boolean().optional(),isOriginalImage:R.boolean().optional(),fileLength:R.number().positive("fileLength must be positive").optional(),data:he.optional(),thumbnailUrl:R.string().min(1).optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),Te=Ie(ye.extend({originalUrl:R.string().min(1,"originalUrl is required").optional(),filename:R.string().min(1,"filename is required").optional(),filetype:R.string().min(1,"filetype is required").optional(),fileSize:R.number().positive("fileSize must be positive").optional(),fileLength:R.number().positive("fileLength must be positive").optional(),data:he.optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),_e=Ie(ye.extend({originalUrl:R.string().min(1,"originalUrl is required").optional(),filename:R.string().min(1,"filename is required").optional(),filetype:R.string().min(1,"filetype is required").optional(),duration:R.number().positive("duration must be positive"),fileLength:R.number().positive("fileLength must be positive").optional(),data:he.optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),Ce=Ie(ye.extend({originalUrl:R.string().min(1,"originalUrl is required").optional(),filename:R.string().min(1,"filename is required").optional(),filetype:R.string().min(1,"filetype is required").optional(),duration:R.number().positive("duration must be positive"),width:R.number().positive("width must be positive").optional(),height:R.number().positive("height must be positive").optional(),fileLength:R.number().positive("fileLength must be positive").optional(),thumbnailUrl:R.string().min(1).optional(),data:he.optional()}).refine(e=>Boolean(e.originalUrl||e.data),{message:"originalUrl or data is required",path:["originalUrl"]})),Ee=Ie(ye.extend({latitude:R.number(),longitude:R.number(),address:R.string().min(1).optional(),buildingName:R.string().min(1).optional()})),Le=Ie(ye.extend({action:R.string().min(1,"action is required")})),we=Ie(ye.extend({event:R.string().min(1,"event is required"),params:R.record(R.string()).optional()})),Oe=Ie(ye.extend({title:R.string().min(1,"title is required"),summary:R.string().min(1,"summary is required"),compatibleText:R.string().min(1).optional(),messageList:R.array(ve).min(1,"messageList must not be empty").max(300,"messageList max length is 300")})),Re=e=>{const a=e?.userId?.trim();if(!a)throw new t("sender.userId is required",{code:r.VALIDATION_REQUIRED,details:{fields:[{path:"sender.userId",message:"sender.userId is required",rule:"required"}]}});return{userId:a,nickname:e?.nickname,avatarUrl:e?.avatarUrl}},Ne=()=>q(),Me=(e,a)=>{if(e)return e;if(!a)throw new t("url or data is required",{code:r.VALIDATION_REQUIRED,details:{fields:[{path:"url",message:"url or data is required",rule:"required"}]}});const s=P(a);if(!s)throw new t("Failed to resolve local url",{code:r.VALIDATION_INVALID_FORMAT,details:{fields:[{path:"url",message:"Failed to resolve local url",rule:"invalid_format"}]}});return s},Ae=e=>!!e.isGif||(e.isOriginalImage??!1),Ue=(e,t,r,a,s)=>({msgServerId:"",msgLocalId:s??q(),from:t.userId,to:e.conversationId,sender:t,conversationId:e.conversationId,conversationType:e.conversationType,type:r,sendStatus:"sending",ext:e.ext??{},timestamp:e.timestamp??Date.now(),body:a,direct:"SEND",isOnline:!0,receiverList:e.receiverList,deliverOnlineOnly:e.deliverOnlineOnly,webhookEnv:e.webhookEnv,priority:e.priority,needReadReceipt:e.needReadReceipt,isPeerRead:"singleChat"!==e.conversationType&&void 0,isChatThread:e.isChatThread}),Se=(e,t)=>{const r=W.validateOrThrow(Oe,e),a=r.messageList,s=Re(t);X(a);const i=K(a);Q(i);const n={title:r.title,summary:r.summary,messageList:a,filename:"combine",filetype:"application/octet-stream",combineLevel:i},o=Ue(r,s,"combine",n);return((e,t)=>{t&&D.set(e,t)})(o,r.compatibleText),o},xe=e=>{const{orgName:t,appName:r}=a(e.appKey);return`/${t}/${r}`},De=e=>{const t=new Uint8Array(N.util.base64.length(e));return N.util.base64.decode(e,t,0),t},$e=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),ke=async e=>{try{return await e()}catch(t){if(!(t instanceof n))throw t;const e=(e=>{const t="string"==typeof e.details?.serverMessage?e.details.serverMessage:void 0;switch(e.code){case r.SERVICE_NOT_ENABLED:case r.TRANSLATE_SERVICE_NOT_ENABLED:return"Translation service is not enabled";case r.TRANSLATE_PARAM_INVALID:return t?.includes("too long")?"Translation text is too long":t?.includes("target language")?"Invalid target language":"Invalid translation request";case r.TRANSLATE_USAGE_LIMIT:return"Translation quota has been reached";case r.TRANSLATE_FAILED:return"Translation service error";default:return}})(t);if(!e)throw t;throw new n(`REST business error: ${e}`,{code:t.code,details:t.details})}},Ve=e=>"string"==typeof e?e:"number"==typeof e||"boolean"==typeof e||"bigint"==typeof e?String(e):"",Pe=e=>{if("string"!=typeof e)return"";const t=e.trim();return t&&"undefined"!==t&&"null"!==t?t:""},qe=e=>({userId:e}),Fe=(e,t)=>{if(!$e(e)||!$e(e.data))throw i({apiName:t,message:`${t} response data is invalid`,mapped:!1});return e.data},Ge=(e,t)=>{if(!$e(e)||!Array.isArray(e.data))throw i({apiName:t,message:`${t} response data is invalid`,mapped:!1});return e.data},Be=(e,t)=>Array.isArray(e)?e:Ge(e,t),ze={txt:"text",img:"image",video:"video",file:"file",loc:"location",custom:"custom",combine:"combine"},je={text:"txt",image:"img",video:"video",file:"file",location:"loc",custom:"custom",combine:"combine"},He={chat:"singleChat",chatroom:"chatRoom",groupchat:"groupChat",singleChat:"singleChat",chatRoom:"chatRoom",groupChat:"groupChat"},Xe=(e,t,r)=>{if(!t)return"";if(t.includes("em-redirect"))return t;const{orgName:s,appName:i}=a(e.appKey),n=t.indexOf("/chatfiles/"),d=n>=0?t.slice(n):t,l=`${e.restBaseUrl}/${s}/${i}${d}`;return o(l,r)},Ke=e=>{if(!e||"object"!=typeof e)return;if(Array.isArray(e))return e;const t=Object.values(e),r=[];for(const a of t)Array.isArray(a)&&r.push(...a);return r.length>0?r:void 0},Qe=(e,t,r)=>{const a=Ve(r.contentType??r.type),s=je[a];if(!s)return null;const i=$e(r.content)?r.content:{},n=((e,t)=>{const r=Ve(t.conversationType);if("groupchat"===r||"chatroom"===r)return Ve(t.receiverId);const a=Ve(t.senderId);return a===e?Ve(t.receiverId):a})(t,r),o=He[Ve(r.conversationType)]??"singleChat",d={msgServerId:Ve(r.messageId),msgLocalId:Ve(r.messageId),from:Ve(r.senderId),to:Ve(r.receiverId),conversationId:n,conversationType:o,type:s,ext:$e(r.ext)?r.ext:{},timestamp:"number"==typeof r.sentTime?r.sentTime:new Date(Ve(r.sentTime)).getTime(),sender:{userId:Ve(r.senderId)},highlight:Ke(r.highlight),text:"string"==typeof r.text?r.text:void 0};let l;const c=Ve(i.remotePath??i.url),g=Ve(i.secret??i.secretKey);switch(s){case"txt":l={type:"txt",content:Ve(i.message??r.text)};break;case"img":{const t=Xe(e,c,g);l={type:"img",url:t,thumb:i.thumb?Xe(e,Ve(i.thumb),Ve(i.thumb_secret??i.thumbnailSecretKey)):`${t}&thumbnail=true`,secret:g,width:Number(i.width??($e(i.size)?i.size.width:0))||0,height:Number(i.height??($e(i.size)?i.size.height:0))||0,fileLength:Number(i.file_length??i.fileLength??0)};break}case"video":l={type:"video",url:Xe(e,c,g),thumb:i.thumb||i.thumbnailRemotePath?Xe(e,Ve(i.thumb??i.thumbnailRemotePath),Ve(i.thumb_secret??i.thumbnailSecretKey)):"",secret:g,filename:Ve(i.filename??i.displayName),duration:Number(i.length??i.duration??0),fileLength:Number(i.file_length??i.fileLength??0)};break;case"file":l={type:"file",url:Xe(e,c,g),secret:g,filename:Ve(i.filename??i.displayName),fileLength:Number(i.file_length??i.fileLength??0)};break;case"loc":l={type:"loc",latitude:Number(i.lat??i.latitude??0),longitude:Number(i.lng??i.longitude??0),address:Ve(i.addr??i.address),buildingName:Ve(i.buildingName)};break;case"custom":l={type:"custom",customEvent:Ve(i.customEvent),customExts:$e(i.customExts)?i.customExts:{}};break;default:return null}return{...d,body:l}},We=async(e,t,r)=>{const a=`${xe(t)}/users/${t.userId}/messages/search/get`,s=((e,t)=>{const{option:r,pageNum:a=1,pageSize:s=20}=e,i=r.keywordList.map(e=>e.trim()).filter(e=>e.length>0),n={searchMode:"default",highlightEnable:!0,page:a,size:s};return 1===i.length?n.keyword=i[0]:(n.keywords=i,n.keywordMatch="and"===r.keywordListMatchType?"all":"any"),r.conversationId&&("singleChat"===r.conversationType?n.participantPairs=[{userId1:t,userId2:r.conversationId}]:"groupChat"===r.conversationType?n.groupIds=[r.conversationId]:"chatRoom"===r.conversationType&&(n.chatroomIds=[r.conversationId])),r.msgTypes&&r.msgTypes.length>0&&(n.contentType=r.msgTypes.map(e=>ze[e]??e).join(",")),void 0!==r.startTime&&(n.startTime=r.startTime),void 0!==r.endTime&&(n.endTime=r.endTime),r.searchScope&&(n.searchExt=r.searchScope),r.direction&&(n.sort="up"===r.direction?"sentTime:asc":"sentTime:desc"),{data:n}})(r,t.userId),i=await e.post(a,s,{operation:"searchMessages"}),n=$e(i)?i:{},o=$e(n.data)?n.data:n,d=$e(o.data)?o.data:o,l=Array.isArray(d.items)?d.items:Array.isArray(d.list)?d.list:[],c=$e(d.pagination)?d.pagination:d,g=Number(c.pageNum??c.page??r.pageNum??1),u=Number(c.pageSize??c.size??r.pageSize??20),m=Number(c.totalPages??0),p=1===c.isFinished||g>=m,h=[];for(const y of l){if(!$e(y))continue;const e=Qe(t,t.userId,y);e&&h.push(e)}return{messages:h,pageNum:g,pageSize:u,totalPages:m,isLast:p}},Ye=e=>{const{orgName:t,appName:r}=a(e.appKey);return`/api/sdk/v1/${t}/${r}`},Ze=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),Je=e=>Ze(e)&&"string"==typeof e.path&&e.path.trim().length>0,et=e=>(e=>"undefined"!=typeof File&&e instanceof File)(e)||Je(e),tt=e=>{if(!Ze(e))return;return{data:Ze(e.data)?e.data:void 0,error:Ze(e.error)?e.error:void 0}},rt=(e,t)=>{const a=tt(e),s=a?.data?.text;if("string"!=typeof s)throw new g(`${t} response data is invalid`,r.REST_BUSINESS_UNKNOWN,{details:{api:t,response:e}});return s},at=(e,r,a,s="sdk")=>"auth"===s?new u(e,{code:r,details:a}):"validation"===s?new t(e,{code:r,details:a}):new g(e,r,{details:a}),st=e=>!(void 0===e||Ze(e)&&!Array.isArray(e))||(void 0!==e?.format&&"string"!=typeof e.format||(void 0!==e?.sampleRate&&"number"!=typeof e.sampleRate||(void 0!==e?.bitsPerSample&&"number"!=typeof e.bitsPerSample||void 0!==e?.channels&&"number"!=typeof e.channels))),it=e=>{if(!e)return;const t=(e.split("#")[0]?.split("?")[0]??"").split("/").filter(Boolean);return t.length>0?t[t.length-1]:void 0},nt=e=>{const{serviceCode:t,serviceMessage:a}=(e=>{const t=e instanceof g&&Ze(e.details)?e.details:void 0,r=tt(t?.rawResponse??t?.response??e),a=t?.serverCode??r?.error?.code,s=t?.serverMessage??r?.error?.message;return{serviceCode:"string"==typeof a||"number"==typeof a?String(a):void 0,serviceMessage:"string"==typeof s?s:void 0}})(e);if(e instanceof m)return at("File upload failed",r.UPLOAD_REQUEST_FAILED,{cause:e.details});if(e instanceof g&&!t)return e;if(t)switch(t){case"4041001":return at("File not found",r.VOICE_TO_TEXT_FILE_NOT_FOUND,{serviceCode:t,serviceMessage:a});case"4001002":return at("Invalid file",r.VOICE_TO_TEXT_FILE_INVALID,{serviceCode:t,serviceMessage:a},"validation");case"5021001":return at("File upload failed",r.UPLOAD_REQUEST_FAILED,{serviceCode:t,serviceMessage:a});case"4001003":return at("Voice duration exceeds 60 seconds",r.VOICE_TO_TEXT_FILE_DURATION_TOO_LONG,{serviceCode:t,serviceMessage:a},"validation");case"4031001":return at("Voice-to-text service is not enabled",r.SERVICE_NOT_ENABLED,{serviceCode:t,serviceMessage:a});case"4031002":return at("Beta service usage limit exceeded",r.SERVICE_LIMIT_EXCEEDED,{serviceCode:t,serviceMessage:a});case"4001001":return"string"==typeof(s=a)&&s.toLowerCase().includes("uploaded file exceeds")?at("File too large",r.VOICE_TO_TEXT_FILE_TOO_LARGE,{serviceCode:t,serviceMessage:a}):at(a||"Missing or invalid request parameter",r.VALIDATION_REQUIRED,{serviceCode:t,serviceMessage:a},"validation");case"5021003":case"5001003":return at("Voice-to-text failed",r.VOICE_TO_TEXT_FAILED,{serviceCode:t,serviceMessage:a});case"4011001":return at(a||"Unauthorized or invalid token",r.AUTH_UNAUTHORIZED,{serviceCode:t,serviceMessage:a},"auth");default:return at(a||(e instanceof Error?e.message:"Voice-to-text failed"),r.VOICE_TO_TEXT_FAILED,{serviceCode:t,serviceMessage:a})}var s;return e instanceof g?at(e.message,e.code,e.details):at(e instanceof Error?e.message:"Voice-to-text failed",r.VOICE_TO_TEXT_FAILED)},ot=(e,t)=>{if(!Ze(a=e)||"string"!=typeof a.filename||"string"!=typeof a.filetype||"number"!=typeof a.duration||"type"in a&&void 0!==a.type&&"voice"!==a.type)throw at("Invalid file",r.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceMessageBody"},"validation");var a;if(st(t))throw at("Invalid file",r.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceParams"},"validation");if(!e.url)throw at("File not found",r.VOICE_TO_TEXT_FILE_NOT_FOUND,{path:"voiceMessageBody.url"});if(!it(e.url))throw at("Invalid file",r.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceMessageBody.url"},"validation");return e},dt=(e,t)=>{if(st(t))throw at("Invalid file",r.VOICE_TO_TEXT_FILE_INVALID,{path:"voiceParams"},"validation");if(!et(e))throw at("Invalid file",r.VOICE_TO_TEXT_FILE_INVALID,{path:"file"},"validation");return e},lt=async(e,a,s,i)=>{const n=ot(s,i),o=it(n.url);if(!o)throw((e,r,a,s="invalid")=>new t(e,{code:r,details:{fields:[{path:a,message:e,rule:s}]}}))("File not found",r.VOICE_TO_TEXT_FILE_NOT_FOUND,"voiceMessageBody.url");try{const t=await e.post(`${Ye(a)}/speech/transcriptions`,{data:{fileId:o,username:a.userId,...i?{audio:i}:{}}},{operation:"voiceMessageToText"});return{text:rt(t,"voiceMessageToText")}}catch(d){throw nt(d)}},ct=R.object({keywordList:R.array(R.string()).min(1,"keywordList must not be empty").max(5,"keywordList must have at most 5 keywords").refine(e=>e.map(e=>e.trim()).filter(e=>e.length>0).length>0,"keywordList must contain at least one non-empty keyword"),keywordListMatchType:R.enum(["or","and"]).optional(),conversationId:R.string().min(1).optional(),conversationType:R.enum(["singleChat","groupChat","chatRoom"]).optional(),msgTypes:R.array(R.enum(["txt","img","video","file","loc","custom","combine"])).optional(),startTime:R.number().optional(),endTime:R.number().optional(),searchScope:R.enum(["none","with","only"]).optional(),direction:R.enum(["up","down"]).optional()}).refine(e=>void 0!==e.conversationId===(void 0!==e.conversationType),{message:"conversationId and conversationType must be provided together"}).refine(e=>void 0!==e.startTime===(void 0!==e.endTime),{message:"startTime and endTime must be provided together"}).refine(e=>void 0===e.startTime||void 0===e.endTime||e.endTime>=e.startTime,{message:"endTime must be >= startTime"}),gt=R.object({option:ct,pageNum:R.number().int().min(1).default(1),pageSize:R.number().int().min(1).max(100).default(20)}),ut=f(b,{common:{},apis:{sendMessage:{range:"1,4,100,108,110,202,210,213-215,219-222,300-301,303,305,402,405-406,500-501,505-510,602-603,606-607,1200,1299",localErrors:{sendMessage:{operation_cancelled:{code:1,retryable:!1},upload_invalid_appkey:{code:100,retryable:!1},validation_invalid:{code:110,retryable:!1},not_connected:{code:300,retryable:!0},request_timeout:{code:301,retryable:!0},send_failed:{code:303,retryable:!1},upload_failed:{code:402,retryable:!0},file_too_large:{code:405,retryable:!1},file_content_improper:{code:406,retryable:!1},encode_failed:{code:500,retryable:!1}}},errors:{SERVICE_LIMIT_EXCEEDED:{code:4,retryable:!1},TOKEN_EXPIRED:{code:108,retryable:!1},AUTH_FAILED:{code:202,retryable:!1},PERMISSION_DENIED:{code:210,retryable:!1},BIND_ANOTHER_DEVICE:{code:213,retryable:!1},TOO_MANY_DEVICES:{code:214,retryable:!1},USER_MUTED:{code:215,retryable:!1},USER_MUTED_BY_ADMIN:{code:219,retryable:!1},USER_DEVICE_CHANGED:{code:220,retryable:!1},USER_NOT_ON_ROSTER:{code:221,retryable:!1},BLOCKED_BY_RECIPIENT:{code:222,retryable:!1,aliases:["blocked"]},SERVER_SERVING_DISABLED:{code:305,retryable:!1},MESSAGE_INCLUDE_ILLEGAL_CONTENT:{code:501,retryable:!1},SERVICE_NOT_ENABLED:{code:505,retryable:!1},MESSAGE_EXPIRED:{code:506,retryable:!1},MESSAGE_ILLEGAL_WHITELIST:{code:507,retryable:!1},MESSAGE_EXTERNAL_LOGIC_BLOCKED:{code:508,retryable:!1},MESSAGE_CURRENT_LIMITING:{code:509,retryable:!0},MESSAGE_SIZE_LIMIT:{code:510,retryable:!1},GROUP_NOT_JOINED:{code:602,retryable:!1},GROUP_PERMISSION_DENIED:{code:603,retryable:!1},GROUP_NOT_EXIST:{code:606,retryable:!1},GROUP_DISABLED:{code:607,retryable:!1},MESSAGE_BLOCKED:{code:1200,retryable:!1},THIRD_DEFAULT_FAILED:{code:1299,retryable:!1}}},getHistoryMessages:{range:"4,110,202,505",localErrors:{getHistoryMessages:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},page_size_exceeded:{code:110,aliases:["pull number cannot be greater","limit is to large"],retryable:!1}}},removeHistoryMessages:{range:"110,112,202,505",localErrors:{removeHistoryMessages:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},query_param_reaches_limit:{code:112,aliases:["delete msg list limit"],retryable:!1}}},getGroupMessageReadUsers:{range:"4,110,500",localErrors:{getGroupMessageReadUsers:{validation_invalid:{code:110,retryable:!1}}},errors:{message_not_found:{code:500,retryable:!1}}},recallMessage:{range:"110,201,300,504,505",localErrors:{recallMessage:{validation_invalid:{code:110,retryable:!1}}},errors:{message_invalid:{code:110,retryable:!1},not_login:{code:201,retryable:!0},not_connected:{code:300,retryable:!0},recall_time_limit:{code:504,retryable:!1},recall_disabled:{code:505,retryable:!1}}},updateMessage:{range:"110,111,201,210,300,511",localErrors:{modifyMessage:{validation_invalid:{code:110,retryable:!1},unsupported_type:{code:111,retryable:!1}}},errors:{message_invalid:{code:110,retryable:!1},unsupported_type:{code:111,retryable:!1},not_login:{code:201,retryable:!0},permission_denied:{code:210,retryable:!1},not_connected:{code:300,retryable:!0},edit_failed:{code:511,retryable:!0}}},downloadMessageAttachment:{range:"400,401,403,407",localErrors:{downloadAttachment:{validation_invalid:{code:401,retryable:!1}}},errors:{not_found:{code:400,httpStatus:404,retryable:!1},invalid:{code:401,retryable:!1},download_failed:{code:403,retryable:!0},expired:{code:407,httpStatus:404,retryable:!1}}},downloadAndParseCombineMessage:{range:"110,401,403,500",localErrors:{downloadAndParseCombineMessage:{validation_invalid:{code:110,retryable:!1}}},errors:{invalid_param:{code:110,retryable:!1},invalid_type:{code:500,retryable:!1},parse_failed:{code:401,retryable:!0},download_failed:{code:403,retryable:!0}}},addReaction:{range:"110,302,505,600,602,1300-1302",localErrors:{addReaction:{validation_invalid:{code:110,retryable:!1}}},errors:{reaction_already_operated:{code:1301,retryable:!1},reaction_reach_limit:{code:1300,retryable:!1},group_not_joined:{code:602,retryable:!1},reaction_operation_illegal:{code:1302,retryable:!1},service_not_enabled:{code:505,retryable:!1},server_busy:{code:302,retryable:!0}}},removeReaction:{range:"110,505,1301,1302",localErrors:{removeReaction:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},reaction_operation_illegal:{code:1302,retryable:!1}}},getReactionList:{range:"110,505,600",localErrors:{getReactionList:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},group_invalid_id:{code:600,retryable:!1}}},getReactionDetail:{range:"110,505,1302",localErrors:{getReactionDetail:{validation_invalid:{code:110,retryable:!1}}},errors:{service_not_enabled:{code:505,retryable:!1},reaction_operation_illegal:{code:1302,retryable:!1}}},pinMessage:{range:"4,110",errors:{pin_msg_id_illegal:{code:110,retryable:!1},pin_message_limit:{code:4,aliases:["91101"],retryable:!1},pin_message_not_found:{code:110,aliases:["91102"],retryable:!1}}},unpinMessage:{range:"110",errors:{pin_msg_id_illegal:{code:110,retryable:!1},pin_message_not_found:{code:110,aliases:["91102","user session pin message not exist"],retryable:!1}}},getPinnedMessageList:{range:"110,111",errors:{operation_unsupported:{code:111,aliases:["15002"],retryable:!1},pin_message_not_found:{code:110,aliases:["91102","user session pin message not exist"],retryable:!1}}},getSupportedTranslationLanguages:{range:"505",errors:{service_not_enabled:{code:505,aliases:["service not open!"],retryable:!1}}},translateMessage:{range:"505,1110-1113",localErrors:{translateMessage:{validation_invalid:{code:1110,retryable:!1}}},errors:{translate_text_too_long:{code:1110,runtimeMessage:"Translation text is too long",retryable:!1},translate_param_invalid:{code:1110,runtimeMessage:"Invalid target language",retryable:!1},service_not_enabled:{code:1111,runtimeMessage:"Translation service is not enabled",aliases:["service not open!"],retryable:!1},translate_usage_limit:{code:1112,runtimeMessage:"Translation quota has been reached",aliases:["The request has reached the maximum limit"],retryable:!1},translate_failed:{code:1113,runtimeMessage:"Translation service error",aliases:["The request failed, please try again later."],retryable:!1}}},voiceMessageToText:{range:"4,110,202,407-411,505",localErrors:{voiceMessageToText:{validation_invalid:{code:407,retryable:!1},file_not_found:{code:410,retryable:!1}}},errors:{unauthorized:{code:202,retryable:!0},file_not_found:{code:410,retryable:!1,aliases:["4041001"]},file_invalid:{code:407,retryable:!1,aliases:["4001002"]},duration_too_long:{code:408,retryable:!1,aliases:["4001003"]},file_too_large:{code:411,retryable:!1,aliases:["4001001"]},service_not_enabled:{code:505,retryable:!1,aliases:["4031001"]},service_limit_exceeded:{code:4,retryable:!0,aliases:["4031002"]},voice_to_text_failed:{code:409,retryable:!0,aliases:["5021003","5001003"]}}},voiceFileToText:{range:"4,110,202,402,407-411,505",localErrors:{voiceFileToText:{validation_invalid:{code:407,retryable:!1},upload_required:{code:110,retryable:!1}}},errors:{unauthorized:{code:202,retryable:!0},upload_failed:{code:402,retryable:!0,aliases:["5021001"]},file_invalid:{code:407,retryable:!1,aliases:["4001002"]},duration_too_long:{code:408,retryable:!1,aliases:["4001003"]},file_too_large:{code:411,retryable:!1,aliases:["4001001"]},service_not_enabled:{code:505,retryable:!1,aliases:["4031001"]},service_limit_exceeded:{code:4,retryable:!0,aliases:["4031002"]},voice_to_text_failed:{code:409,retryable:!0,aliases:["5021003","5001003"]}}},getConversationList:{range:"110",localErrors:{getConversationList:{validation_invalid:{code:110,retryable:!1}}},errors:{}},getPinnedConversationList:{range:"110",localErrors:{getPinnedConversationList:{validation_invalid:{code:110,retryable:!1}}},errors:{}},getConversationListByMark:{range:"110",localErrors:{getConversationListByMark:{validation_invalid:{code:110,retryable:!1}}},errors:{}},deleteConversation:{range:"110",localErrors:{deleteConversation:{validation_invalid:{code:110,retryable:!1}}},errors:{}},clearConversationUnreadMessageCount:{range:"110,201,300,500",localErrors:{clearConversationUnreadMessageCount:{validation_invalid:{code:110,retryable:!1}}},errors:{not_login:{code:201,retryable:!0},not_connected:{code:300,retryable:!0},message_invalid:{code:500,retryable:!1}}},clearAllConversationUnreadMessageCount:{range:"201,300,500",errors:{not_login:{code:201,retryable:!0},not_connected:{code:300,retryable:!0},message_invalid:{code:500,retryable:!1}}},sendMessageReadReceipts:{range:"110,300",localErrors:{sendMessageReadReceipts:{validation_invalid:{code:110,retryable:!1}}},errors:{invalid_direction:{code:110,retryable:!1},not_connected:{code:300,retryable:!0}}},getGroupMessageReadReceipts:{range:"110,202,210,303",localErrors:{getGroupMessageReadReceipts:{validation_invalid:{code:110,retryable:!1}}},errors:{illegal_argument:{code:110,httpStatus:400,retryable:!1},auth_bad_access_token:{code:202,httpStatus:401,retryable:!1},forbidden_op:{code:210,httpStatus:403,retryable:!1},unknown_exception_error:{code:303,httpStatus:500,retryable:!0}}},setConversationPinned:{range:"110",localErrors:{setConversationPinned:{validation_invalid:{code:110,retryable:!1}}},errors:{}},addConversationMark:{range:"110",localErrors:{addConversationMark:{validation_invalid:{code:110,retryable:!1}}},errors:{}},removeConversationMark:{range:"110",localErrors:{removeConversationMark:{validation_invalid:{code:110,retryable:!1}}},errors:{}},clearAllMessagesAndConversations:{range:"",errors:{}},searchMessages:{range:"110,202,303,505",localErrors:{searchMessages:{validation_invalid:{code:110,retryable:!1}}},errors:{parameter_error:{code:110,httpStatus:400,retryable:!1,aliases:["4000005","4000006"]},token_invalid:{code:202,httpStatus:401,retryable:!1,aliases:["4010101"]},service_not_enabled:{code:505,httpStatus:403,retryable:!1,aliases:["4030204"]},app_not_found:{code:110,httpStatus:404,retryable:!1,aliases:["4040302"]},server_error:{code:303,httpStatus:500,retryable:!0,aliases:["5000701","5020801"]}}}}}),mt=class{constructor(){this.client=null,this.eventContext=null,this.restClient=null,this.restBaseUrl=null,this.restToken=null}bind(e,t){this.client=e,this.eventContext=t??null,this.restClient=null,this.restBaseUrl=null,this.restToken=null}async sendMessage(e,t){return this.getClientOrThrow().sendMessage(e,t)}createTextMessage(e){return((e,t)=>{const r=W.validateOrThrow(fe,e),a=Re(t),s=Ne(),i={content:r.content};return r.targetLanguages&&(i.targetLanguages=r.targetLanguages),Ue(r,a,"text",i,s)})(e,this.buildMessageSenderOrThrow())}createImageMessage(e){return((e,t,r)=>{const a=W.validateOrThrow(be,e),i=Re(t),n=Ne(),o=a.data?Me(void 0,a.data):"",d=a.originalUrl?s(a.originalUrl,{deriveVariants:!r?.useCustomAttachmentUpload}):void 0;a.data&&V.set(n,a.data);const l=a.isGif??!1,c={localUrl:o,filename:a.filename,filetype:a.filetype,width:a.width,height:a.height,isGif:l,isOriginalImage:Ae({isGif:l,isOriginalImage:a.isOriginalImage})};return d?.originalImageUrl&&(c.originalImageUrl=d.originalImageUrl,c.bigImageUrl=d.bigImageUrl,c.thumbnailUrl=d.thumbnailUrl),void 0!==a.fileLength&&(c.fileLength=a.fileLength),a.thumbnailUrl&&(c.thumbnailUrl=a.thumbnailUrl),Ue(a,i,"image",c,n)})(e,this.buildMessageSenderOrThrow(),this.getClientOrThrow().getMessageCreationOptions())}createFileMessage(e){return((e,t)=>{const r=W.validateOrThrow(Te,e),a=Re(t),s=Ne(),i=Me(r.originalUrl,r.data);r.data&&V.set(s,r.data);const n={url:i,filename:r.filename,filetype:r.filetype};return void 0!==r.fileSize&&(n.fileSize=r.fileSize),void 0!==r.fileLength&&(n.fileLength=r.fileLength),Ue(r,a,"file",n,s)})(e,this.buildMessageSenderOrThrow())}createVoiceMessage(e){return((e,t)=>{const r=W.validateOrThrow(_e,e),a=Re(t),s=Ne(),i=Me(r.originalUrl,r.data);r.data&&V.set(s,r.data);const n={url:i,filename:r.filename,filetype:r.filetype,duration:r.duration};return void 0!==r.fileLength&&(n.fileLength=r.fileLength),Ue(r,a,"voice",n,s)})(e,this.buildMessageSenderOrThrow())}createVideoMessage(e){return((e,t)=>{const r=W.validateOrThrow(Ce,e),a=Re(t),s=Ne(),i=Me(r.originalUrl,r.data);r.data&&V.set(s,r.data);const n={url:i,filename:r.filename,filetype:r.filetype,duration:r.duration};return void 0!==r.width&&(n.width=r.width),void 0!==r.height&&(n.height=r.height),void 0!==r.fileLength&&(n.fileLength=r.fileLength),r.thumbnailUrl&&(n.thumbnailUrl=r.thumbnailUrl),Ue(r,a,"video",n,s)})(e,this.buildMessageSenderOrThrow())}createLocationMessage(e){return((e,t)=>{const r=W.validateOrThrow(Ee,e),a=Re(t),s={latitude:r.latitude,longitude:r.longitude};return r.address&&(s.address=r.address),r.buildingName&&(s.buildingName=r.buildingName),Ue(r,a,"location",s)})(e,this.buildMessageSenderOrThrow())}createCmdMessage(e){return((e,t)=>{const r=W.validateOrThrow(Le,e),a=Re(t),s={action:r.action};return void 0!==r.deliverOnlineOnly&&(s.deliverOnlineOnly=r.deliverOnlineOnly),Ue(r,a,"cmd",s)})(e,this.buildMessageSenderOrThrow())}createCustomMessage(e){return((e,t)=>{const r=W.validateOrThrow(we,e),a=Re(t),s={event:r.event};return r.params&&(s.params=r.params),Ue(r,a,"custom",s)})(e,this.buildMessageSenderOrThrow())}createCombineMessage(e){return Se(e,this.buildMessageSenderOrThrow())}getConversationList(e){if(void 0!==e?.mark&&(!Number.isInteger(e.mark)||e.mark<0||e.mark>19))throw new t("filter.mark must be an integer between 0 and 19",{code:r.VALIDATION_INVALID_FORMAT,details:{fields:[{path:"filter.mark",message:"filter.mark must be an integer between 0 and 19",rule:"invalid_format"}]}});const a=(this.getClientOrThrow().getCacheManager()?.loadSessionList()??[]).filter(t=>null!==t.lastMessage&&((void 0===e?.isPinned||t.isPinned===e.isPinned)&&!(void 0!==e?.mark&&!C(t,e.mark)))).map(E);return this.getClientOrThrow().markConversationAccess(a.map(e=>({conversationId:e.conversationId,type:e.conversationType}))),a}setCurrentConversation(e){this.validateConversationLocator(e),this.getClientOrThrow().getCacheManager()?.setCurrentConversation({conversationId:e.conversationId,type:e.conversationType})}resetCurrentConversation(){this.getClientOrThrow().getCacheManager()?.resetCurrentConversation()}getCurrentConversation(){const e=this.getClientOrThrow().getCacheManager()?.getCurrentConversation()??null;return e?{conversationId:e.conversationId,conversationType:e.type}:null}refreshSessionList(e){return this.getClientOrThrow().refreshSessionList(e)}async deleteConversation(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>{const a=oe(t),s=Z(r.conversationId,"params.conversationId"),i=ee(r.conversationType,"params.conversationType"),n=r.deleteRoamingMessages??!1;if("boolean"!=typeof n)throw Y("params.deleteRoamingMessages","params.deleteRoamingMessages must be a boolean");return await e.request(`/${a.orgName}/${a.appName}/user/${a.encodedUserId}/user_channel?resource=${a.encodedResource}`,{method:"DELETE",body:{channel:s,type:"groupChat"===i?"groupChat":te(i),delete_roam:n},operation:"deleteConversation"}),{conversationId:s,conversationType:i,operation:"delete"}})(this.getRestClient(t),t,e),a=this.getClientOrThrow(),s=a.getCacheManager()?.deleteConversation({conversationId:r.conversationId,type:r.conversationType});return s?.changed&&a.emitConversationListUpdate("local"),r}async setConversationPinned(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>{const a=oe(t),s=Z(r.conversationId,"params.conversationId"),i=ee(r.conversationType,"params.conversationType");if("boolean"!=typeof r.pinned)throw Y("params.pinned","params.pinned must be a boolean");const n="groupChat"===i?"groupChat":te(i),o=r.pinned?await e.post(`/${a.orgName}/${a.appName}/sdk/user/${a.encodedUserId}/user_channel/top?resource=${a.encodedResource}`,{type:n,to:s},{operation:"setConversationPinned"}):await e.delete(`/${a.orgName}/${a.appName}/sdk/user/${a.encodedUserId}/user_channel/top?type=${encodeURIComponent(n)}&to=${encodeURIComponent(s)}&resource=${a.encodedResource}`,{operation:"setConversationPinned"}),d=T(o)&&T(o.data)?o.data:{};return{conversationId:s,conversationType:i,operation:"setPinned",isPinned:"boolean"==typeof d.is_top?d.is_top:r.pinned,pinnedTime:"number"==typeof d.update_top_status_time?d.update_top_status_time:r.pinned?Date.now():0}})(this.getRestClient(t),t,e),a=this.getClientOrThrow().getCacheManager(),s=a?.applyConversationPinnedMutation({conversationId:r.conversationId,type:r.conversationType,isPinned:r.isPinned??e.pinned,pinnedTime:r.pinnedTime});return s?.changed&&this.getClientOrThrow().emitConversationListUpdate("local"),r}async addConversationMark(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>de(e,t,r,!0))(this.getRestClient(t),t,e),a=this.getClientOrThrow().getCacheManager(),s=a?.applyConversationMarkMutation({conversations:[...r.succeeded.map(e=>({...e,applied:!0})),...r.failed.map(e=>({...e,applied:!1}))],mark:r.mark,operation:r.operation});return s?.changed&&this.getClientOrThrow().emitConversationListUpdate("local"),r}async removeConversationMark(e){const t=this.getRestContextOrThrow(),r=await(async(e,t,r)=>de(e,t,r,!1))(this.getRestClient(t),t,e),a=this.getClientOrThrow().getCacheManager(),s=a?.applyConversationMarkMutation({conversations:[...r.succeeded.map(e=>({...e,applied:!0})),...r.failed.map(e=>({...e,applied:!1}))],mark:r.mark,operation:r.operation});return s?.changed&&this.getClientOrThrow().emitConversationListUpdate("local"),r}async clearAllMessagesAndConversations(){const e=this.getRestContextOrThrow();await(async(e,t)=>{const r=oe(t);await e.post(`/${r.orgName}/${r.appName}/sdk/message/roaming/user/${r.encodedUserId}/delete/all?resource=${r.encodedResource}`,void 0,{operation:"clearAllMessagesAndConversations"})})(this.getRestClient(e),e);const t=this.getClientOrThrow(),r=t.getCacheManager()?.clearConversations();r?.changed&&t.emitConversationListUpdate("local")}async pinMessage(e){const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>le(e,t,r,!0))(this.getRestClient(t),t,e))}async unpinMessage(e){const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>le(e,t,r,!1))(this.getRestClient(t),t,e))}async getPinnedMessageList(e){const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=oe(t),s=Z(r.conversationId,"params.conversationId"),i=ee(r.conversationType,"params.conversationType"),n=await e.get(`/${a.orgName}/${a.appName}/sdk/user/${a.encodedUserId}/user_channel/pin?to=${encodeURIComponent(s)}&type=${encodeURIComponent(te(i))}&limit=${String(20)}`,{operation:"getPinnedMessageList"}),o=T(n)&&T(n.data)?n.data:{};return{items:(Array.isArray(o.msg_infos)?o.msg_infos:[]).reduce((e,r)=>{if(!T(r))return e;const a="string"==typeof r.pin_msg_id?r.pin_msg_id:T(r.message)&&"string"==typeof r.message.id?r.message.id:"";if(!a)return e;const n="number"==typeof r.pin_opt_at?r.pin_opt_at:0,o=ie(r.message,{messageId:a,conversationId:s,conversationType:i,currentUserId:t.userId,timestamp:n});return o?(e.push({messageId:a,conversationId:s,conversationType:i,operatorId:"string"==typeof r.pin_operator?r.pin_operator:void 0,pinnedAt:n,message:o}),e):e},[])}})(this.getRestClient(t),t,e))}addEventHandler(e,t){this.getEventContextOrThrow().addEventHandler(e,t)}removeEventHandler(e){this.getEventContextOrThrow().removeEventHandler(e)}async clearConversationUnreadMessageCount(e){this.validateUnreadConversationLocator(e);const t=this.getClientOrThrow(),r=t.getCacheManager()?.clearConversationUnreadMessageCount({conversationId:e.conversationId,type:e.conversationType});r?.changed&&t.emitConversationListUpdate("local");try{await this.requireConnectedClient().sendMessageAction({kind:"clearConversationUnreadMessageCount",conversationId:e.conversationId,conversationType:e.conversationType,sendToPeer:!1},(e,t)=>this.buildActionError(e,t))}catch(a){if(!r?.matched)throw a;p.warn("Conversation unread remote sync failed after local clear",{conversationId:e.conversationId,conversationType:e.conversationType,error:a})}}async sendMessageReadReceipts(e){this.validateSendMessageReadReceiptsParams(e),await this.requireConnectedClient().sendMessageAction({kind:"sendMessageReadReceipts",conversationId:e.conversationId,conversationType:e.conversationType,messageIds:e.messageIds},(e,t)=>this.buildActionError(e,t))}async clearAllConversationUnreadMessageCount(){await this.requireConnectedClient().sendMessageAction({kind:"clearAllConversationUnreadMessageCount",conversationId:this.getCurrentUserIdOrThrow(),conversationType:"singleChat",sendToPeer:!1,clearAllUnreadMessageCount:!0},(e,t)=>this.buildActionError(e,t));const e=this.getClientOrThrow(),t=e.getCacheManager()?.clearAllConversationUnreadMessageCount();t?.changed&&e.emitConversationListUpdate("local")}async recallMessage(e){this.validateConversationLocator(e),this.requireNonEmptyString(e.messageId,"messageId"),await this.requireConnectedClient().sendMessageAction({kind:"recall",conversationId:e.conversationId,conversationType:e.conversationType,messageId:e.messageId,ext:e.ext},(e,t)=>this.buildActionError(e,t));return{messageId:e.messageId,conversationId:e.conversationId,conversationType:e.conversationType,timestamp:Date.now()}}async modifyMessage(e){if(this.validateConversationLocator(e),this.requireNonEmptyString(e.messageId,"messageId"),"text"!==e.message.type&&"custom"!==e.message.type)throw new t("only text and custom messages are editable",{code:r.OPERATION_UNSUPPORTED});await this.requireConnectedClient().sendMessageAction({kind:"update",conversationId:e.conversationId,conversationType:e.conversationType,messageId:e.messageId,body:e.message.body,messageType:e.message.type,ext:e.message.ext},(e,t)=>this.buildActionError(e,t));const a=Date.now(),s=this.getCurrentUserIdOrThrow(),i={operatorId:s,operationCount:1,operationTime:a};return{msgServerId:e.messageId,msgLocalId:"",from:s,to:e.conversationId,sender:{userId:s},conversationId:e.conversationId,conversationType:e.conversationType,type:e.message.type,sendStatus:"sent",ext:e.message.ext,timestamp:a,body:e.message.body,direct:"SEND",modifiedInfo:i}}async getHistoryMessages(e){if(this.validateConversationLocator(e),void 0!==e.pageSize&&(!Number.isInteger(e.pageSize)||e.pageSize<=0))throw this.buildValidationError("pageSize must be a positive integer","pageSize");const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r,a)=>{const s=`${xe(t)}/users/${t.userId}/messageroaming`,i=await e.post(s,{queue:"singleChat"===r.conversationType?`${r.conversationId}@easemob.com`:`${r.conversationId}@conference.easemob.com`,start:r.cursor&&r.cursor.length>0?r.cursor:-1,pull_number:r.pageSize??20,is_positive:"down"===r.searchDirection,msgType:(r.messageTypes??[]).join(","),end:-1,startTime:r.startTime??null,endTime:r.endTime??null,userIds:"singleChat"===r.conversationType?null:r.senderIds&&r.senderIds.length>0?r.senderIds:null},{operation:"getHistoryMessages"}),n=Fe(i,"getHistoryMessages"),o=Array.isArray(n.msgs)?n.msgs:[],d=[];for(const l of o){if(!$e(l)||"string"!=typeof l.msg||0===l.msg.length)continue;const e=a(De(l.msg));e&&d.push(e)}return{items:d,cursor:Pe(n.next_key),hasMore:!0!==n.is_last&&d.length>0}})(this.getRestClient(t),t,e,e=>this.getClientOrThrow().decodeServerMessageMeta(e)))}async searchMessages(e){const t=W.validateOrThrow(gt,e),r=this.getRestContextOrThrow();return this.executeRestOperation(()=>We(this.getRestClient(r),r,t))}async downloadAttachment(e){return this.getClientOrThrow().downloadAttachment(e.message)}async downloadAndParseCombineMessage(e){return this.getClientOrThrow().downloadAndParseCombinePayload(this.resolveDownloadCombineMessageParams(e))}async removeHistoryMessages(e){if(this.validateConversationLocator(e),!e.messageIds&&!e.beforeTimestamp)throw this.buildValidationError("messageIds or beforeTimestamp is required","removeHistoryMessages");if(e.messageIds&&0===e.messageIds.length)throw this.buildValidationError("messageIds cannot be empty","messageIds");if(void 0!==e.beforeTimestamp&&(!Number.isInteger(e.beforeTimestamp)||e.beforeTimestamp<=0))throw this.buildValidationError("beforeTimestamp must be a positive integer","beforeTimestamp");const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>{const a="singleChat"===r.conversationType?"userId":"groupId",s="singleChat"===r.conversationType?"chat":"group",i=encodeURIComponent(t.clientResource),n=r.messageIds?`${xe(t)}/sdk/message/roaming/${s}/user/${t.userId}?${a}=${encodeURIComponent(r.conversationId)}&msgIdList=${encodeURIComponent(r.messageIds.join(","))}&resource=${i}`:`${xe(t)}/sdk/message/roaming/${s}/user/${t.userId}/time?${a}=${encodeURIComponent(r.conversationId)}&delTime=${r.beforeTimestamp}&resource=${i}`;await e.delete(n,{operation:"removeHistoryMessages"})})(this.getRestClient(t),t,e))}async getGroupMessageReadUsers(e){if(this.requireNonEmptyString(e.groupId,"groupId"),this.requireNonEmptyString(e.messageId,"messageId"),void 0!==e.pageSize&&(!Number.isInteger(e.pageSize)||e.pageSize<=0))throw this.buildValidationError("pageSize must be a positive integer","pageSize");const t=this.getRestContextOrThrow(),r=await this.executeRestOperation(()=>(async(e,t,r)=>{const a=M();a.set("limit",String(r.pageSize??10)),r.cursor&&a.set("key",r.cursor);const s=`${xe(t)}/chatgroups/${encodeURIComponent(r.groupId)}/acks/${encodeURIComponent(r.messageId)}?${a.toString()}`,i=await e.get(s,{operation:"getGroupMessageReadUsers"}),n=Fe(i,"getGroupMessageReadUsers"),o=$e(n.group_ack)?n.group_ack:n,d=(Array.isArray(o.userlist)?o.userlist:[]).map(e=>$e(e)&&"string"==typeof e.username?{userId:e.username,user:qe(e.username),ackId:"string"==typeof e.meta_id?e.meta_id:void 0,timestamp:"number"==typeof e.timestamp?e.timestamp:void 0,ackContent:"string"==typeof e.ack_content?e.ack_content:void 0}:null).filter(e=>null!==e);return{groupId:r.groupId,messageId:"string"==typeof n.ackmid?n.ackmid:r.messageId,users:d,count:"number"==typeof o.total?o.total:d.length,cursor:Pe(o.next_key),hasMore:!0!==o.is_last&&d.length>0}})(this.getRestClient(t),t,e));return await this.hydrateGroupMessageReadUsers(e.groupId,r)}async getGroupMessageReadReceipts(e){this.requireNonEmptyString(e.groupId,"groupId");const t=this.validateMessageIdList(e.messageIds,"messageIds"),r=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=`${xe(t)}/chatgroups/${encodeURIComponent(r.groupId)}/acks/batch`,s=await e.post(a,{messageIds:r.messageIds},{operation:"getGroupMessageReadReceipts"});return Ge(s,"getGroupMessageReadReceipts").map(e=>$e(e)&&"string"==typeof e.ackmid&&"number"==typeof e.total?{messageId:e.ackmid,count:e.total}:null).filter(e=>null!==e)})(this.getRestClient(r),r,{groupId:e.groupId.trim(),messageIds:t}))}async addReaction(e){this.validateReactionParams(e);const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>{await e.post(`${xe(t)}/reaction/user/${t.userId}`,{msgId:r.messageId,message:r.reaction},{operation:"addReaction"})})(this.getRestClient(t),t,e))}async removeReaction(e){this.validateReactionParams(e);const t=this.getRestContextOrThrow();await this.executeRestOperation(()=>(async(e,t,r)=>{const a=`${xe(t)}/reaction/user/${t.userId}?msgId=${encodeURIComponent(r.messageId)}&message=${encodeURIComponent(r.reaction)}`;await e.delete(a,{operation:"removeReaction"})})(this.getRestClient(t),t,e))}async getReactionList(e){if(!e.messageId||Array.isArray(e.messageId)&&0===e.messageId.length)throw this.buildValidationError("messageId is required","messageId");"groupChat"===e.conversationType&&this.requireNonEmptyString(e.groupId??"","groupId");const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=M(),s="string"==typeof r.messageId?r.messageId:[...r.messageId].join(",");a.set("msgIdList",s),a.set("msgType","groupChat"===r.conversationType?"group":"chat"),r.groupId&&a.set("groupId",r.groupId);const i=await e.get(`${xe(t)}/reaction/user/${t.userId}?${a.toString()}`,{operation:"getReactionList"});return Ge(i,"getReactionList").map(e=>{if(!$e(e)||"string"!=typeof e.msgId)return null;const t=Array.isArray(e.reactionList)?e.reactionList:[];return{messageId:e.msgId,reactions:t.map(e=>$e(e)&&"string"==typeof e.reaction?{reaction:e.reaction,count:"number"==typeof e.count?e.count:0,isAddedBySelf:!0===e.state,userIds:Array.isArray(e.userList)?e.userList.filter(e=>"string"==typeof e):[]}:null).filter(e=>null!==e)}}).filter(e=>null!==e)})(this.getRestClient(t),t,e))}async getReactionDetail(e){if(this.validateReactionParams(e),void 0!==e.pageSize&&(!Number.isInteger(e.pageSize)||e.pageSize<=0))throw this.buildValidationError("pageSize must be a positive integer","pageSize");const t=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=M();a.set("msgId",r.messageId),a.set("message",r.reaction),a.set("cursor",r.cursor??""),a.set("limit",String(r.pageSize??20));const s=await e.get(`${xe(t)}/reaction/user/${t.userId}/detail?${a.toString()}`,{operation:"getReactionDetail"}),i=Fe(s,"getReactionDetail"),n=Array.isArray(i.reactionUserList)?i.reactionUserList.map(e=>$e(e)&&"string"==typeof e.userId?{userId:e.userId,user:qe(e.userId),createdAt:"string"==typeof e.createdAt?e.createdAt:void 0}:null).filter(e=>null!==e):[],o=Array.isArray(i.userList)?i.userList.filter(e=>"string"==typeof e).map(e=>({userId:e,user:qe(e)})):[],d=n.length>0?n:o;return{reaction:"string"==typeof i.reaction?i.reaction:r.reaction,count:"number"==typeof i.count?i.count:d.length,isAddedBySelf:!0===i.state,reactionUsers:d,cursor:Pe(i.cursor),hasMore:Pe(i.cursor).length>0,createdAt:"string"==typeof i.createdAt?i.createdAt:void 0}})(this.getRestClient(t),t,e))}async getSupportedTranslationLanguages(){const e=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t)=>{const r=await ke(()=>e.get(`${xe(t)}/users/${t.userId}/translate/support/language`,{operation:"getSupportedTranslationLanguages"}));return Be(r,"getSupportedTranslationLanguages").map(e=>$e(e)&&"string"==typeof e.code?{code:e.code,name:"string"==typeof e.name?e.name:e.code,nativeName:"string"==typeof e.nativeName?e.nativeName:e.code}:null).filter(e=>null!==e)})(this.getRestClient(e),e))}async translateMessage(e){if("text"!==e.message.type)throw new t("only text messages can be translated",{code:r.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"message.type",message:"must be text",rule:"message_type"}]}});const a=e.message.body.content.trim();if(0===a.length)throw new t("message text is required",{code:r.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"message.body.content",message:"is required",rule:"required"}]}});if(!Array.isArray(e.targetLanguages)||0===e.targetLanguages.length)throw new t("targetLanguages is required",{code:r.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"targetLanguages",message:"is required",rule:"required"}]}});if(e.targetLanguages.some(e=>"string"!=typeof e||0===e.trim().length))throw new t("targetLanguages contains invalid language code",{code:r.TRANSLATE_PARAM_INVALID,details:{fields:[{path:"targetLanguages",message:"contains invalid language code",rule:"language_code"}]}});const s=this.getRestContextOrThrow();return this.executeRestOperation(()=>(async(e,t,r)=>{const a=await ke(()=>e.post(`${xe(t)}/users/${t.userId}/translate`,{text:r.text,to:[...r.targetLanguages]},{operation:"translateMessage"})),s=Be(a,"translateMessage"),n=$e(s[0])?s[0]:null;if(!n)throw i({apiName:"translateMessage",message:"translateMessage response data is invalid",mapped:!1});const o=Array.isArray(n.translations)?n.translations:[],d=$e(n.detectedLanguage)?n.detectedLanguage:void 0;return{detectedLanguage:d&&"string"==typeof d.language?{language:d.language,score:"number"==typeof d.score?d.score:Number(d.score??0)}:void 0,translations:o.map(e=>$e(e)&&"string"==typeof e.text&&"string"==typeof e.to?{text:e.text,to:e.to}:null).filter(e=>null!==e)}})(this.getRestClient(s),s,{text:a,targetLanguages:e.targetLanguages}))}async voiceMessageToText(e,t){ot(e,t);const r=this.getRestContextOrThrow();return this.executeRestOperation(()=>lt(this.getRestClient(r),r,e,t))}async voiceFileToText(e,t){dt(e,t);const a=this.getRestContextOrThrow(),s=this.getClientOrThrow().getUploadAdapter();if(!s)throw new g("Upload capability is missing for current platform",r.UPLOAD_REQUIRED_FIELD_MISSING);return this.executeRestOperation(()=>(async(e,t,a,s)=>{const i=dt(a,s),n=d({file:i,fallbackName:Je(i)?"voice.amr":void 0,fallbackMimeType:"audio/amr"});try{const a=await e.upload({url:`${t.restBaseUrl}${Ye(t)}/speech/recognitions`,headers:{Authorization:`Bearer ${t.token}`,Accept:"application/json",[l]:c()},source:n.source,fields:{username:t.userId,...s?.format?{format:s.format}:{},...void 0!==s?.sampleRate?{sampleRate:String(s.sampleRate)}:{},...void 0!==s?.bitsPerSample?{bitsPerSample:String(s.bitsPerSample)}:{},...void 0!==s?.channels?{channels:String(s.channels)}:{}}});let i=a.body;try{i=JSON.parse(a.body)}catch{i=a.body}if(a.status<200||a.status>=300)throw new g("Voice-to-text failed",r.VOICE_TO_TEXT_FAILED,{details:{httpStatus:a.status,rawResponse:i}});return{text:rt(i,"voiceFileToText")}}catch(o){if(o instanceof g)throw nt(o);throw nt(L(o))}})(s,a,e,t))}validateConversationLocator(e){if(this.requireNonEmptyString(e.conversationId,"conversationId"),"singleChat"!==e.conversationType&&"groupChat"!==e.conversationType&&"chatRoom"!==e.conversationType)throw this.buildValidationError("conversationType is invalid","conversationType")}validateUnreadConversationLocator(e){if(this.requireNonEmptyString(e.conversationId,"conversationId"),"singleChat"!==e.conversationType&&"groupChat"!==e.conversationType)throw this.buildValidationError("conversationType must be singleChat or groupChat","conversationType")}validateSendMessageReadReceiptsParams(e){if(this.requireNonEmptyString(e.conversationId,"conversationId"),"singleChat"!==e.conversationType&&"groupChat"!==e.conversationType)throw this.buildValidationError("conversationType is invalid","conversationType");if(e.messageIds.length>50)throw this.buildValidationError("messageIds cannot contain more than 50 items","messageIds");return this.validateMessageIdList(e.messageIds,"messageIds")}validateMessageIdList(e,t){if(!Array.isArray(e)||0===e.length)throw this.buildValidationError(`${t} cannot be empty`,t);return e.map((e,r)=>{if("string"!=typeof e||0===e.trim().length)throw this.buildValidationError(`${t}.${r} is invalid`,`${t}.${r}`);return e.trim()})}resolveDownloadCombineMessageParams(e){if("message"in e){if("combine"!==e.message.type)throw new t("message must be a combine message",{code:r.VALIDATION_INVALID_FORMAT});const a=e.message.body;return{url:a.url??"",secret:a.secret,timeoutMs:e.timeoutMs,maxItems:e.maxItems}}return{url:e.url,secret:e.secret,timeoutMs:e.timeoutMs,maxItems:e.maxItems}}validateReactionParams(e){this.requireNonEmptyString(e.messageId,"messageId"),this.requireNonEmptyString(e.reaction,"reaction")}buildActionError(e,a){return e===r.AUTH_NOT_LOGIN||e===r.AUTH_UNAUTHORIZED?new u(a??"authentication failed",{code:e}):e===r.CONNECTION_WEBSOCKET_ERROR||e===r.CONNECTION_TIMEOUT?new h(a??"connection unavailable",{code:e}):107===e||110===e||205===e||500===e||e===r.VALIDATION_REQUIRED||e===r.VALIDATION_INVALID_FORMAT?new t(a??"invalid parameter",{code:e}):e===r.MESSAGE_RECALL_TIME_LIMIT?new g(a??"message recall time limit reached",e):e===r.MESSAGE_EDIT_FAILED?new g(a??"message update failed",e):e===r.OPERATION_UNSUPPORTED?new t(a??"operation unsupported",{code:e}):new g(a??"message action failed",e)}requireNonEmptyString(e,t){if("string"!=typeof e||0===e.trim().length)throw this.buildValidationError(`${t} is required`,t)}buildValidationError(e,a){return new t(e,{code:r.VALIDATION_INVALID_FORMAT,details:{fields:[{path:a,message:e,rule:"required"}]}})}getEventContextOrThrow(){if(!this.eventContext)throw new t("ChatManager is not bound to event context",{code:r.VALIDATION_REQUIRED});return this.eventContext}getClientOrThrow(){if(!this.client)throw new t("ChatManager is not bound to client",{code:r.VALIDATION_REQUIRED});return this.client}getRestContextOrThrow(){return this.getClientOrThrow().getRestContext()}getRestClient(e){return this.restClient&&this.restBaseUrl===e.restBaseUrl&&this.restToken===e.token||(this.restClient=new y(e.restBaseUrl,{errorMap:ut,requestAdapter:this.getClientOrThrow().getRequestAdapter?.(),includeRequestId:!0}),this.restClient.setAuthToken(e.token),this.restBaseUrl=e.restBaseUrl,this.restToken=e.token),this.restClient}requireConnectedClient(){const e=this.getClientOrThrow();if(e.getConnectionState()!==A.CONNECTED)throw new h("client is not connected",{code:r.CONNECTION_WEBSOCKET_ERROR});return e}getCurrentUserIdOrThrow(){const e=this.getClientOrThrow().getCurrentUserId();if(!e)throw new u("user is not logged in",{code:r.AUTH_NOT_LOGIN});return e}buildMessageSenderOrThrow(){const e=this.getClientOrThrow(),t=this.getCurrentUserIdOrThrow(),r=e.getCacheManager()?.getUserInfoSummaries([t],!1)[0];return{userId:t,nickname:r?.nickname,avatarUrl:r?.avatarUrl}}async hydrateGroupMessageReadUsers(e,t){const r=this.getClientOrThrow();if(!r.isUserInfoSyncEnabled()||0===t.users.length)return t;const a=r.getCacheManager(),s=await w({groupId:e,users:t.users.map(e=>e.user),includeNameCard:!0,cacheManager:a,fetchUserInfos:async({userIds:e})=>{const t=this.getUserInfoReadCapability(r);return t?await t.getUserInfoByUserId({userIds:e}):[]},hydrateGroupNamecards:async(e,t)=>{const a=this.getGroupNamecardHydrationCapability(r);a&&await a.hydrateMessageProfileGroupNamecards(e,t.map(e=>({userId:e})))}});return this.dispatchFetchedUserInfoUpdates(r,s.fetchedUserInfos),{...t,users:t.users.map(e=>{const t=s.usersById.get(e.userId)??e.user;return{...e,user:t}})}}getUserInfoReadCapability(e){const t=e.getManagerByCapability("userInfo:read");return t&&"function"==typeof t.getUserInfoByUserId?t:null}getGroupNamecardHydrationCapability(e){const t=e.getManagerByCapability("group:namecard");return t&&"function"==typeof t.hydrateMessageProfileGroupNamecards?t:null}dispatchFetchedUserInfoUpdates(e,t){if(0===t.length)return;const r=e.getCurrentUserId(),a=t.find(e=>e.userId===r),s=t.filter(e=>e.userId!==r);a&&e.dispatchOwnInfoUpdated(a),e.dispatchUserInfoUpdated(s),t.length>0&&e.refreshConversationDisplayFromUserInfos(t.map(e=>({userId:e.userId})),"profile")}async executeRestOperation(e){try{return await e()}catch(t){throw this.mapRestError(t)}}mapRestError(e){return e instanceof t||e instanceof u||e instanceof h||e instanceof v?e:e instanceof I?new v(e.message,{code:e.code,details:e.details}):e instanceof n||e instanceof g?e:new g(String(e),r.UNKNOWN)}};mt.key="chatManager";let pt=mt;export{pt as C,S as I,F as M,W as V,A as a,U as b,x as c,K as d,Q as e,P as f,$ as g,V as h,k as i,H as j,q as k,X as v};