k2-im 0.2.12 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-kit-pinia.d.ts +3 -3
- package/dist/chat-kit.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/modules/api-protocol-client/src/client.js +1 -1
- package/dist/modules/api-protocol-client/src/nonce.js +1 -1
- package/dist/modules/crypto/browser.js +1 -1
- package/dist/modules/crypto/driver.js +1 -1
- package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
- package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
- package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
- package/dist/modules/im-core/src/abort.js +1 -1
- package/dist/modules/im-core/src/mapping/message-id.js +1 -1
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-core/src/state/domain-state.js +1 -1
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
- package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
- package/dist/modules/im-sdk/src/product/media.js +1 -1
- package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
- package/dist/request-crypto.d.ts +3 -2
- package/dist/sdk.d.ts +1 -1
- package/dist/vendor/crypto/index_bg.wasm +0 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=new TextEncoder;function t(e,t,o){if(void 0===e)return t;if(!Number.isSafeInteger(e)||e<=0)throw new RangeError(`${o} 必须为正安全整数`);return e}function o(e,t=/* @__PURE__ */new WeakSet){if("object"!=typeof e||null===e||t.has(e))return e;t.add(e);for(const
|
|
1
|
+
const e=new TextEncoder;function t(e,t,o){if(void 0===e)return t;if(!Number.isSafeInteger(e)||e<=0)throw new RangeError(`${o} 必须为正安全整数`);return e}function o(e,t=/* @__PURE__ */new WeakSet){if("object"!=typeof e||null===e||t.has(e))return e;t.add(e);for(const r of Object.values(e))o(r,t);return Object.freeze(e)}const r=/* @__PURE__ */new WeakMap;function n(){if("function"!=typeof PerformanceMark||!("detail"in PerformanceMark.prototype))return!1;const e=r.get(PerformanceMark);if(void 0!==e)return e;const t=function(){try{const e={value:1,optional:void 0},t={first:e,second:e};t.self=t;const o=new PerformanceMark("im-diagnostic-probe",{detail:t}).detail;return o!==t&&o?.first!==e&&o?.first===o?.second&&1===o?.first?.value&&Object.prototype.hasOwnProperty.call(o.first,"optional")&&void 0===o.first.optional&&o?.self===o}catch{return!1}}();return r.set(PerformanceMark,t),t}function i(r={}){const i=t(r.maxRecords,200,"maxRecords"),a=t(r.maxEstimatedBytes,4194304,"maxEstimatedBytes"),s=/* @__PURE__ */new Set,c=[];let d=0,f=0,u=!1;function m(e){const t=c.map(e=>e.record).filter(t=>void 0===e||function(e,t){return!(void 0!==t.accountId&&e.accountId!==t.accountId||void 0!==t.generation&&e.generation!==t.generation||void 0!==t.category&&e.category!==t.category||void 0!==t.traceId&&e.traceId!==t.traceId||void 0!==t.operationId&&e.operationId!==t.operationId||void 0!==t.messageId&&function(e){if(void 0!==e.message?.id)return e.message.id;if("object"!=typeof e.data||null===e.data)return;const t=e.data.messageId;return"string"==typeof t?t:void 0}(e)!==t.messageId||void 0!==t.fromTimestamp&&e.timestamp<t.fromTimestamp||void 0!==t.toTimestamp&&e.timestamp>t.toTimestamp||void 0!==t.conversation&&(e.conversation?.conversationType!==t.conversation.conversationType||e.conversation.conversationId!==t.conversation.conversationId))}(t,e));return Object.freeze({records:Object.freeze(t),droppedCount:f,estimatedBytes:d,disposed:u})}function p(){const e=m();for(const t of s)try{t(e)}catch{}}function v(){c.length=0,d=0,f=0}return{write(t){if(u)return;const r=function(t){try{const r="function"==typeof structuredClone?structuredClone(t):n()?new PerformanceMark("im-diagnostic-snapshot",{detail:t}).detail:void 0;if(void 0===r)return;const i=JSON.stringify(r);if(void 0===i)return;return{record:o(r),estimatedBytes:e.encode(i).byteLength}}catch{return}}(t);if(void 0===r||r.estimatedBytes>a)return f+=1,void p();for(c.push(r),d+=r.estimatedBytes;c.length>i||d>a;){const e=c.shift();if(void 0===e)break;d-=e.estimatedBytes,f+=1}p()},getSnapshot:m,subscribe(e){if(u)return()=>{};s.add(e);let t=!0;return()=>{t&&(t=!1,s.delete(e))}},clear(){u||(v(),p())},dispose(){u||(u=!0,v(),s.clear())}}}export{i as createImDiagnosticMemoryBuffer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createImSdkError as e}from"./message.js";import{createMediaAssetCacheStrategyRegistry as t,mediaAssetResourceVersion as o}from"../../../im-core/src/ports/media-asset-cache-port.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{resolveMediaThumbnailMimeType as a}from"../../../im-core/src/media-thumbnail.js";import{isCryptoExecutionError as i}from"../../../im-core/src/ports/crypto-task-executor.js";const n=6048e5,s=1048576;function d(e){let t=0,o=!1;const r=[];function a(){if(!o)for(;t<e&&r.length>0;){r.sort((e,t)=>t.getPriority()-e.getPriority());const e=r.shift();if(e.signal.removeEventListener("abort",e.onAbort),e.signal.aborted){e.reject(new DOMException("媒体下载已取消","AbortError"));continue}t+=1;let o=!1;e.resolve(()=>{o||(o=!0,t=Math.max(0,t-1),a())})}}return{acquire:(e,t)=>o?Promise.reject(new Error("媒体下载并发控制器已释放")):new Promise((o,i)=>{const n={resolve:o,reject:i,signal:e,getPriority:t,onAbort:()=>{const e=r.indexOf(n);e>=0&&r.splice(e,1),i(new DOMException("媒体下载已取消","AbortError"))}};e.addEventListener("abort",n.onAbort,{once:!0}),r.push(n),a()}),dispose(){o=!0;for(const e of r.splice(0))e.signal.removeEventListener("abort",e.onAbort),e.reject(new Error("媒体下载并发控制器已释放"))}}}function c(){return t([{kind:"image",softMaxBytes:512*s,maxEntries:512,maxEntryBytes:30*s,maxIdleMs:n},{kind:"video",softMaxBytes:1792*s,maxEntries:64,maxEntryBytes:200*s,maxIdleMs:n},{kind:"file",softMaxBytes:512*s,maxEntries:128,maxEntryBytes:200*s,maxIdleMs:n}])}function l(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function m(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function p(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function u(e){const t=e.ref.conversationType,o=e.ref.conversationId;if("direct"!==t&&"group"!==t&&"channel"!==t||""===o.trim())throw y({code:"supergroup"===t?"IM_SDK_SUPERGROUP_UNSUPPORTED":"IM_SDK_MEDIA_TASK_REF_INVALID",category:"supergroup"===t?"unsupported":"contract",operation:"media.tasks.project",retryable:!1});const r=m({conversationType:t,conversationId:o});return g({id:p(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:l(e.percent),...void 0===e.items?{}:{items:e.items},...void 0===e.attempt?{}:{attempt:e.attempt},...void 0===e.maxAttempts?{}:{maxAttempts:e.maxAttempts},...void 0===e.bytesTransferred?{}:{bytesTransferred:e.bytesTransferred},...void 0===e.bytesTotal?{}:{bytesTotal:e.bytesTotal},...void 0===e.recovery?{}:{recovery:e.recovery},...void 0===e.recoveryReason?{}:{recoveryReason:e.recoveryReason},...void 0===e.phase?{}:{phase:e.phase},...void 0===e.failure?{}:{error:I(e.failure,r)}})}function y(t){const o=e(t);return Object.assign(new Error(o.code),o,{name:"ImMediaTaskOperationError"})}function f(e){return!(void 0!==e.recalled||void 0!==e.deletedForEveryone||"failed"!==e.status&&"uploading"!==e.status||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable)}function I(t,o){if(void 0===t)return;const r=t.displayCode,a=void 0===r?void 0:{"media.empty":{code:"IM_SDK_MEDIA_EMPTY",category:"validation",retryable:!1},"media.noCrypto":{code:"IM_SDK_MEDIA_CRYPTO_UNAVAILABLE",category:"contract",retryable:!1},"media.previewFailed":{code:"IM_SDK_MEDIA_PREVIEW_FAILED",category:"state",retryable:!1},"media.encryptFailed":{code:"IM_SDK_MEDIA_ENCRYPT_FAILED",category:"state",retryable:!1},"media.uploadFailed":{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"network",retryable:!0},"media.uploadTimeout":{code:"IM_SDK_MEDIA_UPLOAD_TIMEOUT",category:"network",retryable:!0},"media.resumeUnavailable":{code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",retryable:!0},"media.cleanupUnconfirmed":{code:"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED",category:"state",retryable:!0},"media.cancelled":{code:"IM_SDK_MEDIA_UPLOAD_CANCELED",category:"state",retryable:!0},"media.invalidDuration":{code:"IM_SDK_VOICE_DURATION_INVALID",category:"validation",retryable:!1},"media.uploadInterrupted":{code:"IM_SDK_MEDIA_UPLOAD_INTERRUPTED",category:"network",retryable:!0}}[r];return Object.freeze(e({...a??{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"state",retryable:t.retryable??!1},...!1===t.retryable?{retryable:!1}:{},operation:"media.upload",conversation:o}))}function g(e){return Object.freeze({...e,ref:m(e.ref),...void 0===e.items?{}:{items:Object.freeze(e.items.map(e=>Object.freeze({...e})))},...void 0===e.error?{}:{error:Object.freeze({...e.error})}})}function v(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw y({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1});if("direct"!==o&&"group"!==o&&"channel"!==o||"string"!=typeof r||""===r.trim()||"string"!=typeof e?.messageId||""===e.messageId.trim())throw y({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return m({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let c=0,I=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Set,h=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,M=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set,C=e.maxDownloadCheckpointBytes??536870912;function K(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function O(e,t){L.delete(e),S.add(e);const o=_.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:K(o.ref)}:{}};"running"===o.state?$(e):q(e)}}const R=d(3);let U;const P=e.maxCachedBlobs??8,N=e.maxCachedBlobBytes??67108864;let k=0;function x(){if(!t||!e.isActive())throw y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function V(){return Object.freeze([..._.values()])}function F(){const t=V();for(const o of[...E])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function z(){!T&&t&&e.isActive()&&(T=!0,queueMicrotask(()=>{if(T=!1,t&&e.isActive())for(const t of[...w])try{t()}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体缓存订阅者回调异常",cause:t}})}}))}function B(e){const t=A.get(e);void 0!==t&&(k-=t.size,A.delete(e),b.delete(e),M.delete(e),z())}function j(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!D.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&O(e,"download-checkpoint-expired");for(const[e,t]of b)!D.has(e)&&o-t>=n&&B(e);z()}function W(e,t){const o=A.get(e);if(void 0!==o){if(!(M.get(e)!==t||s()-b.get(e)>=n))return A.delete(e),A.set(e,o),b.set(e,s()),o;B(e)}}function Y(){c+=1,A.clear(),b.clear(),M.clear(),z(),k=0;for(const e of[...L.keys()])O(e,"download-checkpoint-cleared")}function H(e){_.delete(e),h.delete(e),L.delete(e),S.delete(e),B(e)}function $(e){_.set(e.id,g(e)),function(){for(;_.size>128;){const e=[..._.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;H(e.id)}}()}function q(o){if(!t||!e.isActive())return;$(o);const r=_.get(o.id);if(F(),!t||!e.isActive()||void 0===r||_.get(o.id)!==r)return;const a={id:r.id,messageId:r.messageId,ref:r.ref,direction:"download",state:r.state,percent:r.percent};e.emitter.emit({type:"media-task:updated",conversation:r.ref,task:a})}function J(e,t,o){if(B(e),!(t.size>N))for(A.set(e,t),M.set(e,o),z(),b.set(e,s()),k+=t.size;A.size>P||k>N;){const e=A.keys().next().value;if(void 0===e)break;B(e)}}function G(t,r=!0){const a=v(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw y({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,d,c;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,c="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,c="video";else if("voice"===i.contentType)n=i.body.voice,s=e.loaders?.loadVoice;else if("file"===i.contentType)n=i.body.file,s=e.loaders?.loadFile,d=i.body.file?.mimeType,c="file";else if("filesAlbum"===i.contentType){const o=t.itemIndex;if(n=void 0===o?void 0:i.body.filesAlbum?.items[o],void 0===n)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile,c="file"}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,d=void 0===r||void 0===o?void 0:o[r];if(void 0===d)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=d,s="video"===d.kind?e.loaders?.loadVideo:e.loaders?.loadImage,c=d.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw y({code:"IM_SDK_MEDIA_REMOTE_URL_UNAVAILABLE",category:"state",operation:"media.download",retryable:!1,conversation:a});return{ref:a,messageId:i.id,...void 0===t.itemIndex?{}:{itemIndex:t.itemIndex},...void 0===d?{}:{mimeType:d},...void 0===c?{}:{cacheKind:c,resourceVersion:o(n.url,{conversation:a,itemIndex:t.itemIndex})},...void 0===s?{}:{load:s},input:{url:n.url,...void 0===n.size?{}:{expectedBytes:n.size},...void 0===n.teaKey?{}:{teaKey:n.teaKey},...void 0===n.fileEncryptType?{}:{fileEncryptType:n.fileEncryptType}}}}function Q(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function X(){return y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function Z(t,o,r=c){if(x(),r!==c)return null;const a=p("download",t.ref,t.messageId,t.itemIndex),i=W(a,t.resourceVersion);if(void 0!==i)return i;if(void 0===e.assetCache||void 0===t.cacheKind||void 0===t.resourceVersion)return null;let n;try{n=await e.assetCache.get({kind:t.cacheKind,messageId:t.messageId,resourceVersion:t.resourceVersion}),e.onAssetCacheEvent?.({operation:"get",outcome:null===n?"miss":"hit",kind:t.cacheKind,messageId:t.messageId,...null===n?{}:{byteLength:n.blob.size}})}catch(r){if(e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.cacheKind,messageId:t.messageId,cause:r}),o)throw y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCached",retryable:!0,conversation:t.ref});return null}if(null===n)return null;if(x(),r!==c)return null;const s=n.blob,d=n.mimeType??t.mimeType??"",l=s.type===d?s:s.slice(0,s.size,d);return J(a,l,t.resourceVersion),l}function ee(e,t){j();const o=L.get(e);if(void 0!==o&&o.url!==t.input.url&&O(e,"download-object-changed"),S.has(e)){const o=K(t.ref),r=_.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||q({...r,error:o}),o}return o?.state}function te(o,r=!1){const a=c,n=p("download",o.ref,o.messageId,o.itemIndex),d=D.get(n);if(void 0!==d&&!d.controller.signal.aborted)return d.promise;if(!r){const e=W(n,o.resourceVersion);if(void 0!==e)return q({id:n,ref:m(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100}),Promise.resolve(e)}B(n);const u=(()=>{const e=ee(n,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),f=m(o.ref);h.set(n,Object.freeze({conversation:f,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const I={id:n,messageId:o.messageId,ref:f,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},g=new AbortController,v=Promise.resolve().then(async()=>{let d;try{if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(d=await R.acquire(g.signal,()=>U===n?1:0),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(q({...I,...u,state:"running"}),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await Z(o,!1,a);if(null!==e){if(g.signal.aborted)throw Q(f);return L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}}const i=o.load;if(void 0===i)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:f});const s=ee(n,o);if(void 0!==u.bytesTransferred&&(void 0===s||a!==c))throw O(n,"download-checkpoint-cleared"),K(f);const m=await i({...o.input,getPriority:()=>U===n?1:0,...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&function(e,t,o){L.delete(e),L.set(e,{url:t,state:o}),S.delete(e);let r=[...L.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;L.size>8||r>C;){const e=L.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,O(e[0],"download-checkpoint-limit")}}(n,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&O(n,"download-checkpoint-invalid")},signal:g.signal,onTransferProgress:o=>{const r=_.get(n);t&&e.isActive()&&!g.signal.aborted&&D.get(n)?.controller===g&&"running"===r?.state&&q({...r,state:"running",percent:Math.min(99,l(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=_.get(n);if(!t||!e.isActive()||g.signal.aborted||D.get(n)?.controller!==g||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||q({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);const p=m instanceof Blob?void 0:m;let v=void 0===p?m:new Blob([p],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&v.type!==o.mimeType&&(v=v.slice(0,v.size,o.mimeType)),a===c&&J(n,v,o.resourceVersion),a===c&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=v.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:v,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{z(),e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:o.cacheKind,messageId:o.messageId,byteLength:t})}).catch(r=>{e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:o.cacheKind,messageId:o.messageId,byteLength:t,cause:r})})}if(L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw X();return v}catch(o){if(!t||!e.isActive())throw X();if(g.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=Q(f);throw D.get(n)?.controller===g&&"canceled"!==_.get(n)?.state&&q({..._.get(n),...I,state:"canceled",percent:_.get(n)?.percent??0,error:S.has(n)?K(f):e}),e}const r=S.has(n)?K(f):i(o)?y({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:f,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:y({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:f});throw D.get(n)?.controller===g&&q({..._.get(n),...I,state:"failed",percent:_.get(n)?.percent??0,error:r}),r}finally{if(d?.(),D.get(n)?.controller===g){D.delete(n);const e=L.get(n);void 0!==e&&(e.idleSince=s())}}});return D.set(n,{controller:g,promise:v}),q({...I,...u,state:"queued"}),v}function oe(e,t){x();const o=_.get(e);if(void 0===o)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function re(e,t){return y({code:"IM_SDK_MEDIA_TASK_INVALID_STATE",category:"state",operation:t,retryable:!1,conversation:e.ref,details:Object.freeze({state:e.state,direction:e.direction})})}const ae=e.emitter.subscribe(e=>{var o,r;t&&"media-task:updated"===e.type&&"upload"===e.task.direction&&(o=e.conversation,r=e.task.ref,o.conversationType===r.conversationType&&o.conversationId===r.conversationId&&($(u(e.task)),F()))});return{api:{async clearCache(){x(),e.connection.invalidateMediaAssetCacheWrites?.(),Y();try{await(e.assetCache?.clear())}catch(t){throw x(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),y({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}x(),z()},getSnapshot:()=>(x(),V()),subscribe:e=>(x(),E.add(e),()=>E.delete(e)),async cancel(t,o){const r=oe(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw re(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=D.get(t);if(void 0===a)throw re(r,"media.cancel");a.controller.abort();const i=S.has(t)?K(r.ref):Q(r.ref);q({...r,state:"canceled",error:i})},async pause(t){const o=oe(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw re(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});x()},async resume(t){const o=oe(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw re(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=oe(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw re(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw re(r,"media.retry");if(("IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED"===r.error?.code||"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED"===r.error?.code)&&!0!==o?.restartUpload)throw y({code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});if(!(void 0===o?e.connection.retryMediaUpload(r.messageId):e.connection.retryMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw re(r,"media.retry");if(D.has(t)&&!D.get(t).controller.signal.aborted)throw y({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=h.get(t);if(void 0===a)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(L.delete(t),S.delete(t)),await te(G(a),!0)},async getUploadRecovery(t){x();const o=v(t);if(void 0!==t.itemIndex)return{available:!1,reason:"unsupported"};const r=t.messageId;if(void 0===e.recoveryPort)return{available:!1,reason:"unavailable"};const a=e.domainState.getConversationMessage(o,r);if(void 0===a)return{available:!1,reason:"not-found"};if(!f(a))return{available:!1,reason:"invalid-state"};try{const t=await e.recoveryPort.get(o,r);x();const a=e.domainState.getConversationMessage(o,r);return void 0===a?{available:!1,reason:"not-found"}:f(a)?void 0===t?{available:!1,reason:"not-found"}:{available:!0,expiresAt:t.savedAt+864e5}:{available:!1,reason:"invalid-state"}}catch(e){x();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){x();const r=v(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw y({code:"IM_SDK_MEDIA_RECOVERY_UNAVAILABLE",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});try{const a=await e.connection.recoverMediaUpload(r,t.messageId,o.file);if(x(),!a.ok&&"paused"===a.reason)throw y({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw y({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw y({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(x(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw y({code:e instanceof Error&&"IM_MEDIA_RECOVERY_FILE_MISMATCH"===e.message?"IM_SDK_MEDIA_RECOVERY_FILE_MISMATCH":"IM_SDK_MEDIA_RECOVERY_FAILED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r})}},download:function(e){try{return x(),te(G(e))}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){x();const t=v(e);U=p("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){x();const o=c,r=t.map(e=>G(e,!1)),a=/* @__PURE__ */new Map,i=s(),d=r.map(e=>{const t=p("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&M.get(t)===e.resourceVersion&&i-(b.get(t)??0)<n});r.forEach((e,t)=>{if(d[t]||void 0===e.cacheKind||void 0===e.resourceVersion)return;const o={kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion};a.set(JSON.stringify(o),o)});const l=[...a.values()];let m=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw y({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(m=await e.assetCache.hasMany(l),m.length!==l.length||m.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw x(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(x(),o!==c)throw y({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const u=new Map(l.map((e,t)=>[JSON.stringify(e),m[t]]));return Object.freeze(r.map((e,t)=>d[t]||!0===u.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(x(),w.add(e),()=>w.delete(e)),getCached:async function(e){const t=G(e,!1);return void 0===t.cacheKind?null:await Z(t,!0)},prepareLocalPreview:async function(t){if(x(),r(t.signal),void 0===e.preparePreview)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++I,kind:t.kind,file:t.file,..."video"===t.kind&&t.includeDisplayPoster?{includeDisplayPoster:!0}:{},...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(!0===t.signal?.aborted||o instanceof Error&&"AbortError"===o.name)throw o;return e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:o}),null}return x(),r(t.signal),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0?(e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:new Error(`预览端口返回了不可用的尺寸 ${o.width}×${o.height}`)}),null):"video"===t.kind?{width:o.width,height:o.height,...void 0===o.duration?{}:{duration:o.duration},...void 0===o.posterData?{}:{posterData:o.posterData},...t.includeDisplayPoster&&o.displayPosterData?.byteLength?{displayPoster:new Blob([o.displayPosterData],{type:a(o.displayPosterData)})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(t){if(x(),r(t.signal),void 0===e.prepareVideoPoster)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++I,kind:"video",file:t.file,...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return x(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),x(),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0||!o.posterData?.byteLength?(e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:new Error("视频封面解码没有返回有效尺寸和图片字节")}),null):new Blob([o.posterData],{type:a(o.posterData)})},prepareLocalImageThumbnail:async function(t){if(x(),r(t.signal),void 0===e.prepareImageThumbnail)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalImageThumbnail",retryable:!1});try{const o=new Uint8Array(await t.file.slice(0,3).arrayBuffer());if(r(t.signal),x(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const i="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),n=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++I,kind:"image",file:i,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),x(),!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0||!n.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和图片字节");return new Blob([n.posterData],{type:a(n.posterData)})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return x(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}}},clearCache:Y,prune:j,dispose(){if(t){t=!1,c+=1,ae();for(const e of D.values())e.controller.abort();R.dispose(),U=void 0,D.clear(),E.clear(),w.clear(),M.clear(),_.clear(),h.clear(),A.clear(),b.clear(),L.clear(),S.clear(),k=0}}}}export{c as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,u as toProductMediaTaskUpdate};
|
|
1
|
+
import{createImSdkError as e}from"./message.js";import{createMediaAssetCacheStrategyRegistry as t,mediaAssetResourceVersion as o}from"../../../im-core/src/ports/media-asset-cache-port.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{resolveMediaThumbnailMimeType as a}from"../../../im-core/src/media-thumbnail.js";import{isCryptoExecutionError as i}from"../../../im-core/src/ports/crypto-task-executor.js";const n=6048e5,s=1048576;function d(e){let t=0,o=!1;const r=[];function a(){if(!o)for(;t<e&&r.length>0;){r.sort((e,t)=>t.getPriority()-e.getPriority());const e=r.shift();if(e.signal.removeEventListener("abort",e.onAbort),e.signal.aborted){e.reject(new DOMException("媒体下载已取消","AbortError"));continue}t+=1;let o=!1;e.resolve(()=>{o||(o=!0,t=Math.max(0,t-1),a())})}}return{acquire:(e,t)=>o?Promise.reject(new Error("媒体下载并发控制器已释放")):new Promise((o,i)=>{const n={resolve:o,reject:i,signal:e,getPriority:t,onAbort:()=>{const e=r.indexOf(n);e>=0&&r.splice(e,1),i(new DOMException("媒体下载已取消","AbortError"))}};e.addEventListener("abort",n.onAbort,{once:!0}),r.push(n),a()}),dispose(){o=!0;for(const e of r.splice(0))e.signal.removeEventListener("abort",e.onAbort),e.reject(new Error("媒体下载并发控制器已释放"))}}}function c(){return t([{kind:"image",softMaxBytes:512*s,maxEntries:512,maxEntryBytes:30*s,maxIdleMs:n},{kind:"video",softMaxBytes:1792*s,maxEntries:64,maxEntryBytes:200*s,maxIdleMs:n}])}function l(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function m(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function p(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function u(e){const t=e.ref.conversationType,o=e.ref.conversationId;if("direct"!==t&&"group"!==t&&"channel"!==t||""===o.trim())throw y({code:"supergroup"===t?"IM_SDK_SUPERGROUP_UNSUPPORTED":"IM_SDK_MEDIA_TASK_REF_INVALID",category:"supergroup"===t?"unsupported":"contract",operation:"media.tasks.project",retryable:!1});const r=m({conversationType:t,conversationId:o});return g({id:p(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:l(e.percent),...void 0===e.items?{}:{items:e.items},...void 0===e.attempt?{}:{attempt:e.attempt},...void 0===e.maxAttempts?{}:{maxAttempts:e.maxAttempts},...void 0===e.bytesTransferred?{}:{bytesTransferred:e.bytesTransferred},...void 0===e.bytesTotal?{}:{bytesTotal:e.bytesTotal},...void 0===e.recovery?{}:{recovery:e.recovery},...void 0===e.recoveryReason?{}:{recoveryReason:e.recoveryReason},...void 0===e.phase?{}:{phase:e.phase},...void 0===e.failure?{}:{error:I(e.failure,r)}})}function y(t){const o=e(t);return Object.assign(new Error(o.code),o,{name:"ImMediaTaskOperationError"})}function f(e){return!(void 0!==e.recalled||void 0!==e.deletedForEveryone||"failed"!==e.status&&"uploading"!==e.status||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable)}function I(t,o){if(void 0===t)return;const r=t.displayCode,a=void 0===r?void 0:{"media.empty":{code:"IM_SDK_MEDIA_EMPTY",category:"validation",retryable:!1},"media.noCrypto":{code:"IM_SDK_MEDIA_CRYPTO_UNAVAILABLE",category:"contract",retryable:!1},"media.previewFailed":{code:"IM_SDK_MEDIA_PREVIEW_FAILED",category:"state",retryable:!1},"media.encryptFailed":{code:"IM_SDK_MEDIA_ENCRYPT_FAILED",category:"state",retryable:!1},"media.uploadFailed":{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"network",retryable:!0},"media.uploadTimeout":{code:"IM_SDK_MEDIA_UPLOAD_TIMEOUT",category:"network",retryable:!0},"media.resumeUnavailable":{code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",retryable:!0},"media.cleanupUnconfirmed":{code:"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED",category:"state",retryable:!0},"media.cancelled":{code:"IM_SDK_MEDIA_UPLOAD_CANCELED",category:"state",retryable:!0},"media.invalidDuration":{code:"IM_SDK_VOICE_DURATION_INVALID",category:"validation",retryable:!1},"media.uploadInterrupted":{code:"IM_SDK_MEDIA_UPLOAD_INTERRUPTED",category:"network",retryable:!0}}[r];return Object.freeze(e({...a??{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"state",retryable:t.retryable??!1},...!1===t.retryable?{retryable:!1}:{},operation:"media.upload",conversation:o}))}function g(e){return Object.freeze({...e,ref:m(e.ref),...void 0===e.items?{}:{items:Object.freeze(e.items.map(e=>Object.freeze({...e})))},...void 0===e.error?{}:{error:Object.freeze({...e.error})}})}function v(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw y({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1});if("direct"!==o&&"group"!==o&&"channel"!==o||"string"!=typeof r||""===r.trim()||"string"!=typeof e?.messageId||""===e.messageId.trim())throw y({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return m({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let c=0,I=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Set,h=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,M=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set,C=e.maxDownloadCheckpointBytes??536870912;function K(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function O(e,t){L.delete(e),S.add(e);const o=_.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:K(o.ref)}:{}};"running"===o.state?$(e):q(e)}}const R=d(3);let U;const P=e.maxCachedBlobs??8,N=e.maxCachedBlobBytes??67108864;let k=0;function V(){if(!t||!e.isActive())throw y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function x(){return Object.freeze([..._.values()])}function F(){const t=x();for(const o of[...E])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function z(){!T&&t&&e.isActive()&&(T=!0,queueMicrotask(()=>{if(T=!1,t&&e.isActive())for(const t of[...w])try{t()}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体缓存订阅者回调异常",cause:t}})}}))}function j(e){const t=A.get(e);void 0!==t&&(k-=t.size,A.delete(e),b.delete(e),M.delete(e),z())}function B(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!D.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&O(e,"download-checkpoint-expired");for(const[e,t]of b)!D.has(e)&&o-t>=n&&j(e);z()}function W(e,t){const o=A.get(e);if(void 0!==o){if(!(M.get(e)!==t||s()-b.get(e)>=n))return A.delete(e),A.set(e,o),b.set(e,s()),o;j(e)}}function Y(){c+=1,A.clear(),b.clear(),M.clear(),z(),k=0;for(const e of[...L.keys()])O(e,"download-checkpoint-cleared")}function H(e){_.delete(e),h.delete(e),L.delete(e),S.delete(e),j(e)}function $(e){_.set(e.id,g(e)),function(){for(;_.size>128;){const e=[..._.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;H(e.id)}}()}function q(o){if(!t||!e.isActive())return;$(o);const r=_.get(o.id);if(F(),!t||!e.isActive()||void 0===r||_.get(o.id)!==r)return;const a={id:r.id,messageId:r.messageId,ref:r.ref,direction:"download",state:r.state,percent:r.percent};e.emitter.emit({type:"media-task:updated",conversation:r.ref,task:a})}function J(e,t,o){if(j(e),!(t.size>N))for(A.set(e,t),M.set(e,o),z(),b.set(e,s()),k+=t.size;A.size>P||k>N;){const e=A.keys().next().value;if(void 0===e)break;j(e)}}function G(t,r=!0){const a=v(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw y({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,d,c;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,c="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,c="video";else if("voice"===i.contentType)n=i.body.voice,s=e.loaders?.loadVoice;else if("file"===i.contentType)n=i.body.file,s=e.loaders?.loadFile,d=i.body.file?.mimeType;else if("filesAlbum"===i.contentType){const o=t.itemIndex;if(n=void 0===o?void 0:i.body.filesAlbum?.items[o],void 0===n)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,d=void 0===r||void 0===o?void 0:o[r];if(void 0===d)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=d,s="video"===d.kind?e.loaders?.loadVideo:e.loaders?.loadImage,c=d.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw y({code:"IM_SDK_MEDIA_REMOTE_URL_UNAVAILABLE",category:"state",operation:"media.download",retryable:!1,conversation:a});return{ref:a,messageId:i.id,...void 0===t.itemIndex?{}:{itemIndex:t.itemIndex},...void 0===d?{}:{mimeType:d},...void 0===c?{}:{cacheKind:c,resourceVersion:o(n.url,{conversation:a,itemIndex:t.itemIndex})},...void 0===s?{}:{load:s},input:{url:n.url,...void 0===n.size?{}:{expectedBytes:n.size},...void 0===n.teaKey?{}:{teaKey:n.teaKey},...void 0===n.fileEncryptType?{}:{fileEncryptType:n.fileEncryptType}}}}function Q(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function X(){return y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function Z(t,o,r=c){if(V(),r!==c)return null;const a=p("download",t.ref,t.messageId,t.itemIndex),i=W(a,t.resourceVersion);if(void 0!==i)return i;if(void 0===e.assetCache||void 0===t.cacheKind||void 0===t.resourceVersion)return null;let n;try{n=await e.assetCache.get({kind:t.cacheKind,messageId:t.messageId,resourceVersion:t.resourceVersion}),e.onAssetCacheEvent?.({operation:"get",outcome:null===n?"miss":"hit",kind:t.cacheKind,messageId:t.messageId,...null===n?{}:{byteLength:n.blob.size}})}catch(r){if(e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.cacheKind,messageId:t.messageId,cause:r}),o)throw y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCached",retryable:!0,conversation:t.ref});return null}if(null===n)return null;if(V(),r!==c)return null;const s=n.blob,d=n.mimeType??t.mimeType??"",l=s.type===d?s:s.slice(0,s.size,d);return J(a,l,t.resourceVersion),l}function ee(e,t){B();const o=L.get(e);if(void 0!==o&&o.url!==t.input.url&&O(e,"download-object-changed"),S.has(e)){const o=K(t.ref),r=_.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||q({...r,error:o}),o}return o?.state}function te(o,r=!1){const a=c,n=p("download",o.ref,o.messageId,o.itemIndex),d=D.get(n);if(void 0!==d&&!d.controller.signal.aborted)return d.promise;if(!r){const e=W(n,o.resourceVersion);if(void 0!==e)return q({id:n,ref:m(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100}),Promise.resolve(e)}j(n);const u=(()=>{const e=ee(n,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),f=m(o.ref);h.set(n,Object.freeze({conversation:f,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const I={id:n,messageId:o.messageId,ref:f,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},g=new AbortController,v=Promise.resolve().then(async()=>{let d;try{if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(d=await R.acquire(g.signal,()=>U===n?1:0),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(q({...I,...u,state:"running"}),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await Z(o,!1,a);if(null!==e){if(g.signal.aborted)throw Q(f);return L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}}const i=o.load;if(void 0===i)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:f});const s=ee(n,o);if(void 0!==u.bytesTransferred&&(void 0===s||a!==c))throw O(n,"download-checkpoint-cleared"),K(f);const m=await i({...o.input,getPriority:()=>U===n?1:0,...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&function(e,t,o){L.delete(e),L.set(e,{url:t,state:o}),S.delete(e);let r=[...L.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;L.size>8||r>C;){const e=L.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,O(e[0],"download-checkpoint-limit")}}(n,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&O(n,"download-checkpoint-invalid")},signal:g.signal,onTransferProgress:o=>{const r=_.get(n);t&&e.isActive()&&!g.signal.aborted&&D.get(n)?.controller===g&&"running"===r?.state&&q({...r,state:"running",percent:Math.min(99,l(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=_.get(n);if(!t||!e.isActive()||g.signal.aborted||D.get(n)?.controller!==g||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||q({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);const p=m instanceof Blob?void 0:m;let v=void 0===p?m:new Blob([p],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&v.type!==o.mimeType&&(v=v.slice(0,v.size,o.mimeType)),a===c&&J(n,v,o.resourceVersion),a===c&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=v.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:v,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{z(),e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:o.cacheKind,messageId:o.messageId,byteLength:t})}).catch(r=>{e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:o.cacheKind,messageId:o.messageId,byteLength:t,cause:r})})}if(L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw X();return v}catch(o){if(!t||!e.isActive())throw X();if(g.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=Q(f);throw D.get(n)?.controller===g&&"canceled"!==_.get(n)?.state&&q({..._.get(n),...I,state:"canceled",percent:_.get(n)?.percent??0,error:S.has(n)?K(f):e}),e}const r=S.has(n)?K(f):i(o)?y({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:f,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:y({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:f});throw D.get(n)?.controller===g&&q({..._.get(n),...I,state:"failed",percent:_.get(n)?.percent??0,error:r}),r}finally{if(d?.(),D.get(n)?.controller===g){D.delete(n);const e=L.get(n);void 0!==e&&(e.idleSince=s())}}});return D.set(n,{controller:g,promise:v}),q({...I,...u,state:"queued"}),v}function oe(e,t){V();const o=_.get(e);if(void 0===o)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function re(e,t){return y({code:"IM_SDK_MEDIA_TASK_INVALID_STATE",category:"state",operation:t,retryable:!1,conversation:e.ref,details:Object.freeze({state:e.state,direction:e.direction})})}const ae=e.emitter.subscribe(e=>{var o,r;t&&"media-task:updated"===e.type&&"upload"===e.task.direction&&(o=e.conversation,r=e.task.ref,o.conversationType===r.conversationType&&o.conversationId===r.conversationId&&($(u(e.task)),F()))});return{api:{async clearCache(){V(),e.connection.invalidateMediaAssetCacheWrites?.(),Y();try{await(e.assetCache?.clear())}catch(t){throw V(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),y({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}V(),z()},getSnapshot:()=>(V(),x()),subscribe:e=>(V(),E.add(e),()=>E.delete(e)),async cancel(t,o){const r=oe(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw re(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=D.get(t);if(void 0===a)throw re(r,"media.cancel");a.controller.abort();const i=S.has(t)?K(r.ref):Q(r.ref);q({...r,state:"canceled",error:i})},async pause(t){const o=oe(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw re(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});V()},async resume(t){const o=oe(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw re(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=oe(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw re(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw re(r,"media.retry");if(("IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED"===r.error?.code||"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED"===r.error?.code)&&!0!==o?.restartUpload)throw y({code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});if(!(void 0===o?e.connection.retryMediaUpload(r.messageId):e.connection.retryMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw re(r,"media.retry");if(D.has(t)&&!D.get(t).controller.signal.aborted)throw y({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=h.get(t);if(void 0===a)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(L.delete(t),S.delete(t)),await te(G(a),!0)},async getUploadRecovery(t){V();const o=v(t);if(void 0!==t.itemIndex)return{available:!1,reason:"unsupported"};const r=t.messageId;if(void 0===e.recoveryPort)return{available:!1,reason:"unavailable"};const a=e.domainState.getConversationMessage(o,r);if(void 0===a)return{available:!1,reason:"not-found"};if(!f(a))return{available:!1,reason:"invalid-state"};try{const t=await e.recoveryPort.get(o,r);V();const a=e.domainState.getConversationMessage(o,r);return void 0===a?{available:!1,reason:"not-found"}:f(a)?void 0===t?{available:!1,reason:"not-found"}:{available:!0,expiresAt:t.savedAt+864e5}:{available:!1,reason:"invalid-state"}}catch(e){V();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){V();const r=v(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw y({code:"IM_SDK_MEDIA_RECOVERY_UNAVAILABLE",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});try{const a=await e.connection.recoverMediaUpload(r,t.messageId,o.file);if(V(),!a.ok&&"paused"===a.reason)throw y({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw y({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw y({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(V(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw y({code:e instanceof Error&&"IM_MEDIA_RECOVERY_FILE_MISMATCH"===e.message?"IM_SDK_MEDIA_RECOVERY_FILE_MISMATCH":"IM_SDK_MEDIA_RECOVERY_FAILED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r})}},download:function(e){try{return V(),te(G(e))}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){V();const t=v(e);U=p("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){V();const o=c,r=t.map(e=>G(e,!1)),a=/* @__PURE__ */new Map,i=s(),d=r.map(e=>{const t=p("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&M.get(t)===e.resourceVersion&&i-(b.get(t)??0)<n});r.forEach((e,t)=>{if(d[t]||void 0===e.cacheKind||void 0===e.resourceVersion)return;const o={kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion};a.set(JSON.stringify(o),o)});const l=[...a.values()];let m=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw y({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(m=await e.assetCache.hasMany(l),m.length!==l.length||m.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw V(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(V(),o!==c)throw y({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const u=new Map(l.map((e,t)=>[JSON.stringify(e),m[t]]));return Object.freeze(r.map((e,t)=>d[t]||!0===u.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(V(),w.add(e),()=>w.delete(e)),getCached:async function(e){const t=G(e,!1);return void 0===t.cacheKind?null:await Z(t,!0)},prepareLocalPreview:async function(t){if(V(),r(t.signal),void 0===e.preparePreview)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++I,kind:t.kind,file:t.file,..."video"===t.kind&&t.includeDisplayPoster?{includeDisplayPoster:!0}:{},...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(!0===t.signal?.aborted||o instanceof Error&&"AbortError"===o.name)throw o;return e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:o}),null}return V(),r(t.signal),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0?(e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:new Error(`预览端口返回了不可用的尺寸 ${o.width}×${o.height}`)}),null):"video"===t.kind?{width:o.width,height:o.height,...void 0===o.duration?{}:{duration:o.duration},...void 0===o.posterData?{}:{posterData:o.posterData},...t.includeDisplayPoster&&o.displayPosterData?.byteLength?{displayPoster:new Blob([o.displayPosterData],{type:a(o.displayPosterData)})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(t){if(V(),r(t.signal),void 0===e.prepareVideoPoster)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++I,kind:"video",file:t.file,...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return V(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),V(),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0||!o.posterData?.byteLength?(e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:new Error("视频封面解码没有返回有效尺寸和图片字节")}),null):new Blob([o.posterData],{type:a(o.posterData)})},prepareLocalImageThumbnail:async function(t){if(V(),r(t.signal),void 0===e.prepareImageThumbnail)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalImageThumbnail",retryable:!1});try{const o=new Uint8Array(await t.file.slice(0,3).arrayBuffer());if(r(t.signal),V(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const i="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),n=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++I,kind:"image",file:i,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),V(),!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0||!n.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和图片字节");return new Blob([n.posterData],{type:a(n.posterData)})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return V(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}}},clearCache:Y,prune:B,dispose(){if(t){t=!1,c+=1,ae();for(const e of D.values())e.controller.abort();R.dispose(),U=void 0,D.clear(),E.clear(),w.clear(),M.clear(),_.clear(),h.clear(),A.clear(),b.clear(),L.clear(),S.clear(),k=0}}}}export{c as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,u as toProductMediaTaskUpdate};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MediaUploadRecoveryError as e}from"../../../im-browser/src/media/media-upload-recovery-codec.js";import{createBrowserMediaUploadRecovery as a}from"../../../im-browser/src/media/media-upload-recovery-store.js";function
|
|
1
|
+
import{MediaUploadRecoveryError as e}from"../../../im-browser/src/media/media-upload-recovery-codec.js";import{createBrowserMediaUploadRecovery as a}from"../../../im-browser/src/media/media-upload-recovery-store.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";function n(n){let t,i,o=!1,c=!1;const s=new AbortController;function l(){if(!t||!c||o)throw new e("unavailable");return t}return{port:{get:async(...e)=>l().get(...e),list:async()=>l().list(),save:async e=>l().save(e),remove:async(...e)=>l().remove(...e),clear:async()=>l().clear(),drain:async()=>t?.drain(),fingerprint:async(...e)=>l().fingerprint(...e),acquireLease:async e=>l().acquireLease(e),close:async()=>t?.close()},prepare:l=>o?Promise.reject(new e("unavailable")):(i??(i=(async()=>{t=a({namespaceFactory:n,accountId:l}),await t.acquireLease(s.signal),await t.list(),r(s.signal),c=!0})()),i),async prune(){c&&!o&&await l().list()},async dispose(e){if(o=!0,s.abort(),await(i?.catch(()=>{})),t)try{e||await t.clear()}finally{await t.close()}}}}function t(e){let a=e;const n=/* @__PURE__ */new Set;return{setOnline(e){if(a=e,a)for(const e of[...n])e()},wait:e=>(r(e),a?Promise.resolve():new Promise((a,t)=>{function i(){n.delete(o),e.removeEventListener("abort",c)}function o(){i(),a()}function c(){i();try{r(e)}catch(e){t(e)}}n.add(o),e.addEventListener("abort",c,{once:!0})}))}}export{n as createAccountMediaUploadRecovery,t as createMediaOnlineWaiter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,r,n)=>((t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n)(t,"symbol"!=typeof r?r+"":r,n);import{createImSdkError as r}from"../product/message.js";import{encodeConversationKey as n}from"../../../im-core/src/conversation-identity.js";const o=2097152;class a extends Error{constructor(e){super(e),t(this,"reason"),this.reason=e}}function s(){return Object.assign(new Error("最近历史请求已取消"),{name:"AbortError"})}function i(e){const t=e.now??Date.now,i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map;let l,f=!0,g=0;const p=/* @__PURE__ */new WeakMap,h=/* @__PURE__ */new WeakSet,v=/* @__PURE__ */new WeakMap;let y=0,b=Promise.resolve();function w(t,r,n){try{e.report(t,{...r},{remainingNetworkPages:Math.max(0,20-y),...n})}catch{}}function m(e,r=t()){return void 0===e?0:Math.max(0,r-e)}function k(e,t,r,n){const o=n?.diagnostics;w("recent-history-prefetch-result",e,{status:t,reason:r,queueDurationMs:m(o?.queuedAt,o?.startedAt),requestDurationMs:o?.requestDurationMs??m(o?.requestStartedAt),persistenceDurationMs:o?.persistenceDurationMs??m(o?.persistenceStartedAt)})}function E(e){const t=b.then(e,e);return b=t.catch(()=>{}),t}function A(t){if(!f||t.generation!==g||t.controller.signal.aborted||t.epoch!==(i.get(t.key)??0))return!1;const r=e.fingerprint(t.ref);return void 0!==r&&(r===t.fingerprint||!M(t)&&[...t.consumers.values()].includes("foreground"))}function M(e){return e.cacheRevision===(c.get(e.key)??0)}function T(e){if(!A(e))throw s()}async function j(r,o=!1){const a=n(r),s=i.get(a)??0,d={key:a,epoch:s,generation:g,cacheRevision:c.get(a)??0},u=g,l=e.fingerprint(r),h=e=>(w("recent-history-cache-miss",r,{reason:e,allowStale:o}),null);if(!f||void 0===l||void 0===e.cache)return h(f?void 0===l?"unavailable":"storage-unavailable":"disposed");if(await b,!f||u!==g||s!==(i.get(a)??0)||!M(d)||e.fingerprint(r)!==l)return h("invalidated");const v=await e.cache.get(r);return f&&u===g&&s===(i.get(a)??0)&&M(d)&&e.fingerprint(r)===l?null===v?h("empty"):2!==v.version?h("version-mismatch"):n(v.conversation)!==a?h("identity-mismatch"):v.fingerprint!==l?h("fingerprint-mismatch"):v.fetchedAt>t()?h("future-timestamp"):t()-v.fetchedAt>(o?864e5:3e5)?h("expired"):(p.set(v,d),v):h("invalidated")}async function q(r){T(r);try{const e=await j(r.ref);if(T(r),null!==e&&M(r))return r.diagnostics.source="cache",w("recent-history-cache-hit",r.ref),{page:e,durable:!0}}catch(e){if(T(r),r.diagnostics.failureReason="cache-read-failed",w("recent-history-cache-read-failed",r.ref,{reason:"cache-read-failed"}),![...r.consumers.values()].includes("foreground"))throw e}if(![...r.consumers.values()].includes("foreground")){if(y>=20)throw new a("budget");y+=1}const n=t();let s;r.diagnostics.source="network",r.diagnostics.requestStartedAt=n;try{s=await e.fetchPage(r.ref,r.controller.signal)}catch(e){throw r.diagnostics.failureReason="request-failed",e}finally{r.diagnostics.requestDurationMs=m(n)}T(r),await e.yieldToEventLoop(),T(r);const i={version:2,conversation:{...r.ref},fetchedAt:t(),fingerprint:r.fingerprint,messages:s.messages,reactions:s.reactions,exhausted:s.exhausted,...void 0===s.nextCursor?{}:{nextCursor:s.nextCursor},byteLength:0};if(p.set(i,{key:r.key,epoch:r.epoch,generation:r.generation,cacheRevision:r.cacheRevision}),void 0!==s.recoveries&&s.recoveries.length>0&&v.set(i,s.recoveries),v.has(i)||i.messages.some(e=>!0===e.encryption.decryptFailed))return h.add(i),{page:i,durable:!1,reason:"decrypt-failed"};if(i.byteLength=await async function(e,t){const r=new TextEncoder,n=/* @__PURE__ */new WeakSet;let a=0,s=0,i=performance.now();async function c(){++s%64==0&&performance.now()-i>=4&&(await t(),i=performance.now())}return await async function e(t){if(!(a>o))if(await c(),"string"==typeof t){a+=8;for(let e=0;e<t.length&&a<=o;e+=16384)a+=r.encode(t.slice(e,e+16384)).byteLength,await c()}else if(null!==t&&"object"==typeof t){if(n.has(t))return;if(n.add(t),a+=32,ArrayBuffer.isView(t)||t instanceof ArrayBuffer)return void(a+=t.byteLength);for(const r in t)if(Object.hasOwn(t,r)&&(await e(r),await e(t[r]),a>o))break}else a+=8}(e),a}(i,e.yieldToEventLoop),T(r),w("recent-history-page-loaded",r.ref,{durationMs:t()-n,messageCount:i.messages.length,byteLength:i.byteLength}),i.byteLength>o)return{page:i,durable:!1,reason:"page-too-large"};if(void 0===e.cache)return{page:i,durable:!1,reason:"storage-unavailable"};if(!M(r))return{page:i,durable:!1,reason:"invalidated"};r.diagnostics.persistenceStartedAt=t();try{const t=await E(async()=>(T(r),!!M(r)&&e.cache.put(i)));return T(r),M(r)?{page:i,durable:t,...t?{}:{reason:"page-too-large"}}:{page:i,durable:!1,reason:"invalidated"}}catch(e){return T(r),r.diagnostics.failureReason="cache-write-failed",w("recent-history-cache-write-failed",r.ref,{reason:"cache-write-failed"}),{page:i,durable:!1,storageError:e}}finally{r.diagnostics.persistenceDurationMs=m(r.diagnostics.persistenceStartedAt)}}function L(r,n){r.started||(r.started=!0,r.diagnostics.startedAt=t(),w("recent-history-prefetch-start",r.ref,{kind:n?"background":"foreground",queueDurationMs:m(r.diagnostics.queuedAt,r.diagnostics.startedAt)}),n&&(l=r),q(r).then(r.resolve,r.reject).finally(async()=>{d.get(r.key)===r&&d.delete(r.key),l===r&&(l=void 0),await e.yieldToEventLoop(),R()}).catch(e=>{if(!(e instanceof Error&&"AbortError"===e.name))throw e}))}function R(){if(!f||void 0!==l||u.size>0||!e.canRunBackground())return;const t=[...d.values()].find(e=>!e.started&&e.consumers.size>0);void 0!==t&&L(t,!0)}function S(r,o,u){if(!f||!0===u?.aborted)return"background"===o&&k(r,"cancelled","cancelled"),Promise.reject(s());const l=n(r),p=e.fingerprint(r);if(void 0===p)return"background"===o&&k(r,"skipped","unavailable"),Promise.reject(new a("unavailable"));let h=d.get(l);void 0===h||A(h)||(h.controller.abort(),h.reject(s()),d.delete(l),h=void 0);const v=void 0!==h;if(void 0===h){let e,n;const o=new Promise((t,r)=>{e=t,n=r});h={ref:{...r},key:l,fingerprint:p,generation:g,epoch:i.get(l)??0,cacheRevision:c.get(l)??0,controller:new AbortController,consumers:/* @__PURE__ */new Map,started:!1,promise:o,resolve:e,reject:n,diagnostics:{queuedAt:t()}},d.set(l,h)}const y=h,b=Symbol(o);y.consumers.set(b,o),"background"===o&&w("recent-history-prefetch-queued",r,{reason:v?"shared-request":"new-request"});const m=new Promise((e,t)=>{let n=!1;const i=(i,l)=>{n||(n=!0,i?.durable&&!M(y)&&(i={...i,durable:!1,reason:"invalidated"}),u?.removeEventListener("abort",c),y.consumers.delete(b),0===y.consumers.size&&(y.controller.abort(),y.started||(d.get(y.key)===y&&d.delete(y.key),y.reject(s()))),"background"===o&&(l instanceof a?k(r,"skipped",l.reason,y):l instanceof Error&&"AbortError"===l.name?k(r,"cancelled","cancelled",y):void 0!==l||void 0!==i?.storageError?k(r,"failed",y.diagnostics.failureReason??"request-failed",y):!0===i?.durable?k(r,"ready","cache"===y.diagnostics.source?"cache-hit":"persisted",y):k(r,"skipped",i?.reason??"not-persisted",y)),void 0!==l?t(l):e(i))};function c(){i(void 0,s())}u?.addEventListener("abort",c,{once:!0}),y.promise.then(e=>i(e),e=>i(void 0,e))});return"foreground"===o?L(y,!1):R(),m}function x(t,r={}){if(!f||"group"!==t.conversationType&&"channel"!==t.conversationType)return;const o={...t,conversationType:t.conversationType},a=n(t);c.set(a,(c.get(a)??0)+1),r.preserveForeground||i.set(a,(i.get(a)??0)+1);const u=d.get(a);r.preserveForeground&&u&&[...u.consumers.values()].includes("foreground")||(u?.reject(r.reason??s()),u?.controller.abort(r.reason),d.delete(a)),w("recent-history-cache-invalidated",o,{reason:r.preserveForeground?"cache-only-invalidation":"explicit-invalidation"}),E(async()=>e.cache?.delete(o)).catch(()=>w("recent-history-cache-delete-failed",o,{reason:"cache-delete-failed"}))}function D(e){const t=p.get(e);return f&&void 0!==t&&t.generation===g&&t.epoch===(i.get(t.key)??0)}return{readCached:j,isPageCurrent:D,enterForeground:function(t){const r=n(t);u.set(r,(u.get(r)??0)+1),e.onForeground?.(t),void 0===l||l.key===r||[...l.consumers.values()].includes("foreground")||(l.controller.abort(),l.reject(s()));let o=!1;return()=>{if(o)return;o=!0;const e=(u.get(r)??1)-1;e>0?u.set(r,e):u.delete(r),R()}},hasForeground:e=>(u.get(n(e))??0)>0,invalidate:x,notifySchedulingChanged:R,takeRecoveries(e){if(!D(e))return[];const t=v.get(e)??[];return v.delete(e),t},async confirmConsumed(t){const r=e.fingerprint(t.conversation),a=p.get(t);if(!D(t)||void 0===a||!M(a)||h.has(t)||void 0===r||void 0===e.cache||r===t.fingerprint||t.byteLength>o||t.messages.some(e=>!0===e.encryption.decryptFailed))return;const s=n(t.conversation),c=i.get(s)??0;await E(async()=>{D(t)&&M(a)&&c===(i.get(s)??0)&&e.fingerprint(t.conversation)===r&&await e.cache.put({...t,fingerprint:r})}).catch(()=>w("recent-history-cache-write-failed",t.conversation,{reason:"cache-write-failed"}))},latest:async(e,t)=>(await S(e,"foreground",t)).page,async prefetchRecent(t,n={}){const o=[];for(const[s,i]of t.entries())if(s>0&&s%16==0&&await e.yieldToEventLoop(),!0!==n.signal?.aborted&&f)if("direct"!==i.conversationType&&"robot"!==i.conversationType&&"customerService"!==i.conversationType)if(void 0!==e.cache)try{const e=await S({...i,conversationType:i.conversationType},"background",n.signal);if(void 0!==e.storageError)throw e.storageError;o.push({ref:i,status:e.durable?"ready":"skipped",...void 0===e.reason?{}:{reason:e.reason}})}catch(e){e instanceof a?o.push({ref:i,status:"skipped",reason:e.reason}):e instanceof Error&&"AbortError"===e.name?o.push({ref:i,status:"cancelled",reason:"cancelled"}):(w("recent-history-prefetch-failed",i,{reason:"prefetch-failed"}),o.push({ref:i,status:"failed",error:r({code:"IM_SDK_HISTORY_PREFETCH_FAILED",category:"state",operation:"conversations.prefetchRecent",retryable:!0,conversation:i,cause:e})}))}else k(i,"skipped","storage-unavailable"),o.push({ref:i,status:"skipped",reason:"storage-unavailable"});else k(i,"skipped","unsupported"),o.push({ref:i,status:"skipped",reason:"unsupported"});else k(i,"cancelled","cancelled"),o.push({ref:i,status:"cancelled",reason:"cancelled"});return o},dispose(){f=!1;for(const e of d.values())e.controller.abort(),e.reject(s());return d.clear(),b.then(()=>{})},async clear(){if(f){g+=1;for(const e of[...d.values()])x(e.ref);await E(async()=>e.cache?.clear())}}}}export{i as createRecentHistoryPrefetch};
|
|
1
|
+
var e=Object.defineProperty,r=(r,t,n)=>((r,t,n)=>t in r?e(r,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[t]=n)(r,"symbol"!=typeof t?t+"":t,n);import{createImSdkError as t}from"../product/message.js";import{encodeConversationKey as n}from"../../../im-core/src/conversation-identity.js";import{abortWithReason as o}from"../../../im-core/src/abort.js";const a=2097152;class s extends Error{constructor(e){super(e),r(this,"reason"),this.reason=e}}function i(){return Object.assign(new Error("最近历史请求已取消"),{name:"AbortError"})}function c(e){const r=e.now??Date.now,c=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map,l=/* @__PURE__ */new Map;let f,g=!0,p=0;const h=/* @__PURE__ */new WeakMap,v=/* @__PURE__ */new WeakSet,y=/* @__PURE__ */new WeakMap;let b=0,m=Promise.resolve();function w(r,t,n){try{e.report(r,{...t},{remainingNetworkPages:Math.max(0,20-b),...n})}catch{}}function k(e,t=r()){return void 0===e?0:Math.max(0,t-e)}function E(e,r,t,n){const o=n?.diagnostics;w("recent-history-prefetch-result",e,{status:r,reason:t,queueDurationMs:k(o?.queuedAt,o?.startedAt),requestDurationMs:o?.requestDurationMs??k(o?.requestStartedAt),persistenceDurationMs:o?.persistenceDurationMs??k(o?.persistenceStartedAt)})}function A(e){const r=m.then(e,e);return m=r.catch(()=>{}),r}function M(r){if(!g||r.generation!==p||r.controller.signal.aborted||r.epoch!==(c.get(r.key)??0))return!1;const t=e.fingerprint(r.ref);return void 0!==t&&(t===r.fingerprint||!j(r)&&[...r.consumers.values()].includes("foreground"))}function j(e){return e.cacheRevision===(d.get(e.key)??0)}function T(e){if(!M(e))throw i()}async function q(t,o=!1){const a=n(t),s=c.get(a)??0,i={key:a,epoch:s,generation:p,cacheRevision:d.get(a)??0},u=p,l=e.fingerprint(t),f=e=>(w("recent-history-cache-miss",t,{reason:e,allowStale:o}),null);if(!g||void 0===l||void 0===e.cache)return f(g?void 0===l?"unavailable":"storage-unavailable":"disposed");if(await m,!g||u!==p||s!==(c.get(a)??0)||!j(i)||e.fingerprint(t)!==l)return f("invalidated");const v=await e.cache.get(t);return g&&u===p&&s===(c.get(a)??0)&&j(i)&&e.fingerprint(t)===l?null===v?f("empty"):2!==v.version?f("version-mismatch"):n(v.conversation)!==a?f("identity-mismatch"):v.fingerprint!==l?f("fingerprint-mismatch"):v.fetchedAt>r()?f("future-timestamp"):r()-v.fetchedAt>(o?864e5:3e5)?f("expired"):(h.set(v,i),v):f("invalidated")}async function L(t){T(t);try{const e=await q(t.ref);if(T(t),null!==e&&j(t))return t.diagnostics.source="cache",w("recent-history-cache-hit",t.ref),{page:e,durable:!0}}catch(e){if(T(t),t.diagnostics.failureReason="cache-read-failed",w("recent-history-cache-read-failed",t.ref,{reason:"cache-read-failed"}),![...t.consumers.values()].includes("foreground"))throw e}if(![...t.consumers.values()].includes("foreground")){if(b>=20)throw new s("budget");b+=1}const n=r();let o;t.diagnostics.source="network",t.diagnostics.requestStartedAt=n;try{o=await e.fetchPage(t.ref,t.controller.signal)}catch(e){throw t.diagnostics.failureReason="request-failed",e}finally{t.diagnostics.requestDurationMs=k(n)}T(t),await e.yieldToEventLoop(),T(t);const i={version:2,conversation:{...t.ref},fetchedAt:r(),fingerprint:t.fingerprint,messages:o.messages,reactions:o.reactions,exhausted:o.exhausted,...void 0===o.nextCursor?{}:{nextCursor:o.nextCursor},byteLength:0};if(h.set(i,{key:t.key,epoch:t.epoch,generation:t.generation,cacheRevision:t.cacheRevision}),void 0!==o.recoveries&&o.recoveries.length>0&&y.set(i,o.recoveries),y.has(i)||i.messages.some(e=>!0===e.encryption.decryptFailed))return v.add(i),{page:i,durable:!1,reason:"decrypt-failed"};if(i.byteLength=await async function(e,r){const t=new TextEncoder,n=/* @__PURE__ */new WeakSet;let o=0,s=0,i=performance.now();async function c(){++s%64==0&&performance.now()-i>=4&&(await r(),i=performance.now())}return await async function e(r){if(!(o>a))if(await c(),"string"==typeof r){o+=8;for(let e=0;e<r.length&&o<=a;e+=16384)o+=t.encode(r.slice(e,e+16384)).byteLength,await c()}else if(null!==r&&"object"==typeof r){if(n.has(r))return;if(n.add(r),o+=32,ArrayBuffer.isView(r)||r instanceof ArrayBuffer)return void(o+=r.byteLength);for(const t in r)if(Object.prototype.hasOwnProperty.call(r,t)&&(await e(t),await e(r[t]),o>a))break}else o+=8}(e),o}(i,e.yieldToEventLoop),T(t),w("recent-history-page-loaded",t.ref,{durationMs:r()-n,messageCount:i.messages.length,byteLength:i.byteLength}),i.byteLength>a)return{page:i,durable:!1,reason:"page-too-large"};if(void 0===e.cache)return{page:i,durable:!1,reason:"storage-unavailable"};if(!j(t))return{page:i,durable:!1,reason:"invalidated"};t.diagnostics.persistenceStartedAt=r();try{const r=await A(async()=>(T(t),!!j(t)&&e.cache.put(i)));return T(t),j(t)?{page:i,durable:r,...r?{}:{reason:"page-too-large"}}:{page:i,durable:!1,reason:"invalidated"}}catch(e){return T(t),t.diagnostics.failureReason="cache-write-failed",w("recent-history-cache-write-failed",t.ref,{reason:"cache-write-failed"}),{page:i,durable:!1,storageError:e}}finally{t.diagnostics.persistenceDurationMs=k(t.diagnostics.persistenceStartedAt)}}function R(t,n){t.started||(t.started=!0,t.diagnostics.startedAt=r(),w("recent-history-prefetch-start",t.ref,{kind:n?"background":"foreground",queueDurationMs:k(t.diagnostics.queuedAt,t.diagnostics.startedAt)}),n&&(f=t),L(t).then(t.resolve,t.reject).finally(async()=>{u.get(t.key)===t&&u.delete(t.key),f===t&&(f=void 0),await e.yieldToEventLoop(),S()}).catch(e=>{if(!(e instanceof Error&&"AbortError"===e.name))throw e}))}function S(){if(!g||void 0!==f||l.size>0||!e.canRunBackground())return;const r=[...u.values()].find(e=>!e.started&&e.consumers.size>0);void 0!==r&&R(r,!0)}function x(t,o,a){if(!g||!0===a?.aborted)return"background"===o&&E(t,"cancelled","cancelled"),Promise.reject(i());const l=n(t),f=e.fingerprint(t);if(void 0===f)return"background"===o&&E(t,"skipped","unavailable"),Promise.reject(new s("unavailable"));let h=u.get(l);void 0===h||M(h)||(h.controller.abort(),h.reject(i()),u.delete(l),h=void 0);const v=void 0!==h;if(void 0===h){let e,n;const o=new Promise((r,t)=>{e=r,n=t});h={ref:{...t},key:l,fingerprint:f,generation:p,epoch:c.get(l)??0,cacheRevision:d.get(l)??0,controller:new AbortController,consumers:/* @__PURE__ */new Map,started:!1,promise:o,resolve:e,reject:n,diagnostics:{queuedAt:r()}},u.set(l,h)}const y=h,b=Symbol(o);y.consumers.set(b,o),"background"===o&&w("recent-history-prefetch-queued",t,{reason:v?"shared-request":"new-request"});const m=new Promise((e,r)=>{let n=!1;const c=(c,l)=>{n||(n=!0,c?.durable&&!j(y)&&(c={...c,durable:!1,reason:"invalidated"}),a?.removeEventListener("abort",d),y.consumers.delete(b),0===y.consumers.size&&(y.controller.abort(),y.started||(u.get(y.key)===y&&u.delete(y.key),y.reject(i()))),"background"===o&&(l instanceof s?E(t,"skipped",l.reason,y):l instanceof Error&&"AbortError"===l.name?E(t,"cancelled","cancelled",y):void 0!==l||void 0!==c?.storageError?E(t,"failed",y.diagnostics.failureReason??"request-failed",y):!0===c?.durable?E(t,"ready","cache"===y.diagnostics.source?"cache-hit":"persisted",y):E(t,"skipped",c?.reason??"not-persisted",y)),void 0!==l?r(l):e(c))};function d(){c(void 0,i())}a?.addEventListener("abort",d,{once:!0}),y.promise.then(e=>c(e),e=>c(void 0,e))});return"foreground"===o?R(y,!1):S(),m}function D(r,t={}){if(!g||"group"!==r.conversationType&&"channel"!==r.conversationType)return;const a={...r,conversationType:r.conversationType},s=n(r);d.set(s,(d.get(s)??0)+1),t.preserveForeground||c.set(s,(c.get(s)??0)+1);const l=u.get(s);t.preserveForeground&&l&&[...l.consumers.values()].includes("foreground")||(l?.reject(t.reason??i()),void 0!==l&&o(l.controller,t.reason),u.delete(s)),w("recent-history-cache-invalidated",a,{reason:t.preserveForeground?"cache-only-invalidation":"explicit-invalidation"}),A(async()=>e.cache?.delete(a)).catch(()=>w("recent-history-cache-delete-failed",a,{reason:"cache-delete-failed"}))}function P(e){const r=h.get(e);return g&&void 0!==r&&r.generation===p&&r.epoch===(c.get(r.key)??0)}return{readCached:q,isPageCurrent:P,enterForeground:function(r){const t=n(r);l.set(t,(l.get(t)??0)+1),e.onForeground?.(r),void 0===f||f.key===t||[...f.consumers.values()].includes("foreground")||(f.controller.abort(),f.reject(i()));let o=!1;return()=>{if(o)return;o=!0;const e=(l.get(t)??1)-1;e>0?l.set(t,e):l.delete(t),S()}},hasForeground:e=>(l.get(n(e))??0)>0,invalidate:D,notifySchedulingChanged:S,takeRecoveries(e){if(!P(e))return[];const r=y.get(e)??[];return y.delete(e),r},async confirmConsumed(r){const t=e.fingerprint(r.conversation),o=h.get(r);if(!P(r)||void 0===o||!j(o)||v.has(r)||void 0===t||void 0===e.cache||t===r.fingerprint||r.byteLength>a||r.messages.some(e=>!0===e.encryption.decryptFailed))return;const s=n(r.conversation),i=c.get(s)??0;await A(async()=>{P(r)&&j(o)&&i===(c.get(s)??0)&&e.fingerprint(r.conversation)===t&&await e.cache.put({...r,fingerprint:t})}).catch(()=>w("recent-history-cache-write-failed",r.conversation,{reason:"cache-write-failed"}))},latest:async(e,r)=>(await x(e,"foreground",r)).page,async prefetchRecent(r,n={}){const o=[];for(const[a,i]of r.entries())if(a>0&&a%16==0&&await e.yieldToEventLoop(),!0!==n.signal?.aborted&&g)if("direct"!==i.conversationType&&"robot"!==i.conversationType&&"customerService"!==i.conversationType)if(void 0!==e.cache)try{const e=await x({...i,conversationType:i.conversationType},"background",n.signal);if(void 0!==e.storageError)throw e.storageError;o.push({ref:i,status:e.durable?"ready":"skipped",...void 0===e.reason?{}:{reason:e.reason}})}catch(e){e instanceof s?o.push({ref:i,status:"skipped",reason:e.reason}):e instanceof Error&&"AbortError"===e.name?o.push({ref:i,status:"cancelled",reason:"cancelled"}):(w("recent-history-prefetch-failed",i,{reason:"prefetch-failed"}),o.push({ref:i,status:"failed",error:t({code:"IM_SDK_HISTORY_PREFETCH_FAILED",category:"state",operation:"conversations.prefetchRecent",retryable:!0,conversation:i,cause:e})}))}else E(i,"skipped","storage-unavailable"),o.push({ref:i,status:"skipped",reason:"storage-unavailable"});else E(i,"skipped","unsupported"),o.push({ref:i,status:"skipped",reason:"unsupported"});else E(i,"cancelled","cancelled"),o.push({ref:i,status:"cancelled",reason:"cancelled"});return o},dispose(){g=!1;for(const e of u.values())e.controller.abort(),e.reject(i());return u.clear(),m.then(()=>{})},async clear(){if(g){p+=1;for(const e of[...u.values()])D(e.ref);await A(async()=>e.cache?.clear())}}}}export{c as createRecentHistoryPrefetch};
|
package/dist/request-crypto.d.ts
CHANGED
|
@@ -22,8 +22,9 @@ interface CryptoDriver {
|
|
|
22
22
|
* 加载页面请求共用的 WASM 加解密实例。
|
|
23
23
|
*
|
|
24
24
|
* 此入口只依赖请求 crypto,不加载 IM 客户端、Chat Kit 或框架。普通业务可在首个请求前
|
|
25
|
-
* await 一次并保留返回的同步 driver;后续 IM Core
|
|
26
|
-
*
|
|
25
|
+
* await 一次并保留返回的同步 driver;后续 IM Core 请求复用健康实例。RuntimeError 后
|
|
26
|
+
* 可以再次 await 本入口等待异步重建,driver 身份不变,不重试失败操作。导入入口本身
|
|
27
|
+
* 不请求 WASM,Node/SSR 可以安全解析它;加载或重建失败会向调用方传播。
|
|
27
28
|
*/
|
|
28
29
|
declare function loadBrowserCryptoDriver(): Promise<CryptoDriver>;
|
|
29
30
|
|
package/dist/sdk.d.ts
CHANGED
|
@@ -5186,7 +5186,7 @@ interface ImMediaTasksApi {
|
|
|
5186
5186
|
clearCache: () => Promise<void>;
|
|
5187
5187
|
/**
|
|
5188
5188
|
* 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
|
|
5189
|
-
*
|
|
5189
|
+
* 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
|
|
5190
5190
|
* @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
|
|
5191
5191
|
* @example const [available] = await client.media.probeCached([messageRef])
|
|
5192
5192
|
*/
|
|
Binary file
|