k2-im 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/chat-kit-pinia.d.ts +5 -5
- package/dist/chat-kit.d.ts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
- package/dist/modules/im-browser/src/media/media-upload-recovery-codec.js +1 -1
- package/dist/modules/im-browser/src/media/png-lossless-compression.js +1 -0
- package/dist/modules/im-browser/src/media/thumbnail-pixel-profile.js +1 -0
- package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -0
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
- package/dist/sdk.d.ts +5 -5
- package/dist/vendor/crypto/index_bg.wasm +0 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ const encrypted = crypto.encryptAes(new TextEncoder().encode(JSON.stringify(payl
|
|
|
39
39
|
|
|
40
40
|
H5 的 `common/net/crypto` 仅保留原函数名的兼容转发,不再保存另一份 WASM 或生成胶水。PC 的 workspace 协议客户端仍直接消费 `@k2/crypto/browser`,其请求客户端由宿主注入 IM,共享该实现的模块缓存。请求 WASM 与消息 RSA/TEA、媒体指纹 `hash-wasm` 职责不同。
|
|
41
41
|
|
|
42
|
+
请求 WASM 使用固定协议基准生成不依赖 SIMD 的标量制品;local/public 构建均校验实际携带的字节。来源、可复现转换和新旧协议对照见 [请求加密制品](../crypto/README.md)。这项兼容修复不等于所有旧版 iOS 已完成产品验收。
|
|
43
|
+
|
|
42
44
|
可以运行 `node scripts/check-im-request-crypto.mjs --consumer-root <已安装 SDK 的消费者目录>` 检查独立入口的真实 Rspack 依赖图;生成页面验证普通请求初始化后,延后加载 IM 并发请求不会再次获取和实例化 WASM。此验证使用合成数据和 mock transport,不代表真实后端或首屏耗时测试。
|
|
43
45
|
|
|
44
46
|
## 国际化(i18n)
|
package/dist/chat-kit-pinia.d.ts
CHANGED
|
@@ -3358,7 +3358,7 @@ interface MediaAlbumMessageOptions {
|
|
|
3358
3358
|
*
|
|
3359
3359
|
* @remarks 宿主可从本地 object URL 解码首个可展示帧,使上传占位从首次渲染就使用真实比例和主图。
|
|
3360
3360
|
* `posterData` 是等比缩放后的 JPEG(兼容已有 PNG);存在时会作为消息 `thumbData` 随正文发送。宽高必须是有限正数,
|
|
3361
|
-
* duration 存在时必须是有限正数,posterData
|
|
3361
|
+
* duration 存在时必须是有限正数,posterData 必须是非空且不超过共享单项消息容量的 Uint8Array;合集发送会按项数复核容量。
|
|
3362
3362
|
*/
|
|
3363
3363
|
interface VideoPreviewMetadata extends ImagePreviewMetadata {
|
|
3364
3364
|
/** 秒。 */
|
|
@@ -5445,7 +5445,7 @@ interface ImMediaTask {
|
|
|
5445
5445
|
/** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
|
|
5446
5446
|
error?: ImSdkErrorShape;
|
|
5447
5447
|
}
|
|
5448
|
-
/**
|
|
5448
|
+
/** 本地视频预读结果:消息封面与仅供页面显示的独立封面分别持有。 */
|
|
5449
5449
|
interface LocalVideoPreviewMetadata extends VideoPreviewMetadata {
|
|
5450
5450
|
/** 按需生成的高清 JPEG;宿主负责 object URL 生命周期,不可替代 posterData 发送。 */
|
|
5451
5451
|
displayPoster?: Blob;
|
|
@@ -5555,9 +5555,9 @@ interface ImMediaTasksApi {
|
|
|
5555
5555
|
* 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
|
|
5556
5556
|
*
|
|
5557
5557
|
* 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
|
|
5558
|
-
* `sendMediaAlbum
|
|
5559
|
-
* posterData
|
|
5560
|
-
* 仅供页面显示的高清 displayPoster(长边最多 960
|
|
5558
|
+
* `sendMediaAlbum`:发送链路会复用可用元信息;合集项超出其可用消息空间时重新生成封面。
|
|
5559
|
+
* posterData 使用共享自适应发送规格(视频 JPEG,长边最多 960);includeDisplayPoster 可在同一次解码中额外生成
|
|
5560
|
+
* 仅供页面显示的高清 displayPoster(长边最多 960),不得绕过发送校验直接用它替换 posterData。
|
|
5561
5561
|
*
|
|
5562
5562
|
* @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
|
|
5563
5563
|
* @param input.file 本地文件;不会被上传,也不会进任何缓存。
|
package/dist/chat-kit.d.ts
CHANGED
|
@@ -3467,7 +3467,7 @@ interface MediaAlbumMessageOptions {
|
|
|
3467
3467
|
*
|
|
3468
3468
|
* @remarks 宿主可从本地 object URL 解码首个可展示帧,使上传占位从首次渲染就使用真实比例和主图。
|
|
3469
3469
|
* `posterData` 是等比缩放后的 JPEG(兼容已有 PNG);存在时会作为消息 `thumbData` 随正文发送。宽高必须是有限正数,
|
|
3470
|
-
* duration 存在时必须是有限正数,posterData
|
|
3470
|
+
* duration 存在时必须是有限正数,posterData 必须是非空且不超过共享单项消息容量的 Uint8Array;合集发送会按项数复核容量。
|
|
3471
3471
|
*/
|
|
3472
3472
|
interface VideoPreviewMetadata extends ImagePreviewMetadata {
|
|
3473
3473
|
/** 秒。 */
|
|
@@ -5556,7 +5556,7 @@ interface ImMediaTask {
|
|
|
5556
5556
|
/** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
|
|
5557
5557
|
error?: ImSdkErrorShape;
|
|
5558
5558
|
}
|
|
5559
|
-
/**
|
|
5559
|
+
/** 本地视频预读结果:消息封面与仅供页面显示的独立封面分别持有。 */
|
|
5560
5560
|
interface LocalVideoPreviewMetadata extends VideoPreviewMetadata {
|
|
5561
5561
|
/** 按需生成的高清 JPEG;宿主负责 object URL 生命周期,不可替代 posterData 发送。 */
|
|
5562
5562
|
displayPoster?: Blob;
|
|
@@ -5666,9 +5666,9 @@ interface ImMediaTasksApi {
|
|
|
5666
5666
|
* 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
|
|
5667
5667
|
*
|
|
5668
5668
|
* 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
|
|
5669
|
-
* `sendMediaAlbum
|
|
5670
|
-
* posterData
|
|
5671
|
-
* 仅供页面显示的高清 displayPoster(长边最多 960
|
|
5669
|
+
* `sendMediaAlbum`:发送链路会复用可用元信息;合集项超出其可用消息空间时重新生成封面。
|
|
5670
|
+
* posterData 使用共享自适应发送规格(视频 JPEG,长边最多 960);includeDisplayPoster 可在同一次解码中额外生成
|
|
5671
|
+
* 仅供页面显示的高清 displayPoster(长边最多 960),不得绕过发送校验直接用它替换 posterData。
|
|
5672
5672
|
*
|
|
5673
5673
|
* @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
|
|
5674
5674
|
* @param input.file 本地文件;不会被上传,也不会进任何缓存。
|
|
@@ -8280,7 +8280,7 @@ declare function prioritizeMediaDownload(runtime: ChatRuntime, message: ImMessag
|
|
|
8280
8280
|
* `preload="metadata"` 在 iOS Safari 上只加载元信息、不解码任何一帧,格子会是空白的,
|
|
8281
8281
|
* 而且 N 个文件就是 N 路解码。
|
|
8282
8282
|
*
|
|
8283
|
-
* 返回值可以**原样**作为 `localPreviewMetadata`
|
|
8283
|
+
* 返回值可以**原样**作为 `localPreviewMetadata` 传给发送命令:发送链路复用可用元信息,合集封面超出空间时重新生成,
|
|
8284
8284
|
* 上传中的气泡也从第一帧就有封面。posterData 只用于发送;需要高清预览时请求独立的 displayPoster。
|
|
8285
8285
|
*
|
|
8286
8286
|
* @param runtime 当前账号 runtime。
|
package/dist/index.d.ts
CHANGED
|
@@ -4000,7 +4000,7 @@ interface MediaAlbumMessageOptions {
|
|
|
4000
4000
|
*
|
|
4001
4001
|
* @remarks 宿主可从本地 object URL 解码首个可展示帧,使上传占位从首次渲染就使用真实比例和主图。
|
|
4002
4002
|
* `posterData` 是等比缩放后的 JPEG(兼容已有 PNG);存在时会作为消息 `thumbData` 随正文发送。宽高必须是有限正数,
|
|
4003
|
-
* duration 存在时必须是有限正数,posterData
|
|
4003
|
+
* duration 存在时必须是有限正数,posterData 必须是非空且不超过共享单项消息容量的 Uint8Array;合集发送会按项数复核容量。
|
|
4004
4004
|
*/
|
|
4005
4005
|
interface VideoPreviewMetadata extends ImagePreviewMetadata {
|
|
4006
4006
|
/** 秒。 */
|
|
@@ -6128,7 +6128,7 @@ interface ImMediaTask {
|
|
|
6128
6128
|
/** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
|
|
6129
6129
|
error?: ImSdkErrorShape;
|
|
6130
6130
|
}
|
|
6131
|
-
/**
|
|
6131
|
+
/** 本地视频预读结果:消息封面与仅供页面显示的独立封面分别持有。 */
|
|
6132
6132
|
interface LocalVideoPreviewMetadata extends VideoPreviewMetadata {
|
|
6133
6133
|
/** 按需生成的高清 JPEG;宿主负责 object URL 生命周期,不可替代 posterData 发送。 */
|
|
6134
6134
|
displayPoster?: Blob;
|
|
@@ -6238,9 +6238,9 @@ interface ImMediaTasksApi {
|
|
|
6238
6238
|
* 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
|
|
6239
6239
|
*
|
|
6240
6240
|
* 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
|
|
6241
|
-
* `sendMediaAlbum
|
|
6242
|
-
* posterData
|
|
6243
|
-
* 仅供页面显示的高清 displayPoster(长边最多 960
|
|
6241
|
+
* `sendMediaAlbum`:发送链路会复用可用元信息;合集项超出其可用消息空间时重新生成封面。
|
|
6242
|
+
* posterData 使用共享自适应发送规格(视频 JPEG,长边最多 960);includeDisplayPoster 可在同一次解码中额外生成
|
|
6243
|
+
* 仅供页面显示的高清 displayPoster(长边最多 960),不得绕过发送校验直接用它替换 posterData。
|
|
6244
6244
|
*
|
|
6245
6245
|
* @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
|
|
6246
6246
|
* @param input.file 本地文件;不会被上传,也不会进任何缓存。
|
|
@@ -9551,7 +9551,7 @@ declare function prioritizeMediaDownload(runtime: ChatRuntime, message: ImMessag
|
|
|
9551
9551
|
* `preload="metadata"` 在 iOS Safari 上只加载元信息、不解码任何一帧,格子会是空白的,
|
|
9552
9552
|
* 而且 N 个文件就是 N 路解码。
|
|
9553
9553
|
*
|
|
9554
|
-
* 返回值可以**原样**作为 `localPreviewMetadata`
|
|
9554
|
+
* 返回值可以**原样**作为 `localPreviewMetadata` 传给发送命令:发送链路复用可用元信息,合集封面超出空间时重新生成,
|
|
9555
9555
|
* 上传中的气泡也从第一帧就有封面。posterData 只用于发送;需要高清预览时请求独立的 displayPoster。
|
|
9556
9556
|
*
|
|
9557
9557
|
* @param runtime 当前账号 runtime。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readImageDimensionsFromHeader as t}from"./image-header-dimensions.js";
|
|
1
|
+
import{readImageDimensionsFromHeader as t}from"./image-header-dimensions.js";import{compressCanvasPng as e}from"./png-lossless-compression.js";import{isPhotoThumbnailCandidate as r}from"./thumbnail-pixel-profile.js";import{resolveMediaThumbnailPolicy as i}from"../../../im-core/src/media-thumbnail-policy.js";const a=i();function o(t){const e={active:0,disposed:!1},r=[];function i(){for(;!e.disposed&&e.active<t&&r.length>0;){const t=r.shift();if(t.signal?.aborted){t.reject(new DOMException("媒体预览准备已取消","AbortError"));continue}void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),e.active+=1;let a=!1;t.resolve(()=>{a||(a=!0,e.active-=1,i())})}}return{acquire:t=>e.disposed?Promise.reject(new Error("媒体预览执行器已释放")):new Promise((e,a)=>{const o={resolve:e,reject:a,...void 0===t?{}:{signal:t}};void 0!==t&&(o.onAbort=()=>{const t=r.indexOf(o);t>=0&&r.splice(t,1),a(new DOMException("媒体预览准备已取消","AbortError"))},t.addEventListener("abort",o.onAbort,{once:!0})),r.push(o),i()}),dispose(){e.disposed=!0;for(const t of r.splice(0))void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),t.reject(new Error("媒体预览执行器已释放"))}}}function n(t){if(t?.aborted)throw new DOMException("媒体预览准备已取消","AbortError")}const s=16777216;function h(t,e,r){const i=Math.min(1,r/Math.max(t,e));return function(t,e){const r=Math.min(1,4096/Math.max(t,e));let i=Math.max(1,Math.round(t*r)),a=Math.max(1,Math.round(e*r));const o=i*a;if(o>s){const t=Math.sqrt(s/o);i=Math.max(1,Math.floor(i*t)),a=Math.max(1,Math.floor(a*t))}return{width:i,height:a}}(Math.max(1,Math.round(t*i)),Math.max(1,Math.round(e*i)))}async function d(t,r){n(r);const i=await new Promise(e=>t.toBlob(e,"image/png"));if(n(r),null===i)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await e(await i.arrayBuffer(),r)}async function c(t,e,r){n(r);const i=await new Promise(r=>t.toBlob(r,"image/jpeg",e));if(n(r),null===i)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await i.arrayBuffer()}function m(t,e){if(!Number.isInteger(t)||t<=0)throw new RangeError(`${e}必须是正整数`)}function l(t,e){if(!Number.isFinite(t)||t<=0||t>1)throw new RangeError(`${e}必须大于 0 且不超过 1`)}async function f(t,e,i,o,s){const f="video"===o.kind,u=f?"视频封面":"图片缩略图",w=o.maxSize??a.maxSize,g=o.maxBytes??a.maxBytes,v=o.targetBytes??g,y=Math.min(w,Math.max(e,i)),b=y<=320?.94:y<=640?.9:y<=800?.86:.72;let M=o.quality??Math.max(b,o.minQuality??0),p=o.minQuality??Math.min(M,.72);if(m(w,`${u}最大边长`),m(v,`${u}目标字节数`),m(g,`${u}最大字节数`),l(M,`${u}初始质量`),l(p,`${u}最低质量`),v>g)throw new RangeError(`${u}目标字节数不能超过最大字节数`);if(p>M)throw new RangeError(`${u}最低质量不能高于初始质量`);n(s);const x=document.createElement("canvas");try{const a=x.getContext("2d");if(null===a)throw new Error("媒体预览准备失败:无法创建 Canvas 2D 上下文");const m=e=>{n(s),x.width=e.width,x.height=e.height,a.drawImage(t,0,0,e.width,e.height)};let l=h(e,i,w);m(l);const b=f?void 0:a.getImageData(0,0,l.width,l.height).data;let E=!1;if(void 0!==b)for(let t=3;t<b.length;t+=4)if(b[t]<255){E=!0;break}if(E){const t=Math.min(32,Math.max(l.width,l.height));let r;for(let a=0;a<6;a+=1){const o=await d(x,s);if((void 0===r||o.byteLength<r.byteLength)&&(r=o),o.byteLength<=v)return o;const n=Math.max(l.width,l.height);if(n<=t||5===a)break;const c=Math.min(.8,Math.max(.35,.9*Math.sqrt(v/o.byteLength)));l=h(e,i,Math.max(t,Math.floor(n*c))),m(l)}if(void 0!==r&&r.byteLength<=g)return r;throw new Error(`${u}生成失败:编码结果超过 ${g} 字节硬上限`)}y>800&&void 0!==b&&void 0===o.quality&&void 0===o.minQuality&&void 0===o.targetBytes&&r(b,l.width,l.height)&&(M=.68,p=.68);const L=Math.min(200,Math.max(l.width,l.height));let B;const j=[.../* @__PURE__ */new Set([M,Math.max(p,M-.12),p])];for(const t of j){const e=await c(x,t,s);if((void 0===B||e.byteLength<B.byteLength)&&(B=e),e.byteLength<=v)return e}for(let t=0;t<3;t+=1){const t=Math.max(l.width,l.height);if(t<=L||void 0===B||B.byteLength<=g)break;const r=Math.sqrt(v/B.byteLength);l=h(e,i,Math.max(L,Math.floor(t*Math.min(.9,Math.max(.5,r))))),m(l);for(const t of[M,p]){const e=await c(x,t,s);if(e.byteLength<B.byteLength&&(B=e),e.byteLength<=v)return e}}if(void 0!==B&&B.byteLength<=g)return B;throw new Error(`${u}生成失败:编码结果超过 ${g} 字节硬上限`)}finally{x.width=0,x.height=0}}function u(t,e,r,i){return n(r),new Promise((a,o)=>{let n,s,h,d;const c=()=>{void 0!==n&&clearTimeout(n),t.removeEventListener(e,s),t.removeEventListener("error",h),r?.removeEventListener("abort",d)};s=()=>{("seeked"===e?!t.seeking:t.readyState>=("loadedmetadata"===e?1:2))&&(c(),a())},h=()=>{c(),o(new Error(`视频预览准备失败:${e} 前解码错误`))},d=()=>{c(),o(new DOMException("媒体预览准备已取消","AbortError"))},n=setTimeout(()=>{c(),o(new Error(`视频预览准备失败:${e} 超时`))},15e3),t.addEventListener(e,s),t.addEventListener("error",h,{once:!0}),r?.addEventListener("abort",d,{once:!0});try{i?.(),r?.aborted?d():null!==t.error?h():s()}catch(t){c(),o(t)}})}function w(e={}){const r=e.maxConcurrency??function(){if("undefined"==typeof navigator)return 2;const t=navigator.userAgent;if(/iPad|iPhone|iPod/.test(t)||/Macintosh/.test(t)&&(navigator.maxTouchPoints??0)>1)return 1;const e=navigator.deviceMemory;return void 0!==e&&e<=2?1:2}();if(!Number.isInteger(r)||r<1||r>4)throw new RangeError("媒体预览并发数必须是 1-4 的整数");const i=o(r),s=o(1);let d=!1;return{async prepare(e,r){if(d)throw new Error("媒体预览执行器已释放");const o="video"===e.kind,c=await(o?s:i).acquire(r);try{const i=o?await async function(t,e){const r=URL.createObjectURL(t.file),i=document.createElement("video");i.muted=!0,i.preload="metadata",i.playsInline=!0;try{await u(i,"loadedmetadata",e,()=>{i.src=r,i.load()});const a=i.videoWidth,o=i.videoHeight;if(a<=0||o<=0)throw new Error("视频预览准备失败:视频尺寸无效");const n=Number.isFinite(i.duration)&&i.duration>0?i.duration:void 0,s=void 0===t.atTime?void 0===n?0:Math.min(1,n/2):Math.max(0,Math.min(t.atTime,n??t.atTime));s>0&&await u(i,"seeked",e,()=>{i.currentTime=s}),await u(i,"loadeddata",e,()=>{i.preload="auto"});const h=void 0===n?void 0:n;let d,c;try{d=await f(i,a,o,t,e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}if(t.includeDisplayPoster)try{c=await f(i,a,o,{...t,maxSize:960,targetBytes:163840,maxBytes:262144,quality:.9,minQuality:.8},e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}return{width:a,height:o,...void 0===h?{}:{duration:h},...void 0===d?{}:{posterData:d},...void 0===c?{}:{displayPosterData:c}}}finally{i.pause(),i.removeAttribute("src"),i.load(),URL.revokeObjectURL(r)}}(e,r):await async function(e,r){n(r);const i=e.maxSize??a.maxSize,o=e.maxBytes??a.maxBytes,s=await t(e.file);function d(t,r){return"image/jpeg"===e.file.type&&e.file.size<=o&&Math.max(t,r)<=Math.min(i,480)}async function c(t,a){return"image/jpeg"===e.file.type&&Math.max(a.width,a.height)<=i&&e.file.size<=t.byteLength?(n(r),await e.file.arrayBuffer()):t}if(n(r),void 0!==s){if(!1===e.includePoster)return s;if(d(s.width,s.height))return{...s,posterData:await e.file.arrayBuffer()}}const m=void 0===s?void 0:h(s.width,s.height,i);let l;try{l=void 0===m?await createImageBitmap(e.file):await createImageBitmap(e.file,{resizeWidth:m.width,resizeHeight:m.height,resizeQuality:"high"})}catch(t){if(r?.aborted)throw t}if(void 0!==l)try{n(r);const t=s??{width:l.width,height:l.height};return!1===e.includePoster?t:void 0===s&&d(l.width,l.height)?{...t,posterData:await e.file.arrayBuffer()}:{...t,posterData:await c(await f(l,l.width,l.height,e,r),t)}}finally{l.close()}const u=URL.createObjectURL(e.file),w=new Image;try{await new Promise((t,e)=>{let i,a;const o=()=>{void 0!==i&&clearTimeout(i),w.onload=null,w.onerror=null,r?.removeEventListener("abort",a)};a=()=>{o(),e(new DOMException("媒体预览准备已取消","AbortError"))},w.onload=()=>{o(),t()},w.onerror=()=>{o(),e(new Error("图片预览准备失败:Image 解码错误"))},i=setTimeout(()=>{o(),e(new Error("图片预览准备失败:Image 解码超时"))},15e3),r?.addEventListener("abort",a,{once:!0}),w.src=u});const t=s??{width:w.naturalWidth,height:w.naturalHeight};return!1===e.includePoster?t:d(w.naturalWidth,w.naturalHeight)?{...t,posterData:await e.file.arrayBuffer()}:{...t,posterData:await c(await f(w,w.naturalWidth,w.naturalHeight,e,r),t)}}finally{w.removeAttribute("src"),URL.revokeObjectURL(u)}}(e,r);return n(r),i}finally{c()}},dispose(){d||(d=!0,i.dispose(),s.dispose())}}}export{w as createMediaPreviewPreparationExecutor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,r,n)=>((t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n)(t,"symbol"!=typeof r?r+"":r,n);
|
|
1
|
+
var e=Object.defineProperty,t=(t,r,n)=>((t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n)(t,"symbol"!=typeof r?r+"":r,n);import{MEDIA_THUMBNAIL_MAX_BYTES as r}from"../../../im-core/src/media-thumbnail-policy.js";class n extends Error{constructor(e,r){super(`Media upload recovery ${e}`,r),t(this,"reason"),t(this,"code"),this.reason=e,this.name="MediaUploadRecoveryError",this.code=`IM_MEDIA_UPLOAD_RECOVERY_${e.toUpperCase()}`}}function i(){throw new n("invalid")}function o(e){return"object"!=typeof e||null===e||Array.isArray(e)?i():e}function a(e,t=4096){return"string"!=typeof e||0===e.length||e.length>t?i():e}function s(e,t=0){return"number"!=typeof e||!Number.isSafeInteger(e)||e<t?i():e}function u(e){return"number"!=typeof e||!Number.isFinite(e)||e<0?i():e}function c(e,t=4096){if(void 0!==e)return"string"!=typeof e||e.length>t?i():e}function d(e){const t=o(e);if(1!==t.version||"video"!==t.kind&&"file"!==t.kind||"boolean"!=typeof t.encrypted)return i();const n=o(t.ref);if("direct"!==n.conversationType&&"group"!==n.conversationType&&"channel"!==n.conversationType)return i();const d=o(t.source),p=s(d.size,1),f=a(d.sha256,64);if(!/^[a-f0-9]{64}$/.test(f))return i();const l=o(t.resume),y=o(l.transport),m=o(y.session),v=s(m.partSize,8);if(v%8!=0||s(m.sourceBytes,1)!==p||!Array.isArray(m.parts)||m.parts.length>1e4)return i();const b=/* @__PURE__ */new Set;let h=0;const g=m.parts.map(e=>{const t=o(e),r=s(t.partNumber,1);return r>Math.ceil(p/v)||b.has(r)?i():(b.add(r),h+=Math.min(v,p-(r-1)*v),{partNumber:r,etag:a(t.etag,1024)})});if(s(l.bytesUploaded)!==h)return i();let A,w;if(t.encrypted){if(!(t.teaKey instanceof Uint8Array)||16!==t.teaKey.length)return i();A=new Uint8Array(t.teaKey)}else if(void 0!==t.teaKey)return i();if(void 0!==t.preview){const e=o(t.preview);let n;if(void 0!==e.thumbData){if(!(e.thumbData instanceof Uint8Array)||e.thumbData.byteLength>r)return i();n=new Uint8Array(e.thumbData)}w={width:u(e.width),height:u(e.height),...void 0===e.duration?{}:{duration:u(e.duration)},...void 0===n?{}:{thumbData:n}}}if(void 0!==t.filesAlbum&&"boolean"!=typeof t.filesAlbum)return i();const I=c(d.filename),k=c(d.mimeType,256),U=c(t.caption,16384),M=c(t.refMessageId);return{version:1,ref:{conversationType:n.conversationType,conversationId:a(n.conversationId)},messageId:a(t.messageId),kind:t.kind,createdAt:s(t.createdAt),savedAt:s(t.savedAt),encrypted:t.encrypted,source:{size:p,sha256:f,...void 0===I?{}:{filename:I},...void 0===k?{}:{mimeType:k}},...void 0===A?{}:{teaKey:A},...void 0===w?{}:{preview:w},...void 0===U?{}:{caption:U},...void 0===M?{}:{refMessageId:M},...void 0===t.filesAlbum?{}:{filesAlbum:t.filesAlbum},resume:{bytesUploaded:h,transport:{logicalBucket:a(y.logicalBucket),objectName:a(y.objectName),session:{bucket:a(m.bucket),key:a(m.key),uploadId:a(m.uploadId),partSize:v,sourceBytes:p,parts:g}}}}}export{n as MediaUploadRecoveryError,d as decodeMediaUploadRecoveryRecord};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=[137,80,78,71,13,10,26,10],t=1229209940,r=Uint32Array.from({length:256},(e,t)=>{let r=t;for(let e=0;e<8;e+=1)r=r>>>1^(1&r?3988292384:0);return r>>>0});async function n(n,o){if(o?.aborted)throw new DOMException("媒体预览准备已取消","AbortError");if(n.byteLength<16384||"undefined"==typeof CompressionStream||"undefined"==typeof DecompressionStream)return n;const i=new Uint8Array(n);if(!e.every((e,t)=>i[t]===e))return n;const s=new DataView(n),f=[];let a=-1,w=-1,h=!1;for(let e=8;e<i.length;){if(e+12>i.length)throw new Error("PNG 预览压缩失败:数据块不完整");const r=s.getUint32(e),o=e+r+12;if(o>i.length)throw new Error("PNG 预览压缩失败:数据块越界");const u=s.getUint32(e+4);if(8===e){if(1229472850!==u||13!==r)throw new Error("PNG 预览压缩失败:缺少有效图片头");if(s.getUint32(e+8)*s.getUint32(e+12)>1048576)return n}if(1633899596===u)return n;if(u===t){if(-1===a)a=e;else if(w!==e)throw new Error("PNG 预览压缩失败:图片数据块不连续");w=o,f.push(i.subarray(e+8,e+8+r))}if(1229278788===u){h=0===r&&o===i.length;break}e=o}if(!h||-1===a)throw new Error("PNG 预览压缩失败:缺少图片数据或结束标记");const u=await new Response(new Blob(f).stream().pipeThrough(new DecompressionStream("deflate"),{signal:o}).pipeThrough(new CompressionStream("deflate"),{signal:o})).arrayBuffer();if(o?.aborted)throw new DOMException("媒体预览准备已取消","AbortError");const g=w-a-u.byteLength-12;if(g<1024)return n;const y=new Uint8Array(n.byteLength-g);y.set(i.subarray(0,a));const b=new DataView(y.buffer);return b.setUint32(a,u.byteLength),b.setUint32(a+4,t),y.set(new Uint8Array(u),a+8),b.setUint32(a+8+u.byteLength,function(e){let t=4294967295;for(const n of e)t=t>>>8^r[255&(t^n)];return(4294967295^t)>>>0}(y.subarray(a+4,a+8+u.byteLength))),y.set(i.subarray(w),a+12+u.byteLength),y.buffer}export{n as compressCanvasPng};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function t(t,a,e){if(a<2||e<2||t.length!==a*e*4)return!1;const r=Math.max(1,Math.ceil(Math.sqrt(a*e/4096)));let h=0,l=0,n=0;for(let o=0;o<e-1;o+=r)for(let e=0;e<a-1;e+=r){const r=4*(o*a+e);let M=0;for(let e=0;e<3;e+=1)M=Math.max(M,Math.abs(t[r+e]-t[r+4+e]),Math.abs(t[r+e]-t[r+4*a+e]));h+=1,M<=3&&(l+=1),M>=48&&(n+=1)}return h>=256&&l/h<.4&&n/h<.04}export{t as isPhotoThumbnailCandidate};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MEDIA_ALBUM_MAX_ITEMS as r,MEDIA_ALBUM_CONTENT_MAX_BYTES as o}from"./mapping/media-album-body.js";const e=Math.floor(3*(o-32768)/4),t=e;function a(o=1){if(!Number.isInteger(o)||o<1||o>r)throw new RangeError(`媒体缩略图项数必须是 1 到 ${r} 的整数`);return{maxSize:o<=2?960:720,maxBytes:Math.floor(e/o)}}export{t as MEDIA_THUMBNAIL_MAX_BYTES,a as resolveMediaThumbnailPolicy};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as e,MEDIA_ALBUM_MAX_ITEMS as t,resolveMediaAlbumSendContentType as a,measureMediaAlbumContentBytes as i,mediaAlbumBMessageFields as n,MEDIA_ALBUM_CONTENT_WARN_BYTES as o}from"../../mapping/media-album-body.js";import{computeSortKey as r}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as d}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as s}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as l}from"../../mapping/stored-message.js";function c(e){return Number.isFinite(e)&&e>0}const u=16384;function p(e,t){if(("video"===t||"image"===t)&&void 0!==e&&c(e.width)&&c(e.height)&&("video"!==t||void 0===e.duration||c(e.duration))&&("video"!==t||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>16384)))return{width:e.width,height:e.height,..."video"===t&&void 0!==e.duration?{duration:e.duration}:{},..."video"===t&&void 0!==e.posterData?{thumbData:new Uint8Array(e.posterData)}:{}}}function m(e,t){return void 0===t?e:{...e,width:t.width,height:t.height,...void 0===t.thumbData?{}:{thumbData:t.thumbData},...void 0===e.duration&&void 0!==t.duration?{duration:t.duration}:{}}}const f={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i),o=await a.imageThumbnail(e,{mimeType:t,maxSize:320,targetBytes:12288,maxBytes:20480,quality:.9,minQuality:.72},i);return{width:n.width,height:n.height,...o.data.byteLength<=20480?{thumbData:o.data}:{}}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n})=>({image:{url:e,width:t.width,height:t.height,...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},v={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,a,i){const n=await a.videoPoster(e,{mimeType:t,maxSize:320,targetBytes:10240,maxBytes:u,quality:.84,minQuality:.68},i);return{width:n.width,height:n.height,...n.data.byteLength<=u?{thumbData:n.data}:{},duration:n.duration}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n},o)=>({video:{url:e,width:t.width,height:t.height,...void 0!==t.duration?{duration:t.duration}:{},...void 0!==o.caption&&""!==o.caption?{describe:o.caption}:{},...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a,sizeUnit:"bytes"}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},g={contentType:"voice",uploadKind:"voice",encryptMode:"integral",buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody:({url:e,size:t,teaKey:a,fileEncryptType:i},n)=>({voice:{url:e,durationMs:n.durationMs??0,...void 0!==n.waveform&&n.waveform.length>0?{waveform:n.waveform}:{},...void 0!==t?{size:t}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}})},y={contentType:"sticker",uploadKind:"sticker",encryptMode:"none",async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i);return{width:n.width,height:n.height}},buildBody:({url:e,meta:t,size:a})=>({sticker:{url:e,width:t.width,height:t.height,exprType:2,imageType:1,...void 0===a?{}:{size:a}}})};const h={contentType:"file",uploadKind:"file",encryptMode:"simple",streamUpload:!0,buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody({url:e,size:t,teaKey:a,fileEncryptType:i},n){const o=n.filename??"",r=function(e){const t=e.lastIndexOf(".");return t>-1&&t<e.length-1?e.slice(t+1).toLowerCase():""}(o),d=function(e,t){const a=t??"";return a.startsWith("image/")||["jpg","jpeg","png","gif","webp","bmp","heic","svg"].includes(e)?1:a.startsWith("video/")||["mp4","mov","m4v","3gp","avi","mkv","webm","flv"].includes(e)?2:a.startsWith("audio/")||["mp3","m4a","wav","aac","flac","ogg"].includes(e)?3:["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","zip","rar","7z","apk","json"].includes(e)?4:0}(r,n.mimeType);return{file:{url:e,fileName:o,...void 0!==t?{size:t}:{},...""!==r?{extension:r}:{},...0!==d?{fileType:d}:{},...void 0!==n.mimeType&&""!==n.mimeType?{mimeType:n.mimeType}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}}}},w={...h,contentType:"filesAlbum",buildBody(e,t){const a=h.buildBody(e,t).file;return{filesAlbum:{...t.caption?.trim()?{caption:t.caption}:{},items:[{...a,extension:a.extension??"",fileType:a.fileType??0,...["zip","rar","torrent"].includes(a.extension??"")?{fileType:5}:{},...void 0===e.md5?{}:{md5:e.md5}}]}}}};function b(e){switch(e){case"empty":return"media.empty";case"no-crypto":return"media.noCrypto";case"preview-failed":return"media.previewFailed";case"encrypt-failed":return"media.encryptFailed";case"upload-failed":case"offline":return"media.uploadFailed";case"cancelled":return"media.cancelled";case"paused":throw new Error("暂停不是失败状态,不应生成失败文案");case"invalid-duration":return"media.invalidDuration";case"content-too-large":return"media.contentTooLarge"}}function T(e,t){return"video"===e||void 0===t||t>16777216?"large":"small"}function k(){return new DOMException("媒体上传已取消","AbortError")}function M(e){return"album"===e.kind?e.items.flatMap(e=>void 0===e.resume||void 0!==e.uploaded?[]:[{resume:e.resume,kind:e.uploadKind}]):void 0===e.resume?[]:[{resume:e.resume,kind:e.spec.uploadKind}]}function I(e){if("album"===e.kind)return{code:l,reason:"unknown",displayCode:b(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:l,reason:"unknown",displayCode:t?"media.uploadInterrupted":b(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function A(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function E(c){const u=function(e){let t=0,a=0;const i=[];function n(i){return t<e.total&&("large"!==i||a<e.largeFiles)}function o(e){t+=1,"large"===e&&(a+=1);let i=!1;return()=>{i||(i=!0,t-=1,"large"===e&&(a-=1),r())}}function r(){let e=0;for(;e<i.length;){const t=i[e];t.signal.aborted?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.reject(k())):n(t.tier)?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.resolve(o(t.tier))):e+=1}}return{acquire:(e,t)=>t.aborted?Promise.reject(k()):new Promise((a,n)=>{const o={tier:e,signal:t,resolve:a,reject:n,onAbort:()=>{const e=i.indexOf(o);e>=0&&i.splice(e,1),n(k())}};i.push(o),t.addEventListener("abort",o.onAbort,{once:!0}),r()})}}(function(e){if(void 0===e)return{total:5,largeFiles:3};if("number"==typeof e)return A(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;A(t,"total");const a=e.largeFiles??Math.min(3,t);if(A(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(c.maxConcurrentUploads)),E=/* @__PURE__ */new Map,C=/* @__PURE__ */new Map,P=/* @__PURE__ */new Map,K=/* @__PURE__ */new Map;let R=!1;const D=/* @__PURE__ */new Map,z=/* @__PURE__ */new Map,U=/* @__PURE__ */new Set,S=/* @__PURE__ */new Map,x=/* @__PURE__ */new Map;function _(e,t){const a=S.get(e)??/* @__PURE__ */new Set;S.set(e,a),a.add(t),U.add(t),t.finally(()=>{a.delete(t),U.delete(t),0===a.size&&S.get(e)===a&&S.delete(e),ie(e)})}function B(e){return[...S.get(e)??[]]}const O=/* @__PURE__ */new Map,F=/* @__PURE__ */new Set,L=/* @__PURE__ */new Map,q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Map,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map;let $=!0,W=0,Q=0;function G(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function H(e,t,a,i){c.mediaTransfer.abandonUpload(e).catch(e=>{c.onMediaTransferError?.({stage:"upload",kind:t,messageId:a,conversation:i,cause:e})})}function J(e,t,a,i,n,o){if(!$)return;const r=G(t);L.set(e,{input:G(t),state:a,percent:i,phase:o}),c.emitter.emit({type:"media-task:updated",conversation:r,task:{id:`upload:${e}`,messageId:e,ref:r,direction:"upload",state:a,percent:Math.max(0,Math.min(100,Math.round(i))),attempt:K.get(e)?.attempt??1,maxAttempts:3,...V.get(e),...q.has(e)?{items:Object.freeze(q.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===a||"failed"===a?a:e.state})))}:{},...z.get(e),...void 0===o?{}:{phase:o},...void 0===n?{}:{failure:n}}})}function X(e,t){ae(),N.delete(e),Y.delete(e),N.set(e,t),te()}function Z(e){const t=K.get(e);if(E.has(e)||O.has(e)||B(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=L.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function ee(e,t){const a=G(t.input),i=M(t),n="media"===t.kind?t.spec.uploadKind:"image",o={...I(t),displayCode:"media.uploadInterrupted",retryable:!1};N.delete(e),Y.delete(e),K.delete(e),j.delete(e),V.delete(e),q.delete(e),z.delete(e),D.delete(e),L.delete(e),P.delete(e);for(const t of i)H(t.resume,t.kind,e,a);if(function(e,t,a){const i=c.recoveryPort;if(void 0===i)return;const n=B(e),o=Promise.all(n).then(()=>i.remove(G(t),e)).catch(i=>{c.onMediaTransferError?.({stage:"upload",kind:a,messageId:e,conversation:G(t),cause:i})});_(e,o)}(e,a,n),!$)return;const r=c.domainState.getConversationMessage?.(a,e)??t.message;"sent"!==r.status&&(c.domainState.upsertMessages([{...r,status:"failed",failure:o}],"live"),J(e,a,"failed",0,o))}function te(){if($)for(const[e,t]of N){if(N.size<=3)break;Z(e)&&ee(e,t)}}function ae(){if(!$)return;const e=Date.now();for(const[t,a]of N){const i=Y.get(t);void 0!==i&&e-i>=864e5&&Z(t)&&ee(t,a)}}function ie(e){$&&(N.has(e)&&Z(e)&&!Y.has(e)&&Y.set(e,Date.now()),te())}async function ne(e,t,a,i,n,o,f=!1){const v=W,g=()=>$&&v===W;if(!g())return void 0!==o&&void 0!==a&&H(o,e.uploadKind,a,G(t)),{ok:!1,reason:"cancelled"};const y=Q;let h,w,M=n,I=o,A=Promise.resolve(void 0);const U=/* @__PURE__ */new Set,S="function"==typeof t.data;const B=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(t.data)?t.data:void 0,O=S||void 0!==B?void 0:t.data,F=S||void 0!==B,q=!0===e.streamUpload&&void 0!==B,Y=e=>{if(void 0!==B)return B;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===t.mimeType?void 0:{type:t.mimeType})};if(0===O?.length||0===B?.size)return{ok:!1,reason:"empty"};const Z=t.encrypted??!0;if(Z&&void 0===c.crypto)return{ok:!1,reason:"no-crypto"};const ee=p(t.localPreviewMetadata,e.contentType);if(("video"===e.contentType||"image"===e.contentType)&&void 0!==t.localPreviewMetadata&&void 0===ee)return{ok:!1,reason:"preview-failed"};const te=void 0===a||void 0===i?c.outbox.allocateMessageIdentity({conversationId:t.conversationId,conversationType:t.conversationType}):{id:a,createdAt:i},{id:ae,createdAt:ie}=te,ne=c.getSelfId();let oe=ee??{width:0,height:0};if(!F)try{oe=m(await e.buildPreview(Y(O),t.mimeType,c.mediaPreview),ee)}catch{}if(!g())return void 0!==I&&H(I,e.uploadKind,ae,G(t)),{ok:!1,reason:"cancelled"};const re=B?.size??O?.byteLength,de={url:t.localPreviewUrl??"",...void 0===re?{}:{size:re}};let le={id:ae,conversationId:t.conversationId,conversationType:t.conversationType,senderId:ne,contentType:e.contentType,body:e.buildBody({...de,meta:oe},t),createdAt:ie,sortKey:r(ie,ae),status:"uploading",receipt:"unread",encryption:{encrypted:Z},...void 0!==t.refMessageId?{refMessageId:t.refMessageId}:{}};c.domainState.upsertMessages([le],"live",{newOutgoing:!0});const ce=f?0:j.get(ae)??0;f&&V.delete(ae),j.set(ae,ce),J(ae,t,"queued",ce,void 0,"waiting-upload-slot");const ue=(a,i=!1)=>{const n={code:l,reason:"unknown",displayCode:"cleanup-unconfirmed"===h?"media.cleanupUnconfirmed":"resume-unavailable"===h?"media.resumeUnavailable":"timeout"===h?"media.uploadTimeout":b(a),mediaKind:e.uploadKind,retryable:i};if(!g())return{ok:!1,reason:a};const o=K.get(ae);return"paused"===o?.stopped?(J(ae,t,"paused",j.get(ae)??0),{ok:!1,reason:a}):void 0!==o&&void 0===o.stopped&&o.attempt<3&&("network"===o.failure||"timeout"===o.failure||"credentials-expired"===o.failure||"offline"===a&&void 0!==c.waitUntilOnline)?(J(ae,t,"queued",j.get(ae)??0,void 0,"waiting-retry"),{ok:!1,reason:a}):("cancelled"===o?.stopped||void 0!==o&&o.attempt>=3&&("network"===o.failure||"timeout"===o.failure||"credentials-expired"===o.failure)||(c.domainState.upsertMessages([{...le,status:"failed",failure:n}],"live"),J(ae,t,"cancelled"===a?"canceled":"failed",j.get(ae)??0,n)),{ok:!1,reason:a})},pe=async()=>{if(void 0!==I)try{await c.mediaTransfer.abandonUpload(I),I=void 0}catch(a){throw h="cleanup-unconfirmed",c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}),a}},me=async a=>{if(await A,await Promise.all([...U]),"cancelled"===a&&"paused"!==K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint&&"cleanup-unconfirmed"!==h)try{await pe()}catch{}return"cancelled"===a&&"paused"!==K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint&&void 0!==c.recoveryPort&&(await Promise.all([...U]),await c.recoveryPort.remove(G(t),ae).catch(a=>c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}))),g()?(X(ae,{kind:"media",spec:e,input:t,createdAt:ie,message:le,failureReason:a,...!0===K.get(ae)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===h||"resume-unavailable"===h?{restartRequired:!0}:{},...void 0===M?{}:{teaKey:M},...void 0===I?{}:{resume:I}}),ue(a,!0)):{ok:!1,reason:"cancelled"}},fe=new AbortController;E.set(ae,fe),C.set(ae,G(t));const ve=K.get(ae)?.stopped;void 0!==ve&&fe.abort("cancelled"===ve&&K.get(ae)?.retainCheckpoint?"cancelled-preserve":ve),!1===c.isOnline?.()&&se(ae,"offline");try{if(f&&(await pe(),!g()))return{ok:!1,reason:"cancelled"};if(void 0!==B&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=m(await e.buildPreview(B,t.mimeType,c.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};le={...le,body:e.buildBody({url:t.localPreviewUrl??"",meta:oe,size:B.size},t)},c.domainState.upsertMessages([le],"live")}const a=await u.acquire(T(e.contentType,B?.size??O?.byteLength),fe.signal);try{let a;J(ae,t,"running",j.get(ae)??0);try{q||(a=S?await t.data():void 0!==B?new Uint8Array(await B.arrayBuffer()):O)}catch{return ue("upload-failed",!0)}const i=q?B.size:a.length;if(0===i)return ue("empty");if(S&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=m(await e.buildPreview(Y(a),t.mimeType,c.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};le={...le,body:e.buildBody({url:t.localPreviewUrl??"",meta:oe,size:i},t)},c.domainState.upsertMessages([le],"live")}if(fe.signal.throwIfAborted(),("video"===e.contentType||"file"===e.contentType||"filesAlbum"===e.contentType)&&void 0!==c.recoveryPort&&!0===c.shouldPersistUpload?.(e.uploadKind,i)){w=new AbortController,x.set(ae,w);const i=w.signal;z.set(ae,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),A=Promise.resolve().then(()=>c.recoveryPort.fingerprint(q?B:a,i)).catch(a=>{!i.aborted&&g()&&(z.set(ae,{recovery:"session-only",recoveryReason:"unavailable"}),c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}))}),q||await A}if(fe.signal.aborted)throw k();let n,o,r=q?B:a,l=1;if(Z&&void 0!==c.crypto&&"none"!==e.encryptMode){const t=c.crypto;try{M??(M=t.randomTeaKey());const i=M;"simple"===e.encryptMode?(r=q?new Blob([new Uint8Array(t.encryptFileSimple({teaKey:i,plain:new Uint8Array(await B.slice(0,d).arrayBuffer())})),B.slice(d)]):t.encryptFileSimple({teaKey:i,plain:a}),l=2):q?(n=e=>t.encryptSymmetricChunked({teaKey:i,plain:e,signal:fe.signal}),l=3):(r=t.encryptSymmetric({teaKey:i,plain:a}),l=3)}catch{return ue("encrypt-failed")}}try{!1===c.isOnline?.()&&se(ae,"offline"),await(c.waitUntilOnline?.(fe.signal)),fe.signal.throwIfAborted();o=(await c.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===K.get(ae)?.refreshCredentials,data:r,...void 0===n?{}:{transformPart:n},kind:e.uploadKind,conversationType:t.conversationType,signal:fe.signal,...void 0===I?{}:{resume:I},onFailure:e=>{if(g()&&E.get(ae)===fe){h=e;const t=K.get(ae);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{g()&&E.get(ae)===fe&&(I=void 0)},onResumable:a=>{if(g()&&E.get(ae)===fe&&(I=a,!("cancelled"===K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint||void 0===w||void 0===c.recoveryPort||"video"!==e.contentType&&"file"!==e.contentType&&"filesAlbum"!==e.contentType))){const i=D.get(ae)??Date.now();D.set(ae,i);const n=A.then(async n=>{void 0===n||w?.signal.aborted||!g()&&!R||E.get(ae)!==fe||"cancelled"===K.get(ae)?.stopped&&!0!==K.get(ae)?.retainCheckpoint&&!R||(await c.recoveryPort.save({version:1,ref:G(t),messageId:ae,kind:"video"===e.contentType?"video":"file",createdAt:ie,savedAt:i,source:{...n,...void 0===t.filename?{}:{filename:t.filename},...void 0===t.mimeType?{}:{mimeType:t.mimeType}},encrypted:Z,...void 0===M?{}:{teaKey:M},resume:a,...void 0===t.caption?{}:{caption:t.caption},...void 0===t.filesAlbum?{}:{filesAlbum:t.filesAlbum},...void 0===t.refMessageId?{}:{refMessageId:t.refMessageId},..."video"===e.contentType?{preview:oe}:{}}),E.get(ae)!==fe||w?.signal.aborted||z.set(ae,{recovery:"available"}))}).catch(a=>{const i="object"==typeof a&&null!==a&&"reason"in a?String(a.reason):"storage";(E.get(ae)===fe||N.has(ae))&&z.set(ae,{recovery:"session-only",recoveryReason:i}),c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a})});U.add(n),_(ae,n),n.finally(()=>{U.delete(n);const e=L.get(ae);!$||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||J(ae,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==t.filename?{filename:t.filename}:{},...void 0!==t.mimeType?{mimeType:t.mimeType}:{},onProgress:e=>{if(!g()||fe.signal.aborted||E.get(ae)!==fe)return;const a=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,i=Math.max(j.get(ae)??0,a);V.set(ae,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),j.set(ae,i),c.emitter.emit({type:"media:progress",conversation:G(t),messageId:ae,percent:i}),fe.signal.aborted||E.get(ae)!==fe||J(ae,t,"running",i,void 0,e.phase)}})).url}catch(a){if(fe.signal.aborted&&a instanceof Error&&"AbortError"===a.name||c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a}),!g())return{ok:!1,reason:"cancelled"};const i=fe.signal.aborted?P.get(ae)??"cancelled":"upload-failed";return await me(i)}if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.aborted){const e=P.get(ae)??"cancelled";return await me(e)}if(y===Q&&("image"===e.contentType||"video"===e.contentType)&&void 0!==c.mediaAssetCache){const i=e.contentType,n=B??new Blob([a],void 0===t.mimeType?void 0:{type:t.mimeType}),r=n.size;c.mediaAssetCache.put({kind:i,messageId:ae,resourceVersion:s(o,{conversation:G(t)}),blob:n,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{c.onMediaAssetCacheError?.({operation:"put",kind:i,messageId:ae,byteLength:r,cause:e})})}const u="filesAlbum"===e.contentType?await(c.mediaPreview.fileMd5?.(Y(a),fe.signal)):void 0;if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.throwIfAborted(),"filesAlbum"===e.contentType&&void 0===u)throw new Error("FILES_ALBUM requires fileMd5");return await A,await Promise.all([...U]),g()?(fe.signal.throwIfAborted(),c.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ae,conversationId:t.conversationId,conversationType:t.conversationType,contentType:e.contentType,body:e.buildBody({url:o,meta:oe,size:i,...void 0===u?{}:{md5:u},..."none"===e.encryptMode?{}:{teaKey:M,fileEncryptType:l}},t),encryption:{encrypted:Z},createdAt:ie,...void 0!==t.refMessageId?{refMessageId:t.refMessageId}:{}}),await Promise.all([...U]),void 0!==c.recoveryPort&&await c.recoveryPort.remove(G(t),ae).catch(a=>c.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:G(t),cause:a})),J(ae,t,"completed",100),{ok:!0,messageId:ae}):{ok:!1,reason:"cancelled"}}finally{a()}}catch{if(!g())return{ok:!1,reason:"cancelled"};const e=fe.signal.aborted?P.get(ae)??"cancelled":"upload-failed";return await me(e)}finally{await A,await Promise.all([...U]),x.get(ae)===w&&x.delete(ae),!g()&&R&&await Promise.all([...U]),g()||void 0===I||R&&"available"===z.get(ae)?.recovery||H(I,e.uploadKind,ae,G(t)),E.get(ae)===fe&&(E.delete(ae),C.delete(ae),N.has(ae)||j.delete(ae),P.delete(ae))}}async function oe(d,g,y,h,w=!1){const k=W,M=()=>$&&k===W,I=G(d),A=(e,t)=>{for(const a of t)void 0!==a.resume&&H(a.resume,a.uploadKind,e,I)};if(!M())return void 0!==g&&void 0!==h&&A(g,h),{ok:!1,reason:"cancelled"};if(0===d.items.length)return{ok:!1,reason:"empty"};if(d.items.length>t)throw new RangeError(`媒体合集最多 ${t} 项,收到 ${d.items.length} 项`);const R=void 0!==d.caption&&""!==d.caption.trim()?d.caption:void 0;if(void 0!==R&&Array.from(R).length>e)throw new RangeError(`媒体合集配文最长 ${e} 字符,收到 ${Array.from(R).length}`);if(d.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===h&&"mediaAlbum"!==a(d)){const e=d.items[0];return ne("video"===e.kind?v:f,{conversationId:d.conversationId,conversationType:d.conversationType,data:e.data,...void 0!==e.mimeType?{mimeType:e.mimeType}:{},...void 0!==e.filename?{filename:e.filename}:{},...void 0!==e.localPreviewUrl?{localPreviewUrl:e.localPreviewUrl}:{},...void 0!==e.localPreviewMetadata?{localPreviewMetadata:e.localPreviewMetadata}:{},...void 0!==d.encrypted?{encrypted:d.encrypted}:{},...void 0!==d.refMessageId?{refMessageId:d.refMessageId}:{}},g,y)}const D=d.encrypted??!0;if(D&&void 0===c.crypto)return{ok:!1,reason:"no-crypto"};const z=D?c.crypto:void 0,U=Q,S=void 0===g||void 0===y?c.outbox.allocateMessageIdentity(I):{id:g,createdAt:y},{id:x,createdAt:_}=S,B=d.items.map((e,t)=>{const a=h?.[t];return{uploadKind:e.kind,...void 0===a?.uploaded?{}:{uploaded:a.uploaded},...void 0===a?.preview?{}:{preview:a.preview},...void 0===a?.teaKey?{}:{teaKey:a.teaKey},...void 0===a?.resume?{}:{resume:a.resume}}}),O=B.map((e,t)=>{const a=d.items[t].data.size,i=void 0!==e.uploaded?a:w?0:e.resume?.bytesUploaded??0;return{itemIndex:t,bytesTransferred:i,bytesTotal:a,percent:void 0!==e.uploaded?100:Math.min(99,Math.floor(i/a*100)),state:void 0!==e.uploaded?"completed":"queued"}});q.set(x,O);const F=()=>({...void 0===R?{}:{caption:R},items:d.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??p(e.localPreviewMetadata,e.kind)??{width:0,height:0};return{kind:e.kind,url:i?.url??e.localPreviewUrl??"",width:n.width,height:n.height,..."video"===e.kind&&void 0!==n.duration&&n.duration>0?{durationMs:Math.max(1,Math.round(1e3*n.duration))}:{},...void 0===n.thumbData?{}:{thumbData:n.thumbData},size:i?.size??e.data.size,...void 0===i?.teaKey?{}:{teaKey:i.teaKey},...void 0===i?{}:{fileEncryptType:i.fileEncryptType},...void 0===a?{}:{hd:a}}}(e,B[t],d.hd))});let L={id:x,conversationId:d.conversationId,conversationType:d.conversationType,senderId:c.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:F()},createdAt:_,sortKey:r(_,x),status:"uploading",receipt:"unread",encryption:{encrypted:D},...void 0!==d.refMessageId?{refMessageId:d.refMessageId}:{}};c.domainState.upsertMessages([L],"live",{newOutgoing:!0});const Y=w?0:j.get(x)??0;let Z;w&&V.delete(x),j.set(x,Y),J(x,d,"queued",Y,void 0,"waiting-upload-slot");const ee=(e,t)=>{const a={code:l,reason:"unknown",displayCode:"cleanup-unconfirmed"===Z?"media.cleanupUnconfirmed":"resume-unavailable"===Z?"media.resumeUnavailable":"timeout"===Z?"media.uploadTimeout":b(e),retryable:t};if(!M())return{ok:!1,reason:e};const i=K.get(x);return"paused"===i?.stopped?(J(x,d,"paused",j.get(x)??0),{ok:!1,reason:e}):void 0!==i&&void 0===i.stopped&&i.attempt<3&&("network"===i.failure||"timeout"===i.failure||"credentials-expired"===i.failure||"offline"===e&&void 0!==c.waitUntilOnline)?(J(x,d,"queued",j.get(x)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===i?.stopped||void 0!==i&&i.attempt>=3&&("network"===i.failure||"timeout"===i.failure||"credentials-expired"===i.failure)||(c.domainState.upsertMessages([{...L,status:"failed",failure:a}],"live"),J(x,d,"cancelled"===e?"canceled":"failed",j.get(x)??0,a)),{ok:!1,reason:e})},te=new AbortController;E.set(x,te),C.set(x,I);const ae=K.get(x)?.stopped;void 0!==ae&&te.abort("cancelled"===ae&&K.get(x)?.retainCheckpoint?"cancelled-preserve":ae),!1===c.isOnline?.()&&se(x,"offline");const ie=()=>M()&&E.get(x)===te,oe=()=>{M()&&ie()&&(L={...L,body:{mediaAlbum:F()}},c.domainState.upsertMessages([L],"live"))},re=d.items.reduce((e,t)=>e+t.data.size,0),de=B.map((e,t)=>void 0!==e.uploaded?d.items[t].data.size:e.resume?.bytesUploaded??0),le=()=>{if(!M()||!ie()||te.signal.aborted)return;const e=de.reduce((e,t)=>e+t,0),t=Math.min(99,Math.max(j.get(x)??0,Math.floor(e/re*100)));V.set(x,{bytesTransferred:e,bytesTotal:re}),j.set(x,t),c.emitter.emit({type:"media:progress",conversation:I,messageId:x,percent:t}),!te.signal.aborted&&ie()&&J(x,d,"running",t,void 0,"transferring")};let ce;const ue=async()=>{let e=!0;return await Promise.all(B.map(async t=>{if(void 0!==t.resume)try{await c.mediaTransfer.abandonUpload(t.resume),delete t.resume}catch(a){e=!1,Z="cleanup-unconfirmed",c.onMediaTransferError?.({stage:"upload",kind:t.uploadKind,messageId:x,conversation:I,cause:a})}})),e},pe=e=>(X(x,{kind:"album",input:d,createdAt:_,message:L,failureReason:e,items:B,...!0===K.get(x)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===Z||"resume-unavailable"===Z?{restartRequired:!0}:{}}),ee(e,!0));try{if(w){const e=await ue();if(!M())return{ok:!1,reason:"cancelled"};if(!e)return pe("cancelled"===P.get(x)?"cancelled":"upload-failed");for(let e=0;e<B.length;e+=1)void 0===B[e].uploaded&&(de[e]=0)}if(await Promise.all(d.items.map(async(e,t)=>{const a=B[t];if(void 0===a.uploaded)try{!1===c.isOnline?.()&&se(x,"offline"),await(c.waitUntilOnline?.(te.signal)),te.signal.throwIfAborted();const i=await async function(e){const{conversation:t,encryptWith:a,isCurrentAttempt:i,item:n,onBytesUploaded:o,onPreviewReady:r,onSlotAcquired:d,signal:s,state:l}=e,g="video"===n.kind?v:f,y=p(n.localPreviewMetadata,n.kind);let h=y??{width:0,height:0};if("video"!==n.kind||void 0===y?.thumbData)try{h=m(await g.buildPreview(n.data,n.mimeType,c.mediaPreview,s),y)}catch{}void 0===h.thumbData&&void 0!==l.preview?.thumbData&&(h=l.preview),l.preview=h,r();const w=await u.acquire(T(n.kind,n.data.size),s);try{let r;d();let u=1;if(void 0!==a){l.teaKey??(l.teaKey=a.randomTeaKey());const e=l.teaKey;r=t=>a.encryptSymmetricChunked({teaKey:e,plain:t,signal:s}),u=3}return{url:(await c.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:e.forceRefreshCredentials,data:n.data,...void 0===r?{}:{transformPart:r},kind:g.uploadKind,conversationType:t.conversationType,signal:s,...void 0===l.resume?{}:{resume:l.resume},onFailure:t=>{i()&&e.onFailure(t)},onResumeInvalidated:()=>{i()&&delete l.resume},onResumable:e=>{$&&i()&&(l.resume=e)},...void 0!==n.filename?{filename:n.filename}:{},...void 0!==n.mimeType?{mimeType:n.mimeType}:{},onProgress:e=>{$&&!s.aborted&&i()&&o(e.bytesTransferred)}})).url,meta:h,size:n.data.size,...void 0===l.teaKey?{}:{teaKey:l.teaKey},fileEncryptType:u}}finally{w()}}({item:e,state:a,conversation:I,encryptWith:z,signal:te.signal,isCurrentAttempt:ie,onPreviewReady:oe,onSlotAcquired:()=>{M()&&ie()&&!te.signal.aborted&&(O[t]={...O[t],state:"running"},J(x,d,"running",j.get(x)??0))},forceRefreshCredentials:!0===K.get(x)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(te.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===Z||"resume-unavailable"!==e&&"resume-unavailable"===Z)||(Z=e);const a=K.get(x);void 0!==a&&(a.failure=Z)},onBytesUploaded:a=>{de[t]=a,O[t]={...O[t],bytesTransferred:a,percent:Math.min(99,Math.floor(a/e.data.size*100)),state:"running"},le()}});if(!ie())return;a.uploaded=i,O[t]={...O[t],bytesTransferred:e.data.size,percent:100,state:"completed"},de[t]=e.data.size,le()}catch(a){ie()&&!te.signal.aborted&&(O[t]={...O[t],state:"failed"}),((e,t)=>{void 0===ce&&(ce=te.signal.aborted?P.get(x)??"cancelled":"upload-failed","upload-failed"===ce&&c.onMediaTransferError?.({stage:"upload",kind:e,messageId:x,conversation:I,cause:t}),te.abort("offline"))})(e.kind,a)}})),!M())return{ok:!1,reason:"cancelled"};if(!ie())return{ok:!1,reason:"cancelled"};if("cancelled"===P.get(x))return"cleanup-unconfirmed"!==Z&&!0!==K.get(x)?.retainCheckpoint&&await ue(),M()?pe("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==ce)return pe(ce);if(te.signal.aborted){return pe(P.get(x)??"cancelled")}const e=F();let t;try{t=i(n(e).content)}catch(t){return c.onMediaAlbumContentSize?.({messageId:x,conversation:I,itemCount:e.items.length,outcome:"rejected",cause:t}),ee("content-too-large",!1)}if(t>=o&&c.onMediaAlbumContentSize?.({messageId:x,conversation:I,itemCount:e.items.length,contentBytes:t,outcome:"warn"}),U===Q&&void 0!==c.mediaAssetCache){const e=c.mediaAssetCache;d.items.forEach((t,a)=>{const i=B[a].uploaded;void 0!==i&&e.put({kind:t.kind,messageId:x,resourceVersion:s(i.url,{conversation:I,itemIndex:a}),blob:t.data,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{c.onMediaAssetCacheError?.({operation:"put",kind:t.kind,messageId:x,byteLength:t.data.size,cause:e})})})}return c.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:x,conversationId:d.conversationId,conversationType:d.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:e},encryption:{encrypted:D},createdAt:_,...void 0!==d.refMessageId?{refMessageId:d.refMessageId}:{}}),J(x,d,"completed",100),{ok:!0,messageId:x}}finally{M()||A(x,B),E.get(x)===te&&(E.delete(x),C.delete(x),N.has(x)||j.delete(x),P.delete(x))}}function re(e,t,a,i=1){const{id:n,createdAt:o}=a??c.outbox.allocateMessageIdentity(G(e)),r={attempt:i};let d,s;Y.delete(n),K.set(n,r);const l=new Promise((e,t)=>{d=e,s=t});return r.done=l,(async()=>{let e=await t(n,o);for(;K.get(n)===r&&void 0===r.stopped&&r.attempt<3;){const t=N.get(n);if(!$||e.ok||void 0===t||t.restartRequired||"network"!==r.failure&&"timeout"!==r.failure&&"credentials-expired"!==r.failure&&(e.ok||"offline"!==e.reason||void 0===c.waitUntilOnline))break;const a=new AbortController;if(r.waiting=a,await(c.waitUntilOnline?.(a.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(i,1===r.attempt?1e3:3e3);function i(){clearTimeout(t),a.signal.removeEventListener("abort",i),e()}a.signal.addEventListener("abort",i,{once:!0}),a.signal.aborted&&i()}),await(c.waitUntilOnline?.(a.signal).catch(()=>{})),delete r.waiting,!$||void 0!==r.stopped||K.get(n)!==r)break;r.attempt+=1,r.refreshCredentials="credentials-expired"===r.failure,delete r.failure,N.delete(n),Y.delete(n),e=await de(n,t,!1)}const a=N.get(n),i="cancelled"!==r.stopped&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure);if($&&K.get(n)===r&&void 0!==a&&i&&!0===c.retainFailedUploads){r.stopped="cancelled",r.retainCheckpoint=!0,a.retainCheckpoint=!0;const e={...I(a),displayCode:"timeout"===r.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};c.domainState.upsertMessages([{...a.message,status:"failed",failure:e}],"live"),J(n,a.input,"failed",j.get(n)??0,e)}else if($&&K.get(n)===r&&void 0!==a&&("cancelled"===r.stopped||i)){r.stopped="cancelled";const t={...I(a),displayCode:"timeout"===r.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===r.retainCheckpoint&&!i};(!0!==r.retainCheckpoint||i)&&await ue(n,a),$&&K.get(n)===r&&(c.domainState.upsertMessages([{...a.message,status:"failed",failure:t}],"live"),J(n,a.input,"canceled",j.get(n)??0,t)),e={ok:!1,reason:"cancelled"}}return"paused"===r.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{r.settled=!0,ie(n),d(e)},e=>{r.settled=!0,ie(n),s(e)}),l.then(()=>{K.get(n)===r&&"paused"!==r.stopped&&(K.delete(n),N.has(n)||(j.delete(n),V.delete(n),q.delete(n),z.delete(n),D.delete(n),L.delete(n)))},()=>{K.get(n)===r&&K.delete(n)}),l}function de(e,t,a){return"album"===t.kind?oe(t.input,e,t.createdAt,t.items,a):ne(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function se(e,t){const a=K.get(e);if(!$||void 0===a||"cancelled"===a.stopped)return;if("paused"===a.stopped)return void("pagehide"===t&&"offline"===a.pauseReason&&(a.pauseReason="pagehide"));a.stopped="paused",a.pauseReason=t;const i=E.get(e);a.waiting?.abort(),i?.abort("paused");const n=L.get(e);void 0!==n&&K.get(e)===a&&"paused"===a.stopped&&J(e,n.input,"paused",j.get(e)??n.percent)}async function le(e,t="manual"){const a=K.get(e);if(!$||void 0===a||"cancelled"===a.stopped)return!1;if("paused"===a.stopped)return("manual"===t||"pagehide"===t&&"offline"===a.pauseReason)&&(a.pauseReason=t),await a.done,ie(e),$&&K.get(e)===a&&N.has(e);se(e,t),await a.done,await Promise.all(B(e));const i=N.get(e);return!(!$||K.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(J(e,i.input,"paused",j.get(e)??0),!0)}function ce(e){ae();const t=K.get(e),a=N.get(e);if(!$||"paused"!==t?.stopped||!0!==t.settled||void 0===a||E.has(e))return!1;N.delete(e),Y.delete(e);const i=W;return re(a.input,()=>de(e,a,!1),{id:e,createdAt:a.createdAt},t.attempt).catch(t=>{$&&i===W&&c.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:G(a.input),cause:t})}),!0}async function ue(e,t){N.delete(e),Y.delete(e),z.delete(e),D.delete(e),V.delete(e),q.delete(e),F.add(e);try{await Promise.all(B(e)),await(c.recoveryPort?.remove(G(t.input),e).catch(a=>{c.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:G(t.input),cause:a})})),await Promise.all(M(t).map(async a=>{try{await c.mediaTransfer.abandonUpload(a.resume)}catch(i){c.onMediaTransferError?.({stage:"upload",kind:a.kind,messageId:e,conversation:G(t.input),cause:i})}}))}catch(a){c.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:G(t.input),cause:a})}finally{F.delete(e),z.delete(e),D.delete(e),V.delete(e)}}function pe(e,t){if(ae(),!$)return!1;const a=K.get(e),i=E.get(e);if(!0!==t?.retainCheckpoint&&x.get(e)?.abort(),void 0!==a&&(a.stopped="cancelled",a.retainCheckpoint=!0===t?.retainCheckpoint,a.waiting?.abort()),void 0!==i){const a=C.get(e);return void 0!==a&&!0!==t?.retainCheckpoint&&function(e,t){if(void 0===c.recoveryPort)return;const a=B(e),i="video"===c.domainState.getConversationMessage?.(t,e)?.contentType?"video":"file",n=Promise.all(a).then(()=>c.recoveryPort.remove(t,e)).catch(a=>{c.onMediaTransferError?.({stage:"upload",kind:i,messageId:e,conversation:t,cause:a})});_(e,n)}(e,a),P.set(e,"cancelled"),i.abort(!0===t?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const n=N.get(e);if(void 0===n||void 0===a)return void 0!==a&&"queued"===L.get(e)?.state;if(!0===t?.retainCheckpoint)n.retainCheckpoint=!0,n.failureReason="cancelled";else{_(e,ue(e,n))}const o={...I(n),displayCode:"media.cancelled",retryable:!0===t?.retainCheckpoint};return c.domainState.upsertMessages([{...n.message,status:"failed",failure:o}],"live"),J(e,n.input,"canceled",j.get(e)??0,o),K.get(e)===a&&K.delete(e),ie(e),!0!==t?.retainCheckpoint&&(j.delete(e),q.delete(e),L.delete(e)),!0}async function me(e,t,a,i){ae();const n=W,o=B(t);return o.length>0&&await Promise.all(o),$&&n===W?(D.delete(t),re(i,()=>ne(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>re(e,(t,a)=>ne(f,e,t,a)),sendVideo:e=>re(e,(t,a)=>ne(v,e,t,a)),replaceVideo:(e,t,a)=>me(v,e,t,a),sendVoice:e=>{const t=e.durationMs;return void 0===t||!Number.isFinite(t)||t<1e3?Promise.resolve({ok:!1,reason:"invalid-duration"}):re(e,(t,a)=>ne(g,e,t,a))},sendFile:t=>void 0!==t.caption&&Array.from(t.caption).length>e?Promise.resolve({ok:!1,reason:"content-too-large"}):re(t,(e,a)=>ne(t.filesAlbum||t.caption?.trim()?w:h,t,e,a)),sendGif:e=>re(e,(t,a)=>ne(y,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>re(e,(t,a)=>oe(e,t,a)),replaceFile:(t,a,i)=>void 0!==i.caption&&Array.from(i.caption).length>e?Promise.resolve({ok:!1,reason:"content-too-large"}):me(i.filesAlbum||i.caption?.trim()?w:h,t,a,i),cancel:pe,pause:le,async pauseAll(e="pagehide"){for(const{controller:e}of O.values())e.abort();await Promise.all([...K.keys()].map(t=>le(t,e)))},async resumePaused(e,t){await Promise.all([...K.entries()].map(async([a,i])=>{if(t?.aborted||"paused"!==i.stopped||"manual"===i.pauseReason)return;if(void 0===e&&"offline"!==i.pauseReason)return;const n=L.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=N.get(a);t?.aborted||K.get(a)!==i||void 0===o||void 0===e&&"offline"!==i.pauseReason||(void 0===e||o.input.conversationType===e.conversationType&&o.input.conversationId===e.conversationId)&&ce(a)}))},resume:ce,cancelConversation(e,t="offline"){for(const t of O.values())t.ref.conversationType===e.conversationType&&t.ref.conversationId===e.conversationId&&t.controller.abort();for(const[t,a]of N)if(a.input.conversationType===e.conversationType&&a.input.conversationId===e.conversationId){if(K.has(t))pe(t);else{for(const e of M(a))H(e.resume,e.kind,t,G(a.input));c.recoveryPort?.remove(G(a.input),t).catch(i=>c.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:t,conversation:e,cause:i}))}N.delete(t),Y.delete(t),q.delete(t),V.delete(t),j.delete(t),L.delete(t)}if($)for(const[a,i]of C){if(i.conversationType!==e.conversationType||i.conversationId!==e.conversationId)continue;const n=E.get(a);if(void 0===n)continue;const o=K.get(a);void 0!==o&&(o.stopped="cancelled"),P.set(a,t),x.get(a)?.abort(),n.abort(t)}},cancelAll(e="offline"){if($){if("offline"===e){const e=W;for(const t of K.keys()){const a=L.get(t)?.input;le(t,"offline").catch(i=>{$&&e===W&&void 0!==a&&c.onMediaTransferError?.({stage:"upload",kind:"video"===c.domainState.getConversationMessage?.(a,t)?.contentType?"video":"file",messageId:t,conversation:a,cause:i})})}return}if("session-ended"===e){for(const{controller:e}of O.values())e.abort();for(const e of K.values())e.stopped="cancelled",e.waiting?.abort();W+=1,Q+=1}for(const t of x.values())t.abort(e);for(const t of E.values())t.abort(e)}},retry(e,t){if(ae(),F.has(e))return!1;if(!$)return!1;const a=N.get(e);if(void 0===a)return!1;if(!0===K.get(e)?.retainCheckpoint&&!0!==K.get(e)?.settled)return!1;if(a.restartRequired&&!0!==t?.restartUpload)return!1;const i=!0===t?.restartUpload||"cancelled"===a.failureReason&&!0!==a.retainCheckpoint;return N.delete(e),Y.delete(e),re(a.input,()=>de(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:ae,invalidateAssetCacheWrites(){Q+=1},async dispose(e){if(!$)return;R=!0===e?.preserveRecovery;for(const{controller:e}of O.values())e.abort();const t=[...K.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of K.values())e.stopped="cancelled",e.waiting?.abort();if($=!1,Q+=1,!R)for(const e of x.values())e.abort();for(const e of E.values())e.abort(R?"page-preserve":"cancelled");for(const[e,t]of N)if(!R||"available"!==z.get(e)?.recovery)for(const a of M(t))H(a.resume,a.kind,e,G(t.input));N.clear(),Y.clear(),await Promise.allSettled(t),await Promise.all([...U]),E.clear(),j.clear(),P.clear();for(const[e,t]of N)if(!R||"available"!==z.get(e)?.recovery)for(const a of M(t))H(a.resume,a.kind,e,G(t.input));N.clear(),Y.clear(),K.clear(),V.clear(),q.clear(),z.clear(),D.clear(),L.clear(),await(c.recoveryPort?.drain())},async recoverUpload(e,t,a){ae();const i=c.recoveryPort;if(!$||void 0===i)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(K.has(t)||O.has(t))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const n=new AbortController;O.set(t,{controller:n,ref:e});const o=()=>{if(!$||n.signal.aborted||O.get(t)?.controller!==n)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},r=(e,t)=>{if(void 0===e||e.senderId!==c.getSelfId()||void 0!==e.recalled||void 0!==e.deletedForEveryone||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable||"failed"!==e.status&&"uploading"!==e.status)return!1;const a="video"===e.contentType,i="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(a||i)&&(void 0===t||e.contentType===t)};let d;try{d=await i.acquireLease(n.signal),o();const s=c.domainState.getConversationMessage?.(e,t);if(!r(s))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const l=await i.get(e,t);if(o(),void 0===l)throw new Error("IM_MEDIA_RECOVERY_NOT_FOUND");const u="video"===l.kind?"video":l.filesAlbum||l.caption?.trim()?"filesAlbum":"file";if(!r(s,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const p=await i.fingerprint(a,n.signal);if(o(),p.size!==l.source.size||p.sha256!==l.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=c.domainState.getConversationMessage?.(e,t);if(K.has(t)||!r(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:a,encrypted:l.encrypted,filename:l.source.filename,mimeType:l.source.mimeType,caption:l.caption,filesAlbum:l.filesAlbum,refMessageId:l.refMessageId,...void 0===l.preview?{}:{localPreviewMetadata:{width:l.preview.width,height:l.preview.height,duration:l.preview.duration,posterData:l.preview.thumbData}}};return D.set(t,l.savedAt),await re(f,()=>ne("video"===l.kind?v:l.filesAlbum||l.caption?.trim()?w:h,f,t,l.createdAt,l.teaKey,l.resume),{id:t,createdAt:l.createdAt})}finally{O.get(t)?.controller===n&&O.delete(t),ie(t),d?.release()}}}}export{E as createMediaSender};
|
|
1
|
+
import{resolveMediaThumbnailPolicy as e,MEDIA_THUMBNAIL_MAX_BYTES as t}from"../../media-thumbnail-policy.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as a,MEDIA_ALBUM_MAX_ITEMS as i,resolveMediaAlbumSendContentType as n,measureMediaAlbumContentBytes as o,mediaAlbumBMessageFields as r,MEDIA_ALBUM_CONTENT_WARN_BYTES as d}from"../../mapping/media-album-body.js";import{computeSortKey as s}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as l}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as c}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as u}from"../../mapping/stored-message.js";function p(e){return Number.isFinite(e)&&e>0}function m(e,a){if(("video"===a||"image"===a)&&void 0!==e&&p(e.width)&&p(e.height)&&("video"!==a||void 0===e.duration||p(e.duration))&&("video"!==a||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>t)))return{width:e.width,height:e.height,..."video"===a&&void 0!==e.duration?{duration:e.duration}:{},..."video"===a&&void 0!==e.posterData?{thumbData:new Uint8Array(e.posterData)}:{}}}function f(e,t){return void 0===t?e:{...e,width:t.width,height:t.height,...void 0===t.thumbData?{}:{thumbData:t.thumbData},...void 0===e.duration&&void 0!==t.duration?{duration:t.duration}:{}}}const v={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(t,a,i,n,o=1){const r=await i.imageDimensions(t,a,n),d=await i.imageThumbnail(t,{mimeType:a,...e(o)},n);return{width:r.width,height:r.height,...d.data.byteLength<=e(o).maxBytes?{thumbData:d.data}:{}}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n})=>({image:{url:e,width:t.width,height:t.height,...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},g={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(t,a,i,n,o=1){const r=await i.videoPoster(t,{mimeType:a,...e(o)},n);return{width:r.width,height:r.height,...r.data.byteLength<=e(o).maxBytes?{thumbData:r.data}:{},duration:r.duration}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n},o)=>({video:{url:e,width:t.width,height:t.height,...void 0!==t.duration?{duration:t.duration}:{},...void 0!==o.caption&&""!==o.caption?{describe:o.caption}:{},...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a,sizeUnit:"bytes"}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},y={contentType:"voice",uploadKind:"voice",encryptMode:"integral",buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody:({url:e,size:t,teaKey:a,fileEncryptType:i},n)=>({voice:{url:e,durationMs:n.durationMs??0,...void 0!==n.waveform&&n.waveform.length>0?{waveform:n.waveform}:{},...void 0!==t?{size:t}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}})},h={contentType:"sticker",uploadKind:"sticker",encryptMode:"none",async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i);return{width:n.width,height:n.height}},buildBody:({url:e,meta:t,size:a})=>({sticker:{url:e,width:t.width,height:t.height,exprType:2,imageType:1,...void 0===a?{}:{size:a}}})};const w={contentType:"file",uploadKind:"file",encryptMode:"simple",streamUpload:!0,buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody({url:e,size:t,teaKey:a,fileEncryptType:i},n){const o=n.filename??"",r=function(e){const t=e.lastIndexOf(".");return t>-1&&t<e.length-1?e.slice(t+1).toLowerCase():""}(o),d=function(e,t){const a=t??"";return a.startsWith("image/")||["jpg","jpeg","png","gif","webp","bmp","heic","svg"].includes(e)?1:a.startsWith("video/")||["mp4","mov","m4v","3gp","avi","mkv","webm","flv"].includes(e)?2:a.startsWith("audio/")||["mp3","m4a","wav","aac","flac","ogg"].includes(e)?3:["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","zip","rar","7z","apk","json"].includes(e)?4:0}(r,n.mimeType);return{file:{url:e,fileName:o,...void 0!==t?{size:t}:{},...""!==r?{extension:r}:{},...0!==d?{fileType:d}:{},...void 0!==n.mimeType&&""!==n.mimeType?{mimeType:n.mimeType}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}}}},b={...w,contentType:"filesAlbum",buildBody(e,t){const a=w.buildBody(e,t).file;return{filesAlbum:{...t.caption?.trim()?{caption:t.caption}:{},items:[{...a,extension:a.extension??"",fileType:a.fileType??0,...["zip","rar","torrent"].includes(a.extension??"")?{fileType:5}:{},...void 0===e.md5?{}:{md5:e.md5}}]}}}};function T(e){switch(e){case"empty":return"media.empty";case"no-crypto":return"media.noCrypto";case"preview-failed":return"media.previewFailed";case"encrypt-failed":return"media.encryptFailed";case"upload-failed":case"offline":return"media.uploadFailed";case"cancelled":return"media.cancelled";case"paused":throw new Error("暂停不是失败状态,不应生成失败文案");case"invalid-duration":return"media.invalidDuration";case"content-too-large":return"media.contentTooLarge"}}function k(e,t){return"video"===e||void 0===t||t>16777216?"large":"small"}function M(){return new DOMException("媒体上传已取消","AbortError")}function I(e){return"album"===e.kind?e.items.flatMap(e=>void 0===e.resume||void 0!==e.uploaded?[]:[{resume:e.resume,kind:e.uploadKind}]):void 0===e.resume?[]:[{resume:e.resume,kind:e.spec.uploadKind}]}function A(e){if("album"===e.kind)return{code:u,reason:"unknown",displayCode:T(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:u,reason:"unknown",displayCode:t?"media.uploadInterrupted":T(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function E(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function C(t){const p=function(e){let t=0,a=0;const i=[];function n(i){return t<e.total&&("large"!==i||a<e.largeFiles)}function o(e){t+=1,"large"===e&&(a+=1);let i=!1;return()=>{i||(i=!0,t-=1,"large"===e&&(a-=1),r())}}function r(){let e=0;for(;e<i.length;){const t=i[e];t.signal.aborted?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.reject(M())):n(t.tier)?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.resolve(o(t.tier))):e+=1}}return{acquire:(e,t)=>t.aborted?Promise.reject(M()):new Promise((a,n)=>{const o={tier:e,signal:t,resolve:a,reject:n,onAbort:()=>{const e=i.indexOf(o);e>=0&&i.splice(e,1),n(M())}};i.push(o),t.addEventListener("abort",o.onAbort,{once:!0}),r()})}}(function(e){if(void 0===e)return{total:5,largeFiles:3};if("number"==typeof e)return E(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;E(t,"total");const a=e.largeFiles??Math.min(3,t);if(E(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(t.maxConcurrentUploads)),C=/* @__PURE__ */new Map,P=/* @__PURE__ */new Map,K=/* @__PURE__ */new Map,R=/* @__PURE__ */new Map;let D=!1;const z=/* @__PURE__ */new Map,U=/* @__PURE__ */new Map,x=/* @__PURE__ */new Set,S=/* @__PURE__ */new Map,_=/* @__PURE__ */new Map;function B(e,t){const a=S.get(e)??/* @__PURE__ */new Set;S.set(e,a),a.add(t),x.add(t),t.finally(()=>{a.delete(t),x.delete(t),0===a.size&&S.get(e)===a&&S.delete(e),ne(e)})}function O(e){return[...S.get(e)??[]]}const F=/* @__PURE__ */new Map,L=/* @__PURE__ */new Set,q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Map,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map,$=/* @__PURE__ */new Map;let W=!0,G=0,H=0;function J(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function Q(e,a,i,n){t.mediaTransfer.abandonUpload(e).catch(e=>{t.onMediaTransferError?.({stage:"upload",kind:a,messageId:i,conversation:n,cause:e})})}function X(e,a,i,n,o,r){if(!W)return;const d=J(a);q.set(e,{input:J(a),state:i,percent:n,phase:r}),t.emitter.emit({type:"media-task:updated",conversation:d,task:{id:`upload:${e}`,messageId:e,ref:d,direction:"upload",state:i,percent:Math.max(0,Math.min(100,Math.round(n))),attempt:R.get(e)?.attempt??1,maxAttempts:3,...j.get(e),...V.has(e)?{items:Object.freeze(V.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===i||"failed"===i?i:e.state})))}:{},...U.get(e),...void 0===r?{}:{phase:r},...void 0===o?{}:{failure:o}}})}function Z(e,t){ie(),Y.delete(e),$.delete(e),Y.set(e,t),ae()}function ee(e){const t=R.get(e);if(C.has(e)||F.has(e)||O(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=q.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function te(e,a){const i=J(a.input),n=I(a),o="media"===a.kind?a.spec.uploadKind:"image",r={...A(a),displayCode:"media.uploadInterrupted",retryable:!1};Y.delete(e),$.delete(e),R.delete(e),N.delete(e),j.delete(e),V.delete(e),U.delete(e),z.delete(e),q.delete(e),K.delete(e);for(const t of n)Q(t.resume,t.kind,e,i);if(function(e,a,i){const n=t.recoveryPort;if(void 0===n)return;const o=O(e),r=Promise.all(o).then(()=>n.remove(J(a),e)).catch(n=>{t.onMediaTransferError?.({stage:"upload",kind:i,messageId:e,conversation:J(a),cause:n})});B(e,r)}(e,i,o),!W)return;const d=t.domainState.getConversationMessage?.(i,e)??a.message;"sent"!==d.status&&(t.domainState.upsertMessages([{...d,status:"failed",failure:r}],"live"),X(e,i,"failed",0,r))}function ae(){if(W)for(const[e,t]of Y){if(Y.size<=3)break;ee(e)&&te(e,t)}}function ie(){if(!W)return;const e=Date.now();for(const[t,a]of Y){const i=$.get(t);void 0!==i&&e-i>=864e5&&ee(t)&&te(t,a)}}function ne(e){W&&(Y.has(e)&&ee(e)&&!$.has(e)&&$.set(e,Date.now()),ae())}async function oe(e,a,i,n,o,r,d=!1){const v=G,g=()=>W&&v===G;if(!g())return void 0!==r&&void 0!==i&&Q(r,e.uploadKind,i,J(a)),{ok:!1,reason:"cancelled"};const y=H;let h,w,b=o,I=r,A=Promise.resolve(void 0);const E=/* @__PURE__ */new Set,x="function"==typeof a.data;const S=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(a.data)?a.data:void 0,O=x||void 0!==S?void 0:a.data,F=x||void 0!==S,L=!0===e.streamUpload&&void 0!==S,V=e=>{if(void 0!==S)return S;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===a.mimeType?void 0:{type:a.mimeType})};if(0===O?.length||0===S?.size)return{ok:!1,reason:"empty"};const $=a.encrypted??!0;if($&&void 0===t.crypto)return{ok:!1,reason:"no-crypto"};const ee=m(a.localPreviewMetadata,e.contentType);if(("video"===e.contentType||"image"===e.contentType)&&void 0!==a.localPreviewMetadata&&void 0===ee)return{ok:!1,reason:"preview-failed"};const te=void 0===i||void 0===n?t.outbox.allocateMessageIdentity({conversationId:a.conversationId,conversationType:a.conversationType}):{id:i,createdAt:n},{id:ae,createdAt:ie}=te,ne=t.getSelfId();let oe=ee??{width:0,height:0};if(!F)try{oe=f(await e.buildPreview(V(O),a.mimeType,t.mediaPreview),ee)}catch{}if(!g())return void 0!==I&&Q(I,e.uploadKind,ae,J(a)),{ok:!1,reason:"cancelled"};const re=S?.size??O?.byteLength,de={url:a.localPreviewUrl??"",...void 0===re?{}:{size:re}};let se={id:ae,conversationId:a.conversationId,conversationType:a.conversationType,senderId:ne,contentType:e.contentType,body:e.buildBody({...de,meta:oe},a),createdAt:ie,sortKey:s(ie,ae),status:"uploading",receipt:"unread",encryption:{encrypted:$},...void 0!==a.refMessageId?{refMessageId:a.refMessageId}:{}};t.domainState.upsertMessages([se],"live",{newOutgoing:!0});const ce=d?0:N.get(ae)??0;d&&j.delete(ae),N.set(ae,ce),X(ae,a,"queued",ce,void 0,"waiting-upload-slot");const ue=(i,n=!1)=>{const o={code:u,reason:"unknown",displayCode:"cleanup-unconfirmed"===h?"media.cleanupUnconfirmed":"resume-unavailable"===h?"media.resumeUnavailable":"timeout"===h?"media.uploadTimeout":T(i),mediaKind:e.uploadKind,retryable:n};if(!g())return{ok:!1,reason:i};const r=R.get(ae);return"paused"===r?.stopped?(X(ae,a,"paused",N.get(ae)??0),{ok:!1,reason:i}):void 0!==r&&void 0===r.stopped&&r.attempt<3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure||"offline"===i&&void 0!==t.waitUntilOnline)?(X(ae,a,"queued",N.get(ae)??0,void 0,"waiting-retry"),{ok:!1,reason:i}):("cancelled"===r?.stopped||void 0!==r&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure)||(t.domainState.upsertMessages([{...se,status:"failed",failure:o}],"live"),X(ae,a,"cancelled"===i?"canceled":"failed",N.get(ae)??0,o)),{ok:!1,reason:i})},pe=async()=>{if(void 0!==I)try{await t.mediaTransfer.abandonUpload(I),I=void 0}catch(i){throw h="cleanup-unconfirmed",t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}),i}},me=async i=>{if(await A,await Promise.all([...E]),"cancelled"===i&&"paused"!==R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint&&"cleanup-unconfirmed"!==h)try{await pe()}catch{}return"cancelled"===i&&"paused"!==R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint&&void 0!==t.recoveryPort&&(await Promise.all([...E]),await t.recoveryPort.remove(J(a),ae).catch(i=>t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}))),g()?(Z(ae,{kind:"media",spec:e,input:a,createdAt:ie,message:se,failureReason:i,...!0===R.get(ae)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===h||"resume-unavailable"===h?{restartRequired:!0}:{},...void 0===b?{}:{teaKey:b},...void 0===I?{}:{resume:I}}),ue(i,!0)):{ok:!1,reason:"cancelled"}},fe=new AbortController;C.set(ae,fe),P.set(ae,J(a));const ve=R.get(ae)?.stopped;void 0!==ve&&fe.abort("cancelled"===ve&&R.get(ae)?.retainCheckpoint?"cancelled-preserve":ve),!1===t.isOnline?.()&&le(ae,"offline");try{if(d&&(await pe(),!g()))return{ok:!1,reason:"cancelled"};if(void 0!==S&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=f(await e.buildPreview(S,a.mimeType,t.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};se={...se,body:e.buildBody({url:a.localPreviewUrl??"",meta:oe,size:S.size},a)},t.domainState.upsertMessages([se],"live")}const i=await p.acquire(k(e.contentType,S?.size??O?.byteLength),fe.signal);try{let i;X(ae,a,"running",N.get(ae)??0);try{L||(i=x?await a.data():void 0!==S?new Uint8Array(await S.arrayBuffer()):O)}catch{return ue("upload-failed",!0)}const n=L?S.size:i.length;if(0===n)return ue("empty");if(x&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=f(await e.buildPreview(V(i),a.mimeType,t.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};se={...se,body:e.buildBody({url:a.localPreviewUrl??"",meta:oe,size:n},a)},t.domainState.upsertMessages([se],"live")}if(fe.signal.throwIfAborted(),("video"===e.contentType||"file"===e.contentType||"filesAlbum"===e.contentType)&&void 0!==t.recoveryPort&&!0===t.shouldPersistUpload?.(e.uploadKind,n)){w=new AbortController,_.set(ae,w);const n=w.signal;U.set(ae,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),A=Promise.resolve().then(()=>t.recoveryPort.fingerprint(L?S:i,n)).catch(i=>{!n.aborted&&g()&&(U.set(ae,{recovery:"session-only",recoveryReason:"unavailable"}),t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}))}),L||await A}if(fe.signal.aborted)throw M();let o,r,d=L?S:i,s=1;if($&&void 0!==t.crypto&&"none"!==e.encryptMode){const a=t.crypto;try{b??(b=a.randomTeaKey());const t=b;"simple"===e.encryptMode?(d=L?new Blob([new Uint8Array(a.encryptFileSimple({teaKey:t,plain:new Uint8Array(await S.slice(0,l).arrayBuffer())})),S.slice(l)]):a.encryptFileSimple({teaKey:t,plain:i}),s=2):L?(o=e=>a.encryptSymmetricChunked({teaKey:t,plain:e,signal:fe.signal}),s=3):(d=a.encryptSymmetric({teaKey:t,plain:i}),s=3)}catch{return ue("encrypt-failed")}}try{!1===t.isOnline?.()&&le(ae,"offline"),await(t.waitUntilOnline?.(fe.signal)),fe.signal.throwIfAborted();r=(await t.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===R.get(ae)?.refreshCredentials,data:d,...void 0===o?{}:{transformPart:o},kind:e.uploadKind,conversationType:a.conversationType,signal:fe.signal,...void 0===I?{}:{resume:I},onFailure:e=>{if(g()&&C.get(ae)===fe){h=e;const t=R.get(ae);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{g()&&C.get(ae)===fe&&(I=void 0)},onResumable:i=>{if(g()&&C.get(ae)===fe&&(I=i,!("cancelled"===R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint||void 0===w||void 0===t.recoveryPort||"video"!==e.contentType&&"file"!==e.contentType&&"filesAlbum"!==e.contentType))){const n=z.get(ae)??Date.now();z.set(ae,n);const o=A.then(async o=>{void 0===o||w?.signal.aborted||!g()&&!D||C.get(ae)!==fe||"cancelled"===R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint&&!D||(await t.recoveryPort.save({version:1,ref:J(a),messageId:ae,kind:"video"===e.contentType?"video":"file",createdAt:ie,savedAt:n,source:{...o,...void 0===a.filename?{}:{filename:a.filename},...void 0===a.mimeType?{}:{mimeType:a.mimeType}},encrypted:$,...void 0===b?{}:{teaKey:b},resume:i,...void 0===a.caption?{}:{caption:a.caption},...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.refMessageId?{}:{refMessageId:a.refMessageId},..."video"===e.contentType?{preview:oe}:{}}),C.get(ae)!==fe||w?.signal.aborted||U.set(ae,{recovery:"available"}))}).catch(i=>{const n="object"==typeof i&&null!==i&&"reason"in i?String(i.reason):"storage";(C.get(ae)===fe||Y.has(ae))&&U.set(ae,{recovery:"session-only",recoveryReason:n}),t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i})});E.add(o),B(ae,o),o.finally(()=>{E.delete(o);const e=q.get(ae);!W||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||X(ae,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==a.filename?{filename:a.filename}:{},...void 0!==a.mimeType?{mimeType:a.mimeType}:{},onProgress:e=>{if(!g()||fe.signal.aborted||C.get(ae)!==fe)return;const i=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,n=Math.max(N.get(ae)??0,i);j.set(ae,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),N.set(ae,n),t.emitter.emit({type:"media:progress",conversation:J(a),messageId:ae,percent:n}),fe.signal.aborted||C.get(ae)!==fe||X(ae,a,"running",n,void 0,e.phase)}})).url}catch(i){if(fe.signal.aborted&&i instanceof Error&&"AbortError"===i.name||t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}),!g())return{ok:!1,reason:"cancelled"};const n=fe.signal.aborted?K.get(ae)??"cancelled":"upload-failed";return await me(n)}if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.aborted){const e=K.get(ae)??"cancelled";return await me(e)}if(y===H&&("image"===e.contentType||"video"===e.contentType)&&void 0!==t.mediaAssetCache){const n=e.contentType,o=S??new Blob([i],void 0===a.mimeType?void 0:{type:a.mimeType}),d=o.size;t.mediaAssetCache.put({kind:n,messageId:ae,resourceVersion:c(r,{conversation:J(a)}),blob:o,...void 0===a.mimeType?{}:{mimeType:a.mimeType}}).catch(e=>{t.onMediaAssetCacheError?.({operation:"put",kind:n,messageId:ae,byteLength:d,cause:e})})}const u="filesAlbum"===e.contentType?await(t.mediaPreview.fileMd5?.(V(i),fe.signal)):void 0;if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.throwIfAborted(),"filesAlbum"===e.contentType&&void 0===u)throw new Error("FILES_ALBUM requires fileMd5");return await A,await Promise.all([...E]),g()?(fe.signal.throwIfAborted(),t.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ae,conversationId:a.conversationId,conversationType:a.conversationType,contentType:e.contentType,body:e.buildBody({url:r,meta:oe,size:n,...void 0===u?{}:{md5:u},..."none"===e.encryptMode?{}:{teaKey:b,fileEncryptType:s}},a),encryption:{encrypted:$},createdAt:ie,...void 0!==a.refMessageId?{refMessageId:a.refMessageId}:{}}),await Promise.all([...E]),void 0!==t.recoveryPort&&await t.recoveryPort.remove(J(a),ae).catch(i=>t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i})),X(ae,a,"completed",100),{ok:!0,messageId:ae}):{ok:!1,reason:"cancelled"}}finally{i()}}catch{if(!g())return{ok:!1,reason:"cancelled"};const e=fe.signal.aborted?K.get(ae)??"cancelled":"upload-failed";return await me(e)}finally{await A,await Promise.all([...E]),_.get(ae)===w&&_.delete(ae),!g()&&D&&await Promise.all([...E]),g()||void 0===I||D&&"available"===U.get(ae)?.recovery||Q(I,e.uploadKind,ae,J(a)),C.get(ae)===fe&&(C.delete(ae),P.delete(ae),Y.has(ae)||N.delete(ae),K.delete(ae))}}async function re(l,y,h,w,b=!1){const M=G,I=()=>W&&M===G,A=J(l),E=(e,t)=>{for(const a of t)void 0!==a.resume&&Q(a.resume,a.uploadKind,e,A)};if(!I())return void 0!==y&&void 0!==w&&E(y,w),{ok:!1,reason:"cancelled"};if(0===l.items.length)return{ok:!1,reason:"empty"};if(l.items.length>i)throw new RangeError(`媒体合集最多 ${i} 项,收到 ${l.items.length} 项`);const D=void 0!==l.caption&&""!==l.caption.trim()?l.caption:void 0;if(void 0!==D&&Array.from(D).length>a)throw new RangeError(`媒体合集配文最长 ${a} 字符,收到 ${Array.from(D).length}`);if(l.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===w&&"mediaAlbum"!==n(l)){const e=l.items[0];return oe("video"===e.kind?g:v,{conversationId:l.conversationId,conversationType:l.conversationType,data:e.data,...void 0!==e.mimeType?{mimeType:e.mimeType}:{},...void 0!==e.filename?{filename:e.filename}:{},...void 0!==e.localPreviewUrl?{localPreviewUrl:e.localPreviewUrl}:{},...void 0!==e.localPreviewMetadata?{localPreviewMetadata:e.localPreviewMetadata}:{},...void 0!==l.encrypted?{encrypted:l.encrypted}:{},...void 0!==l.refMessageId?{refMessageId:l.refMessageId}:{}},y,h)}const z=l.encrypted??!0;if(z&&void 0===t.crypto)return{ok:!1,reason:"no-crypto"};const U=z?t.crypto:void 0,x=H,S=void 0===y||void 0===h?t.outbox.allocateMessageIdentity(A):{id:y,createdAt:h},{id:_,createdAt:B}=S,O=l.items.map((e,t)=>{const a=w?.[t];return{uploadKind:e.kind,...void 0===a?.uploaded?{}:{uploaded:a.uploaded},...void 0===a?.preview?{}:{preview:a.preview},...void 0===a?.teaKey?{}:{teaKey:a.teaKey},...void 0===a?.resume?{}:{resume:a.resume}}}),F=O.map((e,t)=>{const a=l.items[t].data.size,i=void 0!==e.uploaded?a:b?0:e.resume?.bytesUploaded??0;return{itemIndex:t,bytesTransferred:i,bytesTotal:a,percent:void 0!==e.uploaded?100:Math.min(99,Math.floor(i/a*100)),state:void 0!==e.uploaded?"completed":"queued"}});V.set(_,F);const L=()=>({...void 0===D?{}:{caption:D},items:l.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??m(e.localPreviewMetadata,e.kind)??{width:0,height:0};return{kind:e.kind,url:i?.url??e.localPreviewUrl??"",width:n.width,height:n.height,..."video"===e.kind&&void 0!==n.duration&&n.duration>0?{durationMs:Math.max(1,Math.round(1e3*n.duration))}:{},...void 0===n.thumbData?{}:{thumbData:n.thumbData},size:i?.size??e.data.size,...void 0===i?.teaKey?{}:{teaKey:i.teaKey},...void 0===i?{}:{fileEncryptType:i.fileEncryptType},...void 0===a?{}:{hd:a}}}(e,O[t],l.hd))});let q={id:_,conversationId:l.conversationId,conversationType:l.conversationType,senderId:t.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:L()},createdAt:B,sortKey:s(B,_),status:"uploading",receipt:"unread",encryption:{encrypted:z},...void 0!==l.refMessageId?{refMessageId:l.refMessageId}:{}};t.domainState.upsertMessages([q],"live",{newOutgoing:!0});const $=b?0:N.get(_)??0;let ee;b&&j.delete(_),N.set(_,$),X(_,l,"queued",$,void 0,"waiting-upload-slot");const te=(e,a)=>{const i={code:u,reason:"unknown",displayCode:"cleanup-unconfirmed"===ee?"media.cleanupUnconfirmed":"resume-unavailable"===ee?"media.resumeUnavailable":"timeout"===ee?"media.uploadTimeout":T(e),retryable:a};if(!I())return{ok:!1,reason:e};const n=R.get(_);return"paused"===n?.stopped?(X(_,l,"paused",N.get(_)??0),{ok:!1,reason:e}):void 0!==n&&void 0===n.stopped&&n.attempt<3&&("network"===n.failure||"timeout"===n.failure||"credentials-expired"===n.failure||"offline"===e&&void 0!==t.waitUntilOnline)?(X(_,l,"queued",N.get(_)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===n?.stopped||void 0!==n&&n.attempt>=3&&("network"===n.failure||"timeout"===n.failure||"credentials-expired"===n.failure)||(t.domainState.upsertMessages([{...q,status:"failed",failure:i}],"live"),X(_,l,"cancelled"===e?"canceled":"failed",N.get(_)??0,i)),{ok:!1,reason:e})},ae=new AbortController;C.set(_,ae),P.set(_,A);const ie=R.get(_)?.stopped;void 0!==ie&&ae.abort("cancelled"===ie&&R.get(_)?.retainCheckpoint?"cancelled-preserve":ie),!1===t.isOnline?.()&&le(_,"offline");const ne=()=>I()&&C.get(_)===ae,re=()=>{I()&&ne()&&(q={...q,body:{mediaAlbum:L()}},t.domainState.upsertMessages([q],"live"))},de=l.items.reduce((e,t)=>e+t.data.size,0),se=O.map((e,t)=>void 0!==e.uploaded?l.items[t].data.size:e.resume?.bytesUploaded??0),ce=()=>{if(!I()||!ne()||ae.signal.aborted)return;const e=se.reduce((e,t)=>e+t,0),a=Math.min(99,Math.max(N.get(_)??0,Math.floor(e/de*100)));j.set(_,{bytesTransferred:e,bytesTotal:de}),N.set(_,a),t.emitter.emit({type:"media:progress",conversation:A,messageId:_,percent:a}),!ae.signal.aborted&&ne()&&X(_,l,"running",a,void 0,"transferring")};let ue;const pe=async()=>{let e=!0;return await Promise.all(O.map(async a=>{if(void 0!==a.resume)try{await t.mediaTransfer.abandonUpload(a.resume),delete a.resume}catch(i){e=!1,ee="cleanup-unconfirmed",t.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:_,conversation:A,cause:i})}})),e},me=e=>(Z(_,{kind:"album",input:l,createdAt:B,message:q,failureReason:e,items:O,...!0===R.get(_)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===ee||"resume-unavailable"===ee?{restartRequired:!0}:{}}),te(e,!0));try{if(b){const e=await pe();if(!I())return{ok:!1,reason:"cancelled"};if(!e)return me("cancelled"===K.get(_)?"cancelled":"upload-failed");for(let e=0;e<O.length;e+=1)void 0===O[e].uploaded&&(se[e]=0)}if(await Promise.all(l.items.map(async(a,i)=>{const n=O[i];if(void 0===n.uploaded)try{!1===t.isOnline?.()&&le(_,"offline"),await(t.waitUntilOnline?.(ae.signal)),ae.signal.throwIfAborted();const o=await async function(a){const{conversation:i,encryptWith:n,isCurrentAttempt:o,item:r,onBytesUploaded:d,onPreviewReady:s,onSlotAcquired:l,signal:c,state:u}=a,y="video"===r.kind?g:v,h=e(a.itemCount),w=m(r.localPreviewMetadata,r.kind),b=void 0!==w?.thumbData&&w.thumbData.byteLength>h.maxBytes?{width:w.width,height:w.height,...void 0===w.duration?{}:{duration:w.duration}}:w;let T=b??{width:0,height:0};if("video"!==r.kind||void 0===b?.thumbData)try{T=f(await y.buildPreview(r.data,r.mimeType,t.mediaPreview,c,a.itemCount),b)}catch{}void 0===T.thumbData&&void 0!==u.preview?.thumbData&&u.preview.thumbData.byteLength<=h.maxBytes&&(T=u.preview),u.preview=T,s();const M=await p.acquire(k(r.kind,r.data.size),c);try{let e;l();let s=1;if(void 0!==n){u.teaKey??(u.teaKey=n.randomTeaKey());const t=u.teaKey;e=e=>n.encryptSymmetricChunked({teaKey:t,plain:e,signal:c}),s=3}return{url:(await t.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:a.forceRefreshCredentials,data:r.data,...void 0===e?{}:{transformPart:e},kind:y.uploadKind,conversationType:i.conversationType,signal:c,...void 0===u.resume?{}:{resume:u.resume},onFailure:e=>{o()&&a.onFailure(e)},onResumeInvalidated:()=>{o()&&delete u.resume},onResumable:e=>{W&&o()&&(u.resume=e)},...void 0!==r.filename?{filename:r.filename}:{},...void 0!==r.mimeType?{mimeType:r.mimeType}:{},onProgress:e=>{W&&!c.aborted&&o()&&d(e.bytesTransferred)}})).url,meta:T,size:r.data.size,...void 0===u.teaKey?{}:{teaKey:u.teaKey},fileEncryptType:s}}finally{M()}}({item:a,itemCount:l.items.length,state:n,conversation:A,encryptWith:U,signal:ae.signal,isCurrentAttempt:ne,onPreviewReady:re,onSlotAcquired:()=>{I()&&ne()&&!ae.signal.aborted&&(F[i]={...F[i],state:"running"},X(_,l,"running",N.get(_)??0))},forceRefreshCredentials:!0===R.get(_)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(ae.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===ee||"resume-unavailable"!==e&&"resume-unavailable"===ee)||(ee=e);const a=R.get(_);void 0!==a&&(a.failure=ee)},onBytesUploaded:e=>{se[i]=e,F[i]={...F[i],bytesTransferred:e,percent:Math.min(99,Math.floor(e/a.data.size*100)),state:"running"},ce()}});if(!ne())return;n.uploaded=o,F[i]={...F[i],bytesTransferred:a.data.size,percent:100,state:"completed"},se[i]=a.data.size,ce()}catch(e){ne()&&!ae.signal.aborted&&(F[i]={...F[i],state:"failed"}),((e,a)=>{void 0===ue&&(ue=ae.signal.aborted?K.get(_)??"cancelled":"upload-failed","upload-failed"===ue&&t.onMediaTransferError?.({stage:"upload",kind:e,messageId:_,conversation:A,cause:a}),ae.abort("offline"))})(a.kind,e)}})),!I())return{ok:!1,reason:"cancelled"};if(!ne())return{ok:!1,reason:"cancelled"};if("cancelled"===K.get(_))return"cleanup-unconfirmed"!==ee&&!0!==R.get(_)?.retainCheckpoint&&await pe(),I()?me("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==ue)return me(ue);if(ae.signal.aborted){return me(K.get(_)??"cancelled")}const a=L();let i;try{i=o(r(a).content)}catch(e){return t.onMediaAlbumContentSize?.({messageId:_,conversation:A,itemCount:a.items.length,outcome:"rejected",cause:e}),te("content-too-large",!1)}if(i>=d&&t.onMediaAlbumContentSize?.({messageId:_,conversation:A,itemCount:a.items.length,contentBytes:i,outcome:"warn"}),x===H&&void 0!==t.mediaAssetCache){const e=t.mediaAssetCache;l.items.forEach((a,i)=>{const n=O[i].uploaded;void 0!==n&&e.put({kind:a.kind,messageId:_,resourceVersion:c(n.url,{conversation:A,itemIndex:i}),blob:a.data,...void 0===a.mimeType?{}:{mimeType:a.mimeType}}).catch(e=>{t.onMediaAssetCacheError?.({operation:"put",kind:a.kind,messageId:_,byteLength:a.data.size,cause:e})})})}return t.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:_,conversationId:l.conversationId,conversationType:l.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:a},encryption:{encrypted:z},createdAt:B,...void 0!==l.refMessageId?{refMessageId:l.refMessageId}:{}}),X(_,l,"completed",100),{ok:!0,messageId:_}}finally{I()||E(_,O),C.get(_)===ae&&(C.delete(_),P.delete(_),Y.has(_)||N.delete(_),K.delete(_))}}function de(e,a,i,n=1){const{id:o,createdAt:r}=i??t.outbox.allocateMessageIdentity(J(e)),d={attempt:n};let s,l;$.delete(o),R.set(o,d);const c=new Promise((e,t)=>{s=e,l=t});return d.done=c,(async()=>{let e=await a(o,r);for(;R.get(o)===d&&void 0===d.stopped&&d.attempt<3;){const a=Y.get(o);if(!W||e.ok||void 0===a||a.restartRequired||"network"!==d.failure&&"timeout"!==d.failure&&"credentials-expired"!==d.failure&&(e.ok||"offline"!==e.reason||void 0===t.waitUntilOnline))break;const i=new AbortController;if(d.waiting=i,await(t.waitUntilOnline?.(i.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(a,1===d.attempt?1e3:3e3);function a(){clearTimeout(t),i.signal.removeEventListener("abort",a),e()}i.signal.addEventListener("abort",a,{once:!0}),i.signal.aborted&&a()}),await(t.waitUntilOnline?.(i.signal).catch(()=>{})),delete d.waiting,!W||void 0!==d.stopped||R.get(o)!==d)break;d.attempt+=1,d.refreshCredentials="credentials-expired"===d.failure,delete d.failure,Y.delete(o),$.delete(o),e=await se(o,a,!1)}const i=Y.get(o),n="cancelled"!==d.stopped&&d.attempt>=3&&("network"===d.failure||"timeout"===d.failure||"credentials-expired"===d.failure);if(W&&R.get(o)===d&&void 0!==i&&n&&!0===t.retainFailedUploads){d.stopped="cancelled",d.retainCheckpoint=!0,i.retainCheckpoint=!0;const e={...A(i),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};t.domainState.upsertMessages([{...i.message,status:"failed",failure:e}],"live"),X(o,i.input,"failed",N.get(o)??0,e)}else if(W&&R.get(o)===d&&void 0!==i&&("cancelled"===d.stopped||n)){d.stopped="cancelled";const a={...A(i),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===d.retainCheckpoint&&!n};(!0!==d.retainCheckpoint||n)&&await pe(o,i),W&&R.get(o)===d&&(t.domainState.upsertMessages([{...i.message,status:"failed",failure:a}],"live"),X(o,i.input,"canceled",N.get(o)??0,a)),e={ok:!1,reason:"cancelled"}}return"paused"===d.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{d.settled=!0,ne(o),s(e)},e=>{d.settled=!0,ne(o),l(e)}),c.then(()=>{R.get(o)===d&&"paused"!==d.stopped&&(R.delete(o),Y.has(o)||(N.delete(o),j.delete(o),V.delete(o),U.delete(o),z.delete(o),q.delete(o)))},()=>{R.get(o)===d&&R.delete(o)}),c}function se(e,t,a){return"album"===t.kind?re(t.input,e,t.createdAt,t.items,a):oe(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function le(e,t){const a=R.get(e);if(!W||void 0===a||"cancelled"===a.stopped)return;if("paused"===a.stopped)return void("pagehide"===t&&"offline"===a.pauseReason&&(a.pauseReason="pagehide"));a.stopped="paused",a.pauseReason=t;const i=C.get(e);a.waiting?.abort(),i?.abort("paused");const n=q.get(e);void 0!==n&&R.get(e)===a&&"paused"===a.stopped&&X(e,n.input,"paused",N.get(e)??n.percent)}async function ce(e,t="manual"){const a=R.get(e);if(!W||void 0===a||"cancelled"===a.stopped)return!1;if("paused"===a.stopped)return("manual"===t||"pagehide"===t&&"offline"===a.pauseReason)&&(a.pauseReason=t),await a.done,ne(e),W&&R.get(e)===a&&Y.has(e);le(e,t),await a.done,await Promise.all(O(e));const i=Y.get(e);return!(!W||R.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(X(e,i.input,"paused",N.get(e)??0),!0)}function ue(e){ie();const a=R.get(e),i=Y.get(e);if(!W||"paused"!==a?.stopped||!0!==a.settled||void 0===i||C.has(e))return!1;Y.delete(e),$.delete(e);const n=G;return de(i.input,()=>se(e,i,!1),{id:e,createdAt:i.createdAt},a.attempt).catch(a=>{W&&n===G&&t.onMediaTransferError?.({stage:"upload",kind:"media"===i.kind?i.spec.uploadKind:"image",messageId:e,conversation:J(i.input),cause:a})}),!0}async function pe(e,a){Y.delete(e),$.delete(e),U.delete(e),z.delete(e),j.delete(e),V.delete(e),L.add(e);try{await Promise.all(O(e)),await(t.recoveryPort?.remove(J(a.input),e).catch(i=>{t.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:J(a.input),cause:i})})),await Promise.all(I(a).map(async i=>{try{await t.mediaTransfer.abandonUpload(i.resume)}catch(n){t.onMediaTransferError?.({stage:"upload",kind:i.kind,messageId:e,conversation:J(a.input),cause:n})}}))}catch(i){t.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:J(a.input),cause:i})}finally{L.delete(e),U.delete(e),z.delete(e),j.delete(e)}}function me(e,a){if(ie(),!W)return!1;const i=R.get(e),n=C.get(e);if(!0!==a?.retainCheckpoint&&_.get(e)?.abort(),void 0!==i&&(i.stopped="cancelled",i.retainCheckpoint=!0===a?.retainCheckpoint,i.waiting?.abort()),void 0!==n){const i=P.get(e);return void 0!==i&&!0!==a?.retainCheckpoint&&function(e,a){if(void 0===t.recoveryPort)return;const i=O(e),n="video"===t.domainState.getConversationMessage?.(a,e)?.contentType?"video":"file",o=Promise.all(i).then(()=>t.recoveryPort.remove(a,e)).catch(i=>{t.onMediaTransferError?.({stage:"upload",kind:n,messageId:e,conversation:a,cause:i})});B(e,o)}(e,i),K.set(e,"cancelled"),n.abort(!0===a?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const o=Y.get(e);if(void 0===o||void 0===i)return void 0!==i&&"queued"===q.get(e)?.state;if(!0===a?.retainCheckpoint)o.retainCheckpoint=!0,o.failureReason="cancelled";else{B(e,pe(e,o))}const r={...A(o),displayCode:"media.cancelled",retryable:!0===a?.retainCheckpoint};return t.domainState.upsertMessages([{...o.message,status:"failed",failure:r}],"live"),X(e,o.input,"canceled",N.get(e)??0,r),R.get(e)===i&&R.delete(e),ne(e),!0!==a?.retainCheckpoint&&(N.delete(e),V.delete(e),q.delete(e)),!0}async function fe(e,t,a,i){ie();const n=G,o=O(t);return o.length>0&&await Promise.all(o),W&&n===G?(z.delete(t),de(i,()=>oe(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>de(e,(t,a)=>oe(v,e,t,a)),sendVideo:e=>de(e,(t,a)=>oe(g,e,t,a)),replaceVideo:(e,t,a)=>fe(g,e,t,a),sendVoice:e=>{const t=e.durationMs;return void 0===t||!Number.isFinite(t)||t<1e3?Promise.resolve({ok:!1,reason:"invalid-duration"}):de(e,(t,a)=>oe(y,e,t,a))},sendFile:e=>void 0!==e.caption&&Array.from(e.caption).length>a?Promise.resolve({ok:!1,reason:"content-too-large"}):de(e,(t,a)=>oe(e.filesAlbum||e.caption?.trim()?b:w,e,t,a)),sendGif:e=>de(e,(t,a)=>oe(h,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>de(e,(t,a)=>re(e,t,a)),replaceFile:(e,t,i)=>void 0!==i.caption&&Array.from(i.caption).length>a?Promise.resolve({ok:!1,reason:"content-too-large"}):fe(i.filesAlbum||i.caption?.trim()?b:w,e,t,i),cancel:me,pause:ce,async pauseAll(e="pagehide"){for(const{controller:e}of F.values())e.abort();await Promise.all([...R.keys()].map(t=>ce(t,e)))},async resumePaused(e,t){await Promise.all([...R.entries()].map(async([a,i])=>{if(t?.aborted||"paused"!==i.stopped||"manual"===i.pauseReason)return;if(void 0===e&&"offline"!==i.pauseReason)return;const n=q.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=Y.get(a);t?.aborted||R.get(a)!==i||void 0===o||void 0===e&&"offline"!==i.pauseReason||(void 0===e||o.input.conversationType===e.conversationType&&o.input.conversationId===e.conversationId)&&ue(a)}))},resume:ue,cancelConversation(e,a="offline"){for(const t of F.values())t.ref.conversationType===e.conversationType&&t.ref.conversationId===e.conversationId&&t.controller.abort();for(const[a,i]of Y)if(i.input.conversationType===e.conversationType&&i.input.conversationId===e.conversationId){if(R.has(a))me(a);else{for(const e of I(i))Q(e.resume,e.kind,a,J(i.input));t.recoveryPort?.remove(J(i.input),a).catch(n=>t.onMediaTransferError?.({stage:"upload",kind:"media"===i.kind?i.spec.uploadKind:"image",messageId:a,conversation:e,cause:n}))}Y.delete(a),$.delete(a),V.delete(a),j.delete(a),N.delete(a),q.delete(a)}if(W)for(const[t,i]of P){if(i.conversationType!==e.conversationType||i.conversationId!==e.conversationId)continue;const n=C.get(t);if(void 0===n)continue;const o=R.get(t);void 0!==o&&(o.stopped="cancelled"),K.set(t,a),_.get(t)?.abort(),n.abort(a)}},cancelAll(e="offline"){if(W){if("offline"===e){const e=G;for(const a of R.keys()){const i=q.get(a)?.input;ce(a,"offline").catch(n=>{W&&e===G&&void 0!==i&&t.onMediaTransferError?.({stage:"upload",kind:"video"===t.domainState.getConversationMessage?.(i,a)?.contentType?"video":"file",messageId:a,conversation:i,cause:n})})}return}if("session-ended"===e){for(const{controller:e}of F.values())e.abort();for(const e of R.values())e.stopped="cancelled",e.waiting?.abort();G+=1,H+=1}for(const t of _.values())t.abort(e);for(const t of C.values())t.abort(e)}},retry(e,t){if(ie(),L.has(e))return!1;if(!W)return!1;const a=Y.get(e);if(void 0===a)return!1;if(!0===R.get(e)?.retainCheckpoint&&!0!==R.get(e)?.settled)return!1;if(a.restartRequired&&!0!==t?.restartUpload)return!1;const i=!0===t?.restartUpload||"cancelled"===a.failureReason&&!0!==a.retainCheckpoint;return Y.delete(e),$.delete(e),de(a.input,()=>se(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:ie,invalidateAssetCacheWrites(){H+=1},async dispose(e){if(!W)return;D=!0===e?.preserveRecovery;for(const{controller:e}of F.values())e.abort();const a=[...R.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of R.values())e.stopped="cancelled",e.waiting?.abort();if(W=!1,H+=1,!D)for(const e of _.values())e.abort();for(const e of C.values())e.abort(D?"page-preserve":"cancelled");for(const[e,t]of Y)if(!D||"available"!==U.get(e)?.recovery)for(const a of I(t))Q(a.resume,a.kind,e,J(t.input));Y.clear(),$.clear(),await Promise.allSettled(a),await Promise.all([...x]),C.clear(),N.clear(),K.clear();for(const[e,t]of Y)if(!D||"available"!==U.get(e)?.recovery)for(const a of I(t))Q(a.resume,a.kind,e,J(t.input));Y.clear(),$.clear(),R.clear(),j.clear(),V.clear(),U.clear(),z.clear(),q.clear(),await(t.recoveryPort?.drain())},async recoverUpload(e,a,i){ie();const n=t.recoveryPort;if(!W||void 0===n)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(R.has(a)||F.has(a))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const o=new AbortController;F.set(a,{controller:o,ref:e});const r=()=>{if(!W||o.signal.aborted||F.get(a)?.controller!==o)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},d=(e,a)=>{if(void 0===e||e.senderId!==t.getSelfId()||void 0!==e.recalled||void 0!==e.deletedForEveryone||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable||"failed"!==e.status&&"uploading"!==e.status)return!1;const i="video"===e.contentType,n="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(i||n)&&(void 0===a||e.contentType===a)};let s;try{s=await n.acquireLease(o.signal),r();const l=t.domainState.getConversationMessage?.(e,a);if(!d(l))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const c=await n.get(e,a);if(r(),void 0===c)throw new Error("IM_MEDIA_RECOVERY_NOT_FOUND");const u="video"===c.kind?"video":c.filesAlbum||c.caption?.trim()?"filesAlbum":"file";if(!d(l,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const p=await n.fingerprint(i,o.signal);if(r(),p.size!==c.source.size||p.sha256!==c.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=t.domainState.getConversationMessage?.(e,a);if(R.has(a)||!d(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:i,encrypted:c.encrypted,filename:c.source.filename,mimeType:c.source.mimeType,caption:c.caption,filesAlbum:c.filesAlbum,refMessageId:c.refMessageId,...void 0===c.preview?{}:{localPreviewMetadata:{width:c.preview.width,height:c.preview.height,duration:c.preview.duration,posterData:c.preview.thumbData}}};return z.set(a,c.savedAt),await de(f,()=>oe("video"===c.kind?g:c.filesAlbum||c.caption?.trim()?b:w,f,a,c.createdAt,c.teaKey,c.resume),{id:a,createdAt:c.createdAt})}finally{F.get(a)?.controller===o&&F.delete(a),ne(a),s?.release()}}}}export{C as createMediaSender};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{GroupHistoryPageBoundaryError as e}from"../runtime/group-history-page-boundary.js";import{resolveConversationEntryUnread as t}from"./conversation-entry-unread.js";import{isSupportedImageFile as o}from"./image-format.js";import{toMessageMention as r}from"./mention.js";import{createImSdkError as n,unknownOperationErrorToImSdkError as a,toProductMessage as s,toMessageView as i,areMessageViewsEqual as d,mediaFailureToImSdkError as c}from"./message.js";import{fetchMessagesByIdInBatches as l}from"./messages-by-id.js";import{throwIfAborted as g}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as m}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as v}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as y}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as f}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as u}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as I}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as _,MEDIA_ALBUM_MAX_ITEMS as w}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as p}from"../../../im-core/src/mapping/session-mapper.js";function E(t,o,r){return t instanceof e?n({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):a(t,o,r)}const M=/* @__PURE__ */new WeakMap;function S(e,t){const o=M.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");M.set(e,o)}const D={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_RECALL_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_RECALL_NOT_SENT",category:"state",retryable:!1},expired:{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},"server-expired":{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_RECALL_UNSUPPORTED",category:"unsupported",retryable:!1},timeout:{code:"IM_SDK_RECALL_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_RECALL_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_RECALL_DISCONNECTED",category:"network",retryable:!0}},T={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_EDIT_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_EDIT_NOT_SENT",category:"state",retryable:!1},recalled:{code:"IM_SDK_EDIT_RECALLED",category:"state",retryable:!1},deleted:{code:"IM_SDK_EDIT_DELETED",category:"state",retryable:!1},expired:{code:"IM_SDK_EDIT_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_EDIT_UNSUPPORTED",category:"unsupported",retryable:!1},empty:{code:"IM_SDK_EDIT_EMPTY",category:"validation",retryable:!1},restricted:{code:"IM_SDK_EDIT_RESTRICTED",category:"permission",retryable:!1},"unsupported-content":{code:"IM_SDK_EDIT_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"no-key":{code:"IM_SDK_EDIT_KEY_UNAVAILABLE",category:"state",retryable:!1},"encrypt-failed":{code:"IM_SDK_EDIT_ENCRYPT_FAILED",category:"state",retryable:!1},timeout:{code:"IM_SDK_EDIT_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_EDIT_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_EDIT_DISCONNECTED",category:"network",retryable:!0}},h={"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"unsupported-message":{code:"IM_SDK_REACTION_MESSAGE_UNSUPPORTED",category:"unsupported",retryable:!1},"invalid-emoji":{code:"IM_SDK_REACTION_EMOJI_INVALID",category:"validation",retryable:!1},restricted:{code:"IM_SDK_REACTION_FORBIDDEN",category:"permission",retryable:!1},disconnected:{code:"IM_SDK_REACTION_DISCONNECTED",category:"network",retryable:!0},timeout:{code:"IM_SDK_REACTION_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_REACTION_FAILED",category:"state",retryable:!1}},A={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},unsupported:{code:"IM_SDK_CHANNEL_DELETE_UNSUPPORTED",category:"unsupported",retryable:!1},"not-sent":{code:"IM_SDK_CHANNEL_DELETE_NOT_SENT",category:"state",retryable:!1},unavailable:{code:"IM_SDK_CHANNEL_DELETE_UNAVAILABLE",category:"state",retryable:!1},forbidden:{code:"IM_SDK_CHANNEL_DELETE_FORBIDDEN",category:"permission",retryable:!1},timeout:{code:"IM_SDK_CHANNEL_DELETE_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_CHANNEL_DELETE_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_CHANNEL_DELETE_DISCONNECTED",category:"network",retryable:!0}};function b(e,t,o){const r=n({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function O(e,t,o,r){if(("group"===t.conversationType||"channel"===t.conversationType)&&e.getPinnedMessage(t)?.messageId===o){const e=n({code:"IM_SDK_MESSAGE_PINNED",category:"state",operation:r,retryable:!1,conversation:t,details:{messageId:o}});throw Object.assign(new Error(e.code),e)}}function N(e,t){const o=n({code:"IM_SDK_MESSAGE_ANCHOR_UNAVAILABLE",category:"state",operation:"history.loadAround",retryable:!0,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}const P=209715200,R=2147483648,C=31457280,L=4294967295;const K={"empty-input":{code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",retryable:!1},"too-many-targets":{code:"IM_SDK_FORWARD_TOO_MANY_TARGETS",category:"validation",retryable:!1},"unsupported-target-type":{code:"IM_SDK_FORWARD_TARGET_UNSUPPORTED",category:"unsupported",retryable:!1},"type-not-allowed":{code:"IM_SDK_FORWARD_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"media-not-ready":{code:"IM_SDK_FORWARD_MEDIA_NOT_READY",category:"state",retryable:!0},"album-item-not-found":{code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",retryable:!1},"conversation-blocked":{code:"IM_SDK_FORWARD_TARGET_BLOCKED",category:"permission",retryable:!1},"send-failed":{code:"IM_SDK_FORWARD_SEND_FAILED",category:"state",retryable:!1}};async function U(e,r,S,A,b={},U={}){g(U.signal);const k=Object.freeze({...e}),x=r.pageSize??30,G={historySource:"group"===k.conversationType||"channel"===k.conversationType?"remote":"local",retention:{maxMessages:6*x},...void 0===b.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===b.shouldEstablishRemoteLatestOnOpen?.(t)}};let F=r.domainState.createMessageWindow({...G});const j=/* @__PURE__ */new WeakSet,z=/* @__PURE__ */new WeakSet,B=/* @__PURE__ */new Set,H=/* @__PURE__ */new Set,W=/* @__PURE__ */new Map;let Y,$,X=!1,Q=!1,q=!1,J=!0,Z=0,ee=Object.freeze({state:"none"});const te=!0===U.captureEntryUnread&&"robot"!==k.conversationType,oe=te?r.domainState.getSession(k):void 0,re=Math.max(0,!0===oe?.manuallyUnread?0:oe?.unreadCount??0),ne=te?r.domainState.getReadState(k):void 0,ae=r.getSelfId(),se=/* @__PURE__ */new Map,ie=/* @__PURE__ */new Set;let de,ce,le,ge,me,ve=ne?.readCursorSortKey,ye=te?Object.freeze(re>0?{state:"pending",count:re}:{state:"none"}):void 0,fe=0;function ue(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=le;le=void 0;const o=++fe;return t?.controller.abort(e),o}function Ie(){const e={version:ue(),controller:new AbortController};return le=e,e}function _e(e){le===e&&(le=void 0)}let we,pe,Ee=0,Me=!1;if(te)for(const e of r.domainState.getLoadedMessagesByConversation(k))se.set(e.id,m(e,ae)),ne?.readCursor===("channel"===k.conversationType?e.extensions?.historyCursor:e.id)&&(ve=e.sortKey);const Se=new AbortController,De=/* @__PURE__ */new WeakMap;let Te,he=/* @__PURE__ */new Map;function Ae(){if(Q)throw new Error("ConversationHandle 已关闭")}function be(){const e=F.window.info();return{messages:F.window.list(),context:r.domainState.getConversationContext(k),draft:r.domainState.getDraft(k),loading:W.size>0,stale:X,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:$,entryUnread:ee,entryUnreadNavigation:ye}}function Oe(e){const t=De.get(e);if(void 0!==t)return t;const o=i(e),r=he.get(e.id),n=void 0!==r&&d(r,o)?r:o;return De.set(e,n),n}function Ne(e){const t=e.context,o=Object.freeze(e.messages.map(Oe));return he=new Map(o.map(e=>[e.id,e])),{ref:k,...void 0===t?{}:{display:Object.freeze({title:t.title,...void 0===t.avatar?{}:{avatar:t.avatar}})},messages:o,entryUnread:e.entryUnread,...void 0===e.entryUnreadNavigation?{}:{entryUnreadNavigation:e.entryUnreadNavigation},draft:e.draft,loading:e.loading,stale:e.stale,hasOlder:e.hasOlder,hasNewer:e.hasNewer,...void 0===e.error?{}:{error:e.error}}}function Pe(){ze();const e=be();if(void 0!==Te&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=Te).messages,o.messages)&&(t.context?.title??"")===(o.context?.title??"")&&(t.context?.avatar??"")===(o.context?.avatar??"")&&t.draft===o.draft&&t.loading===o.loading&&t.stale===o.stale&&t.hasOlder===o.hasOlder&&t.hasNewer===o.hasNewer&&t.error===o.error&&t.entryUnread===o.entryUnread&&t.entryUnreadNavigation===o.entryUnreadNavigation))return;var t,o;Te=e;const n=Ne(e);for(const e of B)try{e(n)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function Re(e){const t=F.window.list().find(t=>t.id===e)??r.domainState.getConversationMessage(k,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await r.domainState.resolveConversationMessage(k,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function Ce(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return Le(e,t.remoteSeed,o,r);const a=await e.openAt(k,{anchorSortKey:n.sortKey,limit:x});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return Le(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw N(k,n.id);if("local"===G.historySource){const o=e.info();return e.openAt(k,{anchorSortKey:n.sortKey,limit:x,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return Le(e,t.fallbackSeed,o,r)}async function Le(e,t,o,r){const n=await e.openAt(k,{anchorSortKey:t.sortKey,limit:x,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await Ke(e,t,o),{...n,messages:e.list()}):n}async function Ke(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>p(e)&&("older"===r?e.sortKey<t.sortKey:e.sortKey>t.sortKey)))for(let t=0;t<4;t+=1){o();const t=e.info();if(!("older"===r?t.hasMore:t.hasNewer))break;const n="older"===r?await e.loadOlder({limit:x}):await e.loadNewer({limit:x});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function Ue(e,t,o){Ae();const n=F,a=o?.window??n.window,s=o?.isCurrent??(()=>!Q&&F===n),i=()=>{if(Ae(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==Y)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=W.get(e);if(void 0!==d)return d;const c=r.beginReceiving?.();$=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===b.reconcilePage?e:b.reconcilePage(e,a))).then(e=>{i(),X=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof v?t.cause:t;throw s()&&($=E(o,`history.${e}`,k)),J?t:o}).finally(()=>{c?.(),W.delete(e),Q||Pe()});return W.set(e,g),Pe(),g}function ke(){F.window.applyIncoming(r.domainState.getMessagesByConversation(k).slice(-x))}function xe(e){return!0===b.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(re>0||"first-unread"===U.initialPosition&&(r.domainState.getSession(k)?.unreadCount??0)>0)}async function Ge(){Me=!1,q?q=!1:await Ue("latest",()=>F.window.open(k,{limit:x})),ke(),xe(F.window)&&(await Ue("latest:remote",()=>F.window.loadOlder({limit:x,establishLatestOnly:!0})),ke()),Me=!X,je(F.window.list())}function Fe(){if(Ae(),me?.version===fe)return me.promise;const e=Ie(),{version:t}=e,o=async function({version:e,controller:t}){const o=F,n=r.domainState.createMessageWindow(G),a=()=>!Q&&!t.signal.aborted&&fe===e&&F===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||n.dispose(),i(t.signal.reason)};t.signal.addEventListener("abort",l,{once:!0});const g={window:n.window,isCurrent:a,cancelled:c},m=(e,t)=>Ue(e,async()=>{const e=await t();if(e.stale)throw new DOMException("最新历史窗口已失效","AbortError");return e},g),v=(async()=>{await m(`latest:${e}`,()=>n.window.open(k,{limit:x})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(k).slice(-x)),xe(n.window)&&(await m(`latest:remote:${e}`,()=>n.window.loadOlder({limit:x,establishLatestOnly:!0})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(k).slice(-x))),F=n,d=!0,o.dispose(),Me=!0,X=!1,je(n.window.list()),Pe()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||n.dispose()}}(e).finally(()=>{_e(e),me?.version===t&&(me=void 0)});return me={version:t,promise:o},o}function je(e){const t=b.resolveReadMessageId?.(e);we=void 0===b.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function Ve(e){return!(ie.has(e.id)||void 0===de||e.sortKey>de||void 0!==ve&&e.sortKey<=ve)&&(se.get(e.id)??m(e,ae))}function ze(){if(!te||re<=0||void 0!==ce||void 0===de||"none"===ye?.state)return;const e=F.window.list();if(!e.some(e=>e.sortKey===de))return;const t=e.filter(e=>Ve(e)&&p(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<re)return;const o=t.slice(-re);if(o.every(e=>"system"===e.contentType))return void(ye=Object.freeze({state:"none"}));const r=o[0];ce=r.id,ee=Object.freeze({state:"located",firstMessageId:r.id,count:re}),ye=Object.freeze({state:"located",firstMessageId:r.id,count:re})}const Be=r.emitter.subscribe(e=>{if(!Q&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===k.conversationType&&e.conversation.conversationId===k.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(Se.abort(),ue(),ee=Object.freeze({state:"none"}),te&&(ye=Object.freeze({state:"none"})),Ee+=1,pe?.dispose(),pe=void 0,Me=!1,we=void 0),"message:received"===e.type&&"live"===e.source&&(te&&ie.add(e.message.id),Me&&(void 0===we||e.message.sortKey>we.sortKey)&&(void 0===b.resolveReadMessageId||b.resolveReadMessageId([e.message])===e.message.id)&&(we=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of H)try{e(t)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Pe()}});function He(){return"first-unread"===U.initialPosition?async function(){const e=r.domainState.getSession(k),o=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),n=r.domainState.getReadState(k),a=n?.readCursor,s=void 0===a||""===a?void 0:"channel"===k.conversationType?r.domainState.getLoadedMessagesByConversation(k).find(e=>e.extensions?.historyCursor===a):r.domainState.getConversationMessage(k,a),i=s?.sortKey??n?.readCursorSortKey;if(ee=await t({conversation:k,pageSize:x,unreadCount:o,...void 0===i?{}:{readCursorSortKey:i},signal:Se.signal,..."channel"!==k.conversationType||void 0===a||""===a||void 0===r.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=F.window.getRevision(),o=()=>!Q&&!Se.signal.aborted&&F.window.getRevision()===t,n=await r.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:Se.signal,isCurrent:o});if(g(Se.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return n}},selfId:r.getSelfId(),list:()=>F.window.list(),hasOlder:()=>F.window.info().hasMore,hasNewer:()=>F.window.info().hasNewer,openLatest:Ge,openAt:(e,t)=>{if(void 0===t&&"channel"===k.conversationType&&void 0!==a&&""!==a&&void 0!==r.loadEntryUnreadPage)return Promise.resolve();q=!1;const o=t?.messages.map(e=>r.domainState.getConversationMessage(k,e.id)??e),n=t?.messages.find(t=>t.sortKey===e)?.id,s=void 0===n?e:o?.find(e=>e.id===n)?.sortKey??e;return Ue(`entry-unread:${e}`,()=>F.window.openAt(k,{anchorSortKey:s,limit:x,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>Ue("entry-unread:older",()=>F.window.loadOlder({limit:x})),loadNewer:()=>Ue("entry-unread:newer",()=>F.window.loadNewer({limit:x}))}),"located"===ee.state&&!0===F.window.info().remotePagination){const e=ee.firstMessageId,t=F.window.list().find(t=>t.id===e);void 0!==t&&await Ue("entry-unread:context",async()=>(await Ke(F.window,t,()=>{g(Se.signal),Ae()}),{conversationId:k.conversationId,messages:F.window.list(),stale:!1}));const o=F.window.list().find(t=>t.id===e);void 0!==o&&p(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(ee=Object.freeze({state:"unavailable"}))}}():Ge()}const We=()=>{Se.abort(U.signal?.reason),F.dispose()};U.signal?.addEventListener("abort",We,{once:!0});try{if(g(U.signal),"local-first"===U.initialLoad){await Ue("initial:local",()=>F.window.open(k,{limit:x})),g(U.signal),ke(),q=!0;try{await He()}catch(e){if(g(U.signal),e instanceof v)throw e;$=E(e,"history.initial",k),"first-unread"===U.initialPosition&&(ee=Object.freeze({state:"unavailable"}))}finally{q=!1}}else await He();g(U.signal)}catch(e){throw Q=!0,Se.abort(),Be(),B.clear(),F.dispose(),e instanceof v?e.cause:e}finally{U.signal?.removeEventListener("abort",We)}function Ye(e,t){const o=r.domainState.getConversationMessage(k,e);return void 0!==o&&o.conversationType===k.conversationType&&o.conversationId===k.conversationId?{ok:!0,message:s(o)}:{ok:!1,error:n({code:void 0===o?"IM_SDK_MESSAGE_STATE_MISSING":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:k})}}async function $e(e,t,o){const r=await(b.getSendPermissionError?.(e));if(Ae(),void 0!==r){if(void 0===o||"customerService"===k.conversationType)return{ok:!1,error:r};const e=await o(r);return Ae(),e}try{const e=await t();return Ae(),e}catch(t){if(Q)throw t;return{ok:!1,error:a(t,e,k)}}}async function Xe(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...k,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===k.conversationType?{encrypted:!1}:{},...void 0===t.localPreviewUrl?{}:{localPreviewUrl:t.localPreviewUrl},...void 0===t.localPreviewMetadata?{}:{localPreviewMetadata:t.localPreviewMetadata},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}}}function Qe(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function qe(e){return Qe(e)&&(void 0===e?.duration||Number.isFinite(e.duration)&&e.duration>0)&&(void 0===e?.posterData||e.posterData instanceof Uint8Array&&e.posterData.length>0&&e.posterData.length<=16384)}function Je(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function Ze(e,t,o){return{ok:!1,error:n({code:e,category:t,operation:o,retryable:!1,conversation:k})}}function et(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>L||!Number.isSafeInteger(e.height)||e.height<=0||e.height>L)return!1;let o;try{o=new URL(e.url)}catch{return!1}if("http:"!==o.protocol&&"https:"!==o.protocol||""!==o.username||""!==o.password)return!1;const r=e.resourceId;if(void 0!==r&&("string"!=typeof r||""===r.trim()))return!1;if("gif"===t)return!Object.prototype.hasOwnProperty.call(e,"packageId");const n=e.packageId;return"string"==typeof r&&""!==r.trim()&&"string"==typeof n&&""!==n.trim()}function tt(e){if("customerService"===k.conversationType)throw ot(n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:k}))}function ot(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function rt(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw ot(n({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:k,details:{targetConversationType:e,targetConversationId:t}}))}async function nt(e,t,o){let s;try{s=await r.forwardMessages({messages:t,targets:o.map(e=>{if("customerService"===e.conversationType)throw new Error("客服会话不能作为转发目标");return{conversationType:e.conversationType,conversationId:e.conversationId}})})}catch(t){throw ot(a(t,e,k))}return Ae(),Object.freeze({sent:Object.freeze(s.results.flatMap(t=>t.ok?[{conversation:rt(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(s.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:n({...K[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...s.skippedSourceIds])})}function at(e,t){const o=r.domainState.getConversationMessage(k,e);if(void 0===o){const o=r.domainState.getMessagesById(e)[0];throw ot(n({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:k}))}if(o.conversationType!==k.conversationType||o.conversationId!==k.conversationId)throw ot(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:k}));return o}function st(e,t){return ot(n({...t,operation:e,conversation:k}))}function it(e,t){const o=n({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:k,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function dt(e,t){const o=n({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:k,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function ct(e,t){if(void 0!==e)try{await r.domainState.clearDraftIfUnchanged(k,e)}catch(e){r.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function lt(e,t,n,a,s){return $e(e,async()=>{if("image"===t){const t=await o(n);if(Ae(),!t)return Ze("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await Xe(n,a);if(Ae(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const o=new AbortController,a=await r.prepareMediaPreview({operationId:`${k.conversationType}:${k.conversationId}:${e}:${++Z}`,kind:t,file:n,signal:o.signal});if(Ae(),void 0===a||("image"===t?!Qe(a):!qe(a)))return Ze("image"===t?"IM_SDK_IMAGE_PREVIEW_METADATA_INVALID":"IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=a}if("video"===t&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Je(i.localPreviewMetadata))return Ze("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const l=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(Ae(),Ye(l.messageId,e)):{ok:!1,error:c(l.reason,e,k)}})}function gt(e,t,o){const a=at(e,o);if(!(a.contentType===t||"file"===t&&"filesAlbum"===a.contentType&&1===a.body.filesAlbum?.items.length)||"failed"!==a.status||"media.uploadInterrupted"!==a.failure?.displayCode&&"media.cancelled"!==a.failure?.displayCode&&("media.uploadTimeout"!==a.failure?.displayCode||!1!==a.failure.retryable)||r.isOutboxOwned(e))throw ot(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:k}));return a}async function mt(e,t,o,n,a,s){return gt(t,o,e),$e(e,async()=>{const i=await Xe(n,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const t=new AbortController,o=await r.prepareMediaPreview({operationId:`${k.conversationType}:${k.conversationId}:${e}:${++Z}`,kind:"video",file:n,signal:t.signal});if(Ae(),void 0===o||!qe(o))return Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Je(i.localPreviewMetadata))return Ze("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};gt(t,o,e);const l=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(Ae(),Ye(l.messageId,e)):{ok:!1,error:c(l.reason,e,k)}})}J=!1,function(){if(!te||re<=0)return;if(!0===F.window.info().remotePagination&&!Me&&"located"!==ee.state)return;z.add(F.window);const e=F.window.list().filter(e=>!ie.has(e.id));de=e.at(-1)?.sortKey;for(const t of e)se.has(t.id)||se.set(t.id,m(t,ae));if("first-unread"===U.initialPosition&&"located"===ee.state)return ce=ee.firstMessageId,void(ye=Object.freeze({state:"located",count:re,firstMessageId:ee.firstMessageId}));ze()}();const vt={ref:k,getSnapshot:function(){return Ae(),Ne(be())},subscribe:e=>(Ae(),B.add(e),()=>B.delete(e)),resolveMessage:async e=>{Ae();const t=F.window.list().find(t=>t.id===e)??await r.domainState.resolveConversationMessage(k,e);return void 0===t?null:Oe(t)},history:{loadEntryUnread:e=>function(e={}){if(Ae(),e.signal?.aborted)return Promise.reject(e.signal.reason);if(void 0!==ge){if(!ge.controller.signal.aborted&&ge.version===fe&&ge.callerSignal===e.signal)return ge.promise;ge.controller.abort()}if(void 0===ye||"none"===ye.state)return Promise.resolve(!1);const o=Ie(),{version:n,controller:a}=o,s=F.window.list(),i=s.find(e=>e.id===ce),d=F.window.info();if(void 0===Y&&0===W.size&&!X&&!Se.signal.aborted&&z.has(F.window)&&void 0!==i&&p(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>p(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>p(e)&&e.sortKey>i.sortKey)))return ee=Object.freeze({state:"located",firstMessageId:i.id,count:re}),ye=Object.freeze({state:"located",firstMessageId:i.id,count:re}),Pe(),_e(o),Promise.resolve(!0);const c=r.domainState.createMessageWindow(G),l=()=>!Q&&!a.signal.aborted&&fe===n,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},m=async e=>{g();let t=await e();if(g(),void 0!==b.reconcilePage&&(t=await b.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>r.domainState.getConversationMessage(k,e.id)??e))};let y,f=!1;const u=new Promise((e,t)=>{y=t}),I=()=>{f||c.dispose(),y(a.signal.reason)},_=()=>a.abort(e.signal?.reason),w=()=>a.abort(Se.signal.reason);a.signal.addEventListener("abort",I,{once:!0}),e.signal?.addEventListener("abort",_,{once:!0}),Se.signal.addEventListener("abort",w,{once:!0}),Se.signal.aborted&&w();const M=r.beginReceiving?.(),S=(async()=>{try{let e=!1;void 0===de&&(await m(()=>c.window.open(k,{limit:x})),xe(c.window)&&await m(()=>c.window.loadOlder({limit:x,establishLatestOnly:!0})),de=c.window.list().filter(e=>!ie.has(e.id)).at(-1)?.sortKey,e=!0);const o=ce,n=void 0===o?void 0:await Re(o);if(g(),void 0!==o&&void 0===n)return ye=Object.freeze({state:"unavailable",count:re}),!1;const s=void 0===n?await t({conversation:k,pageSize:x,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===de?{}:{entryUpperSortKey:de},unreadCount:re,...void 0===ve?{}:{readCursorSortKey:ve},signal:a.signal,selfId:ae,isEntryUnread:Ve,..."channel"===k.conversationType&&ne?.readCursor&&void 0!==r.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await r.loadEntryUnreadPage({readCursor:ne.readCursor,...void 0===e?{}:{cursor:e},signal:a.signal,isCurrent:l});return g(),t}}:{},paginationKey:()=>c.window.getPaginationKey(),list:()=>c.window.list(),hasOlder:()=>c.window.info().hasMore,hasNewer:()=>c.window.info().hasNewer,openLatest:async()=>{e?e=!1:(await m(()=>c.window.open(k,{limit:x})),xe(c.window)&&await m(()=>c.window.loadOlder({limit:x,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,m(()=>c.window.openAt(k,{anchorSortKey:t,limit:x,...void 0===o?{}:{seedMessages:o.messages.map(e=>r.domainState.getConversationMessage(k,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>m(()=>c.window.loadOlder({limit:x})),loadNewer:()=>m(()=>c.window.loadNewer({limit:x}))}):await(async()=>(await m(()=>Ce(c.window,n,g)),{state:"located",firstMessageId:n.anchor.id,count:re}))();if(g(),"located"!==s.state)return ye=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:re}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!p(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return ye=Object.freeze({state:"unavailable",count:re}),!1;!0===c.window.info().remotePagination&&await m(async()=>(await Ke(c.window,i,g),{conversationId:k.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!p(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return ye=Object.freeze({state:"unavailable",count:re}),!1;const v=F;return F=c,f=!0,v.dispose(),z.add(c.window),ce=s.firstMessageId,ee=s,ye=Object.freeze({state:"located",count:re,firstMessageId:s.firstMessageId}),$=void 0,!0}catch(e){const t=e instanceof v?e.cause:e;if(l()){const e=E(t,"history.loadEntryUnread",k);ye=Object.freeze({state:"failed",count:re,error:e})}throw t}})(),D=Promise.race([S,u]).finally(()=>{a.signal.removeEventListener("abort",I),_e(o),e.signal?.removeEventListener("abort",_),Se.signal.removeEventListener("abort",w),f||c.dispose(),M?.(),ge?.controller===a&&(ge=void 0),Q||Pe()});return ge={version:n,callerSignal:e.signal,controller:a,promise:D},D}(e),loadLatest:async()=>Fe(),loadOlder:async()=>(Ae(),ue(),Ue("older",()=>F.window.loadOlder({limit:x}))),loadNewer:async()=>{Ae(),ue(),await Ue("newer",()=>F.window.loadNewer({limit:x})),Ae(),F.window.info().hasNewer||(ke(),Pe())},loadAround:async(e,t={})=>{if(Ae(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=Ie(),{version:a,controller:s}=o;if(void 0===Y&&"channel"===k.conversationType&&j.has(F.window)&&r.domainState.getPinnedMessage(k)?.messageId===e&&F.window.list().some(t=>t.id===e&&V(t)))return void _e(o);const i=F,d=()=>!Q&&!s.signal.aborted&&fe===a&&F===i,c=()=>{if(Ae(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,m=!1;const v=new Promise((e,t)=>{g=t}),y=()=>{m||l?.dispose(),g(s.signal.reason)},f=()=>s.abort(t.signal?.reason);s.signal.addEventListener("abort",y,{once:!0}),t.signal?.addEventListener("abort",f,{once:!0});const u=(async()=>{const t=await async function(e,t){if(t(),void 0!==Y)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await Re(e);t();const n=o?.fallbackSeed;if(void 0!==o&&("channel"!==k.conversationType||void 0!==n&&V(n)))return"channel"===k.conversationType&&!0===F.window.info().remotePagination?{...o,remoteSeed:n}:o;if(void 0===r.fetchMessagesByIdBatch)throw N(k,e);if(void 0!==Y)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await r.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===k.conversationType&&t.conversationId===k.conversationId);if(void 0!==s){if("channel"===k.conversationType){if(!V(s))throw N(k,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw N(k,e)}(e,c);if(c(),void 0===t)throw function(e,t){const o=n({code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",operation:"history.loadAround",retryable:!1,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}(k,e);if(t.anchor.conversationType!==k.conversationType||t.anchor.conversationId!==k.conversationId)throw N(k,e);l=r.domainState.createMessageWindow(G);const o=l.window;await Ue(`around:${e}:${a}`,async()=>(c(),Ce(o,t,c,!0)),{window:o,isCurrent:d,cancelled:v}),c(),F=l,void 0!==t.remoteSeed&&j.add(o),m=!0,i.dispose(),Pe()})();try{await Promise.race([u,v])}finally{t.signal?.removeEventListener("abort",f),s.signal.removeEventListener("abort",y),_e(o),m||l?.dispose()}},clearLocal:async()=>(Ae(),tt("history.clearLocal"),function(){if(Q)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==Y)return Y;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");ue(e),r.invalidateHistory?.(k,e);const t=[...W.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{Ae();const e=[...r.domainState.getMessagesByConversation(k),...F.window.list()];if(r.hasOutboxForConversation(k)||e.some(e=>r.isOutboxOwned(e.id)))throw dt("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw dt("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await r.domainState.clearLocalConversationHistory(k),Ae(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw dt("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{Y===o&&(Y=void 0)});return Y=o,o}())},messages:{sendText:async(e,t={})=>{Ae();const o=S(k,e,t);if("code"in o)return{ok:!1,error:o};const n=r.domainState.getDraft(k)?.updatedAt;return $e("messages.sendText",async()=>{const e=await r.sendText(o);return Ae(),await ct(n,"messages.sendText"),Ye(e.id,"messages.sendText")},async e=>{const t=b.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await ct(n,"messages.sendText"),{ok:!0,message:s(t)})})},sendContact:async(e,t={})=>{Ae();const o=e.targetId.trim(),a=e.displayName.trim();if(""===o||""===a)return{ok:!1,error:n({code:""===o?"IM_SDK_CONTACT_CARD_TARGET_REQUIRED":"IM_SDK_CONTACT_CARD_NAME_REQUIRED",category:"validation",operation:"messages.sendContact",retryable:!1,conversation:k})};const s={...k,contact:{...e,targetId:o,displayName:a},encrypted:"direct"!==k.conversationType&&"robot"!==k.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return $e("messages.sendContact",async()=>Ye((await r.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(Ae(),e.size>C?Ze("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?Ze("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):Qe(t.localPreviewMetadata)?lt("messages.sendImage","image",e,t,r.sendImage):Ze("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(Ae(),async function(e,t){const n="messages.sendMediaAlbum";if(0===e.length)return Ze("IM_SDK_MEDIA_ALBUM_EMPTY","validation",n);if(e.length>w)return Ze("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",n);if(void 0!==t.caption&&Array.from(t.caption).length>_)return Ze("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",n);for(const t of e){if("image/gif"===t.file.type)return Ze("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",n);if("image"===t.kind){if(t.file.size>C)return Ze("IM_SDK_IMAGE_TOO_LARGE","validation",n);if(!Qe(t.localPreviewMetadata))return Ze("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n)}else{if(t.file.size>P)return Ze("IM_SDK_VIDEO_TOO_LARGE","validation",n);if(!qe(t.localPreviewMetadata))return Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n)}}return $e(n,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await o(t.file);if(Ae(),!e)return Ze("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",n)}const a=await Promise.all(e.map(async e=>{if(void 0!==e.localPreviewMetadata||void 0===r.prepareMediaPreview)return e.localPreviewMetadata;const t=new AbortController;return r.prepareMediaPreview({operationId:`${k.conversationType}:${k.conversationId}:${n}:${++Z}`,kind:e.kind,file:e.file,signal:t.signal})}));Ae();const s=[];for(const[t,o]of e.entries()){const e=a[t];if("image"===o.kind&&!Qe(e))return Ze("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n);if("video"===o.kind){if(!qe(e))return Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n);if(void 0!==r.prepareMediaPreview&&!Je(e))return Ze("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",n)}const i="name"in o.file?o.file.name:void 0;s.push({kind:o.kind,data:o.file,...""===o.file.type?{}:{mimeType:o.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===o.localPreviewUrl?{}:{localPreviewUrl:o.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=b.recheckSendPermissionError?.(n);if(void 0!==i)return{ok:!1,error:i};const d=await r.sendMediaAlbum({...k,items:s,...void 0===t.caption||""===t.caption.trim()?{}:{caption:t.caption},...void 0===t.hd?{}:{hd:t.hd},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}});return d.ok?(Ae(),Ye(d.messageId,n)):{ok:!1,error:c(d.reason,n,k)}})}(e,t)),sendVideo:async(e,t={})=>(Ae(),e.size>P?Ze("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):qe(t.localPreviewMetadata)?lt("messages.sendVideo","video",e,t,r.sendVideo):Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(Ae(),t.size>P?Ze("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):qe(o.localPreviewMetadata)?mt("messages.replaceInterruptedVideo",e,"video",t,o,r.replaceVideo):Ze("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(Ae(),$e("messages.sendVoice",async()=>{const o=await Xe(e,t),n=b.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==n)return{ok:!1,error:n};const a=await r.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(Ae(),Ye(a.messageId,"messages.sendVoice")):{ok:!1,error:c(a.reason,"messages.sendVoice",k)}})),sendFile:async(e,t={})=>{if(Ae(),e.size>R)return Ze("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>_)return Ze("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation","messages.sendFile");const o=t.fileName??("name"in e?e.name:void 0);return"string"!=typeof o||""===o.trim()?Ze("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):lt("messages.sendFile",void 0,e,t,r.sendFile)},sendGif:async(e,t={})=>(Ae(),e.size>3145728?Ze("IM_SDK_GIF_TOO_LARGE","validation","messages.sendGif"):await async function(e){const t=e.type.trim().toLowerCase();if(""!==t&&"image/gif"!==t)return!1;const o=new Uint8Array(await e.slice(0,6).arrayBuffer());if(6!==o.length)return!1;const r=String.fromCharCode(...o);return"GIF87a"===r||"GIF89a"===r}(e)?lt("messages.sendGif",void 0,e,t,e=>r.sendGif(e)):Ze("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(Ae(),et(e,"sticker")?$e("messages.sendSticker",async()=>Ye((await r.sendExpression({...k,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):Ze("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(Ae(),et(e,"gif")?$e("messages.sendGifAsset",async()=>Ye((await r.sendExpression({...k,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):Ze("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(Ae(),"rock-paper-scissors"!==e&&"dice"!==e?Ze("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):$e("messages.sendGame",async()=>Ye((await r.sendGame({...k,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(Ae(),I(e)?$e("messages.sendMiniProgram",async()=>Ye((await r.sendMiniProgram({...k,miniProgram:e,encrypted:"direct"!==k.conversationType&&"robot"!==k.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):Ze("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(Ae(),"channel"===k.conversationType||"robot"===k.conversationType?Ze("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):u(e)?$e("messages.sendTransfer",async()=>Ye((await r.sendTransfer({...k,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):Ze("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(Ae(),"channel"===k.conversationType||"robot"===k.conversationType?Ze("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):f(e)?$e("messages.sendGift",async()=>Ye((await r.sendGift({...k,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):Ze("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(Ae(),y(e)?$e("messages.sendLiveRoom",async()=>Ye((await r.sendLiveRoom({...k,liveRoom:e,encrypted:"direct"!==k.conversationType&&"robot"!==k.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):Ze("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{Ae(),tt("messages.toggleReaction"),at(e,"messages.toggleReaction");const o=await r.setReaction({conversation:k,parentMessageId:e,emoji:t,action:"toggle"});if(Ae(),!o.ok)throw st("messages.toggleReaction",h[o.reason]);return Object.freeze({messageId:e,eventId:o.event.id,emoji:o.event.emoji,action:0===o.event.action?"add":"remove"})},setReaction:async(e,t,o)=>{Ae(),tt("messages.setReaction"),at(e,"messages.setReaction");const n=await r.setReaction({conversation:k,parentMessageId:e,emoji:t,action:o});if(Ae(),!n.ok)throw st("messages.setReaction",h[n.reason]);return Object.freeze({messageId:e,eventId:n.event.id,emoji:n.event.emoji,action:0===n.event.action?"add":"remove"})},replaceInterruptedFile:async(e,t,o={})=>{if(Ae(),tt("messages.replaceInterruptedFile"),t.size>R)return Ze("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return Ze("IM_SDK_FILE_CAPTION_UNSUPPORTED","unsupported","messages.replaceInterruptedFile");const n=o.fileName??("name"in t?t.name:void 0);return"string"!=typeof n||""===n.trim()?Ze("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):mt("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:n},r.replaceFile)},editText:async(e,t,o={})=>{Ae(),tt("messages.editText"),at(e,"messages.editText"),O(r.domainState,k,e,"messages.editText");const n=A(k,e,t,o);if("code"in n)throw ot(n);let i;try{i=await r.editMessage(n)}catch(e){throw ot(a(e,"messages.editText",k))}if(Ae(),!i.ok)throw st("messages.editText",T[i.reason]);return s(at(e,"messages.editText"))},recall:async e=>{let t;Ae(),tt("messages.recall"),at(e,"messages.recall"),O(r.domainState,k,e,"messages.recall");try{t=await r.recallMessage({...k,messageId:e})}catch(e){throw ot(a(e,"messages.recall",k))}if(Ae(),!t.ok)throw st("messages.recall",D[t.reason])},deleteLocal:async e=>{Ae(),tt("messages.deleteLocal"),O(r.domainState,k,e,"messages.deleteLocal");const t=r.domainState.getConversationMessage(k,e);if(r.isOutboxOwned(e))throw it("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===k.conversationType&&t.conversationId===k.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw it("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{r.invalidateHistory?.(k);const t=await r.domainState.deleteLocalMessage(k,e);return Ae(),Object.freeze({scope:"local-only",messageId:e,deleted:t,remoteHistory:"remote-history-may-restore"})}catch(e){if(e instanceof Error&&"code"in e&&"IM_MESSAGE_PINNED"===e.code)throw it("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw it("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(Ae(),tt("messages.forward"),0===e.length||0===t.length)throw ot(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:k}));return nt("messages.forward",e.map(e=>({id:e,...k})),t)},forwardMediaAlbumItem:async(e,t,o)=>{Ae(),tt("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw ot(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:k}));if(!Number.isInteger(t)||t<0)throw ot(n({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:k,details:{itemIndex:t}}));return nt(r,[{id:e,...k,itemIndex:t}],o)},fetchByIds:async e=>{Ae();const t=r.fetchMessagesByIdBatch;if(void 0===t)throw ot(n({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:k}));const o=r.beginReceiving?.();try{const o=await l({messageIds:e,fetchBatch:t,isCurrent:()=>!Q,projectMessage:Oe});return Object.freeze({messages:Object.freeze([...o.messages]),missingMessageIds:Object.freeze([...o.missingMessageIds]),unresolvedMessageIds:Object.freeze([...o.unresolvedMessageIds]),...void 0===o.failure?{}:{failure:Object.freeze(o.failure)}})}finally{o?.()}}},draft:{get:async()=>(Ae(),"customerService"===k.conversationType?null:r.drafts.get(k)),save:async e=>{if(Ae(),"customerService"===k.conversationType)throw new Error("客服会话不支持草稿");return r.drafts.save(k,e)},clear:async()=>{Ae(),"customerService"!==k.conversationType&&await r.drafts.clear(k)},subscribe:e=>(Ae(),H.add(e),()=>H.delete(e))},markRead:async e=>{Ae();const t=F.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===b.resolveReadMessageId?e??t.at(-1)?.id:b.resolveReadMessageId(t,e);void 0!==o&&await r.markRead({...k,readCursor:o})},markConversationRead:async()=>{if(Ae(),void 0===r.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=Ee,t=await async function(){if(Me){const e=/* @__PURE__ */new Map,t=r.domainState.getLoadedMessagesByConversation(k);for(const o of[we,...t])void 0!==o&&e.set(o.id,r.domainState.getConversationMessage(k,o.id)??o);return je([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),we?.id}const e=Ee,t=r.domainState.createMessageWindow(G);try{const o=await t.window.open(k,{limit:x});if(Ae(),o.stale)throw new Error("无法确认会话最新已读边界");if(xe(t.window)){const e=await t.window.loadOlder({limit:x,establishLatestOnly:!0});if(Ae(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==Ee)throw new DOMException("会话已读确认已失效","AbortError");je(t.window.list()),Me=!0;const r=t.window.list();return void 0===b.resolveReadMessageId?r.at(-1)?.id:b.resolveReadMessageId(r)}finally{t.dispose()}}();if(Ae(),e!==Ee)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===k.conversationType&&void 0===t&&F.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===r.domainState.getConversationMessage(k,t)){const o=we?.id===t?we:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");pe??(pe=r.domainState.createMessageWindow({retention:{maxMessages:x}}));const n=await pe.window.openAt(k,{anchorSortKey:o.sortKey,limit:x,seedMessages:[o],seedHasNewer:!1});if(Ae(),n.stale||e!==Ee)throw new DOMException("会话已读确认已失效","AbortError")}await r.markConversationRead(k,t)},markVisibleMessages:async e=>{if(Ae(),void 0===r.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!F.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await r.markVisibleMessages(k,t)},setMuted:async e=>(Ae(),r.setMuted(k,e)),close(){Q||(Q=!0,Se.abort(),ue(),Be(),B.clear(),H.clear(),he.clear(),pe?.dispose(),F.dispose())}};return M.set(vt,{getMessages:()=>(Ae(),F.window.list()),resolveMessage:async e=>(Ae(),F.window.list().find(t=>t.id===e)??r.domainState.resolveConversationMessage(k,e))}),vt}async function k(e,t,o={}){let r,a,s=!1;function i(){const o=Date.now();if(void 0!==r&&o-r.checkedAt<5e3)return Promise.resolve(r.value);if(void 0!==a)return a;const n=t.getRelationship(e.conversationId).then(e=>(r={value:e,checkedAt:Date.now()},e)).catch(e=>(s=!0,t.emitter.emit({type:"error",error:{scope:"http",message:"direct 发送前关系查询失败,已降级为服务端 ACK 裁决",cause:e}}),r={value:"unknown",checkedAt:Date.now()},"unknown")).finally(()=>{a===n&&(a=void 0)});return a=n,n}t.shouldCheckRelationship()&&i();const d=await U(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!0,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{getSendPermissionError:async function(o){if(!t.shouldCheckRelationship())return;const r=await i();if("friend"!==r){if("unknown"!==r)return n({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",operation:o,retryable:!1,conversation:e,details:Object.freeze({relationship:r})});s||(s=!0,t.emitter.emit({type:"error",error:{scope:"protocol",message:"direct 发送前关系状态未知,已降级为服务端 ACK 裁决",cause:{conversation:e,relationship:r}}}))}},appendTextPermissionFailure:t.appendContactRequiredTextFailure},o),c={...d,messages:{...d.messages,async markMediaConsumed(o){const r=t.domainState.getConversationMessage(e,o);if(void 0===r||r.senderId===t.getSelfId()||"voice"!==r.contentType&&"video"!==r.contentType){const t=n({code:"IM_SDK_MEDIA_CONSUMPTION_MESSAGE_INVALID",category:"validation",operation:"messages.markMediaConsumed",retryable:!1,conversation:e});throw Object.assign(new Error(t.code),t)}await t.markDirectMediaConsumed(e.conversationId,o)}}};return S(c,d),c}async function x(e,t,o={}){return U(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&j(r,t.pageSize??30)},o)}async function G(e,t,o={}){return U(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!1,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{shouldEstablishRemoteLatestOnOpen:()=>!1},o)}const F=/* @__PURE__ */new Set(["pending","uploading","sending"]);function j(e,t){return e.length<t}function V(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function z(e,t,o={}){const n=await U(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&j(r,t.pageSize??30)||function(e,t){let o=!1;for(const r of e){const e=r.body.system;if("channel"===r.conversationType&&!0===e?.targetUserIds?.includes(t))if("channel_member_left"!==e.eventType&&"channel_member_removed"!==e.eventType){if(o&&("channel_member_joined"===e.eventType||"channel_member_invited"===e.eventType))return!0}else o=!0}return!1}(r,t.getSelfId()),reconcilePage:t.reconcilePage,resolveReadMessageId:(e,o)=>function(e,t,o){const r=void 0===o?e.length-1:e.findIndex(e=>e.id===o),n=e[r];if(void 0===n||V(n))return n?.id;const a=e.slice(0,r).findLast(e=>V(e));return void 0!==a?a.id:n.senderId===t&&F.has(n.status)?void 0:n.id}(e,t.getSelfId(),o)},o),s={...n,messages:{...n.messages,deleteForEveryone:async o=>{if(void 0===t.domainState.getConversationMessage(e,o))throw b(e,A["not-found"]);let r;O(t.domainState,e,o,"messages.deleteForEveryone");try{r=await t.deleteMessageForEveryone({...e,messageId:o})}catch(t){const o=a(t,"messages.deleteForEveryone",e);throw Object.assign(new Error(o.code,{cause:t}),o)}if(!r.ok)throw b(e,A[r.reason])}}};return S(s,n),s}async function B(e,t,o={}){const r=t=>n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return U(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{z as createChannelConversationHandle,B as createCustomerServiceConversationHandle,k as createDirectConversationHandle,x as createGroupConversationHandle,G as createRobotConversationHandle,S as linkConversationHandleDomainAccess};
|
|
1
|
+
import{GroupHistoryPageBoundaryError as e}from"../runtime/group-history-page-boundary.js";import{resolveConversationEntryUnread as t}from"./conversation-entry-unread.js";import{isSupportedImageFile as o}from"./image-format.js";import{toMessageMention as r}from"./mention.js";import{createImSdkError as n,unknownOperationErrorToImSdkError as a,toProductMessage as s,toMessageView as i,areMessageViewsEqual as d,mediaFailureToImSdkError as c}from"./message.js";import{fetchMessagesByIdInBatches as l}from"./messages-by-id.js";import{throwIfAborted as g}from"../../../im-core/src/abort.js";import{isConversationUnreadMessage as m}from"../../../im-core/src/mapping/unread-divider.js";import{LocalMessageWindowReadError as v}from"../../../im-core/src/state/local-message-window-read-error.js";import{isValidLiveRoomBody as y}from"../../../im-core/src/mapping/live-room-body.js";import{isValidGiftBody as f}from"../../../im-core/src/mapping/gift-body.js";import{isValidTransferBody as u}from"../../../im-core/src/mapping/transfer-body.js";import{isValidMiniProgramBody as I}from"../../../im-core/src/mapping/mini-program-body.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as _,MEDIA_ALBUM_MAX_ITEMS as w}from"../../../im-core/src/mapping/media-album-body.js";import{isMessageVisibleInTimeline as p}from"../../../im-core/src/mapping/session-mapper.js";import{MEDIA_THUMBNAIL_MAX_BYTES as E}from"../../../im-core/src/media-thumbnail-policy.js";function M(t,o,r){return t instanceof e?n({code:t.code,category:t.category,retryable:t.retryable,operation:o,conversation:r,cause:t}):a(t,o,r)}const S=/* @__PURE__ */new WeakMap;function D(e,t){const o=S.get(t);if(void 0===o)throw new Error("ConversationHandle advanced 访问能力尚未注册");S.set(e,o)}const T={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_RECALL_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_RECALL_NOT_SENT",category:"state",retryable:!1},expired:{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},"server-expired":{code:"IM_SDK_RECALL_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_RECALL_UNSUPPORTED",category:"unsupported",retryable:!1},timeout:{code:"IM_SDK_RECALL_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_RECALL_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_RECALL_DISCONNECTED",category:"network",retryable:!0}},h={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"not-own":{code:"IM_SDK_EDIT_NOT_OWN",category:"permission",retryable:!1},"not-sent":{code:"IM_SDK_EDIT_NOT_SENT",category:"state",retryable:!1},recalled:{code:"IM_SDK_EDIT_RECALLED",category:"state",retryable:!1},deleted:{code:"IM_SDK_EDIT_DELETED",category:"state",retryable:!1},expired:{code:"IM_SDK_EDIT_EXPIRED",category:"state",retryable:!1},unsupported:{code:"IM_SDK_EDIT_UNSUPPORTED",category:"unsupported",retryable:!1},empty:{code:"IM_SDK_EDIT_EMPTY",category:"validation",retryable:!1},restricted:{code:"IM_SDK_EDIT_RESTRICTED",category:"permission",retryable:!1},"unsupported-content":{code:"IM_SDK_EDIT_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"no-key":{code:"IM_SDK_EDIT_KEY_UNAVAILABLE",category:"state",retryable:!1},"encrypt-failed":{code:"IM_SDK_EDIT_ENCRYPT_FAILED",category:"state",retryable:!1},timeout:{code:"IM_SDK_EDIT_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_EDIT_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_EDIT_DISCONNECTED",category:"network",retryable:!0}},A={"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},"unsupported-message":{code:"IM_SDK_REACTION_MESSAGE_UNSUPPORTED",category:"unsupported",retryable:!1},"invalid-emoji":{code:"IM_SDK_REACTION_EMOJI_INVALID",category:"validation",retryable:!1},restricted:{code:"IM_SDK_REACTION_FORBIDDEN",category:"permission",retryable:!1},disconnected:{code:"IM_SDK_REACTION_DISCONNECTED",category:"network",retryable:!0},timeout:{code:"IM_SDK_REACTION_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_REACTION_FAILED",category:"state",retryable:!1}},b={pinned:{code:"IM_SDK_MESSAGE_PINNED",category:"state",retryable:!1},"not-found":{code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",retryable:!1},unsupported:{code:"IM_SDK_CHANNEL_DELETE_UNSUPPORTED",category:"unsupported",retryable:!1},"not-sent":{code:"IM_SDK_CHANNEL_DELETE_NOT_SENT",category:"state",retryable:!1},unavailable:{code:"IM_SDK_CHANNEL_DELETE_UNAVAILABLE",category:"state",retryable:!1},forbidden:{code:"IM_SDK_CHANNEL_DELETE_FORBIDDEN",category:"permission",retryable:!1},timeout:{code:"IM_SDK_CHANNEL_DELETE_TIMEOUT",category:"network",retryable:!0},failed:{code:"IM_SDK_CHANNEL_DELETE_FAILED",category:"state",retryable:!1},disconnected:{code:"IM_SDK_CHANNEL_DELETE_DISCONNECTED",category:"network",retryable:!0}};function O(e,t,o){const r=n({...t,operation:"messages.deleteForEveryone",conversation:e});return Object.assign(new Error(r.code,void 0),r)}function N(e,t,o,r){if(("group"===t.conversationType||"channel"===t.conversationType)&&e.getPinnedMessage(t)?.messageId===o){const e=n({code:"IM_SDK_MESSAGE_PINNED",category:"state",operation:r,retryable:!1,conversation:t,details:{messageId:o}});throw Object.assign(new Error(e.code),e)}}function P(e,t){const o=n({code:"IM_SDK_MESSAGE_ANCHOR_UNAVAILABLE",category:"state",operation:"history.loadAround",retryable:!0,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}const R=209715200,C=2147483648,L=31457280,K=4294967295,U=E;const k={"empty-input":{code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",retryable:!1},"too-many-targets":{code:"IM_SDK_FORWARD_TOO_MANY_TARGETS",category:"validation",retryable:!1},"unsupported-target-type":{code:"IM_SDK_FORWARD_TARGET_UNSUPPORTED",category:"unsupported",retryable:!1},"type-not-allowed":{code:"IM_SDK_FORWARD_CONTENT_UNSUPPORTED",category:"unsupported",retryable:!1},"media-not-ready":{code:"IM_SDK_FORWARD_MEDIA_NOT_READY",category:"state",retryable:!0},"album-item-not-found":{code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",retryable:!1},"conversation-blocked":{code:"IM_SDK_FORWARD_TARGET_BLOCKED",category:"permission",retryable:!1},"send-failed":{code:"IM_SDK_FORWARD_SEND_FAILED",category:"state",retryable:!1}};async function x(e,r,E,D,b={},O={}){g(O.signal);const x=Object.freeze({...e}),G=r.pageSize??30,j={historySource:"group"===x.conversationType||"channel"===x.conversationType?"remote":"local",retention:{maxMessages:6*G},...void 0===b.shouldEstablishRemoteLatestOnOpen?{}:{shouldEstablishRemoteLatest:(e,t)=>!0===b.shouldEstablishRemoteLatestOnOpen?.(t)}};let F=r.domainState.createMessageWindow({...j});const V=/* @__PURE__ */new WeakSet,z=/* @__PURE__ */new WeakSet,H=/* @__PURE__ */new Set,W=/* @__PURE__ */new Set,Y=/* @__PURE__ */new Map;let $,X,Q=!1,q=!1,J=!1,Z=!0,ee=0,te=Object.freeze({state:"none"});const oe=!0===O.captureEntryUnread&&"robot"!==x.conversationType,re=oe?r.domainState.getSession(x):void 0,ne=Math.max(0,!0===re?.manuallyUnread?0:re?.unreadCount??0),ae=oe?r.domainState.getReadState(x):void 0,se=r.getSelfId(),ie=/* @__PURE__ */new Map,de=/* @__PURE__ */new Set;let ce,le,ge,me,ve,ye=ae?.readCursorSortKey,fe=oe?Object.freeze(ne>0?{state:"pending",count:ne}:{state:"none"}):void 0,ue=0;function Ie(e=new DOMException("历史导航已被新的操作取代","AbortError")){const t=ge;ge=void 0;const o=++ue;return t?.controller.abort(e),o}function _e(){const e={version:Ie(),controller:new AbortController};return ge=e,e}function we(e){ge===e&&(ge=void 0)}let pe,Ee,Me=0,Se=!1;if(oe)for(const e of r.domainState.getLoadedMessagesByConversation(x))ie.set(e.id,m(e,se)),ae?.readCursor===("channel"===x.conversationType?e.extensions?.historyCursor:e.id)&&(ye=e.sortKey);const De=new AbortController,Te=/* @__PURE__ */new WeakMap;let he,Ae=/* @__PURE__ */new Map;function be(){if(q)throw new Error("ConversationHandle 已关闭")}function Oe(){const e=F.window.info();return{messages:F.window.list(),context:r.domainState.getConversationContext(x),draft:r.domainState.getDraft(x),loading:Y.size>0,stale:Q,hasOlder:e.hasMore,hasNewer:e.hasNewer,error:X,entryUnread:te,entryUnreadNavigation:fe}}function Ne(e){const t=Te.get(e);if(void 0!==t)return t;const o=i(e),r=Ae.get(e.id),n=void 0!==r&&d(r,o)?r:o;return Te.set(e,n),n}function Pe(e){const t=e.context,o=Object.freeze(e.messages.map(Ne));return Ae=new Map(o.map(e=>[e.id,e])),{ref:x,...void 0===t?{}:{display:Object.freeze({title:t.title,...void 0===t.avatar?{}:{avatar:t.avatar}})},messages:o,entryUnread:e.entryUnread,...void 0===e.entryUnreadNavigation?{}:{entryUnreadNavigation:e.entryUnreadNavigation},draft:e.draft,loading:e.loading,stale:e.stale,hasOlder:e.hasOlder,hasNewer:e.hasNewer,...void 0===e.error?{}:{error:e.error}}}function Re(){Be();const e=Oe();if(void 0!==he&&(o=e,function(e,t){return e.length===t.length&&e.every((e,o)=>e===t[o])}((t=he).messages,o.messages)&&(t.context?.title??"")===(o.context?.title??"")&&(t.context?.avatar??"")===(o.context?.avatar??"")&&t.draft===o.draft&&t.loading===o.loading&&t.stale===o.stale&&t.hasOlder===o.hasOlder&&t.hasNewer===o.hasNewer&&t.error===o.error&&t.entryUnread===o.entryUnread&&t.entryUnreadNavigation===o.entryUnreadNavigation))return;var t,o;he=e;const n=Pe(e);for(const e of H)try{e(n)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 订阅者回调异常",cause:e}})}}async function Ce(e){const t=F.window.list().find(t=>t.id===e)??r.domainState.getConversationMessage(x,e);if(void 0!==t)return{anchor:t,fallbackSeed:t};const o=await r.domainState.resolveConversationMessage(x,e,{throwOnStorageError:!0});return void 0===o?void 0:{anchor:o,fallbackSeed:o}}async function Le(e,t,o,r=!1){o();const{anchor:n}=t;if(void 0!==t.remoteSeed)return Ke(e,t.remoteSeed,o,r);const a=await e.openAt(x,{anchorSortKey:n.sortKey,limit:G});o();const s=e.list().find(e=>e.id===n.id);if(!0===e.info().remotePagination&&void 0!==s)return Ke(e,s,o,r);if(e.list().some(e=>e.id===n.id))return a;if(void 0===t.fallbackSeed)throw P(x,n.id);if("local"===j.historySource){const o=e.info();return e.openAt(x,{anchorSortKey:n.sortKey,limit:G,seedMessages:[...a.messages,t.fallbackSeed],seedHasOlder:o.hasMore,seedHasNewer:o.hasNewer})}return Ke(e,t.fallbackSeed,o,r)}async function Ke(e,t,o,r){const n=await e.openAt(x,{anchorSortKey:t.sortKey,limit:G,seedMessages:[t],seedHasNewer:!0,seedRemotePagination:{}});return o(),r?(await Ue(e,t,o),{...n,messages:e.list()}):n}async function Ue(e,t,o){for(const r of["older","newer"])if(!e.list().some(e=>p(e)&&("older"===r?e.sortKey<t.sortKey:e.sortKey>t.sortKey)))for(let t=0;t<4;t+=1){o();const t=e.info();if(!("older"===r?t.hasMore:t.hasNewer))break;const n="older"===r?await e.loadOlder({limit:G}):await e.loadNewer({limit:G});if(o(),n.stale)throw new DOMException("消息定位窗口已失效","AbortError");if(n.messages.length>0)break}}function ke(e,t,o){be();const n=F,a=o?.window??n.window,s=o?.isCurrent??(()=>!q&&F===n),i=()=>{if(be(),!s())throw new DOMException("历史操作已被新的导航取代","AbortError")};if(void 0!==$)return Promise.reject(new Error("清空本机会话历史期间拒绝启动新的历史加载"));const d=Y.get(e);if(void 0!==d)return d;const c=r.beginReceiving?.();X=void 0;const l=Promise.resolve().then(()=>(i(),t())).then(e=>(i(),void 0===b.reconcilePage?e:b.reconcilePage(e,a))).then(e=>{i(),Q=!0===e.stale}),g=(void 0===o?.cancelled?l:Promise.race([l,o.cancelled])).catch(t=>{const o=t instanceof v?t.cause:t;throw s()&&(X=M(o,`history.${e}`,x)),Z?t:o}).finally(()=>{c?.(),Y.delete(e),q||Re()});return Y.set(e,g),Re(),g}function xe(){F.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G))}function Ge(e){return!0===b.shouldEstablishRemoteLatestOnOpen?.(e.list())||!0===e.info().remotePagination&&(ne>0||"first-unread"===O.initialPosition&&(r.domainState.getSession(x)?.unreadCount??0)>0)}async function je(){Se=!1,J?J=!1:await ke("latest",()=>F.window.open(x,{limit:G})),xe(),Ge(F.window)&&(await ke("latest:remote",()=>F.window.loadOlder({limit:G,establishLatestOnly:!0})),xe()),Se=!Q,Ve(F.window.list())}function Fe(){if(be(),ve?.version===ue)return ve.promise;const e=_e(),{version:t}=e,o=async function({version:e,controller:t}){const o=F,n=r.domainState.createMessageWindow(j),a=()=>!q&&!t.signal.aborted&&ue===e&&F===o,s=()=>{if(!a())throw new DOMException("回最新已被新的导航取代","AbortError")};let i,d=!1;const c=new Promise((e,t)=>{i=t}),l=()=>{d||n.dispose(),i(t.signal.reason)};t.signal.addEventListener("abort",l,{once:!0});const g={window:n.window,isCurrent:a,cancelled:c},m=(e,t)=>ke(e,async()=>{const e=await t();if(e.stale)throw new DOMException("最新历史窗口已失效","AbortError");return e},g),v=(async()=>{await m(`latest:${e}`,()=>n.window.open(x,{limit:G})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G)),Ge(n.window)&&(await m(`latest:remote:${e}`,()=>n.window.loadOlder({limit:G,establishLatestOnly:!0})),s(),n.window.applyIncoming(r.domainState.getMessagesByConversation(x).slice(-G))),F=n,d=!0,o.dispose(),Se=!0,Q=!1,Ve(n.window.list()),Re()})();try{await Promise.race([v,c])}finally{t.signal.removeEventListener("abort",l),d||n.dispose()}}(e).finally(()=>{we(e),ve?.version===t&&(ve=void 0)});return ve={version:t,promise:o},o}function Ve(e){const t=b.resolveReadMessageId?.(e);pe=void 0===b.resolveReadMessageId?e.at(-1):e.find(e=>e.id===t)}function ze(e){return!(de.has(e.id)||void 0===ce||e.sortKey>ce||void 0!==ye&&e.sortKey<=ye)&&(ie.get(e.id)??m(e,se))}function Be(){if(!oe||ne<=0||void 0!==le||void 0===ce||"none"===fe?.state)return;const e=F.window.list();if(!e.some(e=>e.sortKey===ce))return;const t=e.filter(e=>ze(e)&&p(e)&&void 0===e.recalled&&void 0===e.deletedForEveryone);if(t.length<ne)return;const o=t.slice(-ne);if(o.every(e=>"system"===e.contentType))return void(fe=Object.freeze({state:"none"}));const r=o[0];le=r.id,te=Object.freeze({state:"located",firstMessageId:r.id,count:ne}),fe=Object.freeze({state:"located",firstMessageId:r.id,count:ne})}const He=r.emitter.subscribe(e=>{if(!q&&"conversation"in e&&void 0!==e.conversation&&e.conversation.conversationType===x.conversationType&&e.conversation.conversationId===x.conversationId){if("conversation-history:cleared"!==e.type&&"session:removed"!==e.type||(De.abort(),Ie(),te=Object.freeze({state:"none"}),oe&&(fe=Object.freeze({state:"none"})),Me+=1,Ee?.dispose(),Ee=void 0,Se=!1,pe=void 0),"message:received"===e.type&&"live"===e.source&&(oe&&de.add(e.message.id),Se&&(void 0===pe||e.message.sortKey>pe.sortKey)&&(void 0===b.resolveReadMessageId||b.resolveReadMessageId([e.message])===e.message.id)&&(pe=e.message)),"draft:updated"===e.type||"draft:cleared"===e.type){const t="draft:updated"===e.type?e.draft:null;for(const e of W)try{e(t)}catch(e){r.emitter.emit({type:"error",error:{scope:"unknown",message:"ConversationHandle 草稿订阅者回调异常",cause:e}})}}Re()}});function We(){return"first-unread"===O.initialPosition?async function(){const e=r.domainState.getSession(x),o=Math.max(0,!0===e?.manuallyUnread?0:e?.unreadCount??0),n=r.domainState.getReadState(x),a=n?.readCursor,s=void 0===a||""===a?void 0:"channel"===x.conversationType?r.domainState.getLoadedMessagesByConversation(x).find(e=>e.extensions?.historyCursor===a):r.domainState.getConversationMessage(x,a),i=s?.sortKey??n?.readCursorSortKey;if(te=await t({conversation:x,pageSize:G,unreadCount:o,...void 0===i?{}:{readCursorSortKey:i},signal:De.signal,..."channel"!==x.conversationType||void 0===a||""===a||void 0===r.loadEntryUnreadPage?{}:{loadReadCursorPage:async e=>{const t=F.window.getRevision(),o=()=>!q&&!De.signal.aborted&&F.window.getRevision()===t,n=await r.loadEntryUnreadPage({readCursor:a,...void 0===e?{}:{cursor:e},signal:De.signal,isCurrent:o});if(g(De.signal),!o())throw new DOMException("首未读定位已被新的窗口操作作废","AbortError");return n}},selfId:r.getSelfId(),list:()=>F.window.list(),hasOlder:()=>F.window.info().hasMore,hasNewer:()=>F.window.info().hasNewer,openLatest:je,openAt:(e,t)=>{if(void 0===t&&"channel"===x.conversationType&&void 0!==a&&""!==a&&void 0!==r.loadEntryUnreadPage)return Promise.resolve();J=!1;const o=t?.messages.map(e=>r.domainState.getConversationMessage(x,e.id)??e),n=t?.messages.find(t=>t.sortKey===e)?.id,s=void 0===n?e:o?.find(e=>e.id===n)?.sortKey??e;return ke(`entry-unread:${e}`,()=>F.window.openAt(x,{anchorSortKey:s,limit:G,...void 0===t?{}:{seedMessages:o,seedHasNewer:t.hasNewer,seedRemotePagination:void 0===t.nextCursor?{}:{newerCursor:t.nextCursor}}}))},loadOlder:()=>ke("entry-unread:older",()=>F.window.loadOlder({limit:G})),loadNewer:()=>ke("entry-unread:newer",()=>F.window.loadNewer({limit:G}))}),"located"===te.state&&!0===F.window.info().remotePagination){const e=te.firstMessageId,t=F.window.list().find(t=>t.id===e);void 0!==t&&await ke("entry-unread:context",async()=>(await Ue(F.window,t,()=>{g(De.signal),be()}),{conversationId:x.conversationId,messages:F.window.list(),stale:!1}));const o=F.window.list().find(t=>t.id===e);void 0!==o&&p(o)&&void 0===o.recalled&&void 0===o.deletedForEveryone||(te=Object.freeze({state:"unavailable"}))}}():je()}const Ye=()=>{De.abort(O.signal?.reason),F.dispose()};O.signal?.addEventListener("abort",Ye,{once:!0});try{if(g(O.signal),"local-first"===O.initialLoad){await ke("initial:local",()=>F.window.open(x,{limit:G})),g(O.signal),xe(),J=!0;try{await We()}catch(e){if(g(O.signal),e instanceof v)throw e;X=M(e,"history.initial",x),"first-unread"===O.initialPosition&&(te=Object.freeze({state:"unavailable"}))}finally{J=!1}}else await We();g(O.signal)}catch(e){throw q=!0,De.abort(),He(),H.clear(),F.dispose(),e instanceof v?e.cause:e}finally{O.signal?.removeEventListener("abort",Ye)}function $e(e,t){const o=r.domainState.getConversationMessage(x,e);return void 0!==o&&o.conversationType===x.conversationType&&o.conversationId===x.conversationId?{ok:!0,message:s(o)}:{ok:!1,error:n({code:void 0===o?"IM_SDK_MESSAGE_STATE_MISSING":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x})}}async function Xe(e,t,o){const r=await(b.getSendPermissionError?.(e));if(be(),void 0!==r){if(void 0===o||"customerService"===x.conversationType)return{ok:!1,error:r};const e=await o(r);return be(),e}try{const e=await t();return be(),e}catch(t){if(q)throw t;return{ok:!1,error:a(t,e,x)}}}async function Qe(e,t={}){const o="name"in e?e.name:void 0,r=t.fileName??("string"==typeof o&&""!==o?o:void 0);return{...x,data:e,...""===e.type?{}:{mimeType:e.type},...void 0===r?{}:{filename:r},..."robot"===x.conversationType?{encrypted:!1}:{},...void 0===t.localPreviewUrl?{}:{localPreviewUrl:t.localPreviewUrl},...void 0===t.localPreviewMetadata?{}:{localPreviewMetadata:t.localPreviewMetadata},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}}}function qe(e){return void 0===e||Number.isFinite(e.width)&&e.width>0&&Number.isFinite(e.height)&&e.height>0}function Je(e){return qe(e)&&(void 0===e?.duration||Number.isFinite(e.duration)&&e.duration>0)&&(void 0===e?.posterData||e.posterData instanceof Uint8Array&&e.posterData.length>0&&e.posterData.length<=U)}function Ze(e){return void 0!==e&&"duration"in e&&void 0!==e.duration&&Number.isFinite(e.duration)&&e.duration>0}function et(e,t,o){return{ok:!1,error:n({code:e,category:t,operation:o,retryable:!1,conversation:x})}}function tt(e,t){if(null===e||"object"!=typeof e||e.kind!==t)return!1;if(!Number.isSafeInteger(e.width)||e.width<=0||e.width>K||!Number.isSafeInteger(e.height)||e.height<=0||e.height>K)return!1;let o;try{o=new URL(e.url)}catch{return!1}if("http:"!==o.protocol&&"https:"!==o.protocol||""!==o.username||""!==o.password)return!1;const r=e.resourceId;if(void 0!==r&&("string"!=typeof r||""===r.trim()))return!1;if("gif"===t)return!Object.prototype.hasOwnProperty.call(e,"packageId");const n=e.packageId;return"string"==typeof r&&""!==r.trim()&&"string"==typeof n&&""!==n.trim()}function ot(e){if("customerService"===x.conversationType)throw rt(n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:e,retryable:!1,conversation:x}))}function rt(e){return Object.assign(new Error(e.code),e,{name:"ImMessageActionError"})}function nt(e,t,o){if("direct"===e||"group"===e||"channel"===e||"robot"===e)return Object.freeze({conversationType:e,conversationId:t});throw rt(n({code:"IM_SDK_FORWARD_RESULT_INVALID",category:"contract",operation:o,retryable:!1,conversation:x,details:{targetConversationType:e,targetConversationId:t}}))}async function at(e,t,o){let s;try{s=await r.forwardMessages({messages:t,targets:o.map(e=>{if("customerService"===e.conversationType)throw new Error("客服会话不能作为转发目标");return{conversationType:e.conversationType,conversationId:e.conversationId}})})}catch(t){throw rt(a(t,e,x))}return be(),Object.freeze({sent:Object.freeze(s.results.flatMap(t=>t.ok?[{conversation:nt(t.targetConversationType,t.targetConversationId,e),messageId:t.newMessageId}]:[])),failed:Object.freeze(s.results.flatMap(t=>t.ok?[]:[{sourceMessageId:t.sourceMessageId,conversation:Object.freeze({conversationType:t.targetConversationType,conversationId:t.targetConversationId}),error:n({...k[t.reason],operation:e,conversation:{conversationType:t.targetConversationType,conversationId:t.targetConversationId}})}])),skippedSourceMessageIds:Object.freeze([...s.skippedSourceIds])})}function st(e,t){const o=r.domainState.getConversationMessage(x,e);if(void 0===o){const o=r.domainState.getMessagesById(e)[0];throw rt(n({code:void 0===o?"IM_SDK_MESSAGE_NOT_FOUND":"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x}))}if(o.conversationType!==x.conversationType||o.conversationId!==x.conversationId)throw rt(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:t,retryable:!1,conversation:x}));return o}function it(e,t){return rt(n({...t,operation:e,conversation:x}))}function dt(e,t){const o=n({code:e,category:"state",operation:"messages.deleteLocal",retryable:!1,conversation:x,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalMessageDeletionError"})}function ct(e,t){const o=n({code:e,category:"state",operation:"history.clearLocal",retryable:!1,conversation:x,...void 0===t?{}:{cause:t}});return Object.assign(new Error(e),o,{name:"ImLocalConversationHistoryClearError"})}async function lt(e,t){if(void 0!==e)try{await r.domainState.clearDraftIfUnchanged(x,e)}catch(e){r.emitter.emit({type:"error",error:{scope:"storage",message:`消息已被本地发送流程接受,但清理草稿失败(${t})`,cause:e}})}}async function gt(e,t,n,a,s){return Xe(e,async()=>{if("image"===t){const t=await o(n);if(be(),!t)return et("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",e)}const i=await Qe(n,a);if(be(),void 0!==t&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const o=new AbortController,a=await r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${e}:${++ee}`,kind:t,file:n,signal:o.signal});if(be(),void 0===a||("image"===t?!qe(a):!Je(a)))return et("image"===t?"IM_SDK_IMAGE_PREVIEW_METADATA_INVALID":"IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=a}if("video"===t&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Ze(i.localPreviewMetadata))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};const l=await s({...i,...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(be(),$e(l.messageId,e)):{ok:!1,error:c(l.reason,e,x)}})}function mt(e,t,o){const a=st(e,o);if(!(a.contentType===t||"file"===t&&"filesAlbum"===a.contentType&&1===a.body.filesAlbum?.items.length)||"failed"!==a.status||"media.uploadInterrupted"!==a.failure?.displayCode&&"media.cancelled"!==a.failure?.displayCode&&("media.uploadTimeout"!==a.failure?.displayCode||!1!==a.failure.retryable)||r.isOutboxOwned(e))throw rt(n({code:"IM_SDK_MESSAGE_STATE_MISMATCH",category:"state",operation:o,retryable:!1,conversation:x}));return a}async function vt(e,t,o,n,a,s){return mt(t,o,e),Xe(e,async()=>{const i=await Qe(n,a);if("video"===o&&void 0===i.localPreviewMetadata&&void 0!==r.prepareMediaPreview){const t=new AbortController,o=await r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${e}:${++ee}`,kind:"video",file:n,signal:t.signal});if(be(),void 0===o||!Je(o))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",e);i.localPreviewMetadata=o}if("video"===o&&(void 0!==r.prepareMediaPreview||void 0!==i.localPreviewMetadata)&&!Ze(i.localPreviewMetadata))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",e);const d=b.recheckSendPermissionError?.(e);if(void 0!==d)return{ok:!1,error:d};mt(t,o,e);const l=await s(t,{...i,...void 0===a.caption||""===a.caption?{}:{caption:a.caption}});return l.ok?(be(),$e(l.messageId,e)):{ok:!1,error:c(l.reason,e,x)}})}Z=!1,function(){if(!oe||ne<=0)return;if(!0===F.window.info().remotePagination&&!Se&&"located"!==te.state)return;z.add(F.window);const e=F.window.list().filter(e=>!de.has(e.id));ce=e.at(-1)?.sortKey;for(const t of e)ie.has(t.id)||ie.set(t.id,m(t,se));if("first-unread"===O.initialPosition&&"located"===te.state)return le=te.firstMessageId,void(fe=Object.freeze({state:"located",count:ne,firstMessageId:te.firstMessageId}));Be()}();const yt={ref:x,getSnapshot:function(){return be(),Pe(Oe())},subscribe:e=>(be(),H.add(e),()=>H.delete(e)),resolveMessage:async e=>{be();const t=F.window.list().find(t=>t.id===e)??await r.domainState.resolveConversationMessage(x,e);return void 0===t?null:Ne(t)},history:{loadEntryUnread:e=>function(e={}){if(be(),e.signal?.aborted)return Promise.reject(e.signal.reason);if(void 0!==me){if(!me.controller.signal.aborted&&me.version===ue&&me.callerSignal===e.signal)return me.promise;me.controller.abort()}if(void 0===fe||"none"===fe.state)return Promise.resolve(!1);const o=_e(),{version:n,controller:a}=o,s=F.window.list(),i=s.find(e=>e.id===le),d=F.window.info();if(void 0===$&&0===Y.size&&!Q&&!De.signal.aborted&&z.has(F.window)&&void 0!==i&&p(i)&&void 0===i.recalled&&void 0===i.deletedForEveryone&&(!d.hasMore||s.some(e=>p(e)&&e.sortKey<i.sortKey))&&(!d.hasNewer||s.some(e=>p(e)&&e.sortKey>i.sortKey)))return te=Object.freeze({state:"located",firstMessageId:i.id,count:ne}),fe=Object.freeze({state:"located",firstMessageId:i.id,count:ne}),Re(),we(o),Promise.resolve(!0);const c=r.domainState.createMessageWindow(j),l=()=>!q&&!a.signal.aborted&&ue===n,g=()=>{if(!l())throw new DOMException("进入未读定位已被新的导航取代","AbortError")},m=async e=>{g();let t=await e();if(g(),void 0!==b.reconcilePage&&(t=await b.reconcilePage(t,c.window)),g(),t.stale)throw new DOMException("进入未读窗口已失效","AbortError");c.window.applyIncoming(c.window.list().map(e=>r.domainState.getConversationMessage(x,e.id)??e))};let y,f=!1;const u=new Promise((e,t)=>{y=t}),I=()=>{f||c.dispose(),y(a.signal.reason)},_=()=>a.abort(e.signal?.reason),w=()=>a.abort(De.signal.reason);a.signal.addEventListener("abort",I,{once:!0}),e.signal?.addEventListener("abort",_,{once:!0}),De.signal.addEventListener("abort",w,{once:!0}),De.signal.aborted&&w();const E=r.beginReceiving?.(),S=(async()=>{try{let e=!1;void 0===ce&&(await m(()=>c.window.open(x,{limit:G})),Ge(c.window)&&await m(()=>c.window.loadOlder({limit:G,establishLatestOnly:!0})),ce=c.window.list().filter(e=>!de.has(e.id)).at(-1)?.sortKey,e=!0);const o=le,n=void 0===o?void 0:await Ce(o);if(g(),void 0!==o&&void 0===n)return fe=Object.freeze({state:"unavailable",count:ne}),!1;const s=void 0===n?await t({conversation:x,pageSize:G,maxExtraPages:Number.POSITIVE_INFINITY,preserveLocatedWindow:!0===c.window.info().remotePagination,...void 0===ce?{}:{entryUpperSortKey:ce},unreadCount:ne,...void 0===ye?{}:{readCursorSortKey:ye},signal:a.signal,selfId:se,isEntryUnread:ze,..."channel"===x.conversationType&&ae?.readCursor&&void 0!==r.loadEntryUnreadPage?{loadReadCursorPage:async e=>{const t=await r.loadEntryUnreadPage({readCursor:ae.readCursor,...void 0===e?{}:{cursor:e},signal:a.signal,isCurrent:l});return g(),t}}:{},paginationKey:()=>c.window.getPaginationKey(),list:()=>c.window.list(),hasOlder:()=>c.window.info().hasMore,hasNewer:()=>c.window.info().hasNewer,openLatest:async()=>{e?e=!1:(await m(()=>c.window.open(x,{limit:G})),Ge(c.window)&&await m(()=>c.window.loadOlder({limit:G,establishLatestOnly:!0})))},openAt:(t,o)=>(e=!1,m(()=>c.window.openAt(x,{anchorSortKey:t,limit:G,...void 0===o?{}:{seedMessages:o.messages.map(e=>r.domainState.getConversationMessage(x,e.id)??e),seedHasNewer:o.hasNewer,seedRemotePagination:void 0===o.nextCursor?{}:{newerCursor:o.nextCursor}}}))),loadOlder:()=>m(()=>c.window.loadOlder({limit:G})),loadNewer:()=>m(()=>c.window.loadNewer({limit:G}))}):await(async()=>(await m(()=>Le(c.window,n,g)),{state:"located",firstMessageId:n.anchor.id,count:ne}))();if(g(),"located"!==s.state)return fe=Object.freeze("none"===s.state?{state:"none"}:{state:"unavailable",count:ne}),!1;const i=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===i||!p(i)||void 0!==i.recalled||void 0!==i.deletedForEveryone)return fe=Object.freeze({state:"unavailable",count:ne}),!1;!0===c.window.info().remotePagination&&await m(async()=>(await Ue(c.window,i,g),{conversationId:x.conversationId,messages:c.window.list(),stale:!1})),g();const d=c.window.list().find(e=>e.id===s.firstMessageId);if(void 0===d||!p(d)||void 0!==d.recalled||void 0!==d.deletedForEveryone)return fe=Object.freeze({state:"unavailable",count:ne}),!1;const v=F;return F=c,f=!0,v.dispose(),z.add(c.window),le=s.firstMessageId,te=s,fe=Object.freeze({state:"located",count:ne,firstMessageId:s.firstMessageId}),X=void 0,!0}catch(e){const t=e instanceof v?e.cause:e;if(l()){const e=M(t,"history.loadEntryUnread",x);fe=Object.freeze({state:"failed",count:ne,error:e})}throw t}})(),D=Promise.race([S,u]).finally(()=>{a.signal.removeEventListener("abort",I),we(o),e.signal?.removeEventListener("abort",_),De.signal.removeEventListener("abort",w),f||c.dispose(),E?.(),me?.controller===a&&(me=void 0),q||Re()});return me={version:n,callerSignal:e.signal,controller:a,promise:D},D}(e),loadLatest:async()=>Fe(),loadOlder:async()=>(be(),Ie(),ke("older",()=>F.window.loadOlder({limit:G}))),loadNewer:async()=>{be(),Ie(),await ke("newer",()=>F.window.loadNewer({limit:G})),be(),F.window.info().hasNewer||(xe(),Re())},loadAround:async(e,t={})=>{if(be(),!0===t.signal?.aborted)throw new DOMException("消息定位已取消","AbortError");const o=_e(),{version:a,controller:s}=o;if(void 0===$&&"channel"===x.conversationType&&V.has(F.window)&&r.domainState.getPinnedMessage(x)?.messageId===e&&F.window.list().some(t=>t.id===e&&B(t)))return void we(o);const i=F,d=()=>!q&&!s.signal.aborted&&ue===a&&F===i,c=()=>{if(be(),!d())throw new DOMException("消息定位已被新的导航取代","AbortError")};let l,g,m=!1;const v=new Promise((e,t)=>{g=t}),y=()=>{m||l?.dispose(),g(s.signal.reason)},f=()=>s.abort(t.signal?.reason);s.signal.addEventListener("abort",y,{once:!0}),t.signal?.addEventListener("abort",f,{once:!0});const u=(async()=>{const t=await async function(e,t){if(t(),void 0!==$)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const o=await Ce(e);t();const n=o?.fallbackSeed;if(void 0!==o&&("channel"!==x.conversationType||void 0!==n&&B(n)))return"channel"===x.conversationType&&!0===F.window.info().remotePagination?{...o,remoteSeed:n}:o;if(void 0===r.fetchMessagesByIdBatch)throw P(x,e);if(void 0!==$)throw new Error("清空本机会话历史期间拒绝启动新的历史加载");const a=await r.fetchMessagesByIdBatch([e]);t();const s=a.messages.find(t=>t.id===e&&t.conversationType===x.conversationType&&t.conversationId===x.conversationId);if(void 0!==s){if("channel"===x.conversationType){if(!B(s))throw P(x,e);return{anchor:s,remoteSeed:s}}return{anchor:s,fallbackSeed:s}}if(!a.missingMessageIds.includes(e))throw P(x,e)}(e,c);if(c(),void 0===t)throw function(e,t){const o=n({code:"IM_SDK_MESSAGE_NOT_FOUND",category:"state",operation:"history.loadAround",retryable:!1,conversation:e,details:{messageId:t}});return Object.assign(new Error(o.code),o)}(x,e);if(t.anchor.conversationType!==x.conversationType||t.anchor.conversationId!==x.conversationId)throw P(x,e);l=r.domainState.createMessageWindow(j);const o=l.window;await ke(`around:${e}:${a}`,async()=>(c(),Le(o,t,c,!0)),{window:o,isCurrent:d,cancelled:v}),c(),F=l,void 0!==t.remoteSeed&&V.add(o),m=!0,i.dispose(),Re()})();try{await Promise.race([u,v])}finally{t.signal?.removeEventListener("abort",f),s.signal.removeEventListener("abort",y),we(o),m||l?.dispose()}},clearLocal:async()=>(be(),ot("history.clearLocal"),function(){if(q)return Promise.reject(new Error("ConversationHandle 已关闭"));if(void 0!==$)return $;const e=new DOMException("本次清历史已取消旧窗口导航","AbortError");Ie(e),r.invalidateHistory?.(x,e);const t=[...Y.values()],o=Promise.all(t.map(t=>t.catch(t=>{if(t!==e)throw t}))).then(async()=>{be();const e=[...r.domainState.getMessagesByConversation(x),...F.window.list()];if(r.hasOutboxForConversation(x)||e.some(e=>r.isOutboxOwned(e.id)))throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_OUTBOX_OWNED");if(e.some(e=>"pending"===e.status||"uploading"===e.status||"sending"===e.status))throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_MESSAGE_IN_FLIGHT");return await r.domainState.clearLocalConversationHistory(x),be(),Object.freeze({scope:"local-only",remoteHistory:"remote-history-may-restore"})}).catch(e=>{if(e instanceof Error&&"ImLocalConversationHistoryClearError"===e.name)throw e;throw ct("IM_SDK_LOCAL_HISTORY_CLEAR_FAILED",e)}).finally(()=>{$===o&&($=void 0)});return $=o,o}())},messages:{sendText:async(e,t={})=>{be();const o=E(x,e,t);if("code"in o)return{ok:!1,error:o};const n=r.domainState.getDraft(x)?.updatedAt;return Xe("messages.sendText",async()=>{const e=await r.sendText(o);return be(),await lt(n,"messages.sendText"),$e(e.id,"messages.sendText")},async e=>{const t=b.appendTextPermissionFailure?.(o);return void 0===t?{ok:!1,error:e}:(await lt(n,"messages.sendText"),{ok:!0,message:s(t)})})},sendContact:async(e,t={})=>{be();const o=e.targetId.trim(),a=e.displayName.trim();if(""===o||""===a)return{ok:!1,error:n({code:""===o?"IM_SDK_CONTACT_CARD_TARGET_REQUIRED":"IM_SDK_CONTACT_CARD_NAME_REQUIRED",category:"validation",operation:"messages.sendContact",retryable:!1,conversation:x})};const s={...x,contact:{...e,targetId:o,displayName:a},encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}};return Xe("messages.sendContact",async()=>$e((await r.sendContact(s)).id,"messages.sendContact"))},sendImage:async(e,t={})=>(be(),e.size>L?et("IM_SDK_IMAGE_TOO_LARGE","validation","messages.sendImage"):void 0!==t.caption&&""!==t.caption?et("IM_SDK_IMAGE_CAPTION_UNSUPPORTED","unsupported","messages.sendImage"):qe(t.localPreviewMetadata)?gt("messages.sendImage","image",e,t,r.sendImage):et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation","messages.sendImage")),sendMediaAlbum:async(e,t={})=>(be(),async function(e,t){const n="messages.sendMediaAlbum";if(0===e.length)return et("IM_SDK_MEDIA_ALBUM_EMPTY","validation",n);if(e.length>w)return et("IM_SDK_MEDIA_ALBUM_TOO_MANY","validation",n);if(void 0!==t.caption&&Array.from(t.caption).length>_)return et("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation",n);for(const t of e){if("image/gif"===t.file.type)return et("IM_SDK_MEDIA_ALBUM_GIF_UNSUPPORTED","unsupported",n);if("image"===t.kind){if(t.file.size>L)return et("IM_SDK_IMAGE_TOO_LARGE","validation",n);if(!qe(t.localPreviewMetadata))return et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n)}else{if(t.file.size>R)return et("IM_SDK_VIDEO_TOO_LARGE","validation",n);if(!Je(t.localPreviewMetadata))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n)}}return Xe(n,async()=>{for(const t of e){if("image"!==t.kind)continue;const e=await o(t.file);if(be(),!e)return et("IM_SDK_IMAGE_FORMAT_UNSUPPORTED","unsupported",n)}const a=await Promise.all(e.map(async e=>{if(void 0!==e.localPreviewMetadata||void 0===r.prepareMediaPreview)return e.localPreviewMetadata;const t=new AbortController;return r.prepareMediaPreview({operationId:`${x.conversationType}:${x.conversationId}:${n}:${++ee}`,kind:e.kind,file:e.file,signal:t.signal})}));be();const s=[];for(const[t,o]of e.entries()){const e=a[t];if("image"===o.kind&&!qe(e))return et("IM_SDK_IMAGE_PREVIEW_METADATA_INVALID","validation",n);if("video"===o.kind){if(!Je(e))return et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation",n);if(void 0!==r.prepareMediaPreview&&!Ze(e))return et("IM_SDK_VIDEO_DURATION_UNAVAILABLE","validation",n)}const i="name"in o.file?o.file.name:void 0;s.push({kind:o.kind,data:o.file,...""===o.file.type?{}:{mimeType:o.file.type},..."string"==typeof i&&""!==i?{filename:i}:{},...void 0===o.localPreviewUrl?{}:{localPreviewUrl:o.localPreviewUrl},...void 0===e?{}:{localPreviewMetadata:e}})}const i=b.recheckSendPermissionError?.(n);if(void 0!==i)return{ok:!1,error:i};const d=await r.sendMediaAlbum({...x,items:s,...void 0===t.caption||""===t.caption.trim()?{}:{caption:t.caption},...void 0===t.hd?{}:{hd:t.hd},...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}});return d.ok?(be(),$e(d.messageId,n)):{ok:!1,error:c(d.reason,n,x)}})}(e,t)),sendVideo:async(e,t={})=>(be(),e.size>R?et("IM_SDK_VIDEO_TOO_LARGE","validation","messages.sendVideo"):Je(t.localPreviewMetadata)?gt("messages.sendVideo","video",e,t,r.sendVideo):et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.sendVideo")),replaceInterruptedVideo:async(e,t,o={})=>(be(),t.size>R?et("IM_SDK_VIDEO_TOO_LARGE","validation","messages.replaceInterruptedVideo"):Je(o.localPreviewMetadata)?vt("messages.replaceInterruptedVideo",e,"video",t,o,r.replaceVideo):et("IM_SDK_VIDEO_PREVIEW_METADATA_INVALID","validation","messages.replaceInterruptedVideo")),sendVoice:async(e,t)=>(be(),Xe("messages.sendVoice",async()=>{const o=await Qe(e,t),n=b.recheckSendPermissionError?.("messages.sendVoice");if(void 0!==n)return{ok:!1,error:n};const a=await r.sendVoice({...o,durationMs:t.durationMs,...void 0===t.waveform?{}:{waveform:[...t.waveform]}});return a.ok?(be(),$e(a.messageId,"messages.sendVoice")):{ok:!1,error:c(a.reason,"messages.sendVoice",x)}})),sendFile:async(e,t={})=>{if(be(),e.size>C)return et("IM_SDK_FILE_TOO_LARGE","validation","messages.sendFile");if(void 0!==t.caption&&Array.from(t.caption).length>_)return et("IM_SDK_MEDIA_ALBUM_CAPTION_TOO_LONG","validation","messages.sendFile");const o=t.fileName??("name"in e?e.name:void 0);return"string"!=typeof o||""===o.trim()?et("IM_SDK_FILE_NAME_REQUIRED","validation","messages.sendFile"):gt("messages.sendFile",void 0,e,t,r.sendFile)},sendGif:async(e,t={})=>(be(),e.size>3145728?et("IM_SDK_GIF_TOO_LARGE","validation","messages.sendGif"):await async function(e){const t=e.type.trim().toLowerCase();if(""!==t&&"image/gif"!==t)return!1;const o=new Uint8Array(await e.slice(0,6).arrayBuffer());if(6!==o.length)return!1;const r=String.fromCharCode(...o);return"GIF87a"===r||"GIF89a"===r}(e)?gt("messages.sendGif",void 0,e,t,e=>r.sendGif(e)):et("IM_SDK_GIF_INVALID","validation","messages.sendGif")),sendSticker:async(e,t={})=>(be(),tt(e,"sticker")?Xe("messages.sendSticker",async()=>$e((await r.sendExpression({...x,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendSticker")):et("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendSticker")),sendGifAsset:async(e,t={})=>(be(),tt(e,"gif")?Xe("messages.sendGifAsset",async()=>$e((await r.sendExpression({...x,asset:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGifAsset")):et("IM_SDK_EXPRESSION_ASSET_INVALID","validation","messages.sendGifAsset")),sendGame:async(e,t={})=>(be(),"rock-paper-scissors"!==e&&"dice"!==e?et("IM_SDK_GAME_TYPE_INVALID","validation","messages.sendGame"):Xe("messages.sendGame",async()=>$e((await r.sendGame({...x,gameType:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGame"))),sendMiniProgram:async(e,t={})=>(be(),I(e)?Xe("messages.sendMiniProgram",async()=>$e((await r.sendMiniProgram({...x,miniProgram:e,encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendMiniProgram")):et("IM_SDK_MINI_PROGRAM_BODY_INVALID","validation","messages.sendMiniProgram")),sendTransfer:async(e,t={})=>(be(),"channel"===x.conversationType||"robot"===x.conversationType?et("IM_SDK_TRANSFER_CHANNEL_UNSUPPORTED","unsupported","messages.sendTransfer"):u(e)?Xe("messages.sendTransfer",async()=>$e((await r.sendTransfer({...x,transfer:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendTransfer")):et("IM_SDK_TRANSFER_BODY_INVALID","validation","messages.sendTransfer")),sendGift:async(e,t={})=>(be(),"channel"===x.conversationType||"robot"===x.conversationType?et("IM_SDK_GIFT_CHANNEL_UNSUPPORTED","unsupported","messages.sendGift"):f(e)?Xe("messages.sendGift",async()=>$e((await r.sendGift({...x,gift:e,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendGift")):et("IM_SDK_GIFT_BODY_INVALID","validation","messages.sendGift")),sendLiveRoom:async(e,t={})=>(be(),y(e)?Xe("messages.sendLiveRoom",async()=>$e((await r.sendLiveRoom({...x,liveRoom:e,encrypted:"direct"!==x.conversationType&&"robot"!==x.conversationType,...void 0===t.replyToMessageId?{}:{refMessageId:t.replyToMessageId}})).id,"messages.sendLiveRoom")):et("IM_SDK_LIVE_ROOM_BODY_INVALID","validation","messages.sendLiveRoom")),toggleReaction:async(e,t)=>{be(),ot("messages.toggleReaction"),st(e,"messages.toggleReaction");const o=await r.setReaction({conversation:x,parentMessageId:e,emoji:t,action:"toggle"});if(be(),!o.ok)throw it("messages.toggleReaction",A[o.reason]);return Object.freeze({messageId:e,eventId:o.event.id,emoji:o.event.emoji,action:0===o.event.action?"add":"remove"})},setReaction:async(e,t,o)=>{be(),ot("messages.setReaction"),st(e,"messages.setReaction");const n=await r.setReaction({conversation:x,parentMessageId:e,emoji:t,action:o});if(be(),!n.ok)throw it("messages.setReaction",A[n.reason]);return Object.freeze({messageId:e,eventId:n.event.id,emoji:n.event.emoji,action:0===n.event.action?"add":"remove"})},replaceInterruptedFile:async(e,t,o={})=>{if(be(),ot("messages.replaceInterruptedFile"),t.size>C)return et("IM_SDK_FILE_TOO_LARGE","validation","messages.replaceInterruptedFile");if(void 0!==o.caption&&""!==o.caption)return et("IM_SDK_FILE_CAPTION_UNSUPPORTED","unsupported","messages.replaceInterruptedFile");const n=o.fileName??("name"in t?t.name:void 0);return"string"!=typeof n||""===n.trim()?et("IM_SDK_FILE_NAME_REQUIRED","validation","messages.replaceInterruptedFile"):vt("messages.replaceInterruptedFile",e,"file",t,{...o,fileName:n},r.replaceFile)},editText:async(e,t,o={})=>{be(),ot("messages.editText"),st(e,"messages.editText"),N(r.domainState,x,e,"messages.editText");const n=D(x,e,t,o);if("code"in n)throw rt(n);let i;try{i=await r.editMessage(n)}catch(e){throw rt(a(e,"messages.editText",x))}if(be(),!i.ok)throw it("messages.editText",h[i.reason]);return s(st(e,"messages.editText"))},recall:async e=>{let t;be(),ot("messages.recall"),st(e,"messages.recall"),N(r.domainState,x,e,"messages.recall");try{t=await r.recallMessage({...x,messageId:e})}catch(e){throw rt(a(e,"messages.recall",x))}if(be(),!t.ok)throw it("messages.recall",T[t.reason])},deleteLocal:async e=>{be(),ot("messages.deleteLocal"),N(r.domainState,x,e,"messages.deleteLocal");const t=r.domainState.getConversationMessage(x,e);if(r.isOutboxOwned(e))throw dt("IM_SDK_LOCAL_DELETE_OUTBOX_OWNED");if(void 0!==t&&t.conversationType===x.conversationType&&t.conversationId===x.conversationId&&("pending"===t.status||"uploading"===t.status||"sending"===t.status))throw dt("IM_SDK_LOCAL_DELETE_MESSAGE_IN_FLIGHT");try{r.invalidateHistory?.(x);const t=await r.domainState.deleteLocalMessage(x,e);return be(),Object.freeze({scope:"local-only",messageId:e,deleted:t,remoteHistory:"remote-history-may-restore"})}catch(e){if(e instanceof Error&&"code"in e&&"IM_MESSAGE_PINNED"===e.code)throw dt("IM_SDK_MESSAGE_PINNED",e);if(e instanceof Error&&"ImLocalMessageDeletionError"===e.name)throw e;throw dt("IM_SDK_LOCAL_DELETE_FAILED",e)}},forward:async(e,t)=>{if(be(),ot("messages.forward"),0===e.length||0===t.length)throw rt(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:"messages.forward",retryable:!1,conversation:x}));return at("messages.forward",e.map(e=>({id:e,...x})),t)},forwardMediaAlbumItem:async(e,t,o)=>{be(),ot("messages.forwardMediaAlbumItem");const r="messages.forwardMediaAlbumItem";if(""===e.trim()||0===o.length)throw rt(n({code:"IM_SDK_FORWARD_EMPTY_INPUT",category:"validation",operation:r,retryable:!1,conversation:x}));if(!Number.isInteger(t)||t<0)throw rt(n({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:r,retryable:!1,conversation:x,details:{itemIndex:t}}));return at(r,[{id:e,...x,itemIndex:t}],o)},fetchByIds:async e=>{be();const t=r.fetchMessagesByIdBatch;if(void 0===t)throw rt(n({code:"IM_SDK_MESSAGE_LOOKUP_UNSUPPORTED",category:"unsupported",operation:"messages.fetchByIds",retryable:!1,conversation:x}));const o=r.beginReceiving?.();try{const o=await l({messageIds:e,fetchBatch:t,isCurrent:()=>!q,projectMessage:Ne});return Object.freeze({messages:Object.freeze([...o.messages]),missingMessageIds:Object.freeze([...o.missingMessageIds]),unresolvedMessageIds:Object.freeze([...o.unresolvedMessageIds]),...void 0===o.failure?{}:{failure:Object.freeze(o.failure)}})}finally{o?.()}}},draft:{get:async()=>(be(),"customerService"===x.conversationType?null:r.drafts.get(x)),save:async e=>{if(be(),"customerService"===x.conversationType)throw new Error("客服会话不支持草稿");return r.drafts.save(x,e)},clear:async()=>{be(),"customerService"!==x.conversationType&&await r.drafts.clear(x)},subscribe:e=>(be(),W.add(e),()=>W.delete(e))},markRead:async e=>{be();const t=F.window.list();if(void 0!==e&&!t.some(t=>t.id===e))throw new Error(`待标记已读消息不存在或不属于当前 handle 窗口:${e}`);const o=void 0===b.resolveReadMessageId?e??t.at(-1)?.id:b.resolveReadMessageId(t,e);void 0!==o&&await r.markRead({...x,readCursor:o})},markConversationRead:async()=>{if(be(),void 0===r.markConversationRead)throw new Error("当前会话未装配整会话已读能力");const e=Me,t=await async function(){if(Se){const e=/* @__PURE__ */new Map,t=r.domainState.getLoadedMessagesByConversation(x);for(const o of[pe,...t])void 0!==o&&e.set(o.id,r.domainState.getConversationMessage(x,o.id)??o);return Ve([...e.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))),pe?.id}const e=Me,t=r.domainState.createMessageWindow(j);try{const o=await t.window.open(x,{limit:G});if(be(),o.stale)throw new Error("无法确认会话最新已读边界");if(Ge(t.window)){const e=await t.window.loadOlder({limit:G,establishLatestOnly:!0});if(be(),e.stale)throw new Error("无法确认会话远端最新已读边界")}if(e!==Me)throw new DOMException("会话已读确认已失效","AbortError");Ve(t.window.list()),Se=!0;const r=t.window.list();return void 0===b.resolveReadMessageId?r.at(-1)?.id:b.resolveReadMessageId(r)}finally{t.dispose()}}();if(be(),e!==Me)throw new DOMException("会话已读确认已失效","AbortError");if("channel"===x.conversationType&&void 0===t&&F.window.list().length>0)throw new Error("当前频道缺少可信的最新已读消息");if(void 0!==t&&void 0===r.domainState.getConversationMessage(x,t)){const o=pe?.id===t?pe:void 0;if(void 0===o)throw new Error("缺少会话最新已读边界的消息证明");Ee??(Ee=r.domainState.createMessageWindow({retention:{maxMessages:G}}));const n=await Ee.window.openAt(x,{anchorSortKey:o.sortKey,limit:G,seedMessages:[o],seedHasNewer:!1});if(be(),n.stale||e!==Me)throw new DOMException("会话已读确认已失效","AbortError")}await r.markConversationRead(x,t)},markVisibleMessages:async e=>{if(be(),void 0===r.markVisibleMessages)throw new Error("当前会话未装配可见消息回执能力");const t=[...new Set(e)];if(t.some(e=>!F.window.list().some(t=>t.id===e)))throw new Error("可见回执包含当前连续窗口之外的消息");t.length>0&&await r.markVisibleMessages(x,t)},setMuted:async e=>(be(),r.setMuted(x,e)),close(){q||(q=!0,De.abort(),Ie(),He(),H.clear(),W.clear(),Ae.clear(),Ee?.dispose(),F.dispose())}};return S.set(yt,{getMessages:()=>(be(),F.window.list()),resolveMessage:async e=>(be(),F.window.list().find(t=>t.id===e)??r.domainState.resolveConversationMessage(x,e))}),yt}async function G(e,t,o={}){let r,a,s=!1;function i(){const o=Date.now();if(void 0!==r&&o-r.checkedAt<5e3)return Promise.resolve(r.value);if(void 0!==a)return a;const n=t.getRelationship(e.conversationId).then(e=>(r={value:e,checkedAt:Date.now()},e)).catch(e=>(s=!0,t.emitter.emit({type:"error",error:{scope:"http",message:"direct 发送前关系查询失败,已降级为服务端 ACK 裁决",cause:e}}),r={value:"unknown",checkedAt:Date.now()},"unknown")).finally(()=>{a===n&&(a=void 0)});return a=n,n}t.shouldCheckRelationship()&&i();const d=await x(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!0,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{getSendPermissionError:async function(o){if(!t.shouldCheckRelationship())return;const r=await i();if("friend"!==r){if("unknown"!==r)return n({code:"IM_SDK_DIRECT_CONTACT_REQUIRED",category:"permission",operation:o,retryable:!1,conversation:e,details:Object.freeze({relationship:r})});s||(s=!0,t.emitter.emit({type:"error",error:{scope:"protocol",message:"direct 发送前关系状态未知,已降级为服务端 ACK 裁决",cause:{conversation:e,relationship:r}}}))}},appendTextPermissionFailure:t.appendContactRequiredTextFailure},o),c={...d,messages:{...d.messages,async markMediaConsumed(o){const r=t.domainState.getConversationMessage(e,o);if(void 0===r||r.senderId===t.getSelfId()||"voice"!==r.contentType&&"video"!==r.contentType){const t=n({code:"IM_SDK_MEDIA_CONSUMPTION_MESSAGE_INVALID",category:"validation",operation:"messages.markMediaConsumed",retryable:!1,conversation:e});throw Object.assign(new Error(t.code),t)}await t.markDirectMediaConsumed(e.conversationId,o)}}};return D(c,d),c}async function j(e,t,o={}){return x(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&z(r,t.pageSize??30)},o)}async function F(e,t,o={}){return x(e,t,(e,t,o)=>void 0!==o.mentions&&o.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.sendText",retryable:!1,conversation:e}):{...e,text:t,encrypted:!1,...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}},(e,t,o,r)=>void 0!==r.mentions&&r.mentions.length>0?n({code:"IM_SDK_DIRECT_MENTION_UNSUPPORTED",category:"unsupported",operation:"messages.editText",retryable:!1,conversation:e}):{...e,messageId:t,text:o},{shouldEstablishRemoteLatestOnOpen:()=>!1},o)}const V=/* @__PURE__ */new Set(["pending","uploading","sending"]);function z(e,t){return e.length<t}function B(e){const t=e.extensions?.historyCursor;return"string"==typeof t&&""!==t.trim()}async function H(e,t,o={}){const n=await x(e,t,(e,t,o)=>{const n=r(o.mentions);return{...e,text:t,encrypted:!0,...void 0===n?{}:{mention:n},...void 0===o.replyToMessageId?{}:{refMessageId:o.replyToMessageId}}},(e,t,o,n)=>{const a=r(n.mentions);return{...e,messageId:t,text:o,...void 0===a?{}:{mention:a}}},{getSendPermissionError:t.getSendPermissionError,recheckSendPermissionError:t.getSendPermissionError,shouldEstablishRemoteLatestOnOpen:r=>("first-unread"===o.initialPosition||!0===o.captureEntryUnread)&&void 0!==t.domainState.getConversationContext(e)&&z(r,t.pageSize??30)||function(e,t){let o=!1;for(const r of e){const e=r.body.system;if("channel"===r.conversationType&&!0===e?.targetUserIds?.includes(t))if("channel_member_left"!==e.eventType&&"channel_member_removed"!==e.eventType){if(o&&("channel_member_joined"===e.eventType||"channel_member_invited"===e.eventType))return!0}else o=!0}return!1}(r,t.getSelfId()),reconcilePage:t.reconcilePage,resolveReadMessageId:(e,o)=>function(e,t,o){const r=void 0===o?e.length-1:e.findIndex(e=>e.id===o),n=e[r];if(void 0===n||B(n))return n?.id;const a=e.slice(0,r).findLast(e=>B(e));return void 0!==a?a.id:n.senderId===t&&V.has(n.status)?void 0:n.id}(e,t.getSelfId(),o)},o),s={...n,messages:{...n.messages,deleteForEveryone:async o=>{if(void 0===t.domainState.getConversationMessage(e,o))throw O(e,b["not-found"]);let r;N(t.domainState,e,o,"messages.deleteForEveryone");try{r=await t.deleteMessageForEveryone({...e,messageId:o})}catch(t){const o=a(t,"messages.deleteForEveryone",e);throw Object.assign(new Error(o.code,{cause:t}),o)}if(!r.ok)throw O(e,b[r.reason])}}};return D(s,n),s}async function W(e,t,o={}){const r=t=>n({code:"IM_SDK_CUSTOMER_SERVICE_READ_ONLY",category:"permission",operation:t,retryable:!1,conversation:e});return x(e,t,()=>r("messages.sendText"),()=>r("messages.edit"),{getSendPermissionError:r,recheckSendPermissionError:r},o)}export{H as createChannelConversationHandle,W as createCustomerServiceConversationHandle,G as createDirectConversationHandle,j as createGroupConversationHandle,F as createRobotConversationHandle,D as linkConversationHandleDomainAccess};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t){return{prepareLocalMediaPreview:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:i.kind,file:i.file,includePoster:"video"===i.kind,..."video"===i.kind&&i.includeDisplayPoster?{includeDisplayPoster:!0}:{}
|
|
1
|
+
function e(e,t){return{prepareLocalMediaPreview:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:i.kind,file:i.file,includePoster:"video"===i.kind,..."video"===i.kind&&i.includeDisplayPoster?{includeDisplayPoster:!0}:{}},i.signal);return"video"===i.kind?{width:a.width,height:a.height,...void 0===a.duration?{}:{duration:a.duration},...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)},...void 0===a.displayPosterData?{}:{displayPosterData:new Uint8Array(a.displayPosterData)}}:{width:a.width,height:a.height}},prepareLocalVideoPoster:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"video",file:i.file,includePoster:!0,maxSize:960,targetBytes:163840,maxBytes:262144,quality:.9,minQuality:.8},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}},prepareLocalImageThumbnail:async i=>{const a=await e.prepare({operationId:i.operationId,generation:t(),kind:"image",file:i.file,includePoster:!0,maxSize:256,targetBytes:262144,maxBytes:262144,quality:.9,minQuality:.9},i.signal);return{width:a.width,height:a.height,...void 0===a.posterData?{}:{posterData:new Uint8Array(a.posterData)}}}}}export{e as createLocalMediaPreviewPreparation};
|
package/dist/sdk.d.ts
CHANGED
|
@@ -3029,7 +3029,7 @@ interface MediaAlbumMessageOptions {
|
|
|
3029
3029
|
*
|
|
3030
3030
|
* @remarks 宿主可从本地 object URL 解码首个可展示帧,使上传占位从首次渲染就使用真实比例和主图。
|
|
3031
3031
|
* `posterData` 是等比缩放后的 JPEG(兼容已有 PNG);存在时会作为消息 `thumbData` 随正文发送。宽高必须是有限正数,
|
|
3032
|
-
* duration 存在时必须是有限正数,posterData
|
|
3032
|
+
* duration 存在时必须是有限正数,posterData 必须是非空且不超过共享单项消息容量的 Uint8Array;合集发送会按项数复核容量。
|
|
3033
3033
|
*/
|
|
3034
3034
|
interface VideoPreviewMetadata extends ImagePreviewMetadata {
|
|
3035
3035
|
/** 秒。 */
|
|
@@ -5157,7 +5157,7 @@ interface ImMediaTask {
|
|
|
5157
5157
|
/** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
|
|
5158
5158
|
error?: ImSdkErrorShape;
|
|
5159
5159
|
}
|
|
5160
|
-
/**
|
|
5160
|
+
/** 本地视频预读结果:消息封面与仅供页面显示的独立封面分别持有。 */
|
|
5161
5161
|
interface LocalVideoPreviewMetadata extends VideoPreviewMetadata {
|
|
5162
5162
|
/** 按需生成的高清 JPEG;宿主负责 object URL 生命周期,不可替代 posterData 发送。 */
|
|
5163
5163
|
displayPoster?: Blob;
|
|
@@ -5267,9 +5267,9 @@ interface ImMediaTasksApi {
|
|
|
5267
5267
|
* 拿它当缩略图会得到一个空白格子(还会白占一路解码)。
|
|
5268
5268
|
*
|
|
5269
5269
|
* 返回的对象可以**原样**作为 `localPreviewMetadata` 交给 `sendImage` / `sendVideo` /
|
|
5270
|
-
* `sendMediaAlbum
|
|
5271
|
-
* posterData
|
|
5272
|
-
* 仅供页面显示的高清 displayPoster(长边最多 960
|
|
5270
|
+
* `sendMediaAlbum`:发送链路会复用可用元信息;合集项超出其可用消息空间时重新生成封面。
|
|
5271
|
+
* posterData 使用共享自适应发送规格(视频 JPEG,长边最多 960);includeDisplayPoster 可在同一次解码中额外生成
|
|
5272
|
+
* 仅供页面显示的高清 displayPoster(长边最多 960),不得绕过发送校验直接用它替换 posterData。
|
|
5273
5273
|
*
|
|
5274
5274
|
* @param input.kind 按文件类型选解码路径;`'video'` 才会抽首帧与读时长。
|
|
5275
5275
|
* @param input.file 本地文件;不会被上传,也不会进任何缓存。
|
|
Binary file
|