k2-im 0.2.16 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/chat-kit-pinia.d.ts +55 -11
  2. package/dist/chat-kit-vue.d.ts +5 -5
  3. package/dist/chat-kit.d.ts +101 -11
  4. package/dist/index.d.ts +104 -13
  5. package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -1
  6. package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
  7. package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
  8. package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
  9. package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
  10. package/dist/modules/im-browser/src/media/media-download-request.js +1 -0
  11. package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
  12. package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
  13. package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
  14. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  15. package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -1
  16. package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
  17. package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
  18. package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
  19. package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
  20. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  21. package/dist/modules/im-sdk/src/create-im-client.js +1 -1
  22. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  23. package/dist/modules/im-sdk/src/product/media.js +1 -1
  24. package/dist/modules/im-sdk/src/runtime/history-page-size.js +1 -0
  25. package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
  26. package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
  27. package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
  28. package/dist/sdk.d.ts +49 -10
  29. package/package.json +1 -1
@@ -1 +1 @@
1
- import{abortWithReason as e,throwIfAborted as t}from"../../abort.js";import{resolveMediaThumbnailPolicy as a,MEDIA_THUMBNAIL_MAX_BYTES as i}from"../../media-thumbnail-policy.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as n,MEDIA_ALBUM_MAX_ITEMS as o,resolveMediaAlbumSendContentType as r,measureMediaAlbumContentBytes as d,mediaAlbumBMessageFields as s,MEDIA_ALBUM_CONTENT_WARN_BYTES as l}from"../../mapping/media-album-body.js";import{computeSortKey as c}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as u}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as p}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as m}from"../../mapping/stored-message.js";function f(e){return Number.isFinite(e)&&e>0}function v(e,t,n=1,o=0){if(("video"===t||"image"===t)&&void 0!==e&&f(e.width)&&f(e.height)&&("video"!==t||void 0===e.duration||f(e.duration))&&("video"!==t||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>i)))return{width:e.width,height:e.height,..."video"===t&&void 0!==e.duration?{duration:e.duration}:{},..."video"===t&&void 0!==e.posterData&&e.posterData.byteLength<=a(n,o).maxBytes?{thumbData:new Uint8Array(e.posterData)}:{}}}function g(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 y={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,i,n,o=1,r=0){const d=await i.imageDimensions(e,t,n),s=await i.imageThumbnail(e,{mimeType:t,...a(o,r)},n);return{width:d.width,height:d.height,...s.data.byteLength<=a(o,r).maxBytes?{thumbData:s.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}:{}}})},h={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,i,n,o=1,r=0){const d=await i.videoPoster(e,{mimeType:t,...a(o,r)},n);return{width:d.width,height:d.height,...d.data.byteLength<=a(o,r).maxBytes?{thumbData:d.data}:{},duration:d.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}:{}}})},w={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}:{}}})},b={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 T={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}:{}}}}},k={...T,contentType:"filesAlbum",buildBody(e,t){const a=T.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 M(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 I(e,t){return"video"===e||void 0===t||t>16777216?"large":"small"}function A(){return new DOMException("媒体上传已取消","AbortError")}function E(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 C(e){if("album"===e.kind)return{code:m,reason:"unknown",displayCode:M(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:m,reason:"unknown",displayCode:t?"media.uploadInterrupted":M(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function P(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function K(i){const f=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(A())):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(A()):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(A())}};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 P(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;P(t,"total");const a=e.largeFiles??Math.min(3,t);if(P(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(i.maxConcurrentUploads)),K=/* @__PURE__ */new Map,R=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,z=/* @__PURE__ */new Map;let U=!1;const x=/* @__PURE__ */new Map,S=/* @__PURE__ */new Map,_=/* @__PURE__ */new Set,B=/* @__PURE__ */new Map,O=/* @__PURE__ */new Map;function F(e,t){const a=B.get(e)??/* @__PURE__ */new Set;B.set(e,a),a.add(t),_.add(t),t.finally(()=>{a.delete(t),_.delete(t),0===a.size&&B.get(e)===a&&B.delete(e),re(e)})}function L(e){return[...B.get(e)??[]]}const q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Set,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map,$=/* @__PURE__ */new Map,W=/* @__PURE__ */new Map,G=/* @__PURE__ */new Map;let H=!0,J=0,Q=0;function X(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function Z(e,t,a,n){i.mediaTransfer.abandonUpload(e).catch(e=>{i.onMediaTransferError?.({stage:"upload",kind:t,messageId:a,conversation:n,cause:e})})}function ee(e,t,a,n,o,r){if(!H)return;const d=X(t);j.set(e,{input:X(t),state:a,percent:n,phase:r}),i.emitter.emit({type:"media-task:updated",conversation:d,task:{id:`upload:${e}`,messageId:e,ref:d,direction:"upload",state:a,percent:Math.max(0,Math.min(100,Math.round(n))),attempt:z.get(e)?.attempt??1,maxAttempts:3,...Y.get(e),...N.has(e)?{items:Object.freeze(N.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===a||"failed"===a?a:e.state})))}:{},...S.get(e),...void 0===r?{}:{phase:r},...void 0===o?{}:{failure:o}}})}function te(e,t){oe(),W.delete(e),G.delete(e),W.set(e,t),ne()}function ae(e){const t=z.get(e);if(K.has(e)||q.has(e)||L(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=j.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function ie(e,t){const a=X(t.input),n=E(t),o="media"===t.kind?t.spec.uploadKind:"image",r={...C(t),displayCode:"media.uploadInterrupted",retryable:!1};W.delete(e),G.delete(e),z.delete(e),$.delete(e),Y.delete(e),N.delete(e),S.delete(e),x.delete(e),j.delete(e),D.delete(e);for(const t of n)Z(t.resume,t.kind,e,a);if(function(e,t,a){const n=i.recoveryPort;if(void 0===n)return;const o=L(e),r=Promise.all(o).then(()=>n.remove(X(t),e)).catch(n=>{i.onMediaTransferError?.({stage:"upload",kind:a,messageId:e,conversation:X(t),cause:n})});F(e,r)}(e,a,o),!H)return;const d=i.domainState.getConversationMessage?.(a,e)??t.message;"sent"!==d.status&&(i.domainState.upsertMessages([{...d,status:"failed",failure:r}],"live"),ee(e,a,"failed",0,r))}function ne(){if(H)for(const[e,t]of W){if(W.size<=3)break;ae(e)&&ie(e,t)}}function oe(){if(!H)return;const e=Date.now();for(const[t,a]of W){const i=G.get(t);void 0!==i&&e-i>=864e5&&ae(t)&&ie(t,a)}}function re(e){H&&(W.has(e)&&ae(e)&&!G.has(e)&&G.set(e,Date.now()),ne())}async function de(a,n,o,r,d,s,l=!1){const y=J,h=()=>H&&y===J;if(!h())return void 0!==s&&void 0!==o&&Z(s,a.uploadKind,o,X(n)),{ok:!1,reason:"cancelled"};const w=Q;let b,T,k=d,E=s,C=Promise.resolve(void 0);const P=/* @__PURE__ */new Set,_="function"==typeof n.data;const B=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(n.data)?n.data:void 0,L=_||void 0!==B?void 0:n.data,q=_||void 0!==B,V=!0===a.streamUpload&&void 0!==B,N=e=>{if(void 0!==B)return B;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===n.mimeType?void 0:{type:n.mimeType})};if(0===L?.length||0===B?.size)return{ok:!1,reason:"empty"};const G=n.encrypted??!0;if(G&&void 0===i.crypto)return{ok:!1,reason:"no-crypto"};const ae=v(n.localPreviewMetadata,a.contentType);if(("video"===a.contentType||"image"===a.contentType)&&void 0!==n.localPreviewMetadata&&void 0===ae)return{ok:!1,reason:"preview-failed"};const ie=void 0===o||void 0===r?i.outbox.allocateMessageIdentity({conversationId:n.conversationId,conversationType:n.conversationType}):{id:o,createdAt:r},{id:ne,createdAt:oe}=ie,re=i.getSelfId();let de=ae??{width:0,height:0};if(!q)try{de=g(await a.buildPreview(N(L),n.mimeType,i.mediaPreview),ae)}catch{}if(!h())return void 0!==E&&Z(E,a.uploadKind,ne,X(n)),{ok:!1,reason:"cancelled"};const se=B?.size??L?.byteLength,le={url:n.localPreviewUrl??"",...void 0===se?{}:{size:se}};let ce={id:ne,conversationId:n.conversationId,conversationType:n.conversationType,senderId:re,contentType:a.contentType,body:a.buildBody({...le,meta:de},n),createdAt:oe,sortKey:c(oe,ne),status:"uploading",receipt:"unread",encryption:{encrypted:G},...void 0!==n.refMessageId?{refMessageId:n.refMessageId}:{}};i.domainState.upsertMessages([ce],"live",{newOutgoing:!0});const pe=l?0:$.get(ne)??0;l&&Y.delete(ne),$.set(ne,pe),ee(ne,n,"queued",pe,void 0,"waiting-upload-slot");const me=(e,t=!1)=>{const o={code:m,reason:"unknown",displayCode:"cleanup-unconfirmed"===b?"media.cleanupUnconfirmed":"resume-unavailable"===b?"media.resumeUnavailable":"timeout"===b?"media.uploadTimeout":M(e),mediaKind:a.uploadKind,retryable:t};if(!h())return{ok:!1,reason:e};const r=z.get(ne);return"paused"===r?.stopped?(ee(ne,n,"paused",$.get(ne)??0),{ok:!1,reason:e}):void 0!==r&&void 0===r.stopped&&r.attempt<3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure||"offline"===e&&void 0!==i.waitUntilOnline)?(ee(ne,n,"queued",$.get(ne)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===r?.stopped||void 0!==r&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure)||(i.domainState.upsertMessages([{...ce,status:"failed",failure:o}],"live"),ee(ne,n,"cancelled"===e?"canceled":"failed",$.get(ne)??0,o)),{ok:!1,reason:e})},fe=async()=>{if(void 0!==E)try{await i.mediaTransfer.abandonUpload(E),E=void 0}catch(e){throw b="cleanup-unconfirmed",i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}),e}},ve=async e=>{if(await C,await Promise.all([...P]),"cancelled"===e&&"paused"!==z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&"cleanup-unconfirmed"!==b)try{await fe()}catch{}return"cancelled"===e&&"paused"!==z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&void 0!==i.recoveryPort&&(await Promise.all([...P]),await i.recoveryPort.remove(X(n),ne).catch(e=>i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}))),h()?(te(ne,{kind:"media",spec:a,input:n,createdAt:oe,message:ce,failureReason:e,...!0===z.get(ne)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===b||"resume-unavailable"===b?{restartRequired:!0}:{},...void 0===k?{}:{teaKey:k},...void 0===E?{}:{resume:E}}),me(e,!0)):{ok:!1,reason:"cancelled"}},ge=new AbortController;K.set(ne,ge),R.set(ne,X(n));const ye=z.get(ne)?.stopped;void 0!==ye&&e(ge,"cancelled"===ye&&z.get(ne)?.retainCheckpoint?"cancelled-preserve":ye),!1===i.isOnline?.()&&ue(ne,"offline");try{if(l&&(await fe(),!h()))return{ok:!1,reason:"cancelled"};if(void 0!==B&&("video"!==a.contentType||void 0===ae?.thumbData)){try{de=g(await a.buildPreview(B,n.mimeType,i.mediaPreview,ge.signal),ae)}catch{}if(!h())return{ok:!1,reason:"cancelled"};ce={...ce,body:a.buildBody({url:n.localPreviewUrl??"",meta:de,size:B.size},n)},i.domainState.upsertMessages([ce],"live")}const e=await f.acquire(I(a.contentType,B?.size??L?.byteLength),ge.signal);try{let e;ee(ne,n,"running",$.get(ne)??0);try{V||(e=_?await n.data():void 0!==B?new Uint8Array(await B.arrayBuffer()):L)}catch{return me("upload-failed",!0)}const o=V?B.size:e.length;if(0===o)return me("empty");if(_&&("video"!==a.contentType||void 0===ae?.thumbData)){try{de=g(await a.buildPreview(N(e),n.mimeType,i.mediaPreview,ge.signal),ae)}catch{}if(!h())return{ok:!1,reason:"cancelled"};ce={...ce,body:a.buildBody({url:n.localPreviewUrl??"",meta:de,size:o},n)},i.domainState.upsertMessages([ce],"live")}if(t(ge.signal),("video"===a.contentType||"file"===a.contentType||"filesAlbum"===a.contentType)&&void 0!==i.recoveryPort&&!0===i.shouldPersistUpload?.(a.uploadKind,o)){T=new AbortController,O.set(ne,T);const t=T.signal;S.set(ne,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),C=Promise.resolve().then(()=>i.recoveryPort.fingerprint(V?B:e,t)).catch(e=>{!t.aborted&&h()&&(S.set(ne,{recovery:"session-only",recoveryReason:"unavailable"}),i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}))}),V||await C}if(ge.signal.aborted)throw A();let r,d,s=V?B:e,l=1;if(G&&void 0!==i.crypto&&"none"!==a.encryptMode){const t=i.crypto;try{k??(k=t.randomTeaKey());const i=k;"simple"===a.encryptMode?(s=V?new Blob([new Uint8Array(t.encryptFileSimple({teaKey:i,plain:new Uint8Array(await B.slice(0,u).arrayBuffer())})),B.slice(u)]):t.encryptFileSimple({teaKey:i,plain:e}),l=2):V?(r=e=>t.encryptSymmetricChunked({teaKey:i,plain:e,signal:ge.signal}),l=3):(s=t.encryptSymmetric({teaKey:i,plain:e}),l=3)}catch{return me("encrypt-failed")}}try{!1===i.isOnline?.()&&ue(ne,"offline"),await(i.waitUntilOnline?.(ge.signal)),t(ge.signal);d=(await i.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===z.get(ne)?.refreshCredentials,data:s,...void 0===r?{}:{transformPart:r},kind:a.uploadKind,conversationType:n.conversationType,signal:ge.signal,...void 0===E?{}:{resume:E},onFailure:e=>{if(h()&&K.get(ne)===ge){b=e;const t=z.get(ne);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{h()&&K.get(ne)===ge&&(E=void 0)},onResumable:e=>{if(h()&&K.get(ne)===ge&&(E=e,!("cancelled"===z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint||void 0===T||void 0===i.recoveryPort||"video"!==a.contentType&&"file"!==a.contentType&&"filesAlbum"!==a.contentType))){const t=x.get(ne)??Date.now();x.set(ne,t);const o=C.then(async o=>{void 0===o||T?.signal.aborted||!h()&&!U||K.get(ne)!==ge||"cancelled"===z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&!U||(await i.recoveryPort.save({version:1,ref:X(n),messageId:ne,kind:"video"===a.contentType?"video":"file",createdAt:oe,savedAt:t,source:{...o,...void 0===n.filename?{}:{filename:n.filename},...void 0===n.mimeType?{}:{mimeType:n.mimeType}},encrypted:G,...void 0===k?{}:{teaKey:k},resume:e,...void 0===n.caption?{}:{caption:n.caption},...void 0===n.filesAlbum?{}:{filesAlbum:n.filesAlbum},...void 0===n.refMessageId?{}:{refMessageId:n.refMessageId},..."video"===a.contentType?{preview:de}:{}}),K.get(ne)!==ge||T?.signal.aborted||S.set(ne,{recovery:"available"}))}).catch(e=>{const t="object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage";(K.get(ne)===ge||W.has(ne))&&S.set(ne,{recovery:"session-only",recoveryReason:t}),i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e})});P.add(o),F(ne,o),o.finally(()=>{P.delete(o);const e=j.get(ne);!H||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||ee(ne,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==n.filename?{filename:n.filename}:{},...void 0!==n.mimeType?{mimeType:n.mimeType}:{},onProgress:e=>{if(!h()||ge.signal.aborted||K.get(ne)!==ge)return;const t=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,a=Math.max($.get(ne)??0,t);Y.set(ne,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),$.set(ne,a),i.emitter.emit({type:"media:progress",conversation:X(n),messageId:ne,percent:a}),ge.signal.aborted||K.get(ne)!==ge||ee(ne,n,"running",a,void 0,e.phase)}})).url}catch(e){if(ge.signal.aborted&&e instanceof Error&&"AbortError"===e.name||i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}),!h())return{ok:!1,reason:"cancelled"};const t=ge.signal.aborted?D.get(ne)??"cancelled":"upload-failed";return await ve(t)}if(!h())return{ok:!1,reason:"cancelled"};if(ge.signal.aborted){const e=D.get(ne)??"cancelled";return await ve(e)}if(w===Q&&("image"===a.contentType||"video"===a.contentType)&&void 0!==i.mediaAssetCache){const t=a.contentType,o=B??new Blob([e],void 0===n.mimeType?void 0:{type:n.mimeType}),r=o.size;i.mediaAssetCache.put({kind:t,messageId:ne,resourceVersion:p(d,{conversation:X(n)}),blob:o,...void 0===n.mimeType?{}:{mimeType:n.mimeType}}).catch(e=>{i.onMediaAssetCacheError?.({operation:"put",kind:t,messageId:ne,byteLength:r,cause:e})})}const c="filesAlbum"===a.contentType?await(i.mediaPreview.fileMd5?.(N(e),ge.signal)):void 0;if(!h())return{ok:!1,reason:"cancelled"};if(t(ge.signal),"filesAlbum"===a.contentType&&void 0===c)throw new Error("FILES_ALBUM requires fileMd5");return await C,await Promise.all([...P]),h()?(t(ge.signal),i.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ne,conversationId:n.conversationId,conversationType:n.conversationType,contentType:a.contentType,body:a.buildBody({url:d,meta:de,size:o,...void 0===c?{}:{md5:c},..."none"===a.encryptMode?{}:{teaKey:k,fileEncryptType:l}},n),encryption:{encrypted:G},createdAt:oe,...void 0!==n.refMessageId?{refMessageId:n.refMessageId}:{}}),await Promise.all([...P]),void 0!==i.recoveryPort&&await i.recoveryPort.remove(X(n),ne).catch(e=>i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e})),ee(ne,n,"completed",100),{ok:!0,messageId:ne}):{ok:!1,reason:"cancelled"}}finally{e()}}catch{if(!h())return{ok:!1,reason:"cancelled"};const e=ge.signal.aborted?D.get(ne)??"cancelled":"upload-failed";return await ve(e)}finally{await C,await Promise.all([...P]),O.get(ne)===T&&O.delete(ne),!h()&&U&&await Promise.all([...P]),h()||void 0===E||U&&"available"===S.get(ne)?.recovery||Z(E,a.uploadKind,ne,X(n)),K.get(ne)===ge&&(K.delete(ne),R.delete(ne),W.has(ne)||$.delete(ne),D.delete(ne))}}async function se(u,w,b,T,k=!1){const A=J,E=()=>H&&A===J,C=X(u),P=(e,t)=>{for(const a of t)void 0!==a.resume&&Z(a.resume,a.uploadKind,e,C)};if(!E())return void 0!==w&&void 0!==T&&P(w,T),{ok:!1,reason:"cancelled"};if(0===u.items.length)return{ok:!1,reason:"empty"};if(u.items.length>o)throw new RangeError(`媒体合集最多 ${o} 项,收到 ${u.items.length} 项`);const U=void 0!==u.caption&&""!==u.caption.trim()?u.caption:void 0;if(void 0!==U&&Array.from(U).length>n)throw new RangeError(`媒体合集配文最长 ${n} 字符,收到 ${Array.from(U).length}`);if(u.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===T&&"mediaAlbum"!==r(u)){const e=u.items[0];return de("video"===e.kind?h:y,{conversationId:u.conversationId,conversationType:u.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!==u.encrypted?{encrypted:u.encrypted}:{},...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}},w,b)}const x=u.encrypted??!0;if(x&&void 0===i.crypto)return{ok:!1,reason:"no-crypto"};const S=x?i.crypto:void 0,_=Q,B=void 0===w||void 0===b?i.outbox.allocateMessageIdentity(C):{id:w,createdAt:b},{id:O,createdAt:F}=B,L=u.items.map((e,t)=>{const a=T?.[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}}}),q=L.map((e,t)=>{const a=u.items[t].data.size,i=void 0!==e.uploaded?a:k?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"}});N.set(O,q);const V=()=>({...void 0===U?{}:{caption:U},items:u.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??v(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,L[t],u.hd))});let j={id:O,conversationId:u.conversationId,conversationType:u.conversationType,senderId:i.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:V()},createdAt:F,sortKey:c(F,O),status:"uploading",receipt:"unread",encryption:{encrypted:x},...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}};i.domainState.upsertMessages([j],"live",{newOutgoing:!0});const G=k?0:$.get(O)??0;let ae;k&&Y.delete(O),$.set(O,G),ee(O,u,"queued",G,void 0,"waiting-upload-slot");const ie=(e,t)=>{const a={code:m,reason:"unknown",displayCode:"cleanup-unconfirmed"===ae?"media.cleanupUnconfirmed":"resume-unavailable"===ae?"media.resumeUnavailable":"timeout"===ae?"media.uploadTimeout":M(e),retryable:t};if(!E())return{ok:!1,reason:e};const n=z.get(O);return"paused"===n?.stopped?(ee(O,u,"paused",$.get(O)??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!==i.waitUntilOnline)?(ee(O,u,"queued",$.get(O)??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)||(i.domainState.upsertMessages([{...j,status:"failed",failure:a}],"live"),ee(O,u,"cancelled"===e?"canceled":"failed",$.get(O)??0,a)),{ok:!1,reason:e})},ne=new AbortController;K.set(O,ne),R.set(O,C);const oe=z.get(O)?.stopped;void 0!==oe&&e(ne,"cancelled"===oe&&z.get(O)?.retainCheckpoint?"cancelled-preserve":oe),!1===i.isOnline?.()&&ue(O,"offline");const re=()=>E()&&K.get(O)===ne,se=()=>{E()&&re()&&(j={...j,body:{mediaAlbum:V()}},i.domainState.upsertMessages([j],"live"))},le=u.items.reduce((e,t)=>e+t.data.size,0),ce=L.map((e,t)=>void 0!==e.uploaded?u.items[t].data.size:e.resume?.bytesUploaded??0),pe=()=>{if(!E()||!re()||ne.signal.aborted)return;const e=ce.reduce((e,t)=>e+t,0),t=Math.min(99,Math.max($.get(O)??0,Math.floor(e/le*100)));Y.set(O,{bytesTransferred:e,bytesTotal:le}),$.set(O,t),i.emitter.emit({type:"media:progress",conversation:C,messageId:O,percent:t}),!ne.signal.aborted&&re()&&ee(O,u,"running",t,void 0,"transferring")};let me;const fe=async()=>{let e=!0;return await Promise.all(L.map(async t=>{if(void 0!==t.resume)try{await i.mediaTransfer.abandonUpload(t.resume),delete t.resume}catch(a){e=!1,ae="cleanup-unconfirmed",i.onMediaTransferError?.({stage:"upload",kind:t.uploadKind,messageId:O,conversation:C,cause:a})}})),e},ve=e=>(te(O,{kind:"album",input:u,createdAt:F,message:j,failureReason:e,items:L,...!0===z.get(O)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===ae||"resume-unavailable"===ae?{restartRequired:!0}:{}}),ie(e,!0));try{if(k){const e=await fe();if(!E())return{ok:!1,reason:"cancelled"};if(!e)return ve("cancelled"===D.get(O)?"cancelled":"upload-failed");for(let e=0;e<L.length;e+=1)void 0===L[e].uploaded&&(ce[e]=0)}if(await Promise.all(u.items.map(async(n,o)=>{const r=L[o];if(void 0===r.uploaded)try{!1===i.isOnline?.()&&ue(O,"offline"),await(i.waitUntilOnline?.(ne.signal)),t(ne.signal);const e=await async function(e){const{conversation:t,encryptWith:n,isCurrentAttempt:o,item:r,onBytesUploaded:d,onPreviewReady:s,onSlotAcquired:l,signal:c,state:u}=e,p="video"===r.kind?h:y,m=a(e.itemCount,e.itemIndex),w=v(r.localPreviewMetadata,r.kind,e.itemCount,e.itemIndex);let b=w??{width:0,height:0};if("video"!==r.kind||void 0===w?.thumbData)try{b=g(await p.buildPreview(r.data,r.mimeType,i.mediaPreview,c,e.itemCount,e.itemIndex),w)}catch{}void 0===b.thumbData&&void 0!==u.preview?.thumbData&&u.preview.thumbData.byteLength<=m.maxBytes&&(b=u.preview),u.preview=b,s();const T=await f.acquire(I(r.kind,r.data.size),c);try{let a;l();let s=1;if(void 0!==n){u.teaKey??(u.teaKey=n.randomTeaKey());const e=u.teaKey;a=t=>n.encryptSymmetricChunked({teaKey:e,plain:t,signal:c}),s=3}return{url:(await i.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:e.forceRefreshCredentials,data:r.data,...void 0===a?{}:{transformPart:a},kind:p.uploadKind,conversationType:t.conversationType,signal:c,...void 0===u.resume?{}:{resume:u.resume},onFailure:t=>{o()&&e.onFailure(t)},onResumeInvalidated:()=>{o()&&delete u.resume},onResumable:e=>{H&&o()&&(u.resume=e)},...void 0!==r.filename?{filename:r.filename}:{},...void 0!==r.mimeType?{mimeType:r.mimeType}:{},onProgress:e=>{H&&!c.aborted&&o()&&d(e.bytesTransferred)}})).url,meta:b,size:r.data.size,...void 0===u.teaKey?{}:{teaKey:u.teaKey},fileEncryptType:s}}finally{T()}}({item:n,itemCount:u.items.length,itemIndex:o,state:r,conversation:C,encryptWith:S,signal:ne.signal,isCurrentAttempt:re,onPreviewReady:se,onSlotAcquired:()=>{E()&&re()&&!ne.signal.aborted&&(q[o]={...q[o],state:"running"},ee(O,u,"running",$.get(O)??0))},forceRefreshCredentials:!0===z.get(O)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(ne.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===ae||"resume-unavailable"!==e&&"resume-unavailable"===ae)||(ae=e);const a=z.get(O);void 0!==a&&(a.failure=ae)},onBytesUploaded:e=>{ce[o]=e,q[o]={...q[o],bytesTransferred:e,percent:Math.min(99,Math.floor(e/n.data.size*100)),state:"running"},pe()}});if(!re())return;r.uploaded=e,q[o]={...q[o],bytesTransferred:n.data.size,percent:100,state:"completed"},ce[o]=n.data.size,pe()}catch(t){re()&&!ne.signal.aborted&&(q[o]={...q[o],state:"failed"}),((t,a)=>{void 0===me&&(me=ne.signal.aborted?D.get(O)??"cancelled":"upload-failed","upload-failed"===me&&i.onMediaTransferError?.({stage:"upload",kind:t,messageId:O,conversation:C,cause:a}),e(ne,"offline"))})(n.kind,t)}})),!E())return{ok:!1,reason:"cancelled"};if(!re())return{ok:!1,reason:"cancelled"};if("cancelled"===D.get(O))return"cleanup-unconfirmed"!==ae&&!0!==z.get(O)?.retainCheckpoint&&await fe(),E()?ve("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==me)return ve(me);if(ne.signal.aborted){return ve(D.get(O)??"cancelled")}const n=V();let o;try{o=d(s(n).content)}catch(e){return i.onMediaAlbumContentSize?.({messageId:O,conversation:C,itemCount:n.items.length,outcome:"rejected",cause:e}),ie("content-too-large",!1)}if(o>=l&&i.onMediaAlbumContentSize?.({messageId:O,conversation:C,itemCount:n.items.length,contentBytes:o,outcome:"warn"}),_===Q&&void 0!==i.mediaAssetCache){const e=i.mediaAssetCache;u.items.forEach((t,a)=>{const n=L[a].uploaded;void 0!==n&&e.put({kind:t.kind,messageId:O,resourceVersion:p(n.url,{conversation:C,itemIndex:a}),blob:t.data,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{i.onMediaAssetCacheError?.({operation:"put",kind:t.kind,messageId:O,byteLength:t.data.size,cause:e})})})}return i.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:O,conversationId:u.conversationId,conversationType:u.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:n},encryption:{encrypted:x},createdAt:F,...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}}),ee(O,u,"completed",100),{ok:!0,messageId:O}}finally{E()||P(O,L),K.get(O)===ne&&(K.delete(O),R.delete(O),W.has(O)||$.delete(O),D.delete(O))}}function le(e,t,a,n=1){const{id:o,createdAt:r}=a??i.outbox.allocateMessageIdentity(X(e)),d={attempt:n};let s,l;G.delete(o),z.set(o,d);const c=new Promise((e,t)=>{s=e,l=t});return d.done=c,(async()=>{let e=await t(o,r);for(;z.get(o)===d&&void 0===d.stopped&&d.attempt<3;){const t=W.get(o);if(!H||e.ok||void 0===t||t.restartRequired||"network"!==d.failure&&"timeout"!==d.failure&&"credentials-expired"!==d.failure&&(e.ok||"offline"!==e.reason||void 0===i.waitUntilOnline))break;const a=new AbortController;if(d.waiting=a,await(i.waitUntilOnline?.(a.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(i,1===d.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(i.waitUntilOnline?.(a.signal).catch(()=>{})),delete d.waiting,!H||void 0!==d.stopped||z.get(o)!==d)break;d.attempt+=1,d.refreshCredentials="credentials-expired"===d.failure,delete d.failure,W.delete(o),G.delete(o),e=await ce(o,t,!1)}const a=W.get(o),n="cancelled"!==d.stopped&&d.attempt>=3&&("network"===d.failure||"timeout"===d.failure||"credentials-expired"===d.failure);if(H&&z.get(o)===d&&void 0!==a&&n&&!0===i.retainFailedUploads){d.stopped="cancelled",d.retainCheckpoint=!0,a.retainCheckpoint=!0;const e={...C(a),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};i.domainState.upsertMessages([{...a.message,status:"failed",failure:e}],"live"),ee(o,a.input,"failed",$.get(o)??0,e)}else if(H&&z.get(o)===d&&void 0!==a&&("cancelled"===d.stopped||n)){d.stopped="cancelled";const t={...C(a),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===d.retainCheckpoint&&!n};(!0!==d.retainCheckpoint||n)&&await fe(o,a),H&&z.get(o)===d&&(i.domainState.upsertMessages([{...a.message,status:"failed",failure:t}],"live"),ee(o,a.input,"canceled",$.get(o)??0,t)),e={ok:!1,reason:"cancelled"}}return"paused"===d.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{d.settled=!0,re(o),s(e)},e=>{d.settled=!0,re(o),l(e)}),c.then(()=>{z.get(o)===d&&"paused"!==d.stopped&&(z.delete(o),W.has(o)||($.delete(o),Y.delete(o),N.delete(o),S.delete(o),x.delete(o),j.delete(o)))},()=>{z.get(o)===d&&z.delete(o)}),c}function ce(e,t,a){return"album"===t.kind?se(t.input,e,t.createdAt,t.items,a):de(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function ue(t,a){const i=z.get(t);if(!H||void 0===i||"cancelled"===i.stopped)return;if("paused"===i.stopped)return void("pagehide"===a&&"offline"===i.pauseReason&&(i.pauseReason="pagehide"));i.stopped="paused",i.pauseReason=a;const n=K.get(t);i.waiting?.abort(),void 0!==n&&e(n,"paused");const o=j.get(t);void 0!==o&&z.get(t)===i&&"paused"===i.stopped&&ee(t,o.input,"paused",$.get(t)??o.percent)}async function pe(e,t="manual"){const a=z.get(e);if(!H||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,re(e),H&&z.get(e)===a&&W.has(e);ue(e,t),await a.done,await Promise.all(L(e));const i=W.get(e);return!(!H||z.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(ee(e,i.input,"paused",$.get(e)??0),!0)}function me(e){oe();const t=z.get(e),a=W.get(e);if(!H||"paused"!==t?.stopped||!0!==t.settled||void 0===a||K.has(e))return!1;W.delete(e),G.delete(e);const n=J;return le(a.input,()=>ce(e,a,!1),{id:e,createdAt:a.createdAt},t.attempt).catch(t=>{H&&n===J&&i.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:X(a.input),cause:t})}),!0}async function fe(e,t){W.delete(e),G.delete(e),S.delete(e),x.delete(e),Y.delete(e),N.delete(e),V.add(e);try{await Promise.all(L(e)),await(i.recoveryPort?.remove(X(t.input),e).catch(a=>{i.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:X(t.input),cause:a})})),await Promise.all(E(t).map(async a=>{try{await i.mediaTransfer.abandonUpload(a.resume)}catch(n){i.onMediaTransferError?.({stage:"upload",kind:a.kind,messageId:e,conversation:X(t.input),cause:n})}}))}catch(a){i.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:X(t.input),cause:a})}finally{V.delete(e),S.delete(e),x.delete(e),Y.delete(e)}}function ve(t,a){if(oe(),!H)return!1;const n=z.get(t),o=K.get(t);if(!0!==a?.retainCheckpoint&&O.get(t)?.abort(),void 0!==n&&(n.stopped="cancelled",n.retainCheckpoint=!0===a?.retainCheckpoint,n.waiting?.abort()),void 0!==o){const n=R.get(t);return void 0!==n&&!0!==a?.retainCheckpoint&&function(e,t){if(void 0===i.recoveryPort)return;const a=L(e),n="video"===i.domainState.getConversationMessage?.(t,e)?.contentType?"video":"file",o=Promise.all(a).then(()=>i.recoveryPort.remove(t,e)).catch(a=>{i.onMediaTransferError?.({stage:"upload",kind:n,messageId:e,conversation:t,cause:a})});F(e,o)}(t,n),D.set(t,"cancelled"),e(o,!0===a?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const r=W.get(t);if(void 0===r||void 0===n)return void 0!==n&&"queued"===j.get(t)?.state;if(!0===a?.retainCheckpoint)r.retainCheckpoint=!0,r.failureReason="cancelled";else{F(t,fe(t,r))}const d={...C(r),displayCode:"media.cancelled",retryable:!0===a?.retainCheckpoint};return i.domainState.upsertMessages([{...r.message,status:"failed",failure:d}],"live"),ee(t,r.input,"canceled",$.get(t)??0,d),z.get(t)===n&&z.delete(t),re(t),!0!==a?.retainCheckpoint&&($.delete(t),N.delete(t),j.delete(t)),!0}async function ge(e,t,a,i){oe();const n=J,o=L(t);return o.length>0&&await Promise.all(o),H&&n===J?(x.delete(t),le(i,()=>de(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>le(e,(t,a)=>de(y,e,t,a)),sendVideo:e=>le(e,(t,a)=>de(h,e,t,a)),replaceVideo:(e,t,a)=>ge(h,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"}):le(e,(t,a)=>de(w,e,t,a))},sendFile:e=>void 0!==e.caption&&Array.from(e.caption).length>n?Promise.resolve({ok:!1,reason:"content-too-large"}):le(e,(t,a)=>de(e.filesAlbum||e.caption?.trim()?k:T,e,t,a)),sendGif:e=>le(e,(t,a)=>de(b,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>le(e,(t,a)=>se(e,t,a)),replaceFile:(e,t,a)=>void 0!==a.caption&&Array.from(a.caption).length>n?Promise.resolve({ok:!1,reason:"content-too-large"}):ge(a.filesAlbum||a.caption?.trim()?k:T,e,t,a),cancel:ve,pause:pe,async pauseAll(e="pagehide"){for(const{controller:e}of q.values())e.abort();await Promise.all([...z.keys()].map(t=>pe(t,e)))},async resumePaused(e,t){await Promise.all([...z.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=j.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=W.get(a);t?.aborted||z.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)&&me(a)}))},resume:me,cancelConversation(t,a="offline"){for(const e of q.values())e.ref.conversationType===t.conversationType&&e.ref.conversationId===t.conversationId&&e.controller.abort();for(const[e,a]of W)if(a.input.conversationType===t.conversationType&&a.input.conversationId===t.conversationId){if(z.has(e))ve(e);else{for(const t of E(a))Z(t.resume,t.kind,e,X(a.input));i.recoveryPort?.remove(X(a.input),e).catch(n=>i.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:t,cause:n}))}W.delete(e),G.delete(e),N.delete(e),Y.delete(e),$.delete(e),j.delete(e)}if(H)for(const[i,n]of R){if(n.conversationType!==t.conversationType||n.conversationId!==t.conversationId)continue;const o=K.get(i);if(void 0===o)continue;const r=z.get(i);void 0!==r&&(r.stopped="cancelled"),D.set(i,a),O.get(i)?.abort(),e(o,a)}},cancelAll(t="offline"){if(H){if("offline"===t){const e=J;for(const t of z.keys()){const a=j.get(t)?.input;pe(t,"offline").catch(n=>{H&&e===J&&void 0!==a&&i.onMediaTransferError?.({stage:"upload",kind:"video"===i.domainState.getConversationMessage?.(a,t)?.contentType?"video":"file",messageId:t,conversation:a,cause:n})})}return}if("session-ended"===t){for(const{controller:e}of q.values())e.abort();for(const e of z.values())e.stopped="cancelled",e.waiting?.abort();J+=1,Q+=1}for(const a of O.values())e(a,t);for(const a of K.values())e(a,t)}},retry(e,t){if(oe(),V.has(e))return!1;if(!H)return!1;const a=W.get(e);if(void 0===a)return!1;if(!0===z.get(e)?.retainCheckpoint&&!0!==z.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 W.delete(e),G.delete(e),le(a.input,()=>ce(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:oe,invalidateAssetCacheWrites(){Q+=1},async dispose(t){if(!H)return;U=!0===t?.preserveRecovery;for(const{controller:e}of q.values())e.abort();const a=[...z.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of z.values())e.stopped="cancelled",e.waiting?.abort();if(H=!1,Q+=1,!U)for(const e of O.values())e.abort();for(const t of K.values())e(t,U?"page-preserve":"cancelled");for(const[e,t]of W)if(!U||"available"!==S.get(e)?.recovery)for(const a of E(t))Z(a.resume,a.kind,e,X(t.input));W.clear(),G.clear(),await Promise.allSettled(a),await Promise.all([..._]),K.clear(),$.clear(),D.clear();for(const[e,t]of W)if(!U||"available"!==S.get(e)?.recovery)for(const a of E(t))Z(a.resume,a.kind,e,X(t.input));W.clear(),G.clear(),z.clear(),Y.clear(),N.clear(),S.clear(),x.clear(),j.clear(),await(i.recoveryPort?.drain())},async recoverUpload(e,t,a){oe();const n=i.recoveryPort;if(!H||void 0===n)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(z.has(t)||q.has(t))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const o=new AbortController;q.set(t,{controller:o,ref:e});const r=()=>{if(!H||o.signal.aborted||q.get(t)?.controller!==o)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},d=(e,t)=>{if(void 0===e||e.senderId!==i.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,n="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(a||n)&&(void 0===t||e.contentType===t)};let s;try{s=await n.acquireLease(o.signal),r();const l=i.domainState.getConversationMessage?.(e,t);if(!d(l))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const c=await n.get(e,t);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(a,o.signal);if(r(),p.size!==c.source.size||p.sha256!==c.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=i.domainState.getConversationMessage?.(e,t);if(z.has(t)||!d(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:a,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 x.set(t,c.savedAt),await le(f,()=>de("video"===c.kind?h:c.filesAlbum||c.caption?.trim()?k:T,f,t,c.createdAt,c.teaKey,c.resume),{id:t,createdAt:c.createdAt})}finally{q.get(t)?.controller===o&&q.delete(t),re(t),s?.release()}}}}export{K as createMediaSender};
1
+ import{abortWithReason as e,throwIfAborted as t}from"../../abort.js";import{resolveMediaThumbnailPolicy as a,MEDIA_THUMBNAIL_MAX_BYTES as i}from"../../media-thumbnail-policy.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as n,MEDIA_ALBUM_MAX_ITEMS as o,resolveMediaAlbumSendContentType as r,measureMediaAlbumContentBytes as d,mediaAlbumBMessageFields as s,MEDIA_ALBUM_CONTENT_WARN_BYTES as l}from"../../mapping/media-album-body.js";import{computeSortKey as c}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as u}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as p}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as m}from"../../mapping/stored-message.js";function f(e){return Number.isFinite(e)&&e>0}function v(e,t,n=1,o=0){if(("video"===t||"image"===t)&&void 0!==e&&f(e.width)&&f(e.height)&&("video"!==t||void 0===e.duration||f(e.duration))&&("video"!==t||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>i)))return{width:e.width,height:e.height,..."video"===t&&void 0!==e.duration?{duration:e.duration}:{},..."video"===t&&void 0!==e.posterData&&e.posterData.byteLength<=a(n,o).maxBytes?{thumbData:new Uint8Array(e.posterData)}:{}}}function g(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 y={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,i,n,o=1,r=0){const d=await i.imageDimensions(e,t,n),s=await i.imageThumbnail(e,{mimeType:t,...a(o,r)},n);return{width:d.width,height:d.height,...s.data.byteLength<=a(o,r).maxBytes?{thumbData:s.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}:{}}})},h={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,i,n,o=1,r=0){const d=await i.videoPoster(e,{mimeType:t,...a(o,r)},n);return{width:d.width,height:d.height,...d.data.byteLength<=a(o,r).maxBytes?{thumbData:d.data}:{},duration:d.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}:{}}})},w={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}:{}}})},b={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 T={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}:{}}}}},k={...T,contentType:"filesAlbum",buildBody(e,t){const a=T.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 M(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 I(e,t){return"video"===e||void 0===t||t>=8388608?"large":"small"}function A(){return new DOMException("媒体上传已取消","AbortError")}function E(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 C(e){if("album"===e.kind)return{code:m,reason:"unknown",displayCode:M(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:m,reason:"unknown",displayCode:t?"media.uploadInterrupted":M(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function P(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function K(i){const f=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(A())):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(A()):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(A())}};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 P(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;P(t,"total");const a=e.largeFiles??Math.min(3,t);if(P(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(i.maxConcurrentUploads)),K=/* @__PURE__ */new Map,R=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,z=/* @__PURE__ */new Map;let U=!1;const x=/* @__PURE__ */new Map,S=/* @__PURE__ */new Map,_=/* @__PURE__ */new Set,B=/* @__PURE__ */new Map,O=/* @__PURE__ */new Map;function F(e,t){const a=B.get(e)??/* @__PURE__ */new Set;B.set(e,a),a.add(t),_.add(t),t.finally(()=>{a.delete(t),_.delete(t),0===a.size&&B.get(e)===a&&B.delete(e),re(e)})}function L(e){return[...B.get(e)??[]]}const q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Set,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map,$=/* @__PURE__ */new Map,W=/* @__PURE__ */new Map,G=/* @__PURE__ */new Map;let H=!0,J=0,Q=0;function X(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function Z(e,t,a,n){i.mediaTransfer.abandonUpload(e).catch(e=>{i.onMediaTransferError?.({stage:"upload",kind:t,messageId:a,conversation:n,cause:e})})}function ee(e,t,a,n,o,r){if(!H)return;const d=X(t);j.set(e,{input:X(t),state:a,percent:n,phase:r}),i.emitter.emit({type:"media-task:updated",conversation:d,task:{id:`upload:${e}`,messageId:e,ref:d,direction:"upload",state:a,percent:Math.max(0,Math.min(100,Math.round(n))),attempt:z.get(e)?.attempt??1,maxAttempts:3,...Y.get(e),...N.has(e)?{items:Object.freeze(N.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===a||"failed"===a?a:e.state})))}:{},...S.get(e),...void 0===r?{}:{phase:r},...void 0===o?{}:{failure:o}}})}function te(e,t){oe(),W.delete(e),G.delete(e),W.set(e,t),ne()}function ae(e){const t=z.get(e);if(K.has(e)||q.has(e)||L(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=j.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function ie(e,t){const a=X(t.input),n=E(t),o="media"===t.kind?t.spec.uploadKind:"image",r={...C(t),displayCode:"media.uploadInterrupted",retryable:!1};W.delete(e),G.delete(e),z.delete(e),$.delete(e),Y.delete(e),N.delete(e),S.delete(e),x.delete(e),j.delete(e),D.delete(e);for(const t of n)Z(t.resume,t.kind,e,a);if(function(e,t,a){const n=i.recoveryPort;if(void 0===n)return;const o=L(e),r=Promise.all(o).then(()=>n.remove(X(t),e)).catch(n=>{i.onMediaTransferError?.({stage:"upload",kind:a,messageId:e,conversation:X(t),cause:n})});F(e,r)}(e,a,o),!H)return;const d=i.domainState.getConversationMessage?.(a,e)??t.message;"sent"!==d.status&&(i.domainState.upsertMessages([{...d,status:"failed",failure:r}],"live"),ee(e,a,"failed",0,r))}function ne(){if(H)for(const[e,t]of W){if(W.size<=3)break;ae(e)&&ie(e,t)}}function oe(){if(!H)return;const e=Date.now();for(const[t,a]of W){const i=G.get(t);void 0!==i&&e-i>=864e5&&ae(t)&&ie(t,a)}}function re(e){H&&(W.has(e)&&ae(e)&&!G.has(e)&&G.set(e,Date.now()),ne())}async function de(a,n,o,r,d,s,l=!1){const y=J,h=()=>H&&y===J;if(!h())return void 0!==s&&void 0!==o&&Z(s,a.uploadKind,o,X(n)),{ok:!1,reason:"cancelled"};const w=Q;let b,T,k=d,E=s,C=Promise.resolve(void 0);const P=/* @__PURE__ */new Set,_="function"==typeof n.data;const B=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(n.data)?n.data:void 0,L=_||void 0!==B?void 0:n.data,q=_||void 0!==B,V=!0===a.streamUpload&&void 0!==B,N=e=>{if(void 0!==B)return B;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===n.mimeType?void 0:{type:n.mimeType})};if(0===L?.length||0===B?.size)return{ok:!1,reason:"empty"};const G=n.encrypted??!0;if(G&&void 0===i.crypto)return{ok:!1,reason:"no-crypto"};const ae=v(n.localPreviewMetadata,a.contentType);if(("video"===a.contentType||"image"===a.contentType)&&void 0!==n.localPreviewMetadata&&void 0===ae)return{ok:!1,reason:"preview-failed"};const ie=void 0===o||void 0===r?i.outbox.allocateMessageIdentity({conversationId:n.conversationId,conversationType:n.conversationType}):{id:o,createdAt:r},{id:ne,createdAt:oe}=ie,re=i.getSelfId();let de=ae??{width:0,height:0};if(!q)try{de=g(await a.buildPreview(N(L),n.mimeType,i.mediaPreview),ae)}catch{}if(!h())return void 0!==E&&Z(E,a.uploadKind,ne,X(n)),{ok:!1,reason:"cancelled"};const se=B?.size??L?.byteLength,le={url:n.localPreviewUrl??"",...void 0===se?{}:{size:se}};let ce={id:ne,conversationId:n.conversationId,conversationType:n.conversationType,senderId:re,contentType:a.contentType,body:a.buildBody({...le,meta:de},n),createdAt:oe,sortKey:c(oe,ne),status:"uploading",receipt:"unread",encryption:{encrypted:G},...void 0!==n.refMessageId?{refMessageId:n.refMessageId}:{}};i.domainState.upsertMessages([ce],"live",{newOutgoing:!0});const pe=l?0:$.get(ne)??0;l&&Y.delete(ne),$.set(ne,pe),ee(ne,n,"queued",pe,void 0,"waiting-upload-slot");const me=(e,t=!1)=>{const o={code:m,reason:"unknown",displayCode:"cleanup-unconfirmed"===b?"media.cleanupUnconfirmed":"resume-unavailable"===b?"media.resumeUnavailable":"timeout"===b?"media.uploadTimeout":M(e),mediaKind:a.uploadKind,retryable:t};if(!h())return{ok:!1,reason:e};const r=z.get(ne);return"paused"===r?.stopped?(ee(ne,n,"paused",$.get(ne)??0),{ok:!1,reason:e}):void 0!==r&&void 0===r.stopped&&r.attempt<3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure||"offline"===e&&void 0!==i.waitUntilOnline)?(ee(ne,n,"queued",$.get(ne)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===r?.stopped||void 0!==r&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure)||(i.domainState.upsertMessages([{...ce,status:"failed",failure:o}],"live"),ee(ne,n,"cancelled"===e?"canceled":"failed",$.get(ne)??0,o)),{ok:!1,reason:e})},fe=async()=>{if(void 0!==E)try{await i.mediaTransfer.abandonUpload(E),E=void 0}catch(e){throw b="cleanup-unconfirmed",i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}),e}},ve=async e=>{if(await C,await Promise.all([...P]),"cancelled"===e&&"paused"!==z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&"cleanup-unconfirmed"!==b)try{await fe()}catch{}return"cancelled"===e&&"paused"!==z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&void 0!==i.recoveryPort&&(await Promise.all([...P]),await i.recoveryPort.remove(X(n),ne).catch(e=>i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}))),h()?(te(ne,{kind:"media",spec:a,input:n,createdAt:oe,message:ce,failureReason:e,...!0===z.get(ne)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===b||"resume-unavailable"===b?{restartRequired:!0}:{},...void 0===k?{}:{teaKey:k},...void 0===E?{}:{resume:E}}),me(e,!0)):{ok:!1,reason:"cancelled"}},ge=new AbortController;K.set(ne,ge),R.set(ne,X(n));const ye=z.get(ne)?.stopped;void 0!==ye&&e(ge,"cancelled"===ye&&z.get(ne)?.retainCheckpoint?"cancelled-preserve":ye),!1===i.isOnline?.()&&ue(ne,"offline");try{if(l&&(await fe(),!h()))return{ok:!1,reason:"cancelled"};if(void 0!==B&&("video"!==a.contentType||void 0===ae?.thumbData)){try{de=g(await a.buildPreview(B,n.mimeType,i.mediaPreview,ge.signal),ae)}catch{}if(!h())return{ok:!1,reason:"cancelled"};ce={...ce,body:a.buildBody({url:n.localPreviewUrl??"",meta:de,size:B.size},n)},i.domainState.upsertMessages([ce],"live")}const e=await f.acquire(I(a.contentType,B?.size??L?.byteLength),ge.signal);try{let e;ee(ne,n,"running",$.get(ne)??0);try{V||(e=_?await n.data():void 0!==B?new Uint8Array(await B.arrayBuffer()):L)}catch{return me("upload-failed",!0)}const o=V?B.size:e.length;if(0===o)return me("empty");if(_&&("video"!==a.contentType||void 0===ae?.thumbData)){try{de=g(await a.buildPreview(N(e),n.mimeType,i.mediaPreview,ge.signal),ae)}catch{}if(!h())return{ok:!1,reason:"cancelled"};ce={...ce,body:a.buildBody({url:n.localPreviewUrl??"",meta:de,size:o},n)},i.domainState.upsertMessages([ce],"live")}if(t(ge.signal),("video"===a.contentType||"file"===a.contentType||"filesAlbum"===a.contentType)&&void 0!==i.recoveryPort&&!0===i.shouldPersistUpload?.(a.uploadKind,o)){T=new AbortController,O.set(ne,T);const t=T.signal;S.set(ne,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),C=Promise.resolve().then(()=>i.recoveryPort.fingerprint(V?B:e,t)).catch(e=>{!t.aborted&&h()&&(S.set(ne,{recovery:"session-only",recoveryReason:"unavailable"}),i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}))}),V||await C}if(ge.signal.aborted)throw A();let r,d,s=V?B:e,l=1;if(G&&void 0!==i.crypto&&"none"!==a.encryptMode){const t=i.crypto;try{k??(k=t.randomTeaKey());const i=k;"simple"===a.encryptMode?(s=V?new Blob([new Uint8Array(t.encryptFileSimple({teaKey:i,plain:new Uint8Array(await B.slice(0,u).arrayBuffer())})),B.slice(u)]):t.encryptFileSimple({teaKey:i,plain:e}),l=2):V?(r=e=>t.encryptSymmetricChunked({teaKey:i,plain:e,signal:ge.signal}),l=3):(s=t.encryptSymmetric({teaKey:i,plain:e}),l=3)}catch{return me("encrypt-failed")}}try{!1===i.isOnline?.()&&ue(ne,"offline"),await(i.waitUntilOnline?.(ge.signal)),t(ge.signal);d=(await i.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===z.get(ne)?.refreshCredentials,data:s,...void 0===r?{}:{transformPart:r},kind:a.uploadKind,conversationType:n.conversationType,signal:ge.signal,...void 0===E?{}:{resume:E},onFailure:e=>{if(h()&&K.get(ne)===ge){b=e;const t=z.get(ne);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{h()&&K.get(ne)===ge&&(E=void 0)},onResumable:e=>{if(h()&&K.get(ne)===ge&&(E=e,!("cancelled"===z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint||void 0===T||void 0===i.recoveryPort||"video"!==a.contentType&&"file"!==a.contentType&&"filesAlbum"!==a.contentType))){const t=x.get(ne)??Date.now();x.set(ne,t);const o=C.then(async o=>{void 0===o||T?.signal.aborted||!h()&&!U||K.get(ne)!==ge||"cancelled"===z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&!U||(await i.recoveryPort.save({version:1,ref:X(n),messageId:ne,kind:"video"===a.contentType?"video":"file",createdAt:oe,savedAt:t,source:{...o,...void 0===n.filename?{}:{filename:n.filename},...void 0===n.mimeType?{}:{mimeType:n.mimeType}},encrypted:G,...void 0===k?{}:{teaKey:k},resume:e,...void 0===n.caption?{}:{caption:n.caption},...void 0===n.filesAlbum?{}:{filesAlbum:n.filesAlbum},...void 0===n.refMessageId?{}:{refMessageId:n.refMessageId},..."video"===a.contentType?{preview:de}:{}}),K.get(ne)!==ge||T?.signal.aborted||S.set(ne,{recovery:"available"}))}).catch(e=>{const t="object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage";(K.get(ne)===ge||W.has(ne))&&S.set(ne,{recovery:"session-only",recoveryReason:t}),i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e})});P.add(o),F(ne,o),o.finally(()=>{P.delete(o);const e=j.get(ne);!H||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||ee(ne,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==n.filename?{filename:n.filename}:{},...void 0!==n.mimeType?{mimeType:n.mimeType}:{},onProgress:e=>{if(!h()||ge.signal.aborted||K.get(ne)!==ge)return;const t=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,a=Math.max($.get(ne)??0,t);Y.set(ne,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),$.set(ne,a),i.emitter.emit({type:"media:progress",conversation:X(n),messageId:ne,percent:a}),ge.signal.aborted||K.get(ne)!==ge||ee(ne,n,"running",a,void 0,e.phase)}})).url}catch(e){if(ge.signal.aborted&&e instanceof Error&&"AbortError"===e.name||i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}),!h())return{ok:!1,reason:"cancelled"};const t=ge.signal.aborted?D.get(ne)??"cancelled":"upload-failed";return await ve(t)}if(!h())return{ok:!1,reason:"cancelled"};if(ge.signal.aborted){const e=D.get(ne)??"cancelled";return await ve(e)}if(w===Q&&("image"===a.contentType||"video"===a.contentType)&&void 0!==i.mediaAssetCache){const t=a.contentType,o=B??new Blob([e],void 0===n.mimeType?void 0:{type:n.mimeType}),r=o.size;i.mediaAssetCache.put({kind:t,messageId:ne,resourceVersion:p(d,{conversation:X(n)}),blob:o,...void 0===n.mimeType?{}:{mimeType:n.mimeType}}).catch(e=>{i.onMediaAssetCacheError?.({operation:"put",kind:t,messageId:ne,byteLength:r,cause:e})})}const c="filesAlbum"===a.contentType?await(i.mediaPreview.fileMd5?.(N(e),ge.signal)):void 0;if(!h())return{ok:!1,reason:"cancelled"};if(t(ge.signal),"filesAlbum"===a.contentType&&void 0===c)throw new Error("FILES_ALBUM requires fileMd5");return await C,await Promise.all([...P]),h()?(t(ge.signal),i.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ne,conversationId:n.conversationId,conversationType:n.conversationType,contentType:a.contentType,body:a.buildBody({url:d,meta:de,size:o,...void 0===c?{}:{md5:c},..."none"===a.encryptMode?{}:{teaKey:k,fileEncryptType:l}},n),encryption:{encrypted:G},createdAt:oe,...void 0!==n.refMessageId?{refMessageId:n.refMessageId}:{}}),await Promise.all([...P]),void 0!==i.recoveryPort&&await i.recoveryPort.remove(X(n),ne).catch(e=>i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e})),ee(ne,n,"completed",100),{ok:!0,messageId:ne}):{ok:!1,reason:"cancelled"}}finally{e()}}catch{if(!h())return{ok:!1,reason:"cancelled"};const e=ge.signal.aborted?D.get(ne)??"cancelled":"upload-failed";return await ve(e)}finally{await C,await Promise.all([...P]),O.get(ne)===T&&O.delete(ne),!h()&&U&&await Promise.all([...P]),h()||void 0===E||U&&"available"===S.get(ne)?.recovery||Z(E,a.uploadKind,ne,X(n)),K.get(ne)===ge&&(K.delete(ne),R.delete(ne),W.has(ne)||$.delete(ne),D.delete(ne))}}async function se(u,w,b,T,k=!1){const A=J,E=()=>H&&A===J,C=X(u),P=(e,t)=>{for(const a of t)void 0!==a.resume&&Z(a.resume,a.uploadKind,e,C)};if(!E())return void 0!==w&&void 0!==T&&P(w,T),{ok:!1,reason:"cancelled"};if(0===u.items.length)return{ok:!1,reason:"empty"};if(u.items.length>o)throw new RangeError(`媒体合集最多 ${o} 项,收到 ${u.items.length} 项`);const U=void 0!==u.caption&&""!==u.caption.trim()?u.caption:void 0;if(void 0!==U&&Array.from(U).length>n)throw new RangeError(`媒体合集配文最长 ${n} 字符,收到 ${Array.from(U).length}`);if(u.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===T&&"mediaAlbum"!==r(u)){const e=u.items[0];return de("video"===e.kind?h:y,{conversationId:u.conversationId,conversationType:u.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!==u.encrypted?{encrypted:u.encrypted}:{},...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}},w,b)}const x=u.encrypted??!0;if(x&&void 0===i.crypto)return{ok:!1,reason:"no-crypto"};const S=x?i.crypto:void 0,_=Q,B=void 0===w||void 0===b?i.outbox.allocateMessageIdentity(C):{id:w,createdAt:b},{id:O,createdAt:F}=B,L=u.items.map((e,t)=>{const a=T?.[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}}}),q=L.map((e,t)=>{const a=u.items[t].data.size,i=void 0!==e.uploaded?a:k?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"}});N.set(O,q);const V=()=>({...void 0===U?{}:{caption:U},items:u.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??v(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,L[t],u.hd))});let j={id:O,conversationId:u.conversationId,conversationType:u.conversationType,senderId:i.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:V()},createdAt:F,sortKey:c(F,O),status:"uploading",receipt:"unread",encryption:{encrypted:x},...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}};i.domainState.upsertMessages([j],"live",{newOutgoing:!0});const G=k?0:$.get(O)??0;let ae;k&&Y.delete(O),$.set(O,G),ee(O,u,"queued",G,void 0,"waiting-upload-slot");const ie=(e,t)=>{const a={code:m,reason:"unknown",displayCode:"cleanup-unconfirmed"===ae?"media.cleanupUnconfirmed":"resume-unavailable"===ae?"media.resumeUnavailable":"timeout"===ae?"media.uploadTimeout":M(e),retryable:t};if(!E())return{ok:!1,reason:e};const n=z.get(O);return"paused"===n?.stopped?(ee(O,u,"paused",$.get(O)??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!==i.waitUntilOnline)?(ee(O,u,"queued",$.get(O)??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)||(i.domainState.upsertMessages([{...j,status:"failed",failure:a}],"live"),ee(O,u,"cancelled"===e?"canceled":"failed",$.get(O)??0,a)),{ok:!1,reason:e})},ne=new AbortController;K.set(O,ne),R.set(O,C);const oe=z.get(O)?.stopped;void 0!==oe&&e(ne,"cancelled"===oe&&z.get(O)?.retainCheckpoint?"cancelled-preserve":oe),!1===i.isOnline?.()&&ue(O,"offline");const re=()=>E()&&K.get(O)===ne,se=()=>{E()&&re()&&(j={...j,body:{mediaAlbum:V()}},i.domainState.upsertMessages([j],"live"))},le=u.items.reduce((e,t)=>e+t.data.size,0),ce=L.map((e,t)=>void 0!==e.uploaded?u.items[t].data.size:e.resume?.bytesUploaded??0),pe=()=>{if(!E()||!re()||ne.signal.aborted)return;const e=ce.reduce((e,t)=>e+t,0),t=Math.min(99,Math.max($.get(O)??0,Math.floor(e/le*100)));Y.set(O,{bytesTransferred:e,bytesTotal:le}),$.set(O,t),i.emitter.emit({type:"media:progress",conversation:C,messageId:O,percent:t}),!ne.signal.aborted&&re()&&ee(O,u,"running",t,void 0,"transferring")};let me;const fe=async()=>{let e=!0;return await Promise.all(L.map(async t=>{if(void 0!==t.resume)try{await i.mediaTransfer.abandonUpload(t.resume),delete t.resume}catch(a){e=!1,ae="cleanup-unconfirmed",i.onMediaTransferError?.({stage:"upload",kind:t.uploadKind,messageId:O,conversation:C,cause:a})}})),e},ve=e=>(te(O,{kind:"album",input:u,createdAt:F,message:j,failureReason:e,items:L,...!0===z.get(O)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===ae||"resume-unavailable"===ae?{restartRequired:!0}:{}}),ie(e,!0));try{if(k){const e=await fe();if(!E())return{ok:!1,reason:"cancelled"};if(!e)return ve("cancelled"===D.get(O)?"cancelled":"upload-failed");for(let e=0;e<L.length;e+=1)void 0===L[e].uploaded&&(ce[e]=0)}if(await Promise.all(u.items.map(async(n,o)=>{const r=L[o];if(void 0===r.uploaded)try{!1===i.isOnline?.()&&ue(O,"offline"),await(i.waitUntilOnline?.(ne.signal)),t(ne.signal);const e=await async function(e){const{conversation:t,encryptWith:n,isCurrentAttempt:o,item:r,onBytesUploaded:d,onPreviewReady:s,onSlotAcquired:l,signal:c,state:u}=e,p="video"===r.kind?h:y,m=a(e.itemCount,e.itemIndex),w=v(r.localPreviewMetadata,r.kind,e.itemCount,e.itemIndex);let b=w??{width:0,height:0};if("video"!==r.kind||void 0===w?.thumbData)try{b=g(await p.buildPreview(r.data,r.mimeType,i.mediaPreview,c,e.itemCount,e.itemIndex),w)}catch{}void 0===b.thumbData&&void 0!==u.preview?.thumbData&&u.preview.thumbData.byteLength<=m.maxBytes&&(b=u.preview),u.preview=b,s();const T=await f.acquire(I(r.kind,r.data.size),c);try{let a;l();let s=1;if(void 0!==n){u.teaKey??(u.teaKey=n.randomTeaKey());const e=u.teaKey;a=t=>n.encryptSymmetricChunked({teaKey:e,plain:t,signal:c}),s=3}return{url:(await i.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:e.forceRefreshCredentials,data:r.data,...void 0===a?{}:{transformPart:a},kind:p.uploadKind,conversationType:t.conversationType,signal:c,...void 0===u.resume?{}:{resume:u.resume},onFailure:t=>{o()&&e.onFailure(t)},onResumeInvalidated:()=>{o()&&delete u.resume},onResumable:e=>{H&&o()&&(u.resume=e)},...void 0!==r.filename?{filename:r.filename}:{},...void 0!==r.mimeType?{mimeType:r.mimeType}:{},onProgress:e=>{H&&!c.aborted&&o()&&d(e.bytesTransferred)}})).url,meta:b,size:r.data.size,...void 0===u.teaKey?{}:{teaKey:u.teaKey},fileEncryptType:s}}finally{T()}}({item:n,itemCount:u.items.length,itemIndex:o,state:r,conversation:C,encryptWith:S,signal:ne.signal,isCurrentAttempt:re,onPreviewReady:se,onSlotAcquired:()=>{E()&&re()&&!ne.signal.aborted&&(q[o]={...q[o],state:"running"},ee(O,u,"running",$.get(O)??0))},forceRefreshCredentials:!0===z.get(O)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(ne.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===ae||"resume-unavailable"!==e&&"resume-unavailable"===ae)||(ae=e);const a=z.get(O);void 0!==a&&(a.failure=ae)},onBytesUploaded:e=>{ce[o]=e,q[o]={...q[o],bytesTransferred:e,percent:Math.min(99,Math.floor(e/n.data.size*100)),state:"running"},pe()}});if(!re())return;r.uploaded=e,q[o]={...q[o],bytesTransferred:n.data.size,percent:100,state:"completed"},ce[o]=n.data.size,pe()}catch(t){re()&&!ne.signal.aborted&&(q[o]={...q[o],state:"failed"}),((t,a)=>{void 0===me&&(me=ne.signal.aborted?D.get(O)??"cancelled":"upload-failed","upload-failed"===me&&i.onMediaTransferError?.({stage:"upload",kind:t,messageId:O,conversation:C,cause:a}),e(ne,"offline"))})(n.kind,t)}})),!E())return{ok:!1,reason:"cancelled"};if(!re())return{ok:!1,reason:"cancelled"};if("cancelled"===D.get(O))return"cleanup-unconfirmed"!==ae&&!0!==z.get(O)?.retainCheckpoint&&await fe(),E()?ve("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==me)return ve(me);if(ne.signal.aborted){return ve(D.get(O)??"cancelled")}const n=V();let o;try{o=d(s(n).content)}catch(e){return i.onMediaAlbumContentSize?.({messageId:O,conversation:C,itemCount:n.items.length,outcome:"rejected",cause:e}),ie("content-too-large",!1)}if(o>=l&&i.onMediaAlbumContentSize?.({messageId:O,conversation:C,itemCount:n.items.length,contentBytes:o,outcome:"warn"}),_===Q&&void 0!==i.mediaAssetCache){const e=i.mediaAssetCache;u.items.forEach((t,a)=>{const n=L[a].uploaded;void 0!==n&&e.put({kind:t.kind,messageId:O,resourceVersion:p(n.url,{conversation:C,itemIndex:a}),blob:t.data,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{i.onMediaAssetCacheError?.({operation:"put",kind:t.kind,messageId:O,byteLength:t.data.size,cause:e})})})}return i.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:O,conversationId:u.conversationId,conversationType:u.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:n},encryption:{encrypted:x},createdAt:F,...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}}),ee(O,u,"completed",100),{ok:!0,messageId:O}}finally{E()||P(O,L),K.get(O)===ne&&(K.delete(O),R.delete(O),W.has(O)||$.delete(O),D.delete(O))}}function le(e,t,a,n=1){const{id:o,createdAt:r}=a??i.outbox.allocateMessageIdentity(X(e)),d={attempt:n};let s,l;G.delete(o),z.set(o,d);const c=new Promise((e,t)=>{s=e,l=t});return d.done=c,(async()=>{let e=await t(o,r);for(;z.get(o)===d&&void 0===d.stopped&&d.attempt<3;){const t=W.get(o);if(!H||e.ok||void 0===t||t.restartRequired||"network"!==d.failure&&"timeout"!==d.failure&&"credentials-expired"!==d.failure&&(e.ok||"offline"!==e.reason||void 0===i.waitUntilOnline))break;const a=new AbortController;if(d.waiting=a,await(i.waitUntilOnline?.(a.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(i,1===d.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(i.waitUntilOnline?.(a.signal).catch(()=>{})),delete d.waiting,!H||void 0!==d.stopped||z.get(o)!==d)break;d.attempt+=1,d.refreshCredentials="credentials-expired"===d.failure,delete d.failure,W.delete(o),G.delete(o),e=await ce(o,t,!1)}const a=W.get(o),n="cancelled"!==d.stopped&&d.attempt>=3&&("network"===d.failure||"timeout"===d.failure||"credentials-expired"===d.failure);if(H&&z.get(o)===d&&void 0!==a&&n&&!0===i.retainFailedUploads){d.stopped="cancelled",d.retainCheckpoint=!0,a.retainCheckpoint=!0;const e={...C(a),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};i.domainState.upsertMessages([{...a.message,status:"failed",failure:e}],"live"),ee(o,a.input,"failed",$.get(o)??0,e)}else if(H&&z.get(o)===d&&void 0!==a&&("cancelled"===d.stopped||n)){d.stopped="cancelled";const t={...C(a),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===d.retainCheckpoint&&!n};(!0!==d.retainCheckpoint||n)&&await fe(o,a),H&&z.get(o)===d&&(i.domainState.upsertMessages([{...a.message,status:"failed",failure:t}],"live"),ee(o,a.input,"canceled",$.get(o)??0,t)),e={ok:!1,reason:"cancelled"}}return"paused"===d.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{d.settled=!0,re(o),s(e)},e=>{d.settled=!0,re(o),l(e)}),c.then(()=>{z.get(o)===d&&"paused"!==d.stopped&&(z.delete(o),W.has(o)||($.delete(o),Y.delete(o),N.delete(o),S.delete(o),x.delete(o),j.delete(o)))},()=>{z.get(o)===d&&z.delete(o)}),c}function ce(e,t,a){return"album"===t.kind?se(t.input,e,t.createdAt,t.items,a):de(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function ue(t,a){const i=z.get(t);if(!H||void 0===i||"cancelled"===i.stopped)return;if("paused"===i.stopped)return void("pagehide"===a&&"offline"===i.pauseReason&&(i.pauseReason="pagehide"));i.stopped="paused",i.pauseReason=a;const n=K.get(t);i.waiting?.abort(),void 0!==n&&e(n,"paused");const o=j.get(t);void 0!==o&&z.get(t)===i&&"paused"===i.stopped&&ee(t,o.input,"paused",$.get(t)??o.percent)}async function pe(e,t="manual"){const a=z.get(e);if(!H||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,re(e),H&&z.get(e)===a&&W.has(e);ue(e,t),await a.done,await Promise.all(L(e));const i=W.get(e);return!(!H||z.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(ee(e,i.input,"paused",$.get(e)??0),!0)}function me(e){oe();const t=z.get(e),a=W.get(e);if(!H||"paused"!==t?.stopped||!0!==t.settled||void 0===a||K.has(e))return!1;W.delete(e),G.delete(e);const n=J;return le(a.input,()=>ce(e,a,!1),{id:e,createdAt:a.createdAt},t.attempt).catch(t=>{H&&n===J&&i.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:X(a.input),cause:t})}),!0}async function fe(e,t){W.delete(e),G.delete(e),S.delete(e),x.delete(e),Y.delete(e),N.delete(e),V.add(e);try{await Promise.all(L(e)),await(i.recoveryPort?.remove(X(t.input),e).catch(a=>{i.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:X(t.input),cause:a})})),await Promise.all(E(t).map(async a=>{try{await i.mediaTransfer.abandonUpload(a.resume)}catch(n){i.onMediaTransferError?.({stage:"upload",kind:a.kind,messageId:e,conversation:X(t.input),cause:n})}}))}catch(a){i.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:X(t.input),cause:a})}finally{V.delete(e),S.delete(e),x.delete(e),Y.delete(e)}}function ve(t,a){if(oe(),!H)return!1;const n=z.get(t),o=K.get(t);if(!0!==a?.retainCheckpoint&&O.get(t)?.abort(),void 0!==n&&(n.stopped="cancelled",n.retainCheckpoint=!0===a?.retainCheckpoint,n.waiting?.abort()),void 0!==o){const n=R.get(t);return void 0!==n&&!0!==a?.retainCheckpoint&&function(e,t){if(void 0===i.recoveryPort)return;const a=L(e),n="video"===i.domainState.getConversationMessage?.(t,e)?.contentType?"video":"file",o=Promise.all(a).then(()=>i.recoveryPort.remove(t,e)).catch(a=>{i.onMediaTransferError?.({stage:"upload",kind:n,messageId:e,conversation:t,cause:a})});F(e,o)}(t,n),D.set(t,"cancelled"),e(o,!0===a?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const r=W.get(t);if(void 0===r||void 0===n)return void 0!==n&&"queued"===j.get(t)?.state;if(!0===a?.retainCheckpoint)r.retainCheckpoint=!0,r.failureReason="cancelled";else{F(t,fe(t,r))}const d={...C(r),displayCode:"media.cancelled",retryable:!0===a?.retainCheckpoint};return i.domainState.upsertMessages([{...r.message,status:"failed",failure:d}],"live"),ee(t,r.input,"canceled",$.get(t)??0,d),z.get(t)===n&&z.delete(t),re(t),!0!==a?.retainCheckpoint&&($.delete(t),N.delete(t),j.delete(t)),!0}async function ge(e,t,a,i){oe();const n=J,o=L(t);return o.length>0&&await Promise.all(o),H&&n===J?(x.delete(t),le(i,()=>de(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>le(e,(t,a)=>de(y,e,t,a)),sendVideo:e=>le(e,(t,a)=>de(h,e,t,a)),replaceVideo:(e,t,a)=>ge(h,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"}):le(e,(t,a)=>de(w,e,t,a))},sendFile:e=>void 0!==e.caption&&Array.from(e.caption).length>n?Promise.resolve({ok:!1,reason:"content-too-large"}):le(e,(t,a)=>de(e.filesAlbum||e.caption?.trim()?k:T,e,t,a)),sendGif:e=>le(e,(t,a)=>de(b,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>le(e,(t,a)=>se(e,t,a)),replaceFile:(e,t,a)=>void 0!==a.caption&&Array.from(a.caption).length>n?Promise.resolve({ok:!1,reason:"content-too-large"}):ge(a.filesAlbum||a.caption?.trim()?k:T,e,t,a),cancel:ve,pause:pe,async pauseAll(e="pagehide"){for(const{controller:e}of q.values())e.abort();await Promise.all([...z.keys()].map(t=>pe(t,e)))},async resumePaused(e,t){await Promise.all([...z.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=j.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=W.get(a);t?.aborted||z.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)&&me(a)}))},resume:me,cancelConversation(t,a="offline"){for(const e of q.values())e.ref.conversationType===t.conversationType&&e.ref.conversationId===t.conversationId&&e.controller.abort();for(const[e,a]of W)if(a.input.conversationType===t.conversationType&&a.input.conversationId===t.conversationId){if(z.has(e))ve(e);else{for(const t of E(a))Z(t.resume,t.kind,e,X(a.input));i.recoveryPort?.remove(X(a.input),e).catch(n=>i.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:t,cause:n}))}W.delete(e),G.delete(e),N.delete(e),Y.delete(e),$.delete(e),j.delete(e)}if(H)for(const[i,n]of R){if(n.conversationType!==t.conversationType||n.conversationId!==t.conversationId)continue;const o=K.get(i);if(void 0===o)continue;const r=z.get(i);void 0!==r&&(r.stopped="cancelled"),D.set(i,a),O.get(i)?.abort(),e(o,a)}},cancelAll(t="offline"){if(H){if("offline"===t){const e=J;for(const t of z.keys()){const a=j.get(t)?.input;pe(t,"offline").catch(n=>{H&&e===J&&void 0!==a&&i.onMediaTransferError?.({stage:"upload",kind:"video"===i.domainState.getConversationMessage?.(a,t)?.contentType?"video":"file",messageId:t,conversation:a,cause:n})})}return}if("session-ended"===t){for(const{controller:e}of q.values())e.abort();for(const e of z.values())e.stopped="cancelled",e.waiting?.abort();J+=1,Q+=1}for(const a of O.values())e(a,t);for(const a of K.values())e(a,t)}},retry(e,t){if(oe(),V.has(e))return!1;if(!H)return!1;const a=W.get(e);if(void 0===a)return!1;if(!0===z.get(e)?.retainCheckpoint&&!0!==z.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 W.delete(e),G.delete(e),le(a.input,()=>ce(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:oe,invalidateAssetCacheWrites(){Q+=1},async dispose(t){if(!H)return;U=!0===t?.preserveRecovery;for(const{controller:e}of q.values())e.abort();const a=[...z.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of z.values())e.stopped="cancelled",e.waiting?.abort();if(H=!1,Q+=1,!U)for(const e of O.values())e.abort();for(const t of K.values())e(t,U?"page-preserve":"cancelled");for(const[e,t]of W)if(!U||"available"!==S.get(e)?.recovery)for(const a of E(t))Z(a.resume,a.kind,e,X(t.input));W.clear(),G.clear(),await Promise.allSettled(a),await Promise.all([..._]),K.clear(),$.clear(),D.clear();for(const[e,t]of W)if(!U||"available"!==S.get(e)?.recovery)for(const a of E(t))Z(a.resume,a.kind,e,X(t.input));W.clear(),G.clear(),z.clear(),Y.clear(),N.clear(),S.clear(),x.clear(),j.clear(),await(i.recoveryPort?.drain())},async recoverUpload(e,t,a){oe();const n=i.recoveryPort;if(!H||void 0===n)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(z.has(t)||q.has(t))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const o=new AbortController;q.set(t,{controller:o,ref:e});const r=()=>{if(!H||o.signal.aborted||q.get(t)?.controller!==o)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},d=(e,t)=>{if(void 0===e||e.senderId!==i.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,n="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(a||n)&&(void 0===t||e.contentType===t)};let s;try{s=await n.acquireLease(o.signal),r();const l=i.domainState.getConversationMessage?.(e,t);if(!d(l))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const c=await n.get(e,t);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(a,o.signal);if(r(),p.size!==c.source.size||p.sha256!==c.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=i.domainState.getConversationMessage?.(e,t);if(z.has(t)||!d(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:a,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 x.set(t,c.savedAt),await le(f,()=>de("video"===c.kind?h:c.filesAlbum||c.caption?.trim()?k:T,f,t,c.createdAt,c.teaKey,c.resume),{id:t,createdAt:c.createdAt})}finally{q.get(t)?.controller===o&&q.delete(t),re(t),s?.release()}}}}export{K as createMediaSender};
@@ -1 +1 @@
1
- import{createConversationCapabilitiesApi as e}from"./product/capabilities.js";import{toProductConversationListItem as n,createProductConversationsApi as t}from"./product/conversations.js";import{createProductEventsApi as r}from"./product/events.js";import{createLocalDataApi as o,createLocalDataError as a}from"./product/local-data.js";import{createImSdkError as s}from"./product/message.js";import{toProductProfileError as i,toProductGroupProfile as c,toProductChannelProfile as l,toProductContactProfile as p,toProductGroupPinnedMessage as u,toProductChannelPinnedMessage as d}from"./product/profiles.js";import{registerAdvancedMessageDiagnosticOperations as g,getAdvancedMessageDiagnosticOperations as v}from"./runtime/advanced-message-diagnostics.js";import{createSessionRuntime as h}from"./runtime/session-runtime.js";import{createImCacheNamespaceFactory as m}from"../../im-core/src/cache-namespace.js";import{createLazyBrowserApiProtocolClient as y}from"../../im-browser/src/http/lazy-api-protocol-client.js";import{createImEventEmitter as P}from"../../im-core/src/event-emitter.js";function b(e){const n=function(e){const n=f(e);return{...n,...void 0===e.coreApi?{}:{coreClient:A(e.authProvider,e.coreApi)}}}(e);return M(F(n),void 0!==e.coreApi)}function I(e){return F(function(e){const{adapters:n,channelJoinApplications:t,channelMembers:r,channelMentionMembers:o,channelProfile:a,contactApplications:s,coreApi:i,coreClient:c,directory:l,expressionProvider:p,sessionFavoriteProvider:u,http:d,network:g,profile:v,groupApplications:h,transport:m}=e,y=f(e);return{...y,adapters:n,channelJoinApplications:t,channelMembers:r,channelMentionMembers:o,channelProfile:a,contactApplications:s,directory:l,expressionProvider:p,sessionFavoriteProvider:u,...void 0!==c?{coreClient:c}:void 0===i?{}:{coreClient:A(e.authProvider,i)},http:d,network:g,profile:v,groupApplications:h,transport:m}}(e))}function f(e){const{authProvider:n,cache:t,clientType:r,connection:o,debug:a,endpointProvider:s,expressions:i,media:c,onRequestError:l,uploadRecovery:p}=e;return{authProvider:n,onRequestError:l,cache:t,clientType:r,connection:o,debug:a,endpointProvider:s,expressions:i,media:c,uploadRecovery:p}}function A(e,n){const t=n.baseUrl.trim();if(""===t)throw new Error("coreApi.baseUrl 不能为空");return y({config:{...void 0===n.appVersion?{}:{appVersion:n.appVersion},...void 0===n.envType?{}:{envType:n.envType},...void 0===n.brandId?{}:{brandId:n.brandId},...void 0===n.merchantId?{}:{merchantId:n.merchantId},...void 0===n.channelId?{}:{channelId:n.channelId},targets:{core:{baseUrl:t,prefix:n.prefix??"/api/h5"}}},getToken:async()=>(await e.getLoginContext())?.token,...void 0===n.getLocale?{}:{getLocale:n.getLocale}})}function M(r,o){const a=t({getCompatibilityApi:()=>r.conversations,subscribeEvents:e=>r.connection.subscribe(e),getSessionState:()=>r.session.getSnapshot().sessionState}),h={clearCache:()=>r.media.clearCache(),getSnapshot:()=>r.media.getSnapshot(),subscribe:e=>r.media.subscribe(e),cancel:(e,n)=>void 0===n?r.media.cancel(e):r.media.cancel(e,n),retry:(e,n)=>r.media.retry(e,n),pause:e=>r.media.pause(e),resume:e=>r.media.resume(e),getUploadRecovery:e=>r.media.getUploadRecovery(e),resumeUpload:(e,n)=>r.media.resumeUpload(e,n),download:(e,n)=>void 0===n?r.media.download(e):r.media.download(e,n),prioritizeDownload:e=>r.media.prioritizeDownload(e),probeCached:e=>r.media.probeCached(e),subscribeCacheChanges:e=>r.media.subscribeCacheChanges(e),getCached:e=>r.media.getCached(e),prepareLocalPreview:e=>r.media.prepareLocalPreview(e),prepareLocalVideoPoster:e=>r.media.prepareLocalVideoPoster(e),prepareLocalImageThumbnail:e=>r.media.prepareLocalImageThumbnail(e)},m=e=>Promise.reject(s({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:e,retryable:!1}));async function y(e,n,t){if(!o)return m(e);try{return await n()}catch(n){throw i(n,e,t)}}function P(e,n,t){if(!o)throw s({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:e,retryable:!1,conversation:t});try{return n()}catch(n){throw i(n,e,t)}}let b;const I=e=>y("contacts.getRelationship",()=>r.contacts.getRelationship(e)),f=(e,n)=>y("groups.getProfile",async()=>{const t=await r.groups.getProfile(e,n);return null===t?null:c(e,t)},e),A=(e,n)=>y("channels.getProfile",async()=>{const t=await r.channels.getProfile(e,n);return null===t?null:l(e,t)},e),M={listFirstPage:e=>y("contacts.listFirstPage",()=>r.contacts.listFirstPage(e)),listNextPage:e=>y("contacts.listNextPage",()=>r.contacts.listNextPage(e)),getProfile:(e,n)=>y("contacts.getProfile",async()=>{const t=await r.contacts.getProfile(e,n);return null===t?null:p(e,t)}),getRelationship:async e=>{const n=e.trim(),t={conversationType:"direct",conversationId:n},r=b?.beginProjectionUpdate(t),o=await I(e);return void 0!==r&&b?.updateRelationshipProjection(n,o,r),o},setRemark:(e,n)=>y("contacts.setRemark",()=>r.contacts.setRemark(e,{...void 0===n.name?{}:{name:n.name},...void 0===n.emails?{}:{email:[...n.emails]},...void 0===n.phones?{}:{phones:n.phones.map(e=>({countryCode:e.countryCode,mobile:e.mobile}))}})),searchUser:e=>y("contacts.searchUser",()=>r.contacts.searchUser(e)),requestFriendship:(e,n)=>y("contacts.requestFriendship",()=>r.contacts.requestFriendship(e,n)),blockUser:e=>y("contacts.blockUser",()=>r.contacts.blockUser(e),{conversationType:"direct",conversationId:e}),listBlocked:()=>y("contacts.listBlocked",()=>r.contacts.listBlocked()),unblockUser:e=>y("contacts.unblockUser",()=>r.contacts.unblockUser(e),{conversationType:"direct",conversationId:e}),reportUser:(e,n)=>y("contacts.reportUser",()=>r.contacts.reportUser(e,n),{conversationType:"direct",conversationId:e}),deleteFriendship:e=>y("contacts.deleteFriendship",()=>r.contacts.deleteFriendship(e),{conversationType:"direct",conversationId:e})},C={search:e=>y("directory.search",()=>r.directory.search(e))},F={listFirstPage:e=>y("groups.listFirstPage",()=>r.groups.listFirstPage(e)),listNextPage:e=>y("groups.listNextPage",()=>r.groups.listNextPage(e)),uploadAvatar:e=>y("groups.uploadAvatar",()=>r.groups.uploadAvatar(e)),create:e=>y("groups.create",()=>r.groups.create(e)),createFaceToFace:()=>y("groups.createFaceToFace",()=>r.groups.createFaceToFace()),mentions:o?r.groups.mentions:{listAll:()=>m("groups.mentions.listAll"),refreshAll:()=>m("groups.mentions.refreshAll")},getProfile:async(e,n)=>{const t=b?.beginProjectionUpdate(e),r=await f(e,n);return void 0!==t&&b?.updateGroupProfileProjection(e,r,t),r},updateName:(e,n)=>y("groups.updateName",()=>r.groups.updateName(e,n),e),updateAvatar:(e,n)=>y("groups.updateAvatar",()=>r.groups.updateAvatar(e,n),e),setMyNickname:(e,n)=>y("groups.setMyNickname",()=>r.groups.setMyNickname(e,n),e),updateVerification:(e,n,t)=>y("groups.updateVerification",()=>r.groups.updateVerification(e,n,t),e),requestJoin:(e,n)=>y("groups.requestJoin",()=>r.group.requestJoin(e.conversationId,n),e),joinByInviteCode:(e,n)=>y("groups.joinByInviteCode",()=>r.group.joinByInviteCode(e.conversationId,n),e),inviteMembers:(e,n)=>y("groups.inviteMembers",()=>r.group.inviteMembers(e.conversationId,n),e),removeMember:(e,n)=>y("groups.removeMember",()=>r.group.removeMember(e.conversationId,n),e),transferOwnership:(e,n)=>y("groups.transferOwnership",()=>r.group.transferOwnership(e.conversationId,n),e),leave:(e,n)=>y("groups.leave",()=>r.group.leave(e.conversationId,n),e),peekPinnedMessage:e=>P("groups.peekPinnedMessage",()=>{const n=r.group.peekPinnedMessage(e.conversationId);return null===n?null:u(e,n)},e),getPinnedMessage:e=>y("groups.getPinnedMessage",async()=>{const n=await r.groups.getPinnedMessage(e);return null===n?null:u(e,n)},e),pinMessage:(e,n)=>y("groups.pinMessage",async()=>{const t=await r.groups.pinMessage(e,n);return u(e,t)},e),unpinMessage:e=>y("groups.unpinMessage",()=>r.groups.unpinMessage(e),e)},w={listFirstPage:e=>y("channels.listFirstPage",()=>r.channels.listFirstPage(e)),listNextPage:e=>y("channels.listNextPage",()=>r.channels.listNextPage(e)),uploadAvatar:e=>y("channels.uploadAvatar",()=>r.channels.uploadAvatar(e)),create:e=>y("channels.create",()=>r.channels.create(e)),mentions:o?r.channels.mentions:{peekFirstPage:()=>null,peekSearchCandidates:()=>Object.freeze([]),getCachedPage:()=>m("channels.mentions.getCachedPage"),prefetchFirstPage:()=>m("channels.mentions.prefetchFirstPage"),refreshFirstPage:()=>m("channels.mentions.refreshFirstPage"),listFirstPage:()=>m("channels.mentions.listFirstPage"),listNextPage:()=>m("channels.mentions.listNextPage"),searchFirstPage:()=>m("channels.mentions.searchFirstPage"),refreshSearchFirstPage:()=>m("channels.mentions.refreshSearchFirstPage"),searchNextPage:()=>m("channels.mentions.searchNextPage")},getProfile:async(e,n)=>{const t=b?.beginProjectionUpdate(e),r=await A(e,n);return void 0!==t&&b?.updateChannelProfileProjection(e,r,t),r},updateName:(e,n)=>y("channels.updateName",()=>r.channel.updateName(e.conversationId,n),e),updateDescription:(e,n)=>y("channels.updateDescription",()=>r.channel.updateDescription(e.conversationId,n),e),updateAvatar:(e,n)=>y("channels.updateAvatar",()=>r.channel.updateAvatar(e.conversationId,n),e),updateVerification:(e,n,t)=>y("channels.updateVerification",()=>r.channels.updateVerification(e,n,t),e),requestJoin:(e,n)=>y("channels.requestJoin",()=>r.channel.requestJoin(e.conversationId,n),e),joinByInviteCode:(e,n)=>y("channels.joinByInviteCode",()=>r.channel.joinByInviteCode(e.conversationId,n),e),setAllMuted:(e,n)=>y("channels.setAllMuted",()=>r.channel.setAllMuted(e.conversationId,n),e),setMemberPrivateChatDisabled:(e,n)=>y("channels.setMemberPrivateChatDisabled",()=>r.channel.setMemberPrivateChatDisabled(e.conversationId,n),e),setMyNickname:(e,n)=>y("channels.setMyNickname",()=>r.channel.setMyNickname(e.conversationId,n),e),setMemberNickname:(e,n,t)=>y("channels.setMemberNickname",()=>r.channel.setMemberNickname(e.conversationId,n,t),e),inviteMembers:(e,n)=>y("channels.inviteMembers",()=>r.channel.inviteMembers(e.conversationId,n),e),removeMember:(e,n)=>y("channels.removeMember",()=>r.channel.removeMember(e.conversationId,n),e),addAdmin:(e,n)=>y("channels.addAdmin",()=>r.channel.addAdmin(e.conversationId,n),e),removeAdmin:(e,n)=>y("channels.removeAdmin",()=>r.channel.removeAdmin(e.conversationId,n),e),transferOwnership:(e,n)=>y("channels.transferOwnership",()=>r.channel.transferOwnership(e.conversationId,n),e),leave:(e,n)=>y("channels.leave",()=>r.channel.leave(e.conversationId,n),e),dismiss:e=>y("channels.dismiss",()=>r.channel.dismiss(e.conversationId),e),peekPinnedMessage:e=>P("channels.peekPinnedMessage",()=>{const n=r.channel.peekPinnedMessage(e.conversationId);return null===n?null:d(e,n)},e),getPinnedMessage:e=>y("channels.getPinnedMessage",async()=>{const n=await r.channels.getPinnedMessage(e);return null===n?null:d(e,n)},e),pinMessage:(e,n)=>y("channels.pinMessage",async()=>{const t=await r.channels.pinMessage(e,n);return d(e,t)},e),unpinMessage:e=>y("channels.unpinMessage",()=>r.channels.unpinMessage(e),e)},N=e({getSessionUserId:()=>r.session.getSnapshot().userId,getConversation:e=>{const t=r.conversations.getContext(e);return void 0===t?void 0:n({...t,draft:null})},subscribeConversations:e=>a.api.subscribe(n=>e(n.items)),subscribeContext:e=>r.connection.subscribe(n=>{"conversation-context:updated"===n.type&&"supergroup"!==n.conversation.conversationType&&e({conversationType:n.conversation.conversationType,conversationId:n.conversation.conversationId})}),getRelationship:I,getGroupProfile:f,getChannelProfile:A});b=N;const k=Object.freeze({start:e=>r.session.start(e),stop:e=>r.session.stop(e),logout:async e=>{N.reset();try{await r.session.logout(e)}finally{N.reset()}},getSnapshot:()=>r.session.getSnapshot(),subscribe:e=>r.session.subscribe(e)});const x={get session(){return k},get capabilities(){return N.api},get conversations(){return a.api},get directory(){return C},get customerService(){return r.customerService},get robots(){return r.robots},get contacts(){return M},get groups(){return F},get channels(){return w},get applications(){return r.applications},get expressions(){return r.expressions},get sessionFavorites(){return r.sessionFavorites},get outbox(){return r.outbox},get drafts(){return r.drafts},get search(){return r.search},get media(){return h},get settings(){return r.settings},get push(){return r.push},get activity(){return r.activity},get localData(){return r.localData},get events(){return r.events},openConversation:async function(e,n={}){const t=r.conversations,o=r.openConversation,a=await t.ensureOpenableConversation(e);return"direct"===a.conversationType?o({conversationType:"direct",conversationId:a.conversationId},n):"group"===a.conversationType?o({conversationType:"group",conversationId:a.conversationId},n):"customerService"===a.conversationType?o({conversationType:"customerService",conversationId:a.conversationId},n):"robot"===a.conversationType?o({conversationType:"robot",conversationId:a.conversationId},n):o({conversationType:"channel",conversationId:a.conversationId},n)},dispose:async()=>{N.dispose(),a.dispose(),await r.dispose()}};return g(x,()=>v(r)),x}function C(e,n){return M(e,n.coreApiAvailable)}function F(e){const t=m(e.cache?.prefix),s=e.adapters?.namespaceFactory??t;if(s.hostPrefix!==t.hostPrefix)throw new Error("adapters.namespaceFactory.hostPrefix 必须与 cache.prefix 一致");const i=P();let c=0;const l=()=>h(e,i,s,c++);let p,u=l(),d=!1;async function v(e){if(d)throw new Error("IM SDK 已 dispose,不能 logout");const n=u;await n.teardown(e),d||u!==n||(u=l())}const y=o({getRuntime:()=>u.localData,purgeCurrentAccount:async function(){if(d)throw a({code:"IM_SDK_LOCAL_DATA_ACCOUNT_UNAVAILABLE",category:"state",operation:"localData.purgeCurrentAccount",retryable:!1});const e=u,n=await e.localData.getInfo();if(d||u!==e)throw a({code:"IM_SDK_LOCAL_DATA_ACCOUNT_UNAVAILABLE",category:"state",operation:"localData.purgeCurrentAccount",retryable:!1});let t;try{t=await e.teardown({localData:"purge"},{reportStorageErrors:!1})}catch(t){throw d||u!==e||(u=l()),a({code:"IM_SDK_LOCAL_DATA_PURGE_FAILED",category:"state",operation:"localData.purgeCurrentAccount",retryable:!0,accountScope:n.accountScope,cause:t})}if(d||u!==e||(u=l()),t.purgedAccountId!==n.accountScope)throw a({code:"IM_SDK_LOCAL_DATA_PURGE_FAILED",category:"state",operation:"localData.purgeCurrentAccount",retryable:!0,accountScope:n.accountScope,cause:t.purgeError??new Error("账号本地数据未完成删除")});i.emit({type:"local-data:cleared",accountScope:n.accountScope,category:"all"})}}),b={start:e=>u.connection.connect(e),stop:async e=>{u.connection.disconnect(e)},logout:v,getSnapshot:()=>u.connection.getLifecycle(),subscribe:e=>(e(u.connection.getLifecycle()),u.connection.subscribe(n=>{"connection:changed"!==n.type&&"receiving:changed"!==n.type&&"syncing:changed"!==n.type||e(u.connection.getLifecycle())}))},I=r({subscribeCore:e=>u.connection.subscribe(e),getLifecycleSnapshot:()=>u.connection.getLifecycle(),getConversation:e=>{const t=u.conversations.list().find(n=>n.type===e.conversationType&&n.id===e.conversationId);return void 0===t?void 0:n(t)},resolveContactApplicationAnswer:async e=>{const n=u,t=await n.contact.resolveApplicationAnswer(e.peerId,e.messageId);return u===n?t:null}}),f={listFirstPage:e=>u.contact.listFirstPage(e),listNextPage:e=>u.contact.listNextPage(e),getProfile:(e,n)=>u.contact.getProfile(e,n),getRelationship:e=>u.contact.getRelationship(e),setRemark:(e,n)=>u.contact.setRemark(e,n),searchUser:e=>u.contact.searchUser(e),requestFriendship:(e,n)=>u.contact.requestFriendship(e,n),blockUser:e=>u.contact.blockUser(e),listBlocked:()=>u.contact.listBlocked(),unblockUser:e=>u.contact.unblockUser(e),reportUser:(e,n)=>u.contact.reportUser(e,n),deleteFriendship:e=>u.contact.deleteFriendship(e)},A={listFirstPage:e=>u.group.listFirstPage(e),listNextPage:e=>u.group.listNextPage(e),uploadAvatar:e=>u.group.uploadAvatar(e),create:e=>u.group.create(e),createFaceToFace:()=>u.group.createFaceToFace(),get mentions(){return u.group.mentions},getProfile:(e,n)=>u.group.getProfile(e.conversationId,n),updateName:(e,n)=>u.group.updateName(e.conversationId,n),updateAvatar:async(e,n)=>{await u.group.updateAvatar(e.conversationId,n)},setMyNickname:(e,n)=>u.group.setMyNickname(e.conversationId,n),updateVerification:(e,n,t)=>u.group.updateVerification(e.conversationId,n,t),requestJoin:(e,n)=>u.group.requestJoin(e.conversationId,n),joinByInviteCode:(e,n)=>u.group.joinByInviteCode(e.conversationId,n),getPinnedMessage:e=>u.group.getPinnedMessage(e.conversationId),pinMessage:(e,n)=>u.group.pinMessage({groupId:e.conversationId,messageId:n}),unpinMessage:e=>u.group.unpinMessage(e.conversationId)},M={listFirstPage:e=>u.channel.listFirstPage(e),listNextPage:e=>u.channel.listNextPage(e),uploadAvatar:e=>u.channel.uploadAvatar(e),create:e=>u.channel.create(e),get mentions(){return u.channel.mentions},getProfile:(e,n)=>u.channel.getProfile(e.conversationId,n),updateVerification:(e,n,t)=>u.channel.updateVerification(e.conversationId,n,t),requestJoin:(e,n)=>u.channel.requestJoin(e.conversationId,n),joinByInviteCode:(e,n)=>u.channel.joinByInviteCode(e.conversationId,n),setAllMuted:(e,n)=>u.channel.setAllMuted(e.conversationId,n),setMemberPrivateChatDisabled:(e,n)=>u.channel.setMemberPrivateChatDisabled(e.conversationId,n),setMyNickname:(e,n)=>u.channel.setMyNickname(e.conversationId,n),setMemberNickname:(e,n,t)=>u.channel.setMemberNickname(e.conversationId,n,t),dismiss:e=>u.channel.dismiss(e.conversationId),getPinnedMessage:e=>u.channel.getPinnedMessage(e.conversationId),pinMessage:(e,n)=>u.channel.pinMessage({channelId:e.conversationId,messageId:n}),unpinMessage:e=>u.channel.unpinMessage(e.conversationId)};const C={get session(){return b},get connection(){return u.connection},get conversations(){return u.conversations},get directory(){return u.directory},get customerService(){return u.customerService},get robots(){return u.robots},get contacts(){return f},get groups(){return A},get channels(){return M},get events(){return I},get contact(){return u.contact},get group(){return u.group},get channel(){return u.channel},get media(){return u.media},get calls(){return u.calls},get groupCalls(){return u.groupCalls},get settings(){return u.settings},get push(){return u.push},get activity(){return u.activity},get outbox(){return u.outbox},get localData(){return y},get search(){return u.search},get applications(){return u.applications},get expressions(){return u.expressions},get sessionFavorites(){return u.sessionFavorites},get drafts(){return u.drafts},get openConversation(){return u.openConversation},logout:v,dispose:function(){return void 0!==p||(d=!0,p=u.teardown({localData:"preserve"},{preserveUploadRecovery:!0}).then(()=>i.clear())),p}};return g(C,()=>u.advancedMessageDiagnostics),C}export{I as createAdvancedImClient,b as createImClient,C as createProductClientFacade};
1
+ import{createConversationCapabilitiesApi as e}from"./product/capabilities.js";import{toProductConversationListItem as n,createProductConversationsApi as t}from"./product/conversations.js";import{createProductEventsApi as r}from"./product/events.js";import{createLocalDataApi as o,createLocalDataError as a}from"./product/local-data.js";import{createImSdkError as s}from"./product/message.js";import{toProductProfileError as i,toProductGroupProfile as c,toProductChannelProfile as l,toProductContactProfile as p,toProductGroupPinnedMessage as d,toProductChannelPinnedMessage as u}from"./product/profiles.js";import{registerAdvancedMessageDiagnosticOperations as g,getAdvancedMessageDiagnosticOperations as v}from"./runtime/advanced-message-diagnostics.js";import{createSessionRuntime as h}from"./runtime/session-runtime.js";import{createImCacheNamespaceFactory as m}from"../../im-core/src/cache-namespace.js";import{createLazyBrowserApiProtocolClient as y}from"../../im-browser/src/http/lazy-api-protocol-client.js";import{createImEventEmitter as P}from"../../im-core/src/event-emitter.js";function b(e){const n=function(e){const n=f(e);return{...n,...void 0===e.coreApi?{}:{coreClient:A(e.authProvider,e.coreApi)}}}(e);return M(F(n),void 0!==e.coreApi)}function I(e){return F(function(e){const{adapters:n,channelJoinApplications:t,channelMembers:r,channelMentionMembers:o,channelProfile:a,contactApplications:s,coreApi:i,coreClient:c,directory:l,expressionProvider:p,sessionFavoriteProvider:d,http:u,network:g,profile:v,groupApplications:h,transport:m}=e,y=f(e);return{...y,adapters:n,channelJoinApplications:t,channelMembers:r,channelMentionMembers:o,channelProfile:a,contactApplications:s,directory:l,expressionProvider:p,sessionFavoriteProvider:d,...void 0!==c?{coreClient:c}:void 0===i?{}:{coreClient:A(e.authProvider,i)},http:u,network:g,profile:v,groupApplications:h,transport:m}}(e))}function f(e){const{authProvider:n,cache:t,clientType:r,connection:o,debug:a,endpointProvider:s,expressions:i,media:c,onRequestError:l,uploadRecovery:p}=e;return{authProvider:n,onRequestError:l,cache:t,clientType:r,connection:o,debug:a,endpointProvider:s,expressions:i,media:c,uploadRecovery:p}}function A(e,n){const t=n.baseUrl.trim();if(""===t)throw new Error("coreApi.baseUrl 不能为空");return y({config:{...void 0===n.appVersion?{}:{appVersion:n.appVersion},...void 0===n.envType?{}:{envType:n.envType},...void 0===n.brandId?{}:{brandId:n.brandId},...void 0===n.merchantId?{}:{merchantId:n.merchantId},...void 0===n.channelId?{}:{channelId:n.channelId},targets:{core:{baseUrl:t,prefix:n.prefix??"/api/h5"}}},getToken:async()=>(await e.getLoginContext())?.token,...void 0===n.getLocale?{}:{getLocale:n.getLocale}})}function M(r,o){const a=t({getCompatibilityApi:()=>r.conversations,subscribeEvents:e=>r.connection.subscribe(e),getSessionState:()=>r.session.getSnapshot().sessionState}),h={clearCache:()=>r.media.clearCache(),getSnapshot:()=>r.media.getSnapshot(),subscribe:e=>r.media.subscribe(e),cancel:(e,n)=>void 0===n?r.media.cancel(e):r.media.cancel(e,n),retry:(e,n)=>r.media.retry(e,n),pause:e=>r.media.pause(e),resume:e=>r.media.resume(e),getUploadRecovery:e=>r.media.getUploadRecovery(e),resumeUpload:(e,n)=>r.media.resumeUpload(e,n),download:(e,n)=>void 0===n?r.media.download(e):r.media.download(e,n),prioritizeDownload:e=>r.media.prioritizeDownload(e),probeCached:e=>r.media.probeCached(e),subscribeCacheChanges:e=>r.media.subscribeCacheChanges(e),getCached:e=>r.media.getCached(e),prepareLocalPreview:e=>r.media.prepareLocalPreview(e),prepareLocalVideoPoster:e=>r.media.prepareLocalVideoPoster(e),prepareLocalImageThumbnail:e=>r.media.prepareLocalImageThumbnail(e),prepareLocalImageDisplay:e=>r.media.prepareLocalImageDisplay(e),getCachedImageDisplay:(e,n)=>r.media.getCachedImageDisplay(e,n),getCachedVideoPoster:(e,n)=>r.media.getCachedVideoPoster(e,n)},m=e=>Promise.reject(s({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:e,retryable:!1}));async function y(e,n,t){if(!o)return m(e);try{return await n()}catch(n){throw i(n,e,t)}}function P(e,n,t){if(!o)throw s({code:"IM_SDK_CORE_API_UNAVAILABLE",category:"contract",operation:e,retryable:!1,conversation:t});try{return n()}catch(n){throw i(n,e,t)}}let b;const I=e=>y("contacts.getRelationship",()=>r.contacts.getRelationship(e)),f=(e,n)=>y("groups.getProfile",async()=>{const t=await r.groups.getProfile(e,n);return null===t?null:c(e,t)},e),A=(e,n)=>y("channels.getProfile",async()=>{const t=await r.channels.getProfile(e,n);return null===t?null:l(e,t)},e),M={listFirstPage:e=>y("contacts.listFirstPage",()=>r.contacts.listFirstPage(e)),listNextPage:e=>y("contacts.listNextPage",()=>r.contacts.listNextPage(e)),getProfile:(e,n)=>y("contacts.getProfile",async()=>{const t=await r.contacts.getProfile(e,n);return null===t?null:p(e,t)}),getRelationship:async e=>{const n=e.trim(),t={conversationType:"direct",conversationId:n},r=b?.beginProjectionUpdate(t),o=await I(e);return void 0!==r&&b?.updateRelationshipProjection(n,o,r),o},setRemark:(e,n)=>y("contacts.setRemark",()=>r.contacts.setRemark(e,{...void 0===n.name?{}:{name:n.name},...void 0===n.emails?{}:{email:[...n.emails]},...void 0===n.phones?{}:{phones:n.phones.map(e=>({countryCode:e.countryCode,mobile:e.mobile}))}})),searchUser:e=>y("contacts.searchUser",()=>r.contacts.searchUser(e)),requestFriendship:(e,n)=>y("contacts.requestFriendship",()=>r.contacts.requestFriendship(e,n)),blockUser:e=>y("contacts.blockUser",()=>r.contacts.blockUser(e),{conversationType:"direct",conversationId:e}),listBlocked:()=>y("contacts.listBlocked",()=>r.contacts.listBlocked()),unblockUser:e=>y("contacts.unblockUser",()=>r.contacts.unblockUser(e),{conversationType:"direct",conversationId:e}),reportUser:(e,n)=>y("contacts.reportUser",()=>r.contacts.reportUser(e,n),{conversationType:"direct",conversationId:e}),deleteFriendship:e=>y("contacts.deleteFriendship",()=>r.contacts.deleteFriendship(e),{conversationType:"direct",conversationId:e})},C={search:e=>y("directory.search",()=>r.directory.search(e))},F={listFirstPage:e=>y("groups.listFirstPage",()=>r.groups.listFirstPage(e)),listNextPage:e=>y("groups.listNextPage",()=>r.groups.listNextPage(e)),uploadAvatar:e=>y("groups.uploadAvatar",()=>r.groups.uploadAvatar(e)),create:e=>y("groups.create",()=>r.groups.create(e)),createFaceToFace:()=>y("groups.createFaceToFace",()=>r.groups.createFaceToFace()),mentions:o?r.groups.mentions:{listAll:()=>m("groups.mentions.listAll"),refreshAll:()=>m("groups.mentions.refreshAll")},getProfile:async(e,n)=>{const t=b?.beginProjectionUpdate(e),r=await f(e,n);return void 0!==t&&b?.updateGroupProfileProjection(e,r,t),r},updateName:(e,n)=>y("groups.updateName",()=>r.groups.updateName(e,n),e),updateAvatar:(e,n)=>y("groups.updateAvatar",()=>r.groups.updateAvatar(e,n),e),setMyNickname:(e,n)=>y("groups.setMyNickname",()=>r.groups.setMyNickname(e,n),e),updateVerification:(e,n,t)=>y("groups.updateVerification",()=>r.groups.updateVerification(e,n,t),e),requestJoin:(e,n)=>y("groups.requestJoin",()=>r.group.requestJoin(e.conversationId,n),e),joinByInviteCode:(e,n)=>y("groups.joinByInviteCode",()=>r.group.joinByInviteCode(e.conversationId,n),e),inviteMembers:(e,n)=>y("groups.inviteMembers",()=>r.group.inviteMembers(e.conversationId,n),e),removeMember:(e,n)=>y("groups.removeMember",()=>r.group.removeMember(e.conversationId,n),e),transferOwnership:(e,n)=>y("groups.transferOwnership",()=>r.group.transferOwnership(e.conversationId,n),e),leave:(e,n)=>y("groups.leave",()=>r.group.leave(e.conversationId,n),e),peekPinnedMessage:e=>P("groups.peekPinnedMessage",()=>{const n=r.group.peekPinnedMessage(e.conversationId);return null===n?null:d(e,n)},e),getPinnedMessage:e=>y("groups.getPinnedMessage",async()=>{const n=await r.groups.getPinnedMessage(e);return null===n?null:d(e,n)},e),pinMessage:(e,n)=>y("groups.pinMessage",async()=>{const t=await r.groups.pinMessage(e,n);return d(e,t)},e),unpinMessage:e=>y("groups.unpinMessage",()=>r.groups.unpinMessage(e),e)},w={listFirstPage:e=>y("channels.listFirstPage",()=>r.channels.listFirstPage(e)),listNextPage:e=>y("channels.listNextPage",()=>r.channels.listNextPage(e)),uploadAvatar:e=>y("channels.uploadAvatar",()=>r.channels.uploadAvatar(e)),create:e=>y("channels.create",()=>r.channels.create(e)),mentions:o?r.channels.mentions:{peekFirstPage:()=>null,peekSearchCandidates:()=>Object.freeze([]),getCachedPage:()=>m("channels.mentions.getCachedPage"),prefetchFirstPage:()=>m("channels.mentions.prefetchFirstPage"),refreshFirstPage:()=>m("channels.mentions.refreshFirstPage"),listFirstPage:()=>m("channels.mentions.listFirstPage"),listNextPage:()=>m("channels.mentions.listNextPage"),searchFirstPage:()=>m("channels.mentions.searchFirstPage"),refreshSearchFirstPage:()=>m("channels.mentions.refreshSearchFirstPage"),searchNextPage:()=>m("channels.mentions.searchNextPage")},getProfile:async(e,n)=>{const t=b?.beginProjectionUpdate(e),r=await A(e,n);return void 0!==t&&b?.updateChannelProfileProjection(e,r,t),r},updateName:(e,n)=>y("channels.updateName",()=>r.channel.updateName(e.conversationId,n),e),updateDescription:(e,n)=>y("channels.updateDescription",()=>r.channel.updateDescription(e.conversationId,n),e),updateAvatar:(e,n)=>y("channels.updateAvatar",()=>r.channel.updateAvatar(e.conversationId,n),e),updateVerification:(e,n,t)=>y("channels.updateVerification",()=>r.channels.updateVerification(e,n,t),e),requestJoin:(e,n)=>y("channels.requestJoin",()=>r.channel.requestJoin(e.conversationId,n),e),joinByInviteCode:(e,n)=>y("channels.joinByInviteCode",()=>r.channel.joinByInviteCode(e.conversationId,n),e),setAllMuted:(e,n)=>y("channels.setAllMuted",()=>r.channel.setAllMuted(e.conversationId,n),e),setMemberPrivateChatDisabled:(e,n)=>y("channels.setMemberPrivateChatDisabled",()=>r.channel.setMemberPrivateChatDisabled(e.conversationId,n),e),setMyNickname:(e,n)=>y("channels.setMyNickname",()=>r.channel.setMyNickname(e.conversationId,n),e),setMemberNickname:(e,n,t)=>y("channels.setMemberNickname",()=>r.channel.setMemberNickname(e.conversationId,n,t),e),inviteMembers:(e,n)=>y("channels.inviteMembers",()=>r.channel.inviteMembers(e.conversationId,n),e),removeMember:(e,n)=>y("channels.removeMember",()=>r.channel.removeMember(e.conversationId,n),e),addAdmin:(e,n)=>y("channels.addAdmin",()=>r.channel.addAdmin(e.conversationId,n),e),removeAdmin:(e,n)=>y("channels.removeAdmin",()=>r.channel.removeAdmin(e.conversationId,n),e),transferOwnership:(e,n)=>y("channels.transferOwnership",()=>r.channel.transferOwnership(e.conversationId,n),e),leave:(e,n)=>y("channels.leave",()=>r.channel.leave(e.conversationId,n),e),dismiss:e=>y("channels.dismiss",()=>r.channel.dismiss(e.conversationId),e),peekPinnedMessage:e=>P("channels.peekPinnedMessage",()=>{const n=r.channel.peekPinnedMessage(e.conversationId);return null===n?null:u(e,n)},e),getPinnedMessage:e=>y("channels.getPinnedMessage",async()=>{const n=await r.channels.getPinnedMessage(e);return null===n?null:u(e,n)},e),pinMessage:(e,n)=>y("channels.pinMessage",async()=>{const t=await r.channels.pinMessage(e,n);return u(e,t)},e),unpinMessage:e=>y("channels.unpinMessage",()=>r.channels.unpinMessage(e),e)},N=e({getSessionUserId:()=>r.session.getSnapshot().userId,getConversation:e=>{const t=r.conversations.getContext(e);return void 0===t?void 0:n({...t,draft:null})},subscribeConversations:e=>a.api.subscribe(n=>e(n.items)),subscribeContext:e=>r.connection.subscribe(n=>{"conversation-context:updated"===n.type&&"supergroup"!==n.conversation.conversationType&&e({conversationType:n.conversation.conversationType,conversationId:n.conversation.conversationId})}),getRelationship:I,getGroupProfile:f,getChannelProfile:A});b=N;const k=Object.freeze({start:e=>r.session.start(e),stop:e=>r.session.stop(e),logout:async e=>{N.reset();try{await r.session.logout(e)}finally{N.reset()}},getSnapshot:()=>r.session.getSnapshot(),subscribe:e=>r.session.subscribe(e)});const x={get session(){return k},get capabilities(){return N.api},get conversations(){return a.api},get directory(){return C},get customerService(){return r.customerService},get robots(){return r.robots},get contacts(){return M},get groups(){return F},get channels(){return w},get applications(){return r.applications},get expressions(){return r.expressions},get sessionFavorites(){return r.sessionFavorites},get outbox(){return r.outbox},get drafts(){return r.drafts},get search(){return r.search},get media(){return h},get settings(){return r.settings},get push(){return r.push},get activity(){return r.activity},get localData(){return r.localData},get events(){return r.events},openConversation:async function(e,n={}){const t=r.conversations,o=r.openConversation,a=await t.ensureOpenableConversation(e);return"direct"===a.conversationType?o({conversationType:"direct",conversationId:a.conversationId},n):"group"===a.conversationType?o({conversationType:"group",conversationId:a.conversationId},n):"customerService"===a.conversationType?o({conversationType:"customerService",conversationId:a.conversationId},n):"robot"===a.conversationType?o({conversationType:"robot",conversationId:a.conversationId},n):o({conversationType:"channel",conversationId:a.conversationId},n)},dispose:async()=>{N.dispose(),a.dispose(),await r.dispose()}};return g(x,()=>v(r)),x}function C(e,n){return M(e,n.coreApiAvailable)}function F(e){const t=m(e.cache?.prefix),s=e.adapters?.namespaceFactory??t;if(s.hostPrefix!==t.hostPrefix)throw new Error("adapters.namespaceFactory.hostPrefix 必须与 cache.prefix 一致");const i=P();let c=0;const l=()=>h(e,i,s,c++);let p,d=l(),u=!1;async function v(e){if(u)throw new Error("IM SDK 已 dispose,不能 logout");const n=d;await n.teardown(e),u||d!==n||(d=l())}const y=o({getRuntime:()=>d.localData,purgeCurrentAccount:async function(){if(u)throw a({code:"IM_SDK_LOCAL_DATA_ACCOUNT_UNAVAILABLE",category:"state",operation:"localData.purgeCurrentAccount",retryable:!1});const e=d,n=await e.localData.getInfo();if(u||d!==e)throw a({code:"IM_SDK_LOCAL_DATA_ACCOUNT_UNAVAILABLE",category:"state",operation:"localData.purgeCurrentAccount",retryable:!1});let t;try{t=await e.teardown({localData:"purge"},{reportStorageErrors:!1})}catch(t){throw u||d!==e||(d=l()),a({code:"IM_SDK_LOCAL_DATA_PURGE_FAILED",category:"state",operation:"localData.purgeCurrentAccount",retryable:!0,accountScope:n.accountScope,cause:t})}if(u||d!==e||(d=l()),t.purgedAccountId!==n.accountScope)throw a({code:"IM_SDK_LOCAL_DATA_PURGE_FAILED",category:"state",operation:"localData.purgeCurrentAccount",retryable:!0,accountScope:n.accountScope,cause:t.purgeError??new Error("账号本地数据未完成删除")});i.emit({type:"local-data:cleared",accountScope:n.accountScope,category:"all"})}}),b={start:e=>d.connection.connect(e),stop:async e=>{d.connection.disconnect(e)},logout:v,getSnapshot:()=>d.connection.getLifecycle(),subscribe:e=>(e(d.connection.getLifecycle()),d.connection.subscribe(n=>{"connection:changed"!==n.type&&"receiving:changed"!==n.type&&"syncing:changed"!==n.type||e(d.connection.getLifecycle())}))},I=r({subscribeCore:e=>d.connection.subscribe(e),getLifecycleSnapshot:()=>d.connection.getLifecycle(),getConversation:e=>{const t=d.conversations.list().find(n=>n.type===e.conversationType&&n.id===e.conversationId);return void 0===t?void 0:n(t)},resolveContactApplicationAnswer:async e=>{const n=d,t=await n.contact.resolveApplicationAnswer(e.peerId,e.messageId);return d===n?t:null}}),f={listFirstPage:e=>d.contact.listFirstPage(e),listNextPage:e=>d.contact.listNextPage(e),getProfile:(e,n)=>d.contact.getProfile(e,n),getRelationship:e=>d.contact.getRelationship(e),setRemark:(e,n)=>d.contact.setRemark(e,n),searchUser:e=>d.contact.searchUser(e),requestFriendship:(e,n)=>d.contact.requestFriendship(e,n),blockUser:e=>d.contact.blockUser(e),listBlocked:()=>d.contact.listBlocked(),unblockUser:e=>d.contact.unblockUser(e),reportUser:(e,n)=>d.contact.reportUser(e,n),deleteFriendship:e=>d.contact.deleteFriendship(e)},A={listFirstPage:e=>d.group.listFirstPage(e),listNextPage:e=>d.group.listNextPage(e),uploadAvatar:e=>d.group.uploadAvatar(e),create:e=>d.group.create(e),createFaceToFace:()=>d.group.createFaceToFace(),get mentions(){return d.group.mentions},getProfile:(e,n)=>d.group.getProfile(e.conversationId,n),updateName:(e,n)=>d.group.updateName(e.conversationId,n),updateAvatar:async(e,n)=>{await d.group.updateAvatar(e.conversationId,n)},setMyNickname:(e,n)=>d.group.setMyNickname(e.conversationId,n),updateVerification:(e,n,t)=>d.group.updateVerification(e.conversationId,n,t),requestJoin:(e,n)=>d.group.requestJoin(e.conversationId,n),joinByInviteCode:(e,n)=>d.group.joinByInviteCode(e.conversationId,n),getPinnedMessage:e=>d.group.getPinnedMessage(e.conversationId),pinMessage:(e,n)=>d.group.pinMessage({groupId:e.conversationId,messageId:n}),unpinMessage:e=>d.group.unpinMessage(e.conversationId)},M={listFirstPage:e=>d.channel.listFirstPage(e),listNextPage:e=>d.channel.listNextPage(e),uploadAvatar:e=>d.channel.uploadAvatar(e),create:e=>d.channel.create(e),get mentions(){return d.channel.mentions},getProfile:(e,n)=>d.channel.getProfile(e.conversationId,n),updateVerification:(e,n,t)=>d.channel.updateVerification(e.conversationId,n,t),requestJoin:(e,n)=>d.channel.requestJoin(e.conversationId,n),joinByInviteCode:(e,n)=>d.channel.joinByInviteCode(e.conversationId,n),setAllMuted:(e,n)=>d.channel.setAllMuted(e.conversationId,n),setMemberPrivateChatDisabled:(e,n)=>d.channel.setMemberPrivateChatDisabled(e.conversationId,n),setMyNickname:(e,n)=>d.channel.setMyNickname(e.conversationId,n),setMemberNickname:(e,n,t)=>d.channel.setMemberNickname(e.conversationId,n,t),dismiss:e=>d.channel.dismiss(e.conversationId),getPinnedMessage:e=>d.channel.getPinnedMessage(e.conversationId),pinMessage:(e,n)=>d.channel.pinMessage({channelId:e.conversationId,messageId:n}),unpinMessage:e=>d.channel.unpinMessage(e.conversationId)};const C={get session(){return b},get connection(){return d.connection},get conversations(){return d.conversations},get directory(){return d.directory},get customerService(){return d.customerService},get robots(){return d.robots},get contacts(){return f},get groups(){return A},get channels(){return M},get events(){return I},get contact(){return d.contact},get group(){return d.group},get channel(){return d.channel},get media(){return d.media},get calls(){return d.calls},get groupCalls(){return d.groupCalls},get settings(){return d.settings},get push(){return d.push},get activity(){return d.activity},get outbox(){return d.outbox},get localData(){return y},get search(){return d.search},get applications(){return d.applications},get expressions(){return d.expressions},get sessionFavorites(){return d.sessionFavorites},get drafts(){return d.drafts},get openConversation(){return d.openConversation},logout:v,dispose:function(){return void 0!==p||(u=!0,p=d.teardown({localData:"preserve"},{preserveUploadRecovery:!0}).then(()=>i.clear())),p}};return g(C,()=>d.advancedMessageDiagnostics),C}export{I as createAdvancedImClient,b as createImClient,C as createProductClientFacade};