k2-im 0.2.15 → 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.
- package/dist/chat-kit-pinia.d.ts +77 -18
- package/dist/chat-kit-vue.d.ts +7 -5
- package/dist/chat-kit.d.ts +138 -23
- package/dist/index.d.ts +142 -26
- 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/cm-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.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-download-request.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
- package/dist/modules/im-browser/src/media/webp-encoder.js +1 -0
- package/dist/modules/im-browser/src/media/webp-worker-factory.js +1 -0
- 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/runtime/chat-runtime.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -1
- package/dist/modules/im-core/src/abort.js +1 -1
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
- package/dist/modules/im-core/src/mapping/message-id.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail.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/create-im-client.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/history-page-size.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
- package/dist/request-crypto.d.ts +3 -2
- package/dist/sdk.d.ts +75 -21
- package/dist/vendor/crypto/index_bg.wasm +0 -0
- package/dist/vendor/webp/LICENSE.jsquash +201 -0
- package/dist/vendor/webp/LICENSE.libwebp +29 -0
- package/dist/vendor/webp/NOTICE +3 -0
- package/dist/webp.worker.js +3 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{pullChannelMessagesRespCodec as c}from"../../../../im-protocol/src/protobuf/registry.js";import{compareBySortKey as d}from"../../../../im-core/src/mapping/sort.js";async function l(o){const t=[];for(const a of u(o.channels,20)){const s=e({userId:o.userId,clientType:o.clientType,channels:a}),i=await o.http.postProtobuf({path:"/channel/v1/sessions",body:s}),r={selfId:o.userId,keepRaw:o.keepRaw??!0,expectedChannelIds:a.map(e=>e.channelId),diagnostic:{endpoint:"sessions",surface:"session-last",...void 0===o.operationId?{}:{operationId:o.operationId},clientTypeHeader:o.clientType,clientTypeBody:o.clientType}},c=n(i,r);await f(o,c.sessions.filter(e=>"active"===e.channelState||0===e.raw?.status).map(e=>e.channelId)),t.push(...n(i,{...r,onContentDecodeError:o.onContentDecodeError,onReaction:o.onReaction},o.decryptDeps).sessions)}return t}async function p(e){const n=function(e){if(void 0===e)return 10;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: channelBatchSize 必须为正整数");return Math.min(e,10)}(e.channelBatchSize),s=e.messageCount??
|
|
1
|
+
import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{pullChannelMessagesRespCodec as c}from"../../../../im-protocol/src/protobuf/registry.js";import{compareBySortKey as d}from"../../../../im-core/src/mapping/sort.js";async function l(o){const t=[];for(const a of u(o.channels,20)){const s=e({userId:o.userId,clientType:o.clientType,channels:a}),i=await o.http.postProtobuf({path:"/channel/v1/sessions",body:s}),r={selfId:o.userId,keepRaw:o.keepRaw??!0,expectedChannelIds:a.map(e=>e.channelId),diagnostic:{endpoint:"sessions",surface:"session-last",...void 0===o.operationId?{}:{operationId:o.operationId},clientTypeHeader:o.clientType,clientTypeBody:o.clientType}},c=n(i,r);await f(o,c.sessions.filter(e=>"active"===e.channelState||0===e.raw?.status).map(e=>e.channelId)),t.push(...n(i,{...r,onContentDecodeError:o.onContentDecodeError,onReaction:o.onReaction},o.decryptDeps).sessions)}return t}async function p(e){const n=function(e){if(void 0===e)return 10;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: channelBatchSize 必须为正整数");return Math.min(e,10)}(e.channelBatchSize),s=e.messageCount??20,i=function(e){if(void 0===e)return 100;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: maxPagesPerBatch 必须为正整数");return e}(e.maxPagesPerBatch),c=/* @__PURE__ */new Map;for(const d of u(e.pulls,n)){let n=d.map(e=>({...e}));const l=new Map(n.map(e=>[e.channelId,/* @__PURE__ */new Set([e.baseIndex])]));let p=0;for(;n.length>0;){r(e.signal),await(e.beforePage?.()),r(e.signal);const d=e.isChannelCurrent;if(void 0!==d&&(n=n.filter(e=>d(e.channelId))),0===n.length)break;if(p>=i){const e=n.map(({channelId:e,baseIndex:n})=>`${e}@${n}`).join(",");throw new Error(`channel offline 分页超过 maxPagesPerBatch=${i}(active=${e})`)}p+=1;const h=o({userId:e.userId,clientType:e.clientType,pulls:n.map(e=>({channelId:e.channelId,baseIndex:e.baseIndex,direction:0,count:s,contain:0}))});r(e.signal);const I=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:h,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal),await f(e,n.map(e=>e.channelId)),r(e.signal);const u={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:n.map(e=>e.channelId),diagnostic:{endpoint:"offlineMessages",surface:"offline-batch",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},g=void 0===e.yieldToEventLoop?t(I,u,e.decryptDeps):await a(I,u,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal});r(e.signal);const y=[];for(const e of n){const n=g.nextBaseIndexes[e.channelId],o=g.messageCounts[e.channelId]??0;if(void 0===n)continue;const t=l.get(e.channelId);if(t.has(n))throw new Error(`channel offline cursor 循环(channelId=${e.channelId}, baseIndex=${n})`);o<s||(t.add(n),y.push({channelId:e.channelId,baseIndex:n}))}await(e.onPage?.(g.messages,{pulls:n.map(e=>({...e})),nextBaseIndexes:{...g.nextBaseIndexes},messageCounts:{...g.messageCounts}})),r(e.signal);for(const e of g.messages)c.has(e.id)||c.set(e.id,e);n=y}}return[...c.values()].sort(d)}async function h(e){r(e.signal);const n=e.count??20;if(!Number.isInteger(n)||n<=0)throw new Error("channel latest: count 必须为正整数");void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const s=o({userId:e.userId,clientType:e.clientType,pulls:[{channelId:e.channelId,baseIndex:"",direction:1,count:n,contain:0}]});r(e.signal);const i=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:s,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);const d={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:[e.channelId],diagnostic:{endpoint:"offlineMessages",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},l=void 0===e.yieldToEventLoop?{...t(i,d,e.decryptDeps),firstBaseIndex:c.decode(i).lsMessage[0]?.sIndex}:await a(i,d,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal}),p=l.batchSize===n,h=l.firstBaseIndex;if(p&&("string"!=typeof h||""===h.trim()))throw new Error(`channel latest: 满页缺少向旧 cursor(channelId=${e.channelId})`);return{messages:l.messages,hasOlder:p,...p?{nextCursor:h}:{}}}async function I(e){r(e.signal);const n=e.count??20;void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const o=s({userId:e.userId,clientType:e.clientType,channelId:e.channelId,baseIndex:e.baseIndex,count:n,contain:e.contain??0});r(e.signal);const t=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:o,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);return i(t,{selfId:e.userId,channelId:e.channelId,requestedBaseIndex:e.baseIndex,requestedCount:n,keepRaw:e.keepRaw??!0,diagnostic:{endpoint:"history",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},e.decryptDeps)}async function f(e,n){if(void 0===e.decryptDeps||void 0===e.prepareKeys)return;const o=[...new Set(n.filter(Boolean))];o.length>0&&await e.prepareKeys(o)}function u(e,n){const o=[];for(let t=0;t<e.length;t+=n)o.push(e.slice(t,t+n));return o}export{I as pullChannelHistory,h as pullChannelLatestPage,p as pullChannelOfflineMessages,l as pullChannelSessions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encryptCollectTeaBody as e,parseCollectFavoriteMsgBody as r}from"../crypto/collect-tea.js";import{requestCoreJson as t,CoreJsonBusinessError as i}from"./requests/core-json-request.js";import{projectSessionFavoriteFilesBody as n,parseSessionFavoriteFileItems as o}from"../../../im-core/src/session-favorite-files.js";import{resolveSessionFavoriteListImageUrl as a}from"../../../im-core/src/session-favorite-album.js";
|
|
1
|
+
import{encryptCollectTeaBody as e,parseCollectFavoriteMsgBody as r}from"../crypto/collect-tea.js";import{requestCoreJson as t,CoreJsonBusinessError as i}from"./requests/core-json-request.js";import{projectSessionFavoriteFilesBody as n,parseSessionFavoriteFileItems as o}from"../../../im-core/src/session-favorite-files.js";import{resolveSessionFavoriteListImageUrl as a}from"../../../im-core/src/session-favorite-album.js";import{newClientMessageId as s}from"../../../im-core/src/mapping/message-id.js";class c extends Error{constructor(){super("会话收藏 Core API 未配置"),this.name="SessionFavoriteProviderUnavailableError"}}class m extends Error{constructor(e){super(e),this.name="SessionFavoriteMappingError"}}function l(e){return"string"==typeof e?e:null==e?"":String(e)}function d(e,r){const t=l(e).trim();if(""===t)throw new m(`${r} 不能为空`);return t}function f(e){if("direct"===e)return 0;if("group"===e)return 1;if("channel"===e)return 2;throw new m(`favorite conversation type ${e}`)}function u(e,r){return"text"===r||"location"===r?l(e.content).trim():"file"===r?l(e.fileName||e.file_name||e.name).trim():"mediaAlbum"===r||"filesAlbum"===r?l(e.caption).trim():"liveRoom"===r?l(e.liveRoomName).trim()||l(e.broadcasterUserName).trim():""}function v(e,r){const t=l(e.group_id).trim(),i=l(e.radio_id).trim(),n=Number(l(e.msg_type).trim());if(1===n&&""!==t)return{conversationType:"group",conversationId:t};if(2===n&&""!==i)return{conversationType:"channel",conversationId:i};if(""!==t)return{conversationType:"group",conversationId:t};if(""!==i)return{conversationType:"channel",conversationId:i};if(0===n){const t=l(e.from_id).trim(),i=l(e.to_id).trim(),n=t===r.trim()?i:t;if(""!==n)return{conversationType:"direct",conversationId:n}}return null}function p(e,r){const t=e.from_user,i=l(t?.nick_name||t?.nickname||t?.name).trim();return""===i?r:i}function y(e,t){const i=l(e.uu_id).trim(),s=function(e){const r="number"==typeof e?e:Number(String(e??"").trim());return 1===r?"text":2===r?"image":3===r?"video":4===r?"voice":5===r?"location":11===r?"file":28===r?"mediaAlbum":29===r?"filesAlbum":30===r?"liveRoom":null}(e.content_type),c=r(l(e.msg_body),t);if(""===i||null===s||null===c)return null;const m=l(e.from_id).trim();return Object.freeze({collectId:i,msgId:l(e.msg_id).trim(),kind:s,senderId:m,senderName:p(e,m),avatarUrl:l(e.from_user?.avatar).trim(),createdAt:l(e.create_time||e.update_time||e.msg_time).trim(),text:u(c,s),imageUrl:a(s,c),fileName:"filesAlbum"===s?o(c).map(e=>e.fileName).join(" "):"file"===s?u(c,"file"):"",body:"filesAlbum"===s?n(c):Object.freeze({...c}),conversation:v(e,t)})}function g(){if("function"!=typeof globalThis.crypto?.randomUUID&&"function"!=typeof globalThis.crypto?.getRandomValues)throw new m("collect uuid 不可用");return s()}function b(r){async function s(e,n,o){if(void 0===r.coreClient)throw new c;const a=await t(r.coreClient,e,n,{method:"POST",responseMode:"strict",prefix:""});if(!a.ok)throw new i(o,a.code,a.message);return a.data}return{async list(){const e=d(r.getUserId(),"favorite userId"),t=await s("/api/v1/user/favorite/list",{start_time:"1970-01-01 08:00:00",page_size:"2000"},"会话收藏列表");return Object.freeze(function(e){if(null==e)return[];if(Array.isArray(e))return e;if("object"==typeof e&&null!==e&&"list"in e){const r=e.list;if(null==r)return[];if(Array.isArray(r))return r}throw new m("favorite list data 必须是数组或 { list }")}(t).flatMap(r=>{const t=y(r,e);return null===t?[]:[t]}))},async add(t){const i=d(r.getUserId(),"favorite userId"),c=(r.createCollectId??g)(),m={msg_id:d(t.messageId,"favorite msgId"),content_type:(l=t.kind,"text"===l?1:"image"===l?2:"video"===l?3:"voice"===l?4:"location"===l?5:"mediaAlbum"===l?28:"filesAlbum"===l?29:"liveRoom"===l?30:11),msg_type:f(t.conversation.conversationType),msg_time:String(t.createdAt),from_id:d(t.senderId,"favorite fromId"),to_id:d(t.peerId,"favorite toId"),is_hide:!0===t.hide?"1":"0",uu_id:c,msg_body:e(JSON.stringify(t.plainBody),i)};var l,v;return"group"===t.conversation.conversationType&&(m.group_id=t.conversation.conversationId),"channel"===t.conversation.conversationType&&(m.radio_id=t.conversation.conversationId),await s("/api/v1/user/favorite/add",m,"添加会话收藏"),v={collectId:c,msgId:t.messageId.trim(),kind:t.kind,senderId:t.senderId.trim(),senderName:t.senderId.trim(),avatarUrl:"",createdAt:String(t.createdAt),text:u(t.plainBody,t.kind),imageUrl:a(t.kind,t.plainBody),fileName:"filesAlbum"===t.kind?o(t.plainBody).map(e=>e.fileName).join(" "):"file"===t.kind?u(t.plainBody,"file"):"",body:"filesAlbum"===t.kind?n(t.plainBody):t.plainBody,conversation:t.conversation},Object.freeze({...v,body:Object.freeze({...v.body}),conversation:null===v.conversation?null:Object.freeze({...v.conversation})})},async delete(e){const r=[...new Set(e.map(e=>e.trim()).filter(e=>""!==e))];if(0===r.length)throw new m("favorite ids 不能为空");await s("/api/v1/user/favorite/del",{ids:r.join("|")},"删除会话收藏")}}}export{m as SessionFavoriteMappingError,c as SessionFavoriteProviderUnavailableError,b as createSessionFavoriteHttpAdapter};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var t=Object.defineProperty,e=(e,r,o)=>((e,r,o)=>r in e?t(e,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[r]=o)(e,"symbol"!=typeof r?r+"":r,o);import{withRequestTimeout as r}from"../http/request-timeout.js";import{MediaTransferError as o}from"./media-transfer-errors.js";class n extends o{constructor(t){super("download-range-failed",`媒体下载失败:HTTP ${t}`),e(this,"status"),this.status=t}}class a extends Error{constructor(t){super("媒体下载网络失败",{cause:t}),this.name="MediaDownloadNetworkError"}}async function s(t){try{return await t()}catch(t){if(t instanceof TypeError||t instanceof Error&&"NetworkError"===t.name)throw new a(t);throw t}}function i(t,e){return r({signal:t,idleMs:3e4,totalMs:18e5,timeoutError:()=>new o("download-timeout","媒体下载连续 30 秒无新数据,或单次请求超过 30 分钟")},e)}function c(t){return t instanceof n?t.status>=500&&t.status<=599:t instanceof o?"download-timeout"===t.code:t instanceof a}async function u(t){if(t?.aborted)throw t.reason??new DOMException("媒体下载已取消","AbortError");await new Promise((e,r)=>{let o;const n=()=>{clearTimeout(o),t?.removeEventListener("abort",n),r(t?.reason??new DOMException("媒体下载已取消","AbortError"))};o=setTimeout(()=>{t?.removeEventListener("abort",n),e()},1e3),t?.addEventListener("abort",n,{once:!0})})}async function f(t,e){for(let r=0;;r++)try{if(t?.aborted)throw t.reason??new DOMException("媒体下载已取消","AbortError");return await e()}catch(e){if(t?.aborted||r>=3||!c(e))throw e instanceof a?e.cause:e;await u(t)}}export{n as MediaDownloadHttpError,a as MediaDownloadNetworkError,s as downloadNetworkOperation,f as retryDownloadRequest,i as timedDownload};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{trackResponseActivity as e}from"../http/request-timeout.js";import{retryDownloadRequest as t,timedDownload as n,downloadNetworkOperation as o,MediaDownloadHttpError as a,MediaDownloadNetworkError as r}from"./media-download-request.js";import{createMediaRequestLimiter as i}from"./media-request-limiter.js";import{MediaTransferError as s}from"./media-transfer-errors.js";import{MEDIA_TRANSFER_PART_BYTES as d,MEDIA_TRANSFER_REQUEST_CONCURRENCY as l,MEDIA_DOWNLOAD_PART_CONCURRENCY as c}from"./media-transfer-policy.js";function u(u=!0,f,w=d){if(!Number.isSafeInteger(w)||w<=0)throw new RangeError("下载分段大小必须为正整数");const b=i(l),g=/* @__PURE__ */new WeakMap;async function y(e,t){if(!e.ok)throw await(e.body?.cancel().catch(()=>{})),new a(e.status);return void 0===t.onProgress||null===e.body?o(async()=>!0===t.preferBlob?await e.blob():new Uint8Array(await e.arrayBuffer())):async function(e,t,n,a=!1){const r=Number(e.headers.get("content-length")??0),i=void 0!==n&&Number.isFinite(n)&&n>0?Math.floor(n):0,s=Number.isFinite(r)&&r>0?r:i;let d=0;const l=e.body.getReader();let c=!1;const u=async e=>{c=!0;try{await l.cancel(e)}catch{}finally{l.releaseLock()}},f=new ReadableStream({async pull(e){try{const n=await o(()=>l.read());if(c)return;if(n.done)return c=!0,l.releaseLock(),void e.close();d+=n.value.byteLength;const a=s>0?Math.min(99,Math.round(d/s*100)):0;t({percent:a,bytesTransferred:d,bytesTotal:s}),e.enqueue(n.value)}catch(t){e.error(t),await u(t)}},cancel:u}),w=new Response(f,{headers:e.headers});return a?await w.blob():new Uint8Array(await w.arrayBuffer())}(e,t.onProgress,t.expectedBytes,!0===t.preferBlob)}async function h(r){const i=r.resume?.transport,d="object"==typeof i&&null!==i?g.get(i):void 0;if(void 0!==r.resume&&(void 0===d||d.url!==r.url))throw r.onResumeInvalidated?.(),new s("download-range-invalid","下载断点不属于当前资源或传输实例,请重新下载");const l=new AbortController,u=()=>l.abort(r.signal?.reason);r.signal?.aborted?u():r.signal?.addEventListener("abort",u,{once:!0});const h=l.signal,m=void 0===d?[]:[...d.blobs];let v,p=m.reduce((e,t)=>e+(t?.size??0),0),B=d?.object,M=d?.mimeType??"",E=0,x=!1,R=!1;function j(){if(void 0===r.onResumable||void 0===B||0===p)return;const e=Object.freeze({});g.set(e,Object.freeze({url:r.url,object:Object.freeze({...B}),mimeType:M,blobs:Object.freeze([...m])}));const t=Object.freeze({bytesDownloaded:p,bytesTotal:B.total,transport:e});r.onResumable(t)}function L(){const e=B.total;r.onProgress?.({percent:Math.min(99,Math.round(p/e*100)),bytesTransferred:p,bytesTotal:e})}function T(e){return void 0!==B&&m[e]?.size===Math.min(w,B.total-e*w)}async function A(i,l=!1){return t(h,()=>b(h,()=>n(h,async t=>{if(!l&&T(i))return"range";const n=l?0:i*w+(m[i]?.size??0),u=l?0:void 0===B?n+w-1:Math.min((i+1)*w-1,B.total-1),b=e(await o(()=>fetch(r.url,{signal:t.signal,cache:"no-store",headers:{Range:`bytes=${n}-${u}`}})),t);if(void 0===d&&void 0===B&&0===i&&200===b.status)return f?.record("info","sdk","media","download-range-unavailable",()=>({data:{reason:"server-returned-full-response"}})),m[0]=await y(b,{...r,signal:h,preferBlob:!0}),"single";if(429===b.status||b.status>=500)throw await(b.body?.cancel().catch(()=>{})),new a(b.status);let g;try{g=function(e,t,n,o){const a=/^bytes (\d+)-(\d+)\/(\d+)$/.exec(e.headers.get("content-range")??""),r=e.headers.get("etag")??"",i=e.headers.get("content-length"),d=Number(a?.[1]),l=Number(a?.[2]),c=Number(a?.[3]);if(206!==e.status||null===a||![d,l,c].every(Number.isSafeInteger)||c<=0||d!==t||l!==Math.min(n,c-1)||l<d||!/^"[\x21\x23-\x7E\x80-\xFF]*"$/.test(r)||null!==i&&(!/^\d+$/.test(i)||Number(i)!==l-d+1)||null!==e.headers.get("content-encoding")&&"identity"!==e.headers.get("content-encoding"))throw new s("download-range-invalid","分段下载响应无效:需要 206、正确 Content-Range、强 ETag 和未压缩字节;请检查下载域名的 CORS ExposeHeaders");if(void 0!==o&&(c!==o.total||r!==o.etag))throw new s("download-object-changed","分段下载期间文件版本发生变化,请重新下载");return{end:l,total:c,etag:r}}(b,n,u,B)}catch(e){throw await(b.body?.cancel().catch(()=>{})),e}if(void 0===B&&(B=g,M=b.headers.get("content-type")??"",f?.record("debug","sdk","media","download-range-started",()=>({data:{bytesTotal:g.total,partSizeBytes:w,concurrency:c}}))),l){if(1!==(await o(()=>b.arrayBuffer())).byteLength)throw new s("download-range-invalid","下载对象校验响应长度无效")}else await async function(e,t,n){const a=e.body?.getReader();if(void 0===a)throw new s("download-range-invalid","分段下载没有响应字节流");const r=()=>{a.cancel().catch(()=>{})};h.addEventListener("abort",r,{once:!0});let i=0;try{for(;;){if(h.aborted)throw new DOMException("媒体下载已取消","AbortError");const e=await o(()=>a.read());if(h.aborted)throw new DOMException("媒体下载已取消","AbortError");if(e.done)break;if(i+=e.value.byteLength,i>n)throw new s("download-range-invalid","分段下载字节数超过 Content-Range");const r=m[t];m[t]=new Blob(void 0===r?[e.value]:[r,e.value]),p+=e.value.byteLength,j(),L()}if(i!==n)throw new s("download-range-invalid","分段下载字节数与 Content-Range 不一致");L()}finally{h.removeEventListener("abort",r),await a.cancel().catch(()=>{}),a.releaseLock()}}(b,i,g.end-n+1);return"range"}),r.getPriority))}try{if(void 0!==B)for(;E<Math.ceil(B.total/w)&&T(E);)E+=1;const e=void 0!==B&&E===Math.ceil(B.total/w),t=await A(E++,e);if("range"===t){const e=Math.ceil(B.total/w),t=Array.from({length:Math.min(c,Math.max(0,e-E))},async()=>{try{for(;!h.aborted&&E<e;){const e=E++;T(e)||await A(e)}}catch(e){(e=>{!R&&e instanceof s&&("download-range-invalid"===e.code||"download-object-changed"===e.code)&&(R=!0,v=e),x||(x=!0,v=e,l.abort())})(e)}});if(await Promise.allSettled(t),x)throw v}if(h.aborted)throw new DOMException("媒体下载已取消","AbortError");const n=[];if("range"===t)for(let e=0;e<Math.ceil(B.total/w);e+=1){if(!T(e))throw new s("download-range-invalid","下载仍缺少分段,不能交付完整文件");n.push(m[e])}return"single"===t?m[0]:new Blob(n,{type:M})}catch(e){throw l.abort(),R||e instanceof s&&("download-range-invalid"===e.code||"download-object-changed"===e.code)?r.onResumeInvalidated?.():j(),f?.record("warn","sdk","media","download-range-failed",()=>({data:{code:e instanceof s?e.code:"download-failed"}})),e}finally{r.signal?.removeEventListener("abort",u)}}return async function(i){if(void 0!==i.resume&&!u)throw i.onResumeInvalidated?.(),new s("download-range-invalid","当前下载器未开启断点下载,请重新下载");if(u&&(void 0!==i.resume||void 0!==i.onResumable||!0===i.preferBlob&&Number.isFinite(i.expectedBytes)&&i.expectedBytes>w)){const e=await h(i);return!0===i.preferBlob?e:new Uint8Array(await e.arrayBuffer())}return t(i.signal,()=>b(i.signal,()=>n(i.signal,async t=>{const n={...i,signal:t.signal};if(void 0!==i.onProgress&&"undefined"!=typeof XMLHttpRequest)return function(e,t){const n=!0===e.preferBlob;return new Promise((o,i)=>{const s=new XMLHttpRequest;let d=!1,l=()=>{};const c=()=>{e.signal?.removeEventListener("abort",l),s.onprogress=null,s.onload=null,s.onerror=null,s.onabort=null,s.onreadystatechange=null},u=e=>{d||(d=!0,c(),e())};l=()=>{s.abort(),u(()=>i(new DOMException("media download canceled","AbortError")))},s.open("GET",e.url,!0),s.responseType=n?"blob":"arraybuffer";let f=0;s.onreadystatechange=()=>{2===s.readyState&&(t.touch(),s.status>0&&(s.status<200||s.status>=300)&&(u(()=>i(new a(s.status))),s.abort()))},s.onprogress=n=>{n.loaded>f&&(f=n.loaded,t.touch());const o=void 0!==e.expectedBytes&&Number.isFinite(e.expectedBytes)&&e.expectedBytes>0?Math.floor(e.expectedBytes):0,a=n.lengthComputable&&n.total>0?n.total:o,r=a>0?Math.min(99,Math.round(n.loaded/a*100)):0;try{e.onProgress?.({percent:r,bytesTransferred:n.loaded,bytesTotal:a})}catch(e){u(()=>i(e)),s.abort()}},s.onload=()=>{if(s.status<200||s.status>=300)return void u(()=>i(new a(s.status)));const e=s.response;if(n)return"undefined"!=typeof Blob&&e instanceof Blob?void u(()=>o(e)):void u(()=>i(new Error("media download 失败:XHR 未返回 Blob")));e instanceof ArrayBuffer?u(()=>o(new Uint8Array(e))):u(()=>i(new Error("media download 失败:XHR 未返回 ArrayBuffer")))},s.onerror=()=>u(()=>i(new r(new TypeError("media download 失败:network")))),s.onabort=()=>u(()=>i(new DOMException("media download canceled","AbortError"))),e.signal?.aborted?l():(e.signal?.addEventListener("abort",l,{once:!0}),s.send())})}(n,t);const s=await o(()=>fetch(i.url,{signal:t.signal}));return y(e(s,t),n)}),i.getPriority))}}export{u as createMediaDownloader};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{fileMd5 as
|
|
1
|
+
import{fileMd5 as e}from"./file-md5.js";import{resolveMediaThumbnailMimeType as t}from"../../../im-core/src/media-thumbnail.js";function i(e,t){return""!==e.type||void 0===t||""===t?e:new Blob([e],{type:t})}function a(a){let r=0;return{fileMd5:e,async imageDimensions(e,t,o){const n=await a.prepare({operationId:"core-image-dimensions-"+ ++r,generation:0,kind:"image",file:i(e,t),includePoster:!1},o);return{width:n.width,height:n.height}},async imageThumbnail(e,o,n){const m=await a.prepare({operationId:"core-image-thumbnail-"+ ++r,generation:0,kind:"image",posterEncoding:"webp",file:i(e,o?.mimeType),...void 0===o?.maxSize?{}:{maxSize:o.maxSize},...void 0===o?.targetBytes?{}:{targetBytes:o.targetBytes},...void 0===o?.maxBytes?{}:{maxBytes:o.maxBytes},...void 0===o?.quality?{}:{quality:o.quality},...void 0===o?.minQuality?{}:{minQuality:o.minQuality}},n);if(void 0===m.posterData)throw new Error("图片缩略图生成失败:执行器未返回 poster");return{data:new Uint8Array(m.posterData),width:m.width,height:m.height,mimeType:t(new Uint8Array(m.posterData))}},async videoPoster(e,o,n){const m=await a.prepare({operationId:"core-video-poster-"+ ++r,generation:0,kind:"video",posterEncoding:"webp",file:i(e,o?.mimeType),...void 0===o?.maxSize?{}:{maxSize:o.maxSize},...void 0===o?.targetBytes?{}:{targetBytes:o.targetBytes},...void 0===o?.maxBytes?{}:{maxBytes:o.maxBytes},...void 0===o?.quality?{}:{quality:o.quality},...void 0===o?.minQuality?{}:{minQuality:o.minQuality},...void 0===o?.atTime?{}:{atTime:o.atTime}},n);if(void 0===m.posterData)throw new Error("视频封面生成失败:执行器未返回 poster");return{data:new Uint8Array(m.posterData),width:m.width,height:m.height,duration:Math.round(m.duration??0),mimeType:t(new Uint8Array(m.posterData))}}}}export{a as createMediaPreviewAdapter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var t=Object.defineProperty,e=(e,i,r)=>((e,i,r)=>i in e?t(e,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[i]=r)(e,"symbol"!=typeof i?i+"":i,r);import{readImageDimensionsFromHeader as i}from"./image-header-dimensions.js";import{compressCanvasPng as r}from"./png-lossless-compression.js";import{
|
|
1
|
+
var t=Object.defineProperty,e=(e,i,r)=>((e,i,r)=>i in e?t(e,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[i]=r)(e,"symbol"!=typeof i?i+"":i,r);import{readImageDimensionsFromHeader as i}from"./image-header-dimensions.js";import{compressCanvasPng as r}from"./png-lossless-compression.js";import{createCanvasWebpEncoder as a}from"./webp-encoder.js";import{resolveMediaThumbnailPolicy as n}from"../../../im-core/src/media-thumbnail-policy.js";const o=n(),s=n(3),h=n(5,4),c={maxSize:960,targetBytes:8192,maxBytes:24576};function d(t){const e={active:0,disposed:!1},i=[];function r(){for(;!e.disposed&&e.active<t&&i.length>0;){const t=i.shift();if(t.signal?.aborted){t.reject(new DOMException("媒体预览准备已取消","AbortError"));continue}void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),e.active+=1;let a=!1;t.resolve(()=>{a||(a=!0,e.active-=1,r())})}}return{acquire:t=>e.disposed?Promise.reject(new Error("媒体预览执行器已释放")):new Promise((e,a)=>{const n={resolve:e,reject:a,...void 0===t?{}:{signal:t}};void 0!==t&&(n.onAbort=()=>{const t=i.indexOf(n);t>=0&&i.splice(t,1),a(new DOMException("媒体预览准备已取消","AbortError"))},t.addEventListener("abort",n.onAbort,{once:!0})),i.push(n),r()}),dispose(){e.disposed=!0;for(const t of i.splice(0))void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),t.reject(new Error("媒体预览执行器已释放"))}}}function l(t){if(t?.aborted)throw new DOMException("媒体预览准备已取消","AbortError")}const m=16777216;function f(t,e,i){const r=Math.min(1,i/Math.max(t,e));return function(t,e){const i=Math.min(1,4096/Math.max(t,e));let r=Math.max(1,Math.round(t*i)),a=Math.max(1,Math.round(e*i));const n=r*a;if(n>m){const t=Math.sqrt(m/n);r=Math.max(1,Math.floor(r*t)),a=Math.max(1,Math.floor(a*t))}return{width:r,height:a}}(Math.max(1,Math.round(t*r)),Math.max(1,Math.round(e*r)))}async function u(t,e){l(e);const i=await new Promise(e=>t.toBlob(e,"image/png"));if(l(e),null===i)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await r(await i.arrayBuffer(),e)}async function g(t,e,i){l(i);const r=await new Promise(i=>t.toBlob(i,"image/jpeg",e));if(l(i),null===r)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await r.arrayBuffer()}function w(t,e){if(!Number.isInteger(t)||t<=0)throw new RangeError(`${e}必须是正整数`)}function y(t,e){if(!Number.isFinite(t)||t<=0||t>1)throw new RangeError(`${e}必须大于 0 且不超过 1`)}function b(t){const e="webp"===t.posterEncoding,i=e?o:c,r="video"===t.kind?"视频封面":"图片缩略图",a=t.maxSize??i.maxSize,n=t.maxBytes??i.maxBytes,s=t.targetBytes??Math.min(i.targetBytes,n),h=t.quality??Math.max(e?.8:.72,t.minQuality??0),d=t.minQuality??Math.min(h,e?.65:.55);if(w(a,`${r}最大边长`),w(s,`${r}目标字节数`),w(n,`${r}最大字节数`),y(h,`${r}初始质量`),y(d,`${r}最低质量`),s>n)throw new RangeError(`${r}目标字节数不能超过最大字节数`);if(d>h)throw new RangeError(`${r}最低质量不能高于初始质量`);return{label:r,maxSize:a,targetBytes:s,maxBytes:n,initialQuality:h,minQuality:d}}class v extends Error{constructor(){super(...arguments),e(this,"name","ThumbnailByteLimitError")}}function p(t,e){const i=[128,64,192],r=i.map(()=>0),a=4*e;for(let n=0;n<t.length;n+=4){const o=t[n+3];if(0===o)continue;const s=n/4%e;if(!(s>0&&t[n-1]<o||s+1<e&&t[n+7]<o||n>=a&&t[n-a+3]<o||n+a+3<t.length&&t[n+a+3]<o))continue;const h=o/255;for(let e=0;e<i.length;e+=1){const a=i[e],o=Math.max(Math.abs(t[n]-a),Math.abs(t[n+1]-a),Math.abs(t[n+2]-a))*h;r[e]=r[e]+Math.min(64,o)}}let n=0;for(let t=1;t<i.length;t+=1)r[t]>r[n]&&(n=t);return`#${i[n].toString(16).padStart(2,"0").repeat(3)}`}async function M(t,e,i,r,a,n){const{label:o,maxSize:c,targetBytes:d,maxBytes:m,initialQuality:w,minQuality:y}=b(r),M="video"===r.kind,x="webp"===r.posterEncoding,E=x?a:g;l(n);const L=document.createElement("canvas");try{const a=L.getContext("2d");if(null===a)throw new Error("媒体预览准备失败:无法创建 Canvas 2D 上下文");let g;const b=e=>{l(n),L.width=e.width,L.height=e.height,void 0!==g&&(a.fillStyle=g,a.fillRect(0,0,e.width,e.height)),a.drawImage(t,0,0,e.width,e.height)},B=f(e,i,c);let j=B;const P=c<=(x?s.maxSize:640),R=x&&c<=h.maxSize,S=Math.min(R?80:P?240:320,Math.max(j.width,j.height));b(j);const z=M?void 0:a.getImageData(0,0,j.width,j.height).data;let D,A,$=!1;if(void 0!==z)for(let t=3;t<z.length;t+=4)if(z[t]<255){$=!0;break}if($&&x&&!r.preserveTransparency&&(g=p(z,B.width),b(j)),$&&!x){let t;for(let r=0;r<4;r+=1){const a=await u(L,n);if((void 0===t||a.byteLength<t.byteLength)&&(t=a),a.byteLength<=m)return a;const o=Math.max(j.width,j.height);if(o<=S||3===r)break;const s=Math.min(.8,Math.max(.35,.9*Math.sqrt(m/a.byteLength)));j=f(e,i,Math.max(S,Math.floor(o*s))),b(j)}if(void 0!==t&&t.byteLength<=m)return t;g=p(z,B.width),j=B,b(j)}const k=[.../* @__PURE__ */new Set([w,Math.max(y,w-.12),y])];for(const t of k){const e=await E(L,t,n);if((void 0===D||e.byteLength<D.byteLength)&&(D=e),e.byteLength<=m&&(void 0===A||x&&e.byteLength<A.byteLength)&&(A=e),e.byteLength<=d)return e}if(void 0!==A)return A;for(let t=0;t<3;t+=1){const t=Math.max(j.width,j.height);if(t<=S||void 0===D)break;const r=Math.sqrt(m/D.byteLength);j=f(e,i,Math.max(S,Math.floor(t*Math.min(.9,Math.max(.5,r))))),b(j);for(const t of/* @__PURE__ */new Set([w,y])){const e=await E(L,t,n);if(e.byteLength<D.byteLength&&(D=e),e.byteLength<=m&&(void 0===A||x&&e.byteLength<A.byteLength)&&(A=e),e.byteLength<=d)return e}if(void 0!==A)return A}if(void 0!==D&&D.byteLength<=m)return D;const O=Math.min(R?64:P?160:240,Math.max(j.width,j.height)),T=r.minQuality??Math.min(w,x?.55:.45);for(let t=0;t<2&&void 0!==D;t+=1){const r=Math.max(j.width,j.height),a=1===t?O:Math.max(O,Math.floor(r*Math.min(.9,.95*Math.sqrt(m/D.byteLength))));j=f(e,i,a),b(j);for(const t of/* @__PURE__ */new Set([y,T])){const e=await E(L,t,n);if(e.byteLength<D.byteLength&&(D=e),e.byteLength<=m)return e}if(a<=O)break}throw new v(`${o}生成失败:编码结果超过 ${m} 字节硬上限`)}finally{L.width=0,L.height=0}}function x(t,e,i,r){return l(i),new Promise((a,n)=>{let o,s,h,c;const d=()=>{void 0!==o&&clearTimeout(o),t.removeEventListener(e,s),t.removeEventListener("error",h),i?.removeEventListener("abort",c)};s=()=>{("seeked"===e?!t.seeking:t.readyState>=("loadedmetadata"===e?1:2))&&(d(),a())},h=()=>{d(),n(new Error(`视频预览准备失败:${e} 前解码错误`))},c=()=>{d(),n(new DOMException("媒体预览准备已取消","AbortError"))},o=setTimeout(()=>{d(),n(new Error(`视频预览准备失败:${e} 超时`))},15e3),t.addEventListener(e,s),t.addEventListener("error",h,{once:!0}),i?.addEventListener("abort",c,{once:!0});try{r?.(),i?.aborted?c():null!==t.error?h():s()}catch(t){d(),n(t)}})}function E(t={}){const e=t.maxConcurrency??function(){if("undefined"==typeof navigator)return 2;const t=navigator.userAgent;if(/iPad|iPhone|iPod/.test(t)||/Macintosh/.test(t)&&(navigator.maxTouchPoints??0)>1)return 1;const e=navigator.deviceMemory;return void 0!==e&&e<=2?1:2}();if(!Number.isInteger(e)||e<1||e>4)throw new RangeError("媒体预览并发数必须是 1-4 的整数");const r=d(e),n=d(1),o=a();let s=!1;return{async prepare(t,e){if(s)throw new Error("媒体预览执行器已释放");const a="video"===t.kind,h=await(a?n:r).acquire(e);try{const r=a?await async function(t,e,i){const r=URL.createObjectURL(t.file),a=document.createElement("video");a.muted=!0,a.preload="metadata",a.playsInline=!0;try{await x(a,"loadedmetadata",i,()=>{a.src=r,a.load()});const n=a.videoWidth,o=a.videoHeight;if(n<=0||o<=0)throw new Error("视频预览准备失败:视频尺寸无效");const s=Number.isFinite(a.duration)&&a.duration>0?a.duration:void 0,h=void 0===t.atTime?void 0===s?0:Math.min(1,s/2):Math.max(0,Math.min(t.atTime,s??t.atTime));h>0&&await x(a,"seeked",i,()=>{a.currentTime=h}),await x(a,"loadeddata",i,()=>{a.preload="auto"});const c=void 0===s?void 0:s;let d,l;try{d=await M(a,n,o,t,e,i)}catch(t){if(i?.aborted||t instanceof RangeError)throw t}if(t.includeDisplayPoster)try{l=await M(a,n,o,{...t,posterEncoding:"webp",maxSize:960,targetBytes:131072,maxBytes:262144,quality:.85,minQuality:.82},e,i)}catch(t){if(i?.aborted||t instanceof RangeError)throw t}return{width:n,height:o,...void 0===c?{}:{duration:c},...void 0===d?{}:{posterData:d},...void 0===l?{}:{displayPosterData:l}}}finally{a.pause(),a.removeAttribute("src"),a.load(),URL.revokeObjectURL(r)}}(t,o.encode,e):await async function(t,e,r){l(r);const{maxSize:a,targetBytes:n,maxBytes:o}=b(t),s=await i(t.file);function h(e,i){return"webp"!==t.posterEncoding&&"image/jpeg"===t.file.type&&t.file.size<=n&&Math.max(e,i)<=a}async function c(e,i){const n="webp"!==t.posterEncoding&&"image/jpeg"===t.file.type&&Math.max(i.width,i.height)<=a&&t.file.size<=o;try{const i=await e;if(!n||t.file.size>i.byteLength)return i}catch(t){if(!(n&&t instanceof v))throw t}return l(r),await t.file.arrayBuffer()}if(l(r),void 0!==s){if(!1===t.includePoster)return s;if(h(s.width,s.height))return{...s,posterData:await t.file.arrayBuffer()}}const d=void 0===s?void 0:f(s.width,s.height,a);let m;try{m=void 0===d?await createImageBitmap(t.file):await createImageBitmap(t.file,{resizeWidth:d.width,resizeHeight:d.height,resizeQuality:"high"})}catch(t){if(r?.aborted)throw t}if(void 0!==m)try{l(r);const i=s??{width:m.width,height:m.height};return!1===t.includePoster?i:void 0===s&&h(m.width,m.height)?{...i,posterData:await t.file.arrayBuffer()}:{...i,posterData:await c(M(m,m.width,m.height,t,e,r),i)}}finally{m.close()}const u=URL.createObjectURL(t.file),g=new Image;try{await new Promise((t,e)=>{let i,a;const n=()=>{void 0!==i&&clearTimeout(i),g.onload=null,g.onerror=null,r?.removeEventListener("abort",a)};a=()=>{n(),e(new DOMException("媒体预览准备已取消","AbortError"))},g.onload=()=>{n(),t()},g.onerror=()=>{n(),e(new Error("图片预览准备失败:Image 解码错误"))},i=setTimeout(()=>{n(),e(new Error("图片预览准备失败:Image 解码超时"))},15e3),r?.addEventListener("abort",a,{once:!0}),g.src=u});const i=s??{width:g.naturalWidth,height:g.naturalHeight};return!1===t.includePoster?i:h(g.naturalWidth,g.naturalHeight)?{...i,posterData:await t.file.arrayBuffer()}:{...i,posterData:await c(M(g,g.naturalWidth,g.naturalHeight,t,e,r),i)}}finally{g.removeAttribute("src"),URL.revokeObjectURL(u)}}(t,o.encode,e);return l(e),r}finally{h()}},dispose(){s||(s=!0,r.dispose(),n.dispose(),o.dispose())}}}export{E as createMediaPreviewPreparationExecutor};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createMediaDownloader as e}from"./media-downloader.js";import{createMediaRequestLimiter as t}from"./media-request-limiter.js";import{MediaTransferError as a,recoverableUploadFailure as r}from"./media-transfer-errors.js";import{resolveMediaUploadPlan as o,MEDIA_UPLOAD_PART_CONCURRENCY as n,MEDIA_TRANSFER_REQUEST_CONCURRENCY as i}from"./media-transfer-policy.js";import{createMediaUploadCredentialStore as s}from"./media-upload-credentials.js";import{abortMultipartSession as d,resumableParts as l,putWholeObject as
|
|
1
|
+
import{createMediaDownloader as e}from"./media-downloader.js";import{createMediaRequestLimiter as t}from"./media-request-limiter.js";import{MediaTransferError as a,recoverableUploadFailure as r}from"./media-transfer-errors.js";import{resolveMediaUploadPlan as o,MEDIA_UPLOAD_PART_CONCURRENCY as n,MEDIA_TRANSFER_REQUEST_CONCURRENCY as i}from"./media-transfer-policy.js";import{createMediaUploadCredentialStore as s}from"./media-upload-credentials.js";import{abortMultipartSession as d,resumableParts as l,putWholeObject as c,uploadInParts as u,isNoSuchUploadError as m,MISSING_ETAG_MESSAGE as p}from"./s3-multipart-uploader.js";import{installUploadIdleTimeout as f}from"./xhr-upload-idle-timeout.js";import{newClientMessageId as b}from"../../../im-core/src/mapping/message-id.js";import{getAbortReason as g}from"../../../im-core/src/abort.js";const y="分片上传要求该 bucket 的 CORS 放行 POST(Create/CompleteMultipartUpload)、DELETE(AbortMultipartUpload)并 ExposeHeaders: ETag";function v(e,t,r){return void 0!==r?new a("multipart-abort-failed",`media upload: 分片上传失败后的 AbortMultipartUpload 清理未成功,已上传分片可能残留在 bucket 中并继续计费(建议桶侧配置 AbortIncompleteMultipartUpload 生命周期规则);${y}`,{cause:r}):e instanceof a?e:function(e){return e instanceof Error&&e.message.includes(p)}(e)?new a("multipart-etag-missing","media upload: 分片响应读不到 ETag,这是 bucket CORS 缺少 ExposeHeaders: ETag 的配置问题,不是网络问题",{cause:e}):!t||e instanceof Error&&"AbortError"===e.name?e:new a("multipart-upload-failed",`media upload: 分片上传失败;${y}`,{cause:e})}const w=/* @__PURE__ */new Set(["upload-source-invalid","upload-resume-unavailable","multipart-etag-missing","multipart-abort-failed"]);function h(e,t){const a=e?.transport;if(null==a||"object"!=typeof a||"string"!=typeof a.logicalBucket||""===a.logicalBucket||"string"!=typeof a.objectName||""===a.objectName||void 0!==t&&a.logicalBucket!==t)return;const r=a.session;if(null==r||"object"!=typeof r||"string"!=typeof r.bucket||""===r.bucket||"string"!=typeof r.key||""===r.key||"string"!=typeof r.uploadId||""===r.uploadId||!Number.isSafeInteger(r.partSize)||r.partSize<=0||!Number.isSafeInteger(r.sourceBytes)||r.sourceBytes<0||!Array.isArray(r.parts))return;const o=/* @__PURE__ */new Set;for(const e of r.parts){if(null===e||"object"!=typeof e||!Number.isSafeInteger(e.partNumber)||e.partNumber<1||e.partNumber>Math.ceil(r.sourceBytes/r.partSize)||o.has(e.partNumber)||"string"!=typeof e.etag||""===e.etag)return;o.add(e.partNumber)}return a}let k;function C(){if(void 0!==k)return k;const e=Promise.all([import("@aws-sdk/client-s3"),import("@aws-sdk/xhr-http-handler")]).then(([e,t])=>({S3Client:e.S3Client,commands:{PutObjectCommand:e.PutObjectCommand,CreateMultipartUploadCommand:e.CreateMultipartUploadCommand,UploadPartCommand:e.UploadPartCommand,CompleteMultipartUploadCommand:e.CompleteMultipartUploadCommand,AbortMultipartUploadCommand:e.AbortMultipartUploadCommand},XhrHttpHandler:t.XhrHttpHandler})).catch(t=>{throw k===e&&(k=void 0),t});return k=e,e}function E(e,t){return new a("multipart-abort-failed","Resource upload failed and incomplete parts could not be removed",{cause:new AggregateError([e,t],"Resource upload and multipart cleanup both failed")})}function S(e,t){const a=e.keyPrefix??"";return""===a||t.startsWith(a)?t:`${a}${t}`}function A(p,y){const k=s(p.getUploadCredentials),A=t(i);function U(e,t,a,r=!1){const{region:o}=t;return f(a,e.XhrHttpHandler),new e.S3Client({region:o,maxAttempts:r?1:3,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,sessionToken:t.sessionToken,...void 0===t.expiresAtSeconds?{}:{expiration:new Date(1e3*t.expiresAtSeconds)}},useAccelerateEndpoint:(p.useAccelerateEndpoint??!0)&&!o.toLowerCase().startsWith("cn-"),requestChecksumCalculation:"WHEN_REQUIRED",requestHandler:a})}async function T(e,t,r,i,s,f,b,y){const{multipart:w,partSize:k}=o(b,!0===p.multipartTransfer&&!1!==p.multipartUpload),C=new e.XhrHttpHandler({}),S=U(e,s,C,!0===t.recoveryManaged),T={client:S,handler:C,commands:e.commands,bucket:s.bucket,key:f,...void 0!==t.mimeType&&""!==t.mimeType?{mimeType:t.mimeType}:{}},j={data:t.data,sourceBytes:b,...void 0===t.onProgress?{}:{onProgress:t.onProgress},...void 0===t.signal?{}:{signal:t.signal},...void 0===t.transformPart?{}:{transformPart:t.transformPart}},P=t.resume,R=h(P),B=w&&R?.logicalBucket===r&&void 0!==l(R.session,T,b,k);let H=B?R?.session:void 0;const I=e=>{H=e;let a=0;for(const t of e.parts)a+=Math.min(e.partSize,e.sourceBytes-(t.partNumber-1)*e.partSize);t.onResumable?.({bytesUploaded:a,transport:{logicalBucket:r,objectName:i,session:e}})},x=()=>{H=void 0,delete t.resume,t.onResumeInvalidated?.()};let N;try{if("retain"===y.mode&&void 0!==P&&!B)throw new a("upload-resume-unavailable","media upload: 上次上传目标或续传记录已失效,需要确认后重新完整上传");if(void 0!==R&&!B){try{R.logicalBucket===r?await d(T,R.session):await M(P)}catch(e){throw y.cleanupFailed=!0,E(y.retryCause,e)}delete t.resume}if(t.signal?.aborted)throw new DOMException("media upload canceled","AbortError");if(!w)return void await c(T,j,A);const e=H;try{await u({target:T,content:j,partSize:k,queueSize:n,runUpload:A,...void 0===e?{}:{resume:e},onResumable:I,onCompleted:x})}catch(r){if(t.signal?.aborted||!m(r)||"discard"===y.mode&&void 0===e)throw r;if("retain"===y.mode)throw new a("upload-resume-unavailable","media upload: 上次上传已无法继续,需要确认后重新完整上传",{cause:r});H=void 0,await u({target:T,content:j,partSize:k,queueSize:n,runUpload:A,onResumable:I,onCompleted:x})}}catch(e){const a=g(t.signal);if("retain"===y.mode&&!0===t.signal?.aborted&&void 0!==a&&!["offline","paused","page-preserve","cancelled-preserve"].includes(a)&&void 0!==H)try{await d(T,H),x()}catch(e){N=e}if(y.cleanupFailed)throw e;throw v(e,w,N)}finally{S.destroy()}}async function j(e,t,n,i={mode:"retain"}){const s=function(e,t){if("avatar"===e)return p.avatarBucket??"";if("channel"===t){const t=p.channelBuckets?.[e]??"";if(""!==t)return t}return p.buckets[e]??""}(t,n);if(""===s)throw new a("bucket-unconfigured",`media upload: kind=${t} 的逻辑桶名未配置(宿主 IM 对象存储配置缺该资源类型)`);const l=(c=e.data)instanceof Uint8Array?c.byteLength:"undefined"!=typeof Blob&&c instanceof Blob?c.size:void 0;var c;if(void 0===l)throw new a("upload-source-invalid","media upload: 上传内容必须是 Uint8Array 或 Blob");o(l,!0===p.multipartTransfer&&!1!==p.multipartUpload);const u=await C();if("discard"===i.mode&&e.signal?.aborted)throw new DOMException("media upload canceled","AbortError");const m=h(e.resume,s)?.objectName??(f=e.filename,b()+function(e){if(void 0===e)return"";const t=e.lastIndexOf(".");return t>=0?e.slice(t):""}(f));var f;const g={...e,onResumable:t=>{g.resume=t,e.onResumable?.(t)},onResumeInvalidated:()=>{delete g.resume,e.onResumeInvalidated?.()}};let y;try{y=await k.resolve(s,!0===e.forceRefreshCredentials?{forceRefresh:!0}:void 0);let t=S(y,m);try{await T(u,g,s,m,y,t,l,i)}catch(r){if(e.signal?.aborted||!0===e.recoveryManaged)throw r;if(r instanceof a&&w.has(r.code))throw r;i.retryCause=r,y=await k.resolve(s,{forceRefresh:!0}),t=S(y,m),await T(u,g,s,m,y,t,l,i)}if(e.signal?.aborted)throw new DOMException("media upload canceled","AbortError");return e.onProgress?.({percent:100,bytesTransferred:l,bytesTotal:l,phase:"finalizing"}),{url:`${y.dnsPoint}/${t}`}}catch(t){const o=h(g.resume);if("discard"===i.mode&&!i.cleanupFailed&&void 0!==o&&void 0!==y){const e=new u.XhrHttpHandler({}),a=U(u,y,e);try{await d({client:a,commands:u.commands},o.session)}catch(e){throw E(t,e)}finally{a.destroy()}}const n=r(t);throw void 0!==n&&e.onFailure?.(n),t instanceof a&&("upload-resume-unavailable"===t.code?e.onFailure?.("resume-unavailable"):"multipart-abort-failed"===t.code&&e.onFailure?.("cleanup-unconfirmed")),t}}async function M(e){const t=e.transport;if(void 0===t?.session||""===t.session.uploadId)return;const a=await C(),r=await k.resolve(t.logicalBucket),o=new a.XhrHttpHandler({}),n=U(a,r,o);try{await d({client:n,commands:a.commands},t.session)}finally{n.destroy()}}return{upload:function(e){return j(e,e.kind,e.conversationType)},uploadAvatar:function(e){return j(e,"avatar")},uploadResource:function(e){return j({data:e.data,...void 0===e.filename?{}:{filename:e.filename},...void 0===e.mimeType?{}:{mimeType:e.mimeType},...void 0===e.signal?{}:{signal:e.signal},...void 0===e.onProgress?{}:{onProgress:e.onProgress}},e.kind,void 0,{mode:"discard"})},download:e(!0===p.multipartTransfer&&!1!==p.rangeDownload,y),abandonUpload:M}}export{A as createMediaTransferAdapter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MediaTransferError as e}from"./media-transfer-errors.js";const r=
|
|
1
|
+
import{MediaTransferError as e}from"./media-transfer-errors.js";const r=8388608,i=16777216,t=3,o=3,n=6,a=5*1024**3,d=1e4;function s(t,o){if(!Number.isSafeInteger(t)||t<0)throw new e("upload-source-invalid","媒体上传大小必须为非负安全整数字节数");const n=o&&t>=r,d=n?Math.ceil(t/i):1;if(!n&&t>a)throw new e("upload-size-exceeded","单次 PUT 最多支持 5 GiB;更大对象需要显式启用并配置分片上传");if(d>1e4)throw new e("upload-size-exceeded","当前 16 MiB 分片策略最多支持 10,000 片(156.25 GiB)");return{multipart:n,partSize:i,partCount:d}}export{d as MAX_MEDIA_UPLOAD_PARTS,a as MAX_SINGLE_PUT_BYTES,o as MEDIA_DOWNLOAD_PART_CONCURRENCY,i as MEDIA_TRANSFER_PART_BYTES,n as MEDIA_TRANSFER_REQUEST_CONCURRENCY,r as MEDIA_UPLOAD_MULTIPART_THRESHOLD_BYTES,t as MEDIA_UPLOAD_PART_CONCURRENCY,s as resolveMediaUploadPlan};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createWebpWorker as e}from"./webp-worker-factory.js";import{resolveMediaThumbnailMimeType as r}from"../../../im-core/src/media-thumbnail.js";function o(){return new DOMException("媒体预览准备已取消","AbortError")}function t(t=e){let i,n,s,a,d=!1,c=0;const v=[];function f(e){if(e?.aborted)throw o();if(d)throw new Error("WebP 编码器已释放")}function u(){void 0!==a&&clearTimeout(a),a=void 0,n?.removeEventListener("message",l),n?.removeEventListener("error",b),n?.removeEventListener("messageerror",b),n?.terminate(),n=void 0}function w(e,r,o){e.signal?.removeEventListener("abort",e.onAbort),void 0!==o?e.reject(o):e.resolve(r)}function m(e,r){const o=s;void 0!==o&&(s=void 0,void 0!==a&&clearTimeout(a),a=void 0,void 0!==r&&u(),w(o,e,r),g())}function l(e){const o=e.data;void 0!==s&&o?.id===s.id&&(o.result instanceof ArrayBuffer&&"image/webp"===r(new Uint8Array(o.result))?m(o.result):m(void 0,new Error("string"==typeof o.error?o.error:"WebP 编码结果签名无效")))}function b(){void 0===s?u():m(void 0,new Error("WebP 编码线程加载或执行失败"))}function g(){if(d||void 0!==s)return;const e=v.shift();if(void 0!==e){s=e;try{f(e.signal),void 0===n&&(n=t(),n.addEventListener("message",l),n.addEventListener("error",b),n.addEventListener("messageerror",b));const r=e.canvas.getContext("2d");if(null===r)throw new Error("无法读取 WebP 编码像素");const{width:o,height:i}=e.canvas,s=r.getImageData(0,0,o,i).data;a=setTimeout(()=>m(void 0,new Error("WebP 编码线程超时")),15e3),n.postMessage({id:e.id,width:o,height:i,pixels:s.buffer,quality:e.quality},[s.buffer])}catch(e){m(void 0,e)}}}return{encode:async function(e,t,n){if(f(n),!1!==i){const o=await new Promise(r=>e.toBlob(r,"image/webp",t));if(f(n),null===o)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");if("image/webp"===o.type){const e=await o.arrayBuffer();if(f(n),"image/webp"!==r(new Uint8Array(e)))throw new Error("媒体预览准备失败:WebP 编码结果签名无效");return i=!0,e}i=!1}return await new Promise((r,i)=>{const a={id:++c,canvas:e,quality:t,signal:n,resolve:r,reject:i,onAbort(){if(s===a)m(void 0,o());else{const e=v.indexOf(a);e>=0&&(v.splice(e,1),w(a,void 0,o()))}}};n?.addEventListener("abort",a.onAbort,{once:!0}),v.push(a),g()})},dispose:function(){if(d)return;d=!0,u();const e=new Error("WebP 编码器已释放");void 0!==s&&w(s,void 0,e),s=void 0;for(const r of v.splice(0))w(r,void 0,e)}}}export{t as createCanvasWebpEncoder};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(){return new Worker(new URL("../../../../webp.worker.js",import.meta.url),{type:"classic",name:"im-webp"})}export{e as createWebpWorker};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
import{newClientMessageId as e}from"../../../im-core/src/mapping/message-id.js";function t(t,o={}){const n=void 0!==o.locks?o.locks:globalThis.navigator?.locks,r=void 0!==o.createChannel?o.createChannel:"function"==typeof globalThis.BroadcastChannel?e=>new BroadcastChannel(e):void 0,s="function"==typeof globalThis.addEventListener?globalThis:void 0,a=void 0!==o.pageLifecycleTarget?o.pageLifecycleTarget:s;let c,i=0;function l(e){try{t.onError(e)}catch{}}function d(e,o=!1,n="stopped"){if(c!==e||o||(c=void 0),e.resolveReady(!1),e.closed)return;e.closed=!0,e.controller.abort();const r=[],s=e=>{try{e()}catch(e){r.push(e)}};for(const t of e.cleanups.splice(0))s(t);s(()=>e.channel.close());const a=e.release;e.release=void 0;const i=e.owned;e.owned=!1;try{const e=i?t.onChange(!1,n):void 0;Promise.resolve(e).then(()=>a?.(),l)}catch(e){l(e)}for(const e of r)l(e)}function p(e,t){d(e,!0),l(t)}return{start(o){if(c?.key===o)return c.ready;const s=++i;if(c&&d(c),s!==i)return Promise.resolve(!1);if(!o||!n||!r)return l(new Error("Browser connection ownership requires a key, Web Locks and BroadcastChannel")),Promise.resolve(!1);let u,h;try{u=r(`im-connection:${o}`)}catch(e){return l(e),Promise.resolve(!1)}const m=new Promise(e=>{h=e}),v={key:o,channel:u,cleanups:[],owned:!1,closed:!1,ready:m,resolveReady:h,controller:new AbortController,claim:{startedAt:Date.now(),id:e()}};c=v;const y=e=>{if(c!==v||v.closed||"object"!=typeof e.data||null===e.data)return;const t=e.data;if("session-ended"===t.type)d(v);else if("takeover"===t.type&&"number"==typeof t.startedAt&&Number.isFinite(t.startedAt)&&"string"==typeof t.id&&t.id!==v.claim.id){t.startedAt>v.claim.startedAt||t.startedAt===v.claim.startedAt&&t.id>v.claim.id?d(v,!0,"replaced"):u.postMessage({type:"takeover",...v.claim})}},f=e=>{c===v&&!0===e.persisted&&d(v)};try{a&&(v.cleanups.push(()=>a.removeEventListener("pagehide",f)),a.addEventListener("pagehide",f)),v.cleanups.push(()=>u.removeEventListener("message",y)),u.addEventListener("message",y);const e=setTimeout(()=>p(v,new Error("Browser IM takeover timed out while waiting for the previous page to close")),15e3);v.cleanups.push(()=>clearTimeout(e));n.request(`im-connection:${o}`,{mode:"exclusive",signal:v.controller.signal},async o=>{if(c!==v||v.closed||!o)return void v.resolveReady(!1);const n=new Promise(e=>{v.release=e});v.owned=!0,clearTimeout(e);try{await t.onChange(!0)}catch(e){p(v,e)}v.resolveReady(c===v&&v.owned),await n}).catch(e=>{c!==v||v.closed||p(v,e)}),u.postMessage({type:"takeover",...v.claim})}catch(e){p(v,e)}return v.ready},stop(){i++,c&&d(c)},terminate(){i++;const e=c;if(e)try{e.closed||e.channel.postMessage({type:"session-ended"})}catch(e){l(e)}finally{d(e)}},get owned(){return c?.owned??!1}}}export{t as createBrowserConnectionOwnership};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{openDB as e,deleteDB as t}from"idb";import{encodeConversationKey as a,conversationRefFromPinnedMessage as n,conversationRefFromSession as o,conversationRefFromMessage as s}from"../../../im-core/src/conversation-identity.js";import{createImTextSearchMatcher as r,extractSearchText as i}from"../../../im-core/src/mapping/search-text.js";import{normalizeStoredMessageContent as c}from"../../../im-core/src/mapping/stored-message.js";import{computeMessageSortKey as d}from"../../../im-core/src/mapping/sort.js";import{isStaleMiniProgramShowTypeProjection as l}from"../../../im-core/src/mapping/mini-program-body.js";import{channelSyncCheckpointKey as y}from"../../../im-core/src/sync/channel-sync-checkpoint.js";const u=1073741824,g="channel:list-version",v="schema:conversation-key-v1",m="schema:message-server-order-v1",w="schema:mini-program-game-preview-v1",f="im:membership-reset-sort-keys",p="default",b="";function h(e){if(void 0!==e&&/^\d+$/.test(e))return e.replace(/^0+(?=\d)/,"")}function S(e,t){const a=h(e),n=h(t);return void 0===a?void 0===n?0:-1:void 0===n?1:a.length!==n.length?a.length>n.length?1:-1:a===n?0:a>n?1:-1}function j(e){return`conversation:${a(e)}`}function k(e,t){return`${a(e)}\0${t}`}function M(e){const{key:t,conversationKey:a,...n}=e;return{...n,conversation:{...n.conversation},sContent:n.sContent.slice()}}function A(e,t){return JSON.stringify([a(e),t])}function I(e){const t=s(e);return{...e,messageKey:A(t,e.id),conversationKey:a(t)}}function C(e){const{messageKey:t,conversationKey:a,...n}=e;return n}function P(e){return{...e,id:a(o(e)),conversationId:e.id}}function K(e){if(void 0===e.conversationId)return e;const{conversationId:t,...a}=e;return{...a,id:t}}function x(e){return void 0===e.conversationType?e:{...e,conversationId:a(e),storageConversationId:e.conversationId}}function _(e){if(void 0===e.storageConversationId)return e;const{storageConversationId:t,...a}=e;return{...a,conversationId:t}}function B(e){return{...e,conversationId:a(n(e)),storageConversationId:e.conversationId}}function R(e){if(void 0===e.storageConversationId)return e;const{storageConversationId:t,...a}=e;return{...a,conversationId:t}}function N(e){const{conversationKey:t,...a}=e;return a}function T(e,t){if(new Set(t.map(e=>e.conversationType)).size>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`)}function O(e){return`${e.kind}:${encodeURIComponent(e.messageId)}:${e.resourceVersion}`}async function D(e,t){const a=e.done;a.catch(()=>{});try{const e=await t();return await a,e}catch(t){try{e.abort()}catch{}throw await a.catch(()=>{}),t}}async function L(e,a){const n=a.namespaceFactory.forAccount(e).name("durable","storage","indexed-db");"undefined"!=typeof indexedDB&&await t(n)}function H(t){const{namespaceFactory:h}=t;let L=null,H=null,E=0,V=Promise.resolve(),$=Promise.resolve(),F=0;const z=t.mediaAssetCache?.maxPendingWriteBytes??268435456;if(!Number.isSafeInteger(z)||z<=0)throw new RangeError("媒体资产缓存待写内存预算必须是正整数");function G(){if(null===L)throw new Error("ImStoragePort 未 open:请先 open({ namespace }) 再读写");return L}function U(e){const t=E,a=H,n=()=>{if(t!==E||a!==H)throw new Error("最近历史缓存操作已失效:账号或存储已改变");G()},o=V.then(async()=>{n();const t=await e();return n(),t});return V=o.then(()=>{},()=>{}),o}function q(e,t){return 2!==e.version||!Number.isFinite(e.fetchedAt)||e.fetchedAt<0||t-e.fetchedAt>=864e5}function J(e){const t=$.then(e,e);return $=t.then(()=>{},()=>{}),t}function Q(e,t){if(e!==E||null===t||t!==H)throw new Error("媒体资产缓存账号代际已失效")}function W(){return Math.max(0,Math.floor(t.mediaAssetCache?.now?.()??Date.now()))}function Y(e,a){const n=t.mediaAssetCache?.strategies.resolve(e.kind)?.maxIdleMs;return void 0!==n&&(!Number.isSafeInteger(e.lastAccessedAt)||e.lastAccessedAt<0||a-e.lastAccessedAt>=n)}async function X(e,t){Q(e,t);const a=await G().getAll("mediaAssetMeta");Q(e,t);const n=W(),o=a.filter(e=>Y(e,n));await ee(o.map(e=>e.key),e,t),Q(e,t);const s=new Set(o.map(e=>e.key));return a.filter(e=>!s.has(e.key))}async function Z(e){const a=t.mediaAssetCache?.estimateStorage??(async()=>"undefined"==typeof navigator||void 0===navigator.storage?.estimate?{}:await navigator.storage.estimate());try{const{quota:t,usage:n}=await a();if(void 0===t||!Number.isFinite(t)||t<=0)return u;const o=e.reduce((e,t)=>e+t.byteLength,0),s=Math.max(0,(n??0)-o),r=Math.max(536870912,Math.floor(.2*t));return Math.max(0,Math.min(2147483648,Math.floor(t-s-r)))}catch{return u}}async function ee(e,t,a){if(0===e.length)return;Q(t,a);const n=G().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await Promise.all(e.flatMap(e=>[n.objectStore("mediaAssets").delete(e),n.objectStore("mediaAssetMeta").delete(e)])),await n.done}async function te(e,a,n,o){Q(e,a);const s=G(),r=t.mediaAssetCache?.strategies;if(void 0===r)return;const i=o??await s.getAll("mediaAssetMeta");Q(e,a);const c=/* @__PURE__ */new Set;for(const e of r.list()){const t=i.filter(t=>t.kind===e.kind).sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt);let a=t.reduce((e,t)=>e+t.byteLength,0),n=t.length;for(const o of t){if(a<=e.softMaxBytes&&n<=e.maxEntries)break;c.add(o.key),a-=o.byteLength,n-=1}}const d=i.filter(e=>!c.has(e.key)).sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt),l=Math.max(0,Math.min(await Z(i),n??Number.POSITIVE_INFINITY));let y=d.reduce((e,t)=>e+t.byteLength,0);for(const e of d){if(y<=l)break;c.add(e.key),y-=e.byteLength}await ee([...c],e,a)}return{supportsChannelSyncCheckpoint:!0,recentHistoryCache:{get:e=>U(async()=>{const t=a(e),n=G().transaction("recentHistoryPages","readwrite");return D(n,async()=>{const e=await n.store.get(t);if(void 0===e)return null;if(q(e,Date.now()))return await n.store.delete(t),null;const{conversationKey:a,...o}=e;return o})}),async put(e){const t=structuredClone(e);return U(()=>async function(e){if(!Number.isSafeInteger(e.byteLength)||e.byteLength<0)throw new Error("最近历史缓存 byteLength 必须是非负安全整数");const t=Date.now();if(e.byteLength>2097152||q(e,t))return!1;const n=a(e.conversation),o=G().transaction("recentHistoryPages","readwrite");return D(o,async()=>{const a=await o.store.getAll(),s=[];for(const e of a)q(e,t)?await o.store.delete(e.conversationKey):e.conversationKey!==n&&s.push(e);const r={...e,conversationKey:n};s.push(r),s.sort((e,t)=>e.fetchedAt-t.fetchedAt||e.conversationKey.localeCompare(t.conversationKey));let i=s.reduce((e,t)=>e+t.byteLength,0);const c=[];for(;s.length>20||i>8388608;){const e=s.shift();c.push(e),i-=e.byteLength}if(c.includes(r))return!1;await o.store.put(r);for(const e of c)await o.store.delete(e.conversationKey);return!0})}(t))},delete:e=>U(async()=>{await G().delete("recentHistoryPages",a(e))}),clear:()=>U(async()=>{await G().clear("recentHistoryPages")})},async open({namespace:t}){if(null!==L&&H===t)return;null!==L&&(L.close(),L=null),H=t;const n=++E,o=h.forAccount(t).name("durable","storage","indexed-db");let r;const i=await e(o,16,{upgrade(e,t,a,n){if(e.objectStoreNames.contains("messages"))n.objectStore("messages").indexNames.contains("by_conversation_key_sort")||n.objectStore("messages").createIndex("by_conversation_key_sort",["conversationKey","sortKey"]);else{const t=e.createObjectStore("messages",{keyPath:"messageKey"});t.createIndex("by_conv_sort",["conversationId","sortKey"]),t.createIndex("by_conversation_key_sort",["conversationKey","sortKey"])}if(e.objectStoreNames.contains("sessions")||e.createObjectStore("sessions",{keyPath:"id"}),e.objectStoreNames.contains("readStates")||e.createObjectStore("readStates",{keyPath:"conversationId"}),e.objectStoreNames.contains("drafts")||e.createObjectStore("drafts",{keyPath:"conversationKey"}),e.objectStoreNames.contains("outbox")||e.createObjectStore("outbox",{keyPath:"id"}),e.objectStoreNames.contains("meta")||e.createObjectStore("meta",{keyPath:"key"}),e.objectStoreNames.contains("userProfiles")||e.createObjectStore("userProfiles",{keyPath:"id"}),e.objectStoreNames.contains("groupMembers")||e.createObjectStore("groupMembers",{keyPath:"groupId"}),e.objectStoreNames.contains("groupProfiles")||e.createObjectStore("groupProfiles",{keyPath:"id"}),e.objectStoreNames.contains("pinnedMessages")||e.createObjectStore("pinnedMessages",{keyPath:"conversationId"}),e.objectStoreNames.contains("channelProfiles")||e.createObjectStore("channelProfiles",{keyPath:"id"}),e.objectStoreNames.contains("channelMembers")||e.createObjectStore("channelMembers",{keyPath:["channelId","userId"]}),e.objectStoreNames.contains("channelMemberSnapshots")||e.createObjectStore("channelMemberSnapshots",{keyPath:"channelId"}),e.objectStoreNames.contains("channelMentionCandidateSnapshots")||e.createObjectStore("channelMentionCandidateSnapshots",{keyPath:"channelId"}),e.objectStoreNames.contains("conversationBackgrounds")||e.createObjectStore("conversationBackgrounds",{keyPath:"key"}),e.objectStoreNames.contains("mediaAssets")||e.createObjectStore("mediaAssets",{keyPath:"key"}),!e.objectStoreNames.contains("mediaAssetMeta")){const t=e.createObjectStore("mediaAssetMeta",{keyPath:"key"});t.createIndex("by_kind_access",["kind","lastAccessedAt"]),t.createIndex("by_access","lastAccessedAt")}if(!e.objectStoreNames.contains("decryptRecoveries")){e.createObjectStore("decryptRecoveries",{keyPath:"key"}).createIndex("by_conversation","conversationKey")}if(t>0&&t<13&&(n.objectStore("mediaAssets").clear(),n.objectStore("mediaAssetMeta").clear()),e.objectStoreNames.contains("recentHistoryPages")||e.createObjectStore("recentHistoryPages",{keyPath:"conversationKey"}),t>0&&t<16&&"messageKey"!==n.objectStore("messages").keyPath){(async()=>{const t=await n.objectStore("messages").getAll();for(const e of t)e.messageKey=A(s(e),e.id);e.deleteObjectStore("messages");const a=e.createObjectStore("messages",{keyPath:"messageKey"});a.createIndex("by_conv_sort",["conversationId","sortKey"]),a.createIndex("by_conversation_key_sort",["conversationKey","sortKey"]);for(let e=0;e<t.length;e+=128){const n=t.slice(e,e+128);await Promise.all(n.map(async e=>a.put(e)))}})().catch(e=>{r=e,n.done.catch(()=>{});try{n.abort()}catch{}})}}}).catch(e=>{throw r??e});if(n===E){try{await async function(e){const t=e.transaction(["messages","sessions","readStates","pinnedMessages","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(v))?.value)return void await t.done;const a=t.objectStore("messages");for(const e of await a.getAll())void 0===e.conversationKey&&await a.put(I(e));const n=t.objectStore("sessions"),o=/* @__PURE__ */new Map;for(const e of await n.getAll()){if(void 0!==e.conversationId)continue;const t=K(e);o.set(t.id,t.type),await n.put(P(t)),await n.delete(e.id)}const s=t.objectStore("readStates");for(const e of await s.getAll()){if(void 0!==e.storageConversationId)continue;const t=e.conversationType??o.get(e.conversationId);if(void 0===t)continue;const a={...e,conversationType:t};await s.put(x(a)),await s.delete(e.conversationId)}const r=t.objectStore("pinnedMessages");for(const e of await r.getAll()){if(void 0!==e.storageConversationId)continue;const t=R(e);await r.put(B(t)),await r.delete(e.conversationId)}await e.put({key:v,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i),await async function(e){const t=e.transaction(["messages","readStates","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(m))?.value)return void await t.done;const n=t.objectStore("readStates"),o=await n.getAll(),r=/* @__PURE__ */new Map;for(const e of o){const t=_(e);"channel"===t.conversationType&&void 0!==t.readCursorSortKey&&""!==t.readCursor&&r.set(a(t),{cursor:t.readCursor})}const i=/* @__PURE__ */new Map,c=t.objectStore("messages");let l=await c.openCursor();for(;null!==l;){const e=l.value,t=a(s(e)),n=d(e),o=r.get(t);if(void 0!==o&&e.extensions?.historyCursor===o.cursor&&(o.sortKey=n),n!==e.sortKey){let a=i.get(t);void 0===a&&(a=/* @__PURE__ */new Map,i.set(t,a)),a.set(e.sortKey,n),await l.update({...e,sortKey:n})}l=await l.continue()}for(const e of o){const t=_(e);if(void 0===t.conversationType)continue;const o=a(t);let d=r.get(o)?.sortKey??(void 0===t.readCursorSortKey?void 0:i.get(o)?.get(t.readCursorSortKey));if(void 0===d&&void 0!==t.readCursorSortKey&&"channel"!==t.conversationType&&""!==t.readCursor){const e=await c.get(A(t,t.readCursor));void 0!==e&&a(s(e))===o&&(d=e.sortKey)}void 0!==d&&d!==t.readCursorSortKey&&await n.put({...e,readCursorSortKey:d})}const y=await e.get(f);if(Array.isArray(y?.value)){let t=!1;const a=y.value.map(e=>{if(!Array.isArray(e)||2!==e.length||"string"!=typeof e[0]||"string"!=typeof e[1])return e;const a=i.get(e[0])?.get(e[1]);return void 0===a?e:(t=!0,[e[0],a])});t&&await e.put({key:f,value:a})}await e.put({key:m,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i),await async function(e){const t=e.transaction(["messages","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(w))?.value)return void await t.done;const a=t.objectStore("messages");let n=await a.openCursor();for(;null!==n;){const e=n.value.body?.miniProgram;"miniProgram"===n.value.contentType&&void 0!==e&&l(e)&&await n.delete(),n=await n.continue()}await e.put({key:w,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i)}catch(e){throw i.close(),e}if(n===E){L=i;try{await J(()=>X(n,t))}catch(e){if(i.close(),n!==E)return;throw L===i&&(L=null),e}}else i.close()}else i.close()},async close(){const e=$;E+=1,H=null,null!==L&&(L.close(),L=null),await e},clearRebuildableCaches:async()=>U(async()=>{const e=E,t=H;await J(async()=>{Q(e,t);const a=G().transaction(["userProfiles","groupMembers","groupProfiles","channelProfiles","channelMembers","channelMemberSnapshots","channelMentionCandidateSnapshots","mediaAssets","mediaAssetMeta","meta","recentHistoryPages"],"readwrite");await Promise.all([a.objectStore("userProfiles").clear(),a.objectStore("groupMembers").clear(),a.objectStore("groupProfiles").clear(),a.objectStore("channelProfiles").clear(),a.objectStore("channelMembers").clear(),a.objectStore("channelMemberSnapshots").clear(),a.objectStore("channelMentionCandidateSnapshots").clear(),a.objectStore("mediaAssets").clear(),a.objectStore("mediaAssetMeta").clear(),a.objectStore("meta").delete(g),a.objectStore("recentHistoryPages").clear(),a.done])})}),async hasMany(e){const a=E,n=H,o=e.map(e=>({...e}));return await J(async()=>{if(Q(a,n),0===o.length)return Object.freeze([]);const e=G().transaction(["mediaAssets","mediaAssetMeta"],"readonly"),s=W(),r=await D(e,async()=>{const a=/* @__PURE__ */new Map;return await Promise.all(o.map(n=>{if(void 0===t.mediaAssetCache?.strategies.resolve(n.kind))return!1;const o=O(n);let r=a.get(o);return void 0===r&&(r=Promise.all([e.objectStore("mediaAssets").getKey(o),e.objectStore("mediaAssetMeta").get(o)]).then(([e,t])=>void 0!==e&&void 0!==t&&t.kind===n.kind&&t.messageId===n.messageId&&t.resourceVersion===n.resourceVersion&&Number.isSafeInteger(t.byteLength)&&t.byteLength>0&&!Y(t,s)),a.set(o,r)),r}))});return Q(a,n),Object.freeze(r)})},async get(e){const a=E,n=H;return await J(async()=>{if(Q(a,n),void 0===t.mediaAssetCache?.strategies.resolve(e.kind))return null;const o=O(e),s=G(),[r,i]=await Promise.all([s.get("mediaAssets",o),s.get("mediaAssetMeta",o)]);Q(a,n);const c=W();return void 0===r||void 0===i||Y(i,c)?(await ee([o],a,n),null):(await s.put("mediaAssetMeta",{...i,lastAccessedAt:c}),Q(a,n),{kind:i.kind,messageId:i.messageId,resourceVersion:i.resourceVersion,blob:r.blob,...void 0===i.mimeType?{}:{mimeType:i.mimeType}})})},async put(e){const a=E,n=H;Q(a,n);const o=e.blob.size;if(o>z||F+o>z)return"skipped";F+=o;try{return await J(()=>async function(e,a,n){Q(a,n);const o=t.mediaAssetCache?.strategies.resolve(e.kind);if(void 0===o)return"skipped";const s=e.blob,r=s.size,i=await X(a,n),c=await Z(i);if(Q(a,n),0===r||r>o.maxEntryBytes||c<=0||r>Math.floor(c/2))return"skipped";const d=O(e),l=W(),y=i.find(e=>e.key===d),u={key:d,kind:e.kind,messageId:e.messageId,resourceVersion:e.resourceVersion,byteLength:r,...void 0===e.mimeType?{}:{mimeType:e.mimeType},createdAt:y?.createdAt??l,lastAccessedAt:l},g=async()=>{Q(a,n);const e=G().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await Promise.all([e.objectStore("mediaAssets").put({key:d,blob:s}),e.objectStore("mediaAssetMeta").put(u)]),await e.done};let v=!1;try{await g()}catch(e){if(!(e instanceof DOMException)||"QuotaExceededError"!==e.name)throw e;v=!0,await te(a,n,Math.max(0,c-r)),await g()}const m=void 0===y?[...i,u]:i.map(e=>e.key===d?u:e);return await te(a,n,void 0,v?void 0:m),Q(a,n),void 0===await G().get("mediaAssets",d)?"skipped":"stored"}(e,a,n))}finally{F=Math.max(0,F-o)}},async clear(){const e=E,t=H;await J(async()=>{Q(e,t);const a=G().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await Promise.all([a.objectStore("mediaAssets").clear(),a.objectStore("mediaAssetMeta").clear(),a.done])})},async prune(){const e=E,t=H;await J(()=>X(e,t))},async getMessage(e,t){const n=await G().get("messages",A(e,t));if(void 0===n)return null;const o=C(n);return a(s(o))===a(e)?o:null},async getMessages(e,t){const n="string"==typeof e?"by_conv_sort":"by_conversation_key_sort",o="string"==typeof e?e:a(e);if(await async function(e){if("string"!=typeof e)return;const t=IDBKeyRange.bound([e,""],[e,b]);T(e,(await G().transaction("messages").store.index("by_conv_sort").getAll(t)).map(C))}(e),void 0===t.beforeSortKey&&void 0!==t.afterSortKey){const e=IDBKeyRange.bound([o,t.afterSortKey],[o,b]),a=[];let s=await G().transaction("messages").store.index(n).openCursor(e,"next");for(;null!==s&&a.length<t.limit;)a.push(s.value),s=await s.continue();return a.map(C)}const s=void 0===t.beforeSortKey?IDBKeyRange.bound([o,""],[o,b]):IDBKeyRange.bound([o,""],[o,t.beforeSortKey],!1,!0),r=[];let i=await G().transaction("messages").store.index(n).openCursor(s,"prev");for(;null!==i&&r.length<t.limit;)r.push(i.value),i=await i.continue();return r.reverse().map(C)},async saveMessages(e){if(0===e.length)return;const t=G().transaction("messages","readwrite");await Promise.all([...e.map(e=>t.store.put(I(e))),t.done])},async searchMessages(e,t){const n=a(e),o=t.keyword?.trim()??"",s=t.contentTypes;if(""===o&&(void 0===s||0===s.length))return{items:[],exhausted:!0};const d=""===o?void 0:await r(o),l=void 0===t.beforeSortKey?IDBKeyRange.bound([n,""],[n,b]):IDBKeyRange.bound([n,""],[n,t.beforeSortKey],!1,!0),y=[];let u,g=0,v=await G().transaction("messages").store.index("by_conversation_key_sort").openCursor(l,"prev");for(;null!==v&&y.length<t.limit&&g<2e3;){const e=c(C(v.value));g+=1,u=e.sortKey;const t=void 0===s||s.includes(e.contentType),a=void 0===d||null!==d.match(i(e));t&&a&&y.push(e),v=await v.continue()}const m=null===v;return{items:y,exhausted:m,...m?{}:{nextBeforeSortKey:u}}},async getDecryptRecoveries(e){const t=a(e);return(await G().getAllFromIndex("decryptRecoveries","by_conversation",t)).map(M)},async saveDecryptRecovery(e){if(0===e.sContent.byteLength||e.sContent.byteLength>65536)throw new Error(`解密恢复密文字节长度非法:${e.sContent.byteLength}`);await G().put("decryptRecoveries",function(e){const t=a(e.conversation);return{...e,key:k(e.conversation,e.messageId),conversationKey:t,conversation:{...e.conversation},sContent:e.sContent.slice()}}(e))},async deleteDecryptRecovery(e,t){await G().delete("decryptRecoveries",k(e,t))},async deleteConversationDecryptRecoveries(e){const t=a(e),n=G().transaction("decryptRecoveries","readwrite");let o=await n.store.index("by_conversation").openCursor(IDBKeyRange.only(t));for(;null!==o;)await o.delete(),o=await o.continue();await n.done},getSessions:async()=>(await G().getAll("sessions")).map(K),async saveSessions(e){if(0===e.length)return;const t=G().transaction("sessions","readwrite");for(const a of e)await t.store.put(P(a)),await t.store.delete(a.id);await t.done},async deleteSession(e){if("string"!=typeof e){const t=G().transaction(["sessions","conversationBackgrounds"],"readwrite");return await t.objectStore("sessions").delete(a(e)),await t.objectStore("conversationBackgrounds").delete(j(e)),void await t.done}const t=(await G().getAll("sessions")).map(K).filter(t=>t.id===e);T(e,t.map(e=>({conversationType:e.type})));const n=G().transaction(["sessions","conversationBackgrounds"],"readwrite");if(void 0!==t[0]){const e=o(t[0]);await n.objectStore("sessions").delete(a(e)),await n.objectStore("conversationBackgrounds").delete(j(e))}await n.objectStore("sessions").delete(e),await n.done},async deleteReadState(e){if("string"!=typeof e)return void await G().delete("readStates",a(e));const t=(await G().getAll("readStates")).map(_).filter(t=>t.conversationId===e).filter(e=>void 0!==e.conversationType);T(e,t),void 0!==t[0]&&await G().delete("readStates",a(t[0])),await G().delete("readStates",e)},deleteMessage:async(e,t,n)=>U(async()=>{if(void 0!==n&&(n.id!==e.conversationId||n.type!==e.conversationType))throw new Error("删除后的会话摘要必须匹配目标会话");const o=G().transaction(["messages","sessions","decryptRecoveries","recentHistoryPages"],"readwrite");return D(o,async()=>{const s=o.objectStore("messages"),r=A(e,t),i=await s.get(r);if(void 0!==i){const t=C(i);if(t.conversationType!==e.conversationType||t.conversationId!==e.conversationId)return!1;await s.delete(r)}return await o.objectStore("decryptRecoveries").delete(k(e,t)),await o.objectStore("recentHistoryPages").delete(a(e)),void 0!==n&&await o.objectStore("sessions").put(P(n)),void 0!==i})}),deleteConversationMessages:async e=>U(async()=>{const t="string"==typeof(n=e)?n:n.conversationId;var n;const o="string"==typeof e?"by_conv_sort":"by_conversation_key_sort",s="string"==typeof e?e:a(e),r=IDBKeyRange.bound([s,""],[s,b]),i=G().transaction(["messages","decryptRecoveries","recentHistoryPages","meta"],"readwrite");return D(i,async()=>{const n=i.objectStore("messages"),s=i.objectStore("decryptRecoveries");let c=[],d=[];if("string"==typeof e){const a=(await n.index("by_conv_sort").getAll(r)).map(C);c=(await s.getAll()).filter(t=>t.conversation.conversationId===e),d=(await i.objectStore("recentHistoryPages").getAll()).filter(e=>e.conversation.conversationId===t);const o=await i.objectStore("meta").get(y({conversationType:"channel",conversationId:t}));T(t,[...void 0===o?[]:[{conversationType:"channel"}],...a,...d.map(e=>({conversationType:e.conversation.conversationType})),...c.map(e=>({conversationType:e.conversation.conversationType}))])}await i.objectStore("meta").delete(y("string"==typeof e?{conversationType:"channel",conversationId:t}:e));let l=await n.index(o).openCursor(r);for(;null!==l;)await l.delete(),l=await l.continue();if("string"==typeof e){for(const e of c)await s.delete(e.key);for(const e of d)await i.objectStore("recentHistoryPages").delete(e.conversationKey)}else{await i.objectStore("recentHistoryPages").delete(a(e));let t=await s.index("by_conversation").openCursor(IDBKeyRange.only(a(e)));for(;null!==t;)await t.delete(),t=await t.continue()}})}),clearConversationHistory:async(e,t,n)=>U(async()=>{const o=a(e),s=IDBKeyRange.bound([o,""],[o,b]),r=G().transaction(["messages","sessions","readStates","decryptRecoveries","recentHistoryPages","meta"],"readwrite");return D(r,async()=>{await r.objectStore("meta").delete(y(e)),await r.objectStore("recentHistoryPages").delete(o);let a=await r.objectStore("messages").index("by_conversation_key_sort").openCursor(s);for(;null!==a;)await a.delete(),a=await a.continue();let i=await r.objectStore("decryptRecoveries").index("by_conversation").openCursor(IDBKeyRange.only(o));for(;null!==i;)await i.delete(),i=await i.continue();void 0!==t&&await r.objectStore("sessions").put(P(t)),void 0!==n&&(await r.objectStore("readStates").put(x(n)),await r.objectStore("readStates").delete(n.conversationId))})}),getReadStates:async()=>(await G().getAll("readStates")).map(_),async saveReadState(e){const t=G().transaction("readStates","readwrite");await t.store.put(x(e)),void 0!==e.conversationType&&await t.store.delete(e.conversationId),await t.done},getDrafts:async()=>(await G().getAll("drafts")).map(N),async saveDraft(e){await G().put("drafts",function(e){return{...e,conversationKey:a(e.ref)}}(e))},async deleteDraft(e){await G().delete("drafts",a(e))},getConversationBackground:async e=>(await G().get("conversationBackgrounds",j(e)))?.background??null,async saveConversationBackground(e,t){const a=j(e);await G().put("conversationBackgrounds",{key:a,background:t})},async deleteConversationBackground(e){await G().delete("conversationBackgrounds",j(e))},getDefaultConversationBackground:async()=>(await G().get("conversationBackgrounds",p))?.background??null,async saveDefaultConversationBackground(e){await G().put("conversationBackgrounds",{key:p,background:e})},async deleteDefaultConversationBackground(){await G().delete("conversationBackgrounds",p)},getOutbox:async()=>G().getAll("outbox"),async saveOutboxMessage(e){await G().put("outbox",e)},async removeOutboxMessage(e){await G().delete("outbox",e)},getPinnedMessages:async()=>(await G().getAll("pinnedMessages")).map(R),async savePinnedMessage(e){const t=G().transaction("pinnedMessages","readwrite");await t.store.put(B(e)),await t.store.delete(e.conversationId),await t.done},async removePinnedMessage(e){if("string"!=typeof e)return void await G().delete("pinnedMessages",a(e));const t=(await G().getAll("pinnedMessages")).map(R).filter(t=>t.conversationId===e);T(e,t),void 0!==t[0]&&await G().delete("pinnedMessages",a(n(t[0]))),await G().delete("pinnedMessages",e)},async getMeta(e){const t=await G().get("meta",e);return void 0===t?null:t.value},async setMeta(e,t){await G().put("meta",{key:e,value:t})},getUserProfile:async e=>await G().get("userProfiles",e)??null,async saveUserProfile(e){await G().put("userProfiles",e)},getGroupMembers:async e=>await G().get("groupMembers",e)??null,async saveGroupMembers(e){await G().put("groupMembers",e)},getGroupProfile:async e=>await G().get("groupProfiles",e)??null,async saveGroupProfile(e){await G().put("groupProfiles",e)},getChannelProfile:async e=>await G().get("channelProfiles",e)??null,getChannelProfiles:async()=>G().getAll("channelProfiles"),async saveChannelProfiles(e){if(0===e.length)return;const t=G().transaction("channelProfiles","readwrite");await Promise.all([...e.map(e=>t.store.put(e)),t.done])},async getChannelListVersion(){const e=await G().get("meta",g);return"string"==typeof e?.value&&/^\d+$/.test(e.value)?e.value:"0"},async saveChannelListVersion(e){if(!/^\d+$/.test(e))throw new Error(`CHANNEL list version 非法:${e}`);await G().put("meta",{key:g,value:e})},async getChannelMembers(e,t){if(0===t.length)return[];const a=G().transaction("channelMembers"),n=await Promise.all(t.map(t=>a.store.get([e,t])));return await a.done,n.filter(e=>void 0!==e)},async saveChannelMembers(e){if(0===e.length)return;const t=G().transaction("channelMembers","readwrite");for(const a of e){const e=await t.store.get([a.channelId,a.userId]);void 0!==e&&S(a.updateVersion,e.updateVersion)<0||await t.store.put(a)}await t.done},async deleteChannelMembers(e){const t=IDBKeyRange.bound([e,""],[e,b]),a=G().transaction("channelMembers","readwrite");let n=await a.store.openCursor(t);for(;null!==n;)await n.delete(),n=await n.continue();await a.done},getChannelMemberSnapshot:async e=>await G().get("channelMemberSnapshots",e)??null,async saveChannelMemberSnapshot(e){await G().put("channelMemberSnapshots",e)},async deleteChannelMemberSnapshot(e){await G().delete("channelMemberSnapshots",e)},getChannelMentionCandidateSnapshot:async e=>await G().get("channelMentionCandidateSnapshots",e)??null,async saveChannelMentionCandidateSnapshot(e){await G().put("channelMentionCandidateSnapshots",e)},async deleteChannelMentionCandidateSnapshot(e){await G().delete("channelMentionCandidateSnapshots",e)}}}export{H as createIndexedDbStorageAdapter,L as deleteIndexedDbNamespace};
|
|
1
|
+
import{openDB as e,deleteDB as t}from"idb";import{encodeConversationKey as a,conversationRefFromPinnedMessage as n,conversationRefFromMessage as o,conversationRefFromSession as s}from"../../../im-core/src/conversation-identity.js";import{createImTextSearchMatcher as r,extractSearchText as i}from"../../../im-core/src/mapping/search-text.js";import{normalizeStoredMessageContent as c}from"../../../im-core/src/mapping/stored-message.js";import{computeMessageSortKey as d}from"../../../im-core/src/mapping/sort.js";import{isStaleMiniProgramShowTypeProjection as l}from"../../../im-core/src/mapping/mini-program-body.js";import{channelSyncCheckpointKey as y}from"../../../im-core/src/sync/channel-sync-checkpoint.js";const u=1073741824;const v="channel:list-version",m="schema:conversation-key-v1",w="schema:message-server-order-v1",g="schema:mini-program-game-preview-v1",f="im:membership-reset-sort-keys",p="default",h="";function b(e){if(void 0!==e&&/^\d+$/.test(e))return e.replace(/^0+(?=\d)/,"")}function S(e,t){const a=b(e),n=b(t);return void 0===a?void 0===n?0:-1:void 0===n?1:a.length!==n.length?a.length>n.length?1:-1:a===n?0:a>n?1:-1}function k(e){return`conversation:${a(e)}`}function j(e,t){return`${a(e)}\0${t}`}function M(e){const{key:t,conversationKey:a,...n}=e;return{...n,conversation:{...n.conversation},sContent:n.sContent.slice()}}function C(e,t){return JSON.stringify([a(e),t])}function A(e){const t=o(e);return{...e,messageKey:C(t,e.id),conversationKey:a(t)}}function I(e){const{messageKey:t,conversationKey:a,...n}=e;return n}function P(e){return{...e,id:a(s(e)),conversationId:e.id}}function K(e){if(void 0===e.conversationId)return e;const{conversationId:t,...a}=e;return{...a,id:t}}function x(e){return void 0===e.conversationType?e:{...e,conversationId:a(e),storageConversationId:e.conversationId}}function _(e){if(void 0===e.storageConversationId)return e;const{storageConversationId:t,...a}=e;return{...a,conversationId:t}}function B(e){return{...e,conversationId:a(n(e)),storageConversationId:e.conversationId}}function R(e){if(void 0===e.storageConversationId)return e;const{storageConversationId:t,...a}=e;return{...a,conversationId:t}}function N(e){const{conversationKey:t,...a}=e;return a}function T(e,t){if(new Set(t.map(e=>e.conversationType)).size>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`)}function O(e){return`${e.kind}:${encodeURIComponent(e.messageId)}:${e.resourceVersion}`}async function D(e,t){const a=e.done;a.catch(()=>{});try{const e=await t();return await a,e}catch(t){try{e.abort()}catch{}throw await a.catch(()=>{}),t}}function L(e){return e.catch(()=>{}),e}async function H(e,t,a){const n=e.transaction(t);return await D(n,async()=>await n.store.get(a))}async function E(e,t){const a=e.transaction(t);return await D(a,async()=>await a.store.getAll())}async function V(e,a){const n=a.namespaceFactory.forAccount(e).name("durable","storage","indexed-db");"undefined"!=typeof indexedDB&&await t(n)}function $(t){const{namespaceFactory:b}=t;let V=null,$=null,z=0,F=Promise.resolve(),G=Promise.resolve(),U=0;const q=t.mediaAssetCache?.maxPendingWriteBytes??268435456;if(!Number.isSafeInteger(q)||q<=0)throw new RangeError("媒体资产缓存待写内存预算必须是正整数");function J(){if(null===V)throw new Error("ImStoragePort 未 open:请先 open({ namespace }) 再读写");return V}function Q(e){const t=z,a=$,n=()=>{if(t!==z||a!==$)throw new Error("最近历史缓存操作已失效:账号或存储已改变");J()},o=F.then(async()=>{n();const t=await e();return n(),t});return F=o.then(()=>{},()=>{}),o}function W(e,t){return 2!==e.version||!Number.isFinite(e.fetchedAt)||e.fetchedAt<0||t-e.fetchedAt>=864e5}async function Y(e){if(!Number.isSafeInteger(e.byteLength)||e.byteLength<0)throw new Error("最近历史缓存 byteLength 必须是非负安全整数");const t=Date.now();if(e.byteLength>2097152||W(e,t))return!1;const n=a(e.conversation),o=J().transaction("recentHistoryPages","readwrite");return D(o,async()=>{const a=await o.store.getAll(),s=[];for(const e of a)W(e,t)?await o.store.delete(e.conversationKey):e.conversationKey!==n&&s.push(e);const r={...e,conversationKey:n};s.push(r),s.sort((e,t)=>e.fetchedAt-t.fetchedAt||e.conversationKey.localeCompare(t.conversationKey));let i=s.reduce((e,t)=>e+t.byteLength,0);const c=[];for(;s.length>20||i>8388608;){const e=s.shift();c.push(e),i-=e.byteLength}if(c.includes(r))return!1;await o.store.put(r);for(const e of c)await o.store.delete(e.conversationKey);return!0})}function X(e){const t=G.then(e,e);return G=t.then(()=>{},()=>{}),t}function Z(e,t){if(e!==z||null===t||t!==$)throw new Error("媒体资产缓存账号代际已失效")}function ee(){return Math.max(0,Math.floor(t.mediaAssetCache?.now?.()??Date.now()))}function te(e,a){const n=t.mediaAssetCache?.strategies.resolve(e.kind)?.maxIdleMs;return void 0!==n&&(!Number.isSafeInteger(e.lastAccessedAt)||e.lastAccessedAt<0||a-e.lastAccessedAt>=n)}async function ae(e,t){Z(e,t);const a=await E(J(),"mediaAssetMeta");Z(e,t);const n=ee(),o=a.filter(e=>te(e,n));await oe(o.map(e=>e.key),e,t),Z(e,t);const s=new Set(o.map(e=>e.key));return a.filter(e=>!s.has(e.key))}async function ne(e){const a=t.mediaAssetCache?.estimateStorage??(async()=>"undefined"==typeof navigator||void 0===navigator.storage?.estimate?{}:await navigator.storage.estimate());try{const{quota:t,usage:n}=await a();if(void 0===t||!Number.isFinite(t)||t<=0)return u;const o=e.reduce((e,t)=>e+t.byteLength,0),s=Math.max(0,(n??0)-o),r=Math.max(536870912,Math.floor(.2*t));return Math.max(0,Math.min(2147483648,Math.floor(t-s-r)))}catch{return u}}async function oe(e,t,a){if(0===e.length)return;Z(t,a);const n=J().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await D(n,async()=>{await Promise.all(e.flatMap(e=>[L(n.objectStore("mediaAssets").delete(e)),L(n.objectStore("mediaAssetMeta").delete(e))]))})}async function se(e,a,n,o){Z(e,a);const s=J(),r=t.mediaAssetCache?.strategies;if(void 0===r)return;const i=o??await E(s,"mediaAssetMeta");Z(e,a);const c=/* @__PURE__ */new Set;for(const e of r.list()){const t=i.filter(t=>t.kind===e.kind).sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt);let a=t.reduce((e,t)=>e+t.byteLength,0),n=t.length;for(const o of t){if(a<=e.softMaxBytes&&n<=e.maxEntries)break;c.add(o.key),a-=o.byteLength,n-=1}}const d=i.filter(e=>!c.has(e.key)).sort((e,t)=>e.lastAccessedAt-t.lastAccessedAt),l=Math.max(0,Math.min(await ne(i),n??Number.POSITIVE_INFINITY));let y=d.reduce((e,t)=>e+t.byteLength,0);for(const e of d){if(y<=l)break;c.add(e.key),y-=e.byteLength}await oe([...c],e,a)}return{supportsChannelSyncCheckpoint:!0,recentHistoryCache:{get:e=>Q(async()=>{const t=a(e),n=J().transaction("recentHistoryPages","readwrite");return D(n,async()=>{const e=await n.store.get(t);if(void 0===e)return null;if(W(e,Date.now()))return await n.store.delete(t),null;const{conversationKey:a,...o}=e;return o})}),async put(e){if("function"==typeof structuredClone){const t=structuredClone(e);return Q(()=>Y(t))}const t=function(e){return new Promise((t,a)=>{const n=new MessageChannel,o=()=>{n.port1.close(),n.port2.close()};n.port1.onmessage=e=>{o(),t(e.data)},n.port1.onmessageerror=()=>{o(),a(new DOMException("最近历史缓存快照无法反序列化","DataCloneError"))};try{n.port2.postMessage(e)}catch(e){o(),a(e)}})}(e).then(e=>({ok:!0,value:e}),e=>({ok:!1,error:e}));return Q(async()=>{const e=await t;if(!e.ok)throw e.error;return Y(e.value)})},delete:e=>Q(async()=>{await J().delete("recentHistoryPages",a(e))}),clear:()=>Q(async()=>{await J().clear("recentHistoryPages")})},async open({namespace:t}){if(null!==V&&$===t)return;null!==V&&(V.close(),V=null),$=t;const n=++z,s=b.forAccount(t).name("durable","storage","indexed-db");let r;const i=await e(s,16,{upgrade(e,t,a,n){if(e.objectStoreNames.contains("messages"))n.objectStore("messages").indexNames.contains("by_conversation_key_sort")||n.objectStore("messages").createIndex("by_conversation_key_sort",["conversationKey","sortKey"]);else{const t=e.createObjectStore("messages",{keyPath:"messageKey"});t.createIndex("by_conv_sort",["conversationId","sortKey"]),t.createIndex("by_conversation_key_sort",["conversationKey","sortKey"])}if(e.objectStoreNames.contains("sessions")||e.createObjectStore("sessions",{keyPath:"id"}),e.objectStoreNames.contains("readStates")||e.createObjectStore("readStates",{keyPath:"conversationId"}),e.objectStoreNames.contains("drafts")||e.createObjectStore("drafts",{keyPath:"conversationKey"}),e.objectStoreNames.contains("outbox")||e.createObjectStore("outbox",{keyPath:"id"}),e.objectStoreNames.contains("meta")||e.createObjectStore("meta",{keyPath:"key"}),e.objectStoreNames.contains("userProfiles")||e.createObjectStore("userProfiles",{keyPath:"id"}),e.objectStoreNames.contains("groupMembers")||e.createObjectStore("groupMembers",{keyPath:"groupId"}),e.objectStoreNames.contains("groupProfiles")||e.createObjectStore("groupProfiles",{keyPath:"id"}),e.objectStoreNames.contains("pinnedMessages")||e.createObjectStore("pinnedMessages",{keyPath:"conversationId"}),e.objectStoreNames.contains("channelProfiles")||e.createObjectStore("channelProfiles",{keyPath:"id"}),e.objectStoreNames.contains("channelMembers")||e.createObjectStore("channelMembers",{keyPath:["channelId","userId"]}),e.objectStoreNames.contains("channelMemberSnapshots")||e.createObjectStore("channelMemberSnapshots",{keyPath:"channelId"}),e.objectStoreNames.contains("channelMentionCandidateSnapshots")||e.createObjectStore("channelMentionCandidateSnapshots",{keyPath:"channelId"}),e.objectStoreNames.contains("conversationBackgrounds")||e.createObjectStore("conversationBackgrounds",{keyPath:"key"}),e.objectStoreNames.contains("mediaAssets")||e.createObjectStore("mediaAssets",{keyPath:"key"}),!e.objectStoreNames.contains("mediaAssetMeta")){const t=e.createObjectStore("mediaAssetMeta",{keyPath:"key"});t.createIndex("by_kind_access",["kind","lastAccessedAt"]),t.createIndex("by_access","lastAccessedAt")}if(!e.objectStoreNames.contains("decryptRecoveries")){e.createObjectStore("decryptRecoveries",{keyPath:"key"}).createIndex("by_conversation","conversationKey")}if(t>0&&t<13&&(n.objectStore("mediaAssets").clear(),n.objectStore("mediaAssetMeta").clear()),e.objectStoreNames.contains("recentHistoryPages")||e.createObjectStore("recentHistoryPages",{keyPath:"conversationKey"}),t>0&&t<16&&"messageKey"!==n.objectStore("messages").keyPath){(async()=>{const t=await n.objectStore("messages").getAll();for(const e of t)e.messageKey=C(o(e),e.id);e.deleteObjectStore("messages");const a=e.createObjectStore("messages",{keyPath:"messageKey"});a.createIndex("by_conv_sort",["conversationId","sortKey"]),a.createIndex("by_conversation_key_sort",["conversationKey","sortKey"]);for(let e=0;e<t.length;e+=128){const n=t.slice(e,e+128);await Promise.all(n.map(async e=>a.put(e)))}})().catch(e=>{r=e,n.done.catch(()=>{});try{n.abort()}catch{}})}}}).catch(e=>{throw r??e});if(n===z){try{await async function(e){const t=e.transaction(["messages","sessions","readStates","pinnedMessages","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(m))?.value)return void await t.done;const a=t.objectStore("messages");for(const e of await a.getAll())void 0===e.conversationKey&&await a.put(A(e));const n=t.objectStore("sessions"),o=/* @__PURE__ */new Map;for(const e of await n.getAll()){if(void 0!==e.conversationId)continue;const t=K(e);o.set(t.id,t.type),await n.put(P(t)),await n.delete(e.id)}const s=t.objectStore("readStates");for(const e of await s.getAll()){if(void 0!==e.storageConversationId)continue;const t=e.conversationType??o.get(e.conversationId);if(void 0===t)continue;const a={...e,conversationType:t};await s.put(x(a)),await s.delete(e.conversationId)}const r=t.objectStore("pinnedMessages");for(const e of await r.getAll()){if(void 0!==e.storageConversationId)continue;const t=R(e);await r.put(B(t)),await r.delete(e.conversationId)}await e.put({key:m,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i),await async function(e){const t=e.transaction(["messages","readStates","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(w))?.value)return void await t.done;const n=t.objectStore("readStates"),s=await n.getAll(),r=/* @__PURE__ */new Map;for(const e of s){const t=_(e);"channel"===t.conversationType&&void 0!==t.readCursorSortKey&&""!==t.readCursor&&r.set(a(t),{cursor:t.readCursor})}const i=/* @__PURE__ */new Map,c=t.objectStore("messages");let l=await c.openCursor();for(;null!==l;){const e=l.value,t=a(o(e)),n=d(e),s=r.get(t);if(void 0!==s&&e.extensions?.historyCursor===s.cursor&&(s.sortKey=n),n!==e.sortKey){let a=i.get(t);void 0===a&&(a=/* @__PURE__ */new Map,i.set(t,a)),a.set(e.sortKey,n),await l.update({...e,sortKey:n})}l=await l.continue()}for(const e of s){const t=_(e);if(void 0===t.conversationType)continue;const s=a(t);let d=r.get(s)?.sortKey??(void 0===t.readCursorSortKey?void 0:i.get(s)?.get(t.readCursorSortKey));if(void 0===d&&void 0!==t.readCursorSortKey&&"channel"!==t.conversationType&&""!==t.readCursor){const e=await c.get(C(t,t.readCursor));void 0!==e&&a(o(e))===s&&(d=e.sortKey)}void 0!==d&&d!==t.readCursorSortKey&&await n.put({...e,readCursorSortKey:d})}const y=await e.get(f);if(Array.isArray(y?.value)){let t=!1;const a=y.value.map(e=>{if(!Array.isArray(e)||2!==e.length||"string"!=typeof e[0]||"string"!=typeof e[1])return e;const a=i.get(e[0])?.get(e[1]);return void 0===a?e:(t=!0,[e[0],a])});t&&await e.put({key:f,value:a})}await e.put({key:w,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i),await async function(e){const t=e.transaction(["messages","meta"],"readwrite");try{const e=t.objectStore("meta");if(!0===(await e.get(g))?.value)return void await t.done;const a=t.objectStore("messages");let n=await a.openCursor();for(;null!==n;){const e=n.value.body?.miniProgram;"miniProgram"===n.value.contentType&&void 0!==e&&l(e)&&await n.delete(),n=await n.continue()}await e.put({key:g,value:!0}),await t.done}catch(e){try{t.abort()}catch{}try{await t.done}catch{}throw e}}(i)}catch(e){throw i.close(),e}if(n===z){V=i;try{await X(()=>ae(n,t))}catch(e){if(i.close(),n!==z)return;throw V===i&&(V=null),e}}else i.close()}else i.close()},async close(){const e=G;z+=1,$=null,null!==V&&(V.close(),V=null),await e},clearRebuildableCaches:async()=>Q(async()=>{const e=z,t=$;await X(async()=>{Z(e,t);const a=J().transaction(["userProfiles","groupMembers","groupProfiles","channelProfiles","channelMembers","channelMemberSnapshots","channelMentionCandidateSnapshots","mediaAssets","mediaAssetMeta","meta","recentHistoryPages"],"readwrite");await D(a,async()=>{await Promise.all([L(a.objectStore("userProfiles").clear()),L(a.objectStore("groupMembers").clear()),L(a.objectStore("groupProfiles").clear()),L(a.objectStore("channelProfiles").clear()),L(a.objectStore("channelMembers").clear()),L(a.objectStore("channelMemberSnapshots").clear()),L(a.objectStore("channelMentionCandidateSnapshots").clear()),L(a.objectStore("mediaAssets").clear()),L(a.objectStore("mediaAssetMeta").clear()),L(a.objectStore("meta").delete(v)),L(a.objectStore("recentHistoryPages").clear())])})})}),async hasMany(e){const a=z,n=$,o=e.map(e=>({...e}));return await X(async()=>{if(Z(a,n),0===o.length)return Object.freeze([]);const e=J().transaction(["mediaAssets","mediaAssetMeta"],"readonly"),s=ee(),r=await D(e,async()=>{const a=/* @__PURE__ */new Map;return await Promise.all(o.map(n=>{if(void 0===t.mediaAssetCache?.strategies.resolve(n.kind))return!1;const o=O(n);let r=a.get(o);return void 0===r&&(r=L(Promise.all([L(e.objectStore("mediaAssets").getKey(o)),L(e.objectStore("mediaAssetMeta").get(o))]).then(([e,t])=>void 0!==e&&void 0!==t&&t.kind===n.kind&&t.messageId===n.messageId&&t.resourceVersion===n.resourceVersion&&Number.isSafeInteger(t.byteLength)&&t.byteLength>0&&!te(t,s))),a.set(o,r)),r}))});return Z(a,n),Object.freeze(r)})},async get(e){const a=z,n=$;return await X(async()=>{if(Z(a,n),void 0===t.mediaAssetCache?.strategies.resolve(e.kind))return null;const o=O(e),s=J(),[r,i]=await Promise.all([H(s,"mediaAssets",o),H(s,"mediaAssetMeta",o)]);Z(a,n);const c=ee();return void 0===r||void 0===i||te(i,c)?(await oe([o],a,n),null):(await s.put("mediaAssetMeta",{...i,lastAccessedAt:c}),Z(a,n),{kind:i.kind,messageId:i.messageId,resourceVersion:i.resourceVersion,blob:r.blob,...void 0===i.mimeType?{}:{mimeType:i.mimeType}})})},async put(e,a){const n=z,o=$;Z(n,o);const s=e.blob.size;if(s>q||U+s>q)return"skipped";U+=s;try{return await X(()=>async function(e,a,n,o=()=>!0){if(Z(a,n),!o())return"skipped";const s=t.mediaAssetCache?.strategies.resolve(e.kind);if(void 0===s)return"skipped";const r=e.blob,i=r.size,c=await ae(a,n),d=await ne(c);if(Z(a,n),0===i||i>s.maxEntryBytes||d<=0||i>Math.floor(d/2))return"skipped";const l=O(e),y=ee(),u=c.find(e=>e.key===l),v={key:l,kind:e.kind,messageId:e.messageId,resourceVersion:e.resourceVersion,byteLength:i,...void 0===e.mimeType?{}:{mimeType:e.mimeType},createdAt:u?.createdAt??y,lastAccessedAt:y},m=async()=>{if(Z(a,n),!o())return!1;const e=J().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");return await D(e,async()=>{await Promise.all([L(e.objectStore("mediaAssets").put({key:l,blob:r})),L(e.objectStore("mediaAssetMeta").put(v))])}),!0};let w=!1;try{if(!await m())return"skipped"}catch(e){if(!o())return"skipped";if(!(e instanceof DOMException)||"QuotaExceededError"!==e.name)throw e;if(w=!0,await se(a,n,Math.max(0,d-i)),!await m())return"skipped"}const g=void 0===u?[...c,v]:c.map(e=>e.key===l?v:e);return await se(a,n,void 0,w?void 0:g),Z(a,n),void 0===await H(J(),"mediaAssets",l)?"skipped":"stored"}(e,n,o,a?.isCurrent))}finally{U=Math.max(0,U-s)}},async clear(){const e=z,t=$;await X(async()=>{Z(e,t);const a=J().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await D(a,async()=>{await Promise.all([L(a.objectStore("mediaAssets").clear()),L(a.objectStore("mediaAssetMeta").clear())])})})},async prune(){const e=z,t=$;await X(()=>ae(e,t))},async getMessage(e,t){const n=await H(J(),"messages",C(e,t));if(void 0===n)return null;const s=I(n);return a(o(s))===a(e)?s:null},async getMessages(e,t){const n="string"==typeof e?"by_conv_sort":"by_conversation_key_sort",o="string"==typeof e?e:a(e);if(await async function(e){if("string"!=typeof e)return;const t=IDBKeyRange.bound([e,""],[e,h]),a=J().transaction("messages");T(e,(await D(a,async()=>await a.store.index("by_conv_sort").getAll(t))).map(I))}(e),void 0===t.beforeSortKey&&void 0!==t.afterSortKey){const e=IDBKeyRange.bound([o,t.afterSortKey],[o,h]),a=[],s=J().transaction("messages");return await D(s,async()=>{let o=await s.store.index(n).openCursor(e,"next");for(;null!==o&&a.length<t.limit;)a.push(o.value),o=await o.continue()}),a.map(I)}const s=void 0===t.beforeSortKey?IDBKeyRange.bound([o,""],[o,h]):IDBKeyRange.bound([o,""],[o,t.beforeSortKey],!1,!0),r=[],i=J().transaction("messages");return await D(i,async()=>{let e=await i.store.index(n).openCursor(s,"prev");for(;null!==e&&r.length<t.limit;)r.push(e.value),e=await e.continue()}),r.reverse().map(I)},async saveMessages(e){if(0===e.length)return;const t=J().transaction("messages","readwrite");await D(t,async()=>{await Promise.all(e.map(e=>L(t.store.put(A(e)))))})},async searchMessages(e,t){const n=a(e),o=t.keyword?.trim()??"",s=t.contentTypes;if(""===o&&(void 0===s||0===s.length))return{items:[],exhausted:!0};const d=""===o?void 0:await r(o),l=void 0===t.beforeSortKey?IDBKeyRange.bound([n,""],[n,h]):IDBKeyRange.bound([n,""],[n,t.beforeSortKey],!1,!0),y=[];let u,v=0;const m=J().transaction("messages"),w=await D(m,async()=>{let e=await m.store.index("by_conversation_key_sort").openCursor(l,"prev");for(;null!==e&&y.length<t.limit&&v<2e3;){const t=c(I(e.value));v+=1,u=t.sortKey;const a=void 0===s||s.includes(t.contentType),n=void 0===d||null!==d.match(i(t));a&&n&&y.push(t),e=await e.continue()}return null===e});return{items:y,exhausted:w,...w?{}:{nextBeforeSortKey:u}}},async getDecryptRecoveries(e){const t=a(e),n=J().transaction("decryptRecoveries");return(await D(n,async()=>await n.store.index("by_conversation").getAll(t))).map(M)},async saveDecryptRecovery(e){if(0===e.sContent.byteLength||e.sContent.byteLength>65536)throw new Error(`解密恢复密文字节长度非法:${e.sContent.byteLength}`);await J().put("decryptRecoveries",function(e){const t=a(e.conversation);return{...e,key:j(e.conversation,e.messageId),conversationKey:t,conversation:{...e.conversation},sContent:e.sContent.slice()}}(e))},async deleteDecryptRecovery(e,t){await J().delete("decryptRecoveries",j(e,t))},async deleteConversationDecryptRecoveries(e){const t=a(e),n=J().transaction("decryptRecoveries","readwrite");await D(n,async()=>{let e=await n.store.index("by_conversation").openCursor(IDBKeyRange.only(t));for(;null!==e;)await e.delete(),e=await e.continue()})},getSessions:async()=>(await E(J(),"sessions")).map(K),async saveSessions(e){if(0===e.length)return;const t=J().transaction("sessions","readwrite");await D(t,async()=>{for(const a of e)await t.store.put(P(a)),await t.store.delete(a.id)})},async deleteSession(e){if("string"!=typeof e){const t=J().transaction(["sessions","conversationBackgrounds"],"readwrite");return void await D(t,async()=>{await t.objectStore("sessions").delete(a(e)),await t.objectStore("conversationBackgrounds").delete(k(e))})}const t=(await E(J(),"sessions")).map(K).filter(t=>t.id===e);T(e,t.map(e=>({conversationType:e.type})));const n=J().transaction(["sessions","conversationBackgrounds"],"readwrite");await D(n,async()=>{if(void 0!==t[0]){const e=s(t[0]);await n.objectStore("sessions").delete(a(e)),await n.objectStore("conversationBackgrounds").delete(k(e))}await n.objectStore("sessions").delete(e)})},async deleteReadState(e){if("string"!=typeof e)return void await J().delete("readStates",a(e));const t=(await E(J(),"readStates")).map(_).filter(t=>t.conversationId===e).filter(e=>void 0!==e.conversationType);T(e,t),void 0!==t[0]&&await J().delete("readStates",a(t[0])),await J().delete("readStates",e)},deleteMessage:async(e,t,n)=>Q(async()=>{if(void 0!==n&&(n.id!==e.conversationId||n.type!==e.conversationType))throw new Error("删除后的会话摘要必须匹配目标会话");const o=J().transaction(["messages","sessions","decryptRecoveries","recentHistoryPages"],"readwrite");return D(o,async()=>{const s=o.objectStore("messages"),r=C(e,t),i=await s.get(r);if(void 0!==i){const t=I(i);if(t.conversationType!==e.conversationType||t.conversationId!==e.conversationId)return!1;await s.delete(r)}return await o.objectStore("decryptRecoveries").delete(j(e,t)),await o.objectStore("recentHistoryPages").delete(a(e)),void 0!==n&&await o.objectStore("sessions").put(P(n)),void 0!==i})}),deleteConversationMessages:async e=>Q(async()=>{const t="string"==typeof(n=e)?n:n.conversationId;var n;const o="string"==typeof e?"by_conv_sort":"by_conversation_key_sort",s="string"==typeof e?e:a(e),r=IDBKeyRange.bound([s,""],[s,h]),i=J().transaction(["messages","decryptRecoveries","recentHistoryPages","meta"],"readwrite");return D(i,async()=>{const n=i.objectStore("messages"),s=i.objectStore("decryptRecoveries");let c=[],d=[];if("string"==typeof e){const a=(await n.index("by_conv_sort").getAll(r)).map(I);c=(await s.getAll()).filter(t=>t.conversation.conversationId===e),d=(await i.objectStore("recentHistoryPages").getAll()).filter(e=>e.conversation.conversationId===t);const o=await i.objectStore("meta").get(y({conversationType:"channel",conversationId:t}));T(t,[...void 0===o?[]:[{conversationType:"channel"}],...a,...d.map(e=>({conversationType:e.conversation.conversationType})),...c.map(e=>({conversationType:e.conversation.conversationType}))])}await i.objectStore("meta").delete(y("string"==typeof e?{conversationType:"channel",conversationId:t}:e));let l=await n.index(o).openCursor(r);for(;null!==l;)await l.delete(),l=await l.continue();if("string"==typeof e){for(const e of c)await s.delete(e.key);for(const e of d)await i.objectStore("recentHistoryPages").delete(e.conversationKey)}else{await i.objectStore("recentHistoryPages").delete(a(e));let t=await s.index("by_conversation").openCursor(IDBKeyRange.only(a(e)));for(;null!==t;)await t.delete(),t=await t.continue()}})}),clearConversationHistory:async(e,t,n)=>Q(async()=>{const o=a(e),s=IDBKeyRange.bound([o,""],[o,h]),r=J().transaction(["messages","sessions","readStates","decryptRecoveries","recentHistoryPages","meta"],"readwrite");return D(r,async()=>{await r.objectStore("meta").delete(y(e)),await r.objectStore("recentHistoryPages").delete(o);let a=await r.objectStore("messages").index("by_conversation_key_sort").openCursor(s);for(;null!==a;)await a.delete(),a=await a.continue();let i=await r.objectStore("decryptRecoveries").index("by_conversation").openCursor(IDBKeyRange.only(o));for(;null!==i;)await i.delete(),i=await i.continue();void 0!==t&&await r.objectStore("sessions").put(P(t)),void 0!==n&&(await r.objectStore("readStates").put(x(n)),await r.objectStore("readStates").delete(n.conversationId))})}),getReadStates:async()=>(await E(J(),"readStates")).map(_),async saveReadState(e){const t=J().transaction("readStates","readwrite");await D(t,async()=>{await t.store.put(x(e)),void 0!==e.conversationType&&await t.store.delete(e.conversationId)})},getDrafts:async()=>(await E(J(),"drafts")).map(N),async saveDraft(e){await J().put("drafts",function(e){return{...e,conversationKey:a(e.ref)}}(e))},async deleteDraft(e){await J().delete("drafts",a(e))},getConversationBackground:async e=>(await H(J(),"conversationBackgrounds",k(e)))?.background??null,async saveConversationBackground(e,t){const a=k(e);await J().put("conversationBackgrounds",{key:a,background:t})},async deleteConversationBackground(e){await J().delete("conversationBackgrounds",k(e))},getDefaultConversationBackground:async()=>(await H(J(),"conversationBackgrounds",p))?.background??null,async saveDefaultConversationBackground(e){await J().put("conversationBackgrounds",{key:p,background:e})},async deleteDefaultConversationBackground(){await J().delete("conversationBackgrounds",p)},getOutbox:async()=>E(J(),"outbox"),async saveOutboxMessage(e){await J().put("outbox",e)},async removeOutboxMessage(e){await J().delete("outbox",e)},getPinnedMessages:async()=>(await E(J(),"pinnedMessages")).map(R),async savePinnedMessage(e){const t=J().transaction("pinnedMessages","readwrite");await D(t,async()=>{await t.store.put(B(e)),await t.store.delete(e.conversationId)})},async removePinnedMessage(e){if("string"!=typeof e)return void await J().delete("pinnedMessages",a(e));const t=(await E(J(),"pinnedMessages")).map(R).filter(t=>t.conversationId===e);T(e,t),void 0!==t[0]&&await J().delete("pinnedMessages",a(n(t[0]))),await J().delete("pinnedMessages",e)},async getMeta(e){const t=await H(J(),"meta",e);return void 0===t?null:t.value},async setMeta(e,t){await J().put("meta",{key:e,value:t})},getUserProfile:async e=>await H(J(),"userProfiles",e)??null,async saveUserProfile(e){await J().put("userProfiles",e)},getGroupMembers:async e=>await H(J(),"groupMembers",e)??null,async saveGroupMembers(e){await J().put("groupMembers",e)},getGroupProfile:async e=>await H(J(),"groupProfiles",e)??null,async saveGroupProfile(e){await J().put("groupProfiles",e)},getChannelProfile:async e=>await H(J(),"channelProfiles",e)??null,getChannelProfiles:async()=>E(J(),"channelProfiles"),async saveChannelProfiles(e){if(0===e.length)return;const t=J().transaction("channelProfiles","readwrite");await D(t,async()=>{await Promise.all(e.map(e=>L(t.store.put(e))))})},async getChannelListVersion(){const e=await H(J(),"meta",v);return"string"==typeof e?.value&&/^\d+$/.test(e.value)?e.value:"0"},async saveChannelListVersion(e){if(!/^\d+$/.test(e))throw new Error(`CHANNEL list version 非法:${e}`);await J().put("meta",{key:v,value:e})},async getChannelMembers(e,t){if(0===t.length)return[];const a=J().transaction("channelMembers");return(await D(a,async()=>await Promise.all(t.map(t=>L(a.store.get([e,t])))))).filter(e=>void 0!==e)},async saveChannelMembers(e){if(0===e.length)return;const t=J().transaction("channelMembers","readwrite");await D(t,async()=>{for(const a of e){const e=await t.store.get([a.channelId,a.userId]);void 0!==e&&S(a.updateVersion,e.updateVersion)<0||await t.store.put(a)}})},async deleteChannelMembers(e){const t=IDBKeyRange.bound([e,""],[e,h]),a=J().transaction("channelMembers","readwrite");await D(a,async()=>{let e=await a.store.openCursor(t);for(;null!==e;)await e.delete(),e=await e.continue()})},getChannelMemberSnapshot:async e=>await H(J(),"channelMemberSnapshots",e)??null,async saveChannelMemberSnapshot(e){await J().put("channelMemberSnapshots",e)},async deleteChannelMemberSnapshot(e){await J().delete("channelMemberSnapshots",e)},getChannelMentionCandidateSnapshot:async e=>await H(J(),"channelMentionCandidateSnapshots",e)??null,async saveChannelMentionCandidateSnapshot(e){await J().put("channelMentionCandidateSnapshots",e)},async deleteChannelMentionCandidateSnapshot(e){await J().delete("channelMentionCandidateSnapshots",e)}}}export{$ as createIndexedDbStorageAdapter,V as deleteIndexedDbNamespace};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineStore as e}from"pinia";import{shallowRef as n,ref as t,watch as o}from"vue";import{getImChatKitContext as r,registerImChatKitStoreDisposer as a,resolveImChatKitPinia as i}from"./context.js";import{useImThreadStore as s}from"./thread.store.js";const l=/* @__PURE__ */new WeakMap;function u(e){const n=l.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImComposerStore");return n}function d(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function c(e){return{text:e.text,...void 0===e.mentions?{}:{mentions:e.mentions.map(e=>({userId:e.userId,displayName:e.displayName}))},...void 0===e.replyToMessageId?{}:{replyToMessageId:e.replyToMessageId},attachments:[]}}function v(e){return null===e?null:c({text:e.text,mentions:e.mentions,...void 0===e.replyToMessageId?{}:{replyToMessageId:e.replyToMessageId}})}function f(e){return""===e.text&&0===(e.mentions?.length??0)&&void 0===e.replyToMessageId}function p(e,n){return null!==e&&e.text===n.text&&e.replyToMessageId===n.replyToMessageId&&(e.mentions?.length??0)===(n.mentions?.length??0)&&(e.mentions??[]).every((e,t)=>{const o=n.mentions?.[t];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function g(e,n,t){return function(e){return"object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category}(e)?e:Object.freeze({code:"composer.draft"===n?"IM_CHAT_KIT_DRAFT_SAVE_FAILED":"IM_CHAT_KIT_COMPOSER_OPERATION_FAILED",category:"state",operation:n,retryable:"composer.draft"===n,...void 0===t?{}:{conversation:d(t)},cause:e})}function m(e,n){return e.conversationId===n.ref.conversationId&&e.conversationType===n.ref.conversationType}function y(a){return e("k2-im-composer",()=>{const e=r(a).runtime,i=e.getDiagnostics(),u=s(a),y=n(null),h=n(null),I=n(null),T=t(!1),b=t(0),k=n(null);let M,j=!1,w=0,O=0,z=0,x=Promise.resolve(),P=Promise.resolve();const R=/* @__PURE__ */new Set,_=/* @__PURE__ */new Map;let E,G;function A(){return u.getHandle()}function C(n,t){const o=u.activeRef;return!j&&A()===n&&e.getGeneration()===t&&null!==o&&o.conversationId===n.ref.conversationId&&o.conversationType===n.ref.conversationType}function D(n=A()){if(void 0===n)return!1;const t=e.getGeneration();return M?.handle===n&&M.generation===t||[...R].some(e=>e.handle===n&&e.generation===t)}async function
|
|
1
|
+
import{defineStore as e}from"pinia";import{shallowRef as n,ref as t,watch as o}from"vue";import{getImChatKitContext as r,registerImChatKitStoreDisposer as a,resolveImChatKitPinia as i}from"./context.js";import{useImThreadStore as s}from"./thread.store.js";const l=/* @__PURE__ */new WeakMap;function u(e){const n=l.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImComposerStore");return n}function d(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function c(e){return{text:e.text,...void 0===e.mentions?{}:{mentions:e.mentions.map(e=>({userId:e.userId,displayName:e.displayName}))},...void 0===e.replyToMessageId?{}:{replyToMessageId:e.replyToMessageId},attachments:[]}}function v(e){return null===e?null:c({text:e.text,mentions:e.mentions,...void 0===e.replyToMessageId?{}:{replyToMessageId:e.replyToMessageId}})}function f(e){return""===e.text&&0===(e.mentions?.length??0)&&void 0===e.replyToMessageId}function p(e,n){return null!==e&&e.text===n.text&&e.replyToMessageId===n.replyToMessageId&&(e.mentions?.length??0)===(n.mentions?.length??0)&&(e.mentions??[]).every((e,t)=>{const o=n.mentions?.[t];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function g(e,n,t){return function(e){return"object"==typeof e&&null!==e&&"string"==typeof e.code&&"string"==typeof e.category}(e)?e:Object.freeze({code:"composer.draft"===n?"IM_CHAT_KIT_DRAFT_SAVE_FAILED":"IM_CHAT_KIT_COMPOSER_OPERATION_FAILED",category:"state",operation:n,retryable:"composer.draft"===n,...void 0===t?{}:{conversation:d(t)},cause:e})}function m(e,n){return e.conversationId===n.ref.conversationId&&e.conversationType===n.ref.conversationType}function y(a){return e("k2-im-composer",()=>{const e=r(a).runtime,i=e.getDiagnostics(),u=s(a),y=n(null),h=n(null),I=n(null),T=t(!1),b=t(0),k=n(null);let M,j=!1,w=0,O=0,z=0,x=Promise.resolve(),P=Promise.resolve();const R=/* @__PURE__ */new Set,_=/* @__PURE__ */new Map;let E,G;function A(){return u.getHandle()}function C(n,t){const o=u.activeRef;return!j&&A()===n&&e.getGeneration()===t&&null!==o&&o.conversationId===n.ref.conversationId&&o.conversationType===n.ref.conversationType}function D(n=A()){if(void 0===n)return!1;const t=e.getGeneration();return M?.handle===n&&M.generation===t||[...R].some(e=>e.handle===n&&e.generation===t)}async function H(n=A()){if(void 0===n)return;const t=e.getGeneration(),o=M?.handle===n&&M.generation===t?M:void 0;if(void 0===o){const e=[...R].filter(e=>e.handle===n&&e.generation===t).map(e=>e.promise);return void(e.length>0?await Promise.all(e):await P)}const r=u.retainHandle(n);M=void 0;const a=x.then(async()=>{f(o.input)?await n.draft.clear():await n.draft.save(o.input)}),s={handle:n,generation:t,promise:a};R.add(s),P=a,x=a.catch(()=>{});try{await a,C(n,t)&&(k.value=null,b.value+=1,i.record("debug","pinia","draft","composer-draft-flush-complete",()=>({generation:t,conversation:d(n.ref)})))}catch(e){throw C(n,t)&&(void 0===M&&z===o.version&&(M=o),k.value=g(e,"composer.draft",n.ref),i.record("error","pinia","draft","composer-draft-flush-failed",()=>({generation:t,conversation:d(n.ref),error:{message:"Composer 草稿持久化失败",data:k.value}}))),e}finally{R.delete(s),r()}}function N(n){const t=A(),o=e.getGeneration();if(void 0===t||!C(t,o))return k.value=g(new Error("当前会话尚未就绪"),"composer.draft"),!1;const r=c(n);return z+=1,y.value=f(r)?null:r,M={handle:t,generation:o,version:z,input:r},k.value=null,S(),f(r)&&H(t).catch(()=>{}),!0}async function S(){if(null!==I.value)return;const n=y.value?.replyToMessageId;if(void 0===n)return O+=1,void(h.value=null);const t=A();if(void 0===t)return void(h.value=null);const o=u.messages.find(e=>e.id===n);if(void 0!==o)return O+=1,void(h.value=o);const r=e.getGeneration(),a=++O,i=await t.resolveMessage(n).catch(()=>null);a===O&&C(t,r)&&null===I.value&&y.value?.replyToMessageId===n&&(h.value=i)}function W(){I.value=null,S()}function $(n,t){return!j&&e.getGeneration()===n&&w===t}function F(e,n){return null!==e&&p(v(e),n)}function K(e){if(!C(e.handle,e.generation)||null!==y.value)return;E=void 0;const n=c(e.input);z+=1,y.value=n,M={handle:e.handle,generation:e.generation,version:z,input:n},S()}function L(){const n=A();if(void 0===n)return;const t=E,o=void 0!==t&&t.handle===n&&t.generation===e.getGeneration()&&F(u.draft,t.input);void 0===t||o||(E=void 0),D(n)||function(e){return[..._.values()].some(n=>n.handle===e)}(n)||o||(y.value=v(u.draft)),null===I.value||m(I.value,n)||(I.value=null),S()}function V(){w+=1,O+=1,z+=1,M=void 0,_.clear(),E=void 0,x=Promise.resolve(),P=Promise.resolve(),y.value=null,h.value=null,I.value=null,G=void 0,T.value=!1,b.value=0,k.value=null}const q=o(()=>({ref:null===u.activeRef?null:`${u.activeRef.conversationType}:${u.activeRef.conversationId}`,draft:u.draft,messages:u.messages}),(e,n)=>{if(e.ref!==n?.ref)return V(),void(null!==e.ref&&L());L()},{immediate:!0});return l.set(a,Object.freeze({suspendInteraction:function(){O+=1,h.value=null,I.value=null},syncReplyTarget:S,dispose:function(){j||(j=!0,q(),V())}})),{input:y,replyTo:h,editingMessage:I,submitting:T,draftCommitVersion:b,error:k,updateDraft:N,flush:H,hasPendingWork:D,submitText:async function(n){const t=I.value,o=null===t?"send":"edit";if(null!==t&&void 0!==G)return Object.freeze({ok:!1,operation:"edit",reason:"busy"});const r=A(),a=e.getGeneration();if(void 0===r||!C(r,a))return Object.freeze({ok:!1,operation:o,reason:"not-ready"});const s=n.text.trim();if(""===s)return Object.freeze({ok:!1,operation:o,reason:"empty"});const l=w;if(null!==t&&!m(t,r))return Object.freeze({ok:!1,operation:"edit",reason:"not-ready"});const v=Symbol(o);null!==t&&(G=v),T.value=void 0!==G,k.value=null;const f=u.retainHandle(r);let b;if(null===t){const e=c(n);b={token:v,handle:r,generation:a,input:e},_.set(v,b),function(e,n,t){C(e,n)&&null!==y.value&&p(y.value,t)&&(z+=1,M?.handle===e&&M.generation===n&&p(M.input,t)&&(M=void 0),y.value=null,O+=1,h.value=null)}(r,a,e)}i.record("debug","pinia","message","composer-submit-start",()=>({generation:a,operation:o,conversation:d(r.ref),...null===t?{}:{messageId:t.id}}));try{if(null===t){if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"send",reason:"stale"});const e=await r.messages.sendText(s,{...void 0===n.mentions?{}:{mentions:n.mentions},...void 0===n.replyToMessageId?{}:{replyToMessageId:n.replyToMessageId}});if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"send",reason:"stale"});if(!e.ok)return void 0!==b&&K(b),k.value=e.error,Object.freeze({ok:!1,operation:"send",reason:"sdk-rejected",error:e.error});if(void 0!==b&&(await async function(e){const n=[...R].filter(n=>n.handle===e.handle&&n.generation===e.generation).map(e=>e.promise.catch(()=>{}));if(n.length>0&&await Promise.all(n),!C(e.handle,e.generation))return;if(F(await e.handle.draft.get(),e.input)){E=e;try{await e.handle.draft.clear(),E?.token===e.token&&(E=void 0)}catch(n){if(C(e.handle,e.generation)){if(null===y.value&&void 0===M){const n={text:"",attachments:[]};z+=1,M={handle:e.handle,generation:e.generation,version:z,input:n}}k.value=g(n,"composer.draft",e.handle.ref),i.record("error","pinia","draft","composer-accepted-draft-clear-failed",()=>({generation:e.generation,conversation:d(e.handle.ref),error:{message:"消息已被发送流程接受,但清理对应草稿失败",data:k.value}}))}}}else E?.token===e.token&&(E=void 0)}(b),!$(a,l)||!C(r,a)))return Object.freeze({ok:!1,operation:"send",reason:"stale"})}else{try{await r.messages.editText(t.id,s,{...void 0===n.mentions?{}:{mentions:n.mentions}})}catch(e){if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"edit",reason:"stale"});const n=g(e,"composer.edit",r.ref);return k.value=n,Object.freeze({ok:!1,operation:"edit",reason:"sdk-rejected",error:n})}if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:"edit",reason:"stale"});I.value===t&&W()}return k.value=null,i.record("debug","pinia","message","composer-submit-complete",()=>({generation:a,operation:o,conversation:d(r.ref)})),Object.freeze({ok:!0,operation:o})}catch(e){if(!$(a,l)||!C(r,a))return Object.freeze({ok:!1,operation:o,reason:"stale"});void 0!==b&&K(b);const n=g(e,`composer.${o}`,r.ref);return k.value=n,Object.freeze({ok:!1,operation:o,reason:"sdk-rejected",error:n})}finally{f(),_.delete(v),G===v&&(G=void 0),T.value=void 0!==G,C(r,a)&&L()}},setReplyTo:function(e){const n=A();return!(void 0===n||!m(e,n))&&(I.value=null,h.value=e,N({...y.value??{text:"",attachments:[]},replyToMessageId:e.id}))},clearReplyTo:function(e){if(void 0!==e&&y.value?.replyToMessageId!==e)return;h.value=null;const n=y.value;if(null===n)return;const{replyToMessageId:t,...o}=n;N({...o})},setEditing:function(e){const n=A();return!(void 0===n||!m(e,n))&&(h.value=null,I.value=e,!0)},clearEditing:W,reset:V}})}const h=/* @__PURE__ */new WeakMap,I=/* @__PURE__ */new WeakMap;function T(e=i()){r(e);let n=h.get(e);void 0===n&&(n=y(e),h.set(e,n));const t=n(e),o=u(e);return I.get(e)!==t&&(I.set(e,t),a(e,()=>{o.dispose(),t.$dispose(),I.get(e)===t&&(I.delete(e),l.get(e)===o&&l.delete(e))})),t}export{u as getInternalImComposerActions,T as useImComposerStore};
|