k2-im 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/chat-kit-pinia.d.ts +3 -3
  2. package/dist/chat-kit.d.ts +2 -2
  3. package/dist/index.d.ts +2 -2
  4. package/dist/modules/api-protocol-client/src/client.js +1 -1
  5. package/dist/modules/api-protocol-client/src/nonce.js +1 -1
  6. package/dist/modules/crypto/browser.js +1 -1
  7. package/dist/modules/crypto/driver.js +1 -1
  8. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
  9. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
  10. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
  11. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
  12. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  13. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
  14. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
  15. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
  16. package/dist/modules/im-core/src/abort.js +1 -1
  17. package/dist/modules/im-core/src/mapping/message-id.js +1 -1
  18. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  19. package/dist/modules/im-core/src/state/domain-state.js +1 -1
  20. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  21. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
  22. package/dist/modules/im-sdk/src/product/media.js +1 -1
  23. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -1
  24. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
  25. package/dist/request-crypto.d.ts +3 -2
  26. package/dist/sdk.d.ts +1 -1
  27. package/dist/vendor/crypto/index_bg.wasm +0 -0
  28. package/package.json +1 -1
@@ -1943,7 +1943,7 @@ interface ImHttpPort {
1943
1943
  }
1944
1944
 
1945
1945
  /** 可持久化的媒体资产类型;未注册类型必须跳过缓存,不能回退到其它类型。 */
1946
- type MediaAssetKind = 'image' | 'video' | 'file';
1946
+ type MediaAssetKind = 'image' | 'video';
1947
1947
  /** 持久媒体资产的稳定键。resourceVersion 由远端资源标识派生,避免同消息替换资源后误命中旧缓存。 */
1948
1948
  interface MediaAssetCacheKey {
1949
1949
  kind: MediaAssetKind;
@@ -5474,7 +5474,7 @@ interface ImMediaTasksApi {
5474
5474
  clearCache: () => Promise<void>;
5475
5475
  /**
5476
5476
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
5477
- * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
5477
+ * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
5478
5478
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
5479
5479
  * @example const [available] = await client.media.probeCached([messageRef])
5480
5480
  */
@@ -7901,7 +7901,7 @@ interface ImExpressionStoreActions {
7901
7901
  loadRecent: (kind: RecentKind) => Promise<ImExpressionOperationResult>;
7902
7902
  reportRecent: (input: ImExpressionRecentInput) => Promise<ImExpressionOperationResult>;
7903
7903
  rememberEmoji: (entry: ImEmojiRecentEntry) => Promise<ImExpressionOperationResult>;
7904
- /** refreshAfterReport=false 保留本地 MRU,仅上报,不再拉取服务端列表。默认保持权威刷新行为。 */
7904
+ /** 默认上报后刷新服务端列表;已使用本地 MRU 的宿主可明确关闭本次刷新。 */
7905
7905
  rememberEmojis: (entries: readonly ImEmojiRecentEntry[], options?: {
7906
7906
  refreshAfterReport?: boolean;
7907
7907
  }) => Promise<ImExpressionOperationResult>;
@@ -1940,7 +1940,7 @@ interface ImHttpPort {
1940
1940
  }
1941
1941
 
1942
1942
  /** 可持久化的媒体资产类型;未注册类型必须跳过缓存,不能回退到其它类型。 */
1943
- type MediaAssetKind = 'image' | 'video' | 'file';
1943
+ type MediaAssetKind = 'image' | 'video';
1944
1944
  /** 持久媒体资产的稳定键。resourceVersion 由远端资源标识派生,避免同消息替换资源后误命中旧缓存。 */
1945
1945
  interface MediaAssetCacheKey {
1946
1946
  kind: MediaAssetKind;
@@ -5585,7 +5585,7 @@ interface ImMediaTasksApi {
5585
5585
  clearCache: () => Promise<void>;
5586
5586
  /**
5587
5587
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
5588
- * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
5588
+ * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
5589
5589
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
5590
5590
  * @example const [available] = await client.media.probeCached([messageRef])
5591
5591
  */
package/dist/index.d.ts CHANGED
@@ -1981,7 +1981,7 @@ interface ImHttpPort {
1981
1981
  }
1982
1982
 
1983
1983
  /** 可持久化的媒体资产类型;未注册类型必须跳过缓存,不能回退到其它类型。 */
1984
- type MediaAssetKind = 'image' | 'video' | 'file';
1984
+ type MediaAssetKind = 'image' | 'video';
1985
1985
  /** 持久媒体资产的稳定键。resourceVersion 由远端资源标识派生,避免同消息替换资源后误命中旧缓存。 */
1986
1986
  interface MediaAssetCacheKey {
1987
1987
  kind: MediaAssetKind;
@@ -6157,7 +6157,7 @@ interface ImMediaTasksApi {
6157
6157
  clearCache: () => Promise<void>;
6158
6158
  /**
6159
6159
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
6160
- * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
6160
+ * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
6161
6161
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
6162
6162
  * @example const [available] = await client.media.probeCached([messageRef])
6163
6163
  */
@@ -1 +1 @@
1
- import{computeBiFeedbackHeaderSign as t}from"./bi-feedback.js";import{API_PROTOCOL_OS_TYPE as e,API_PROTOCOL_APP_ID as s,API_PROTOCOL_APP_TYPE as n,API_PROTOCOL_BI_FEEDBACK_APP_ID as o,API_PROTOCOL_CLIENT_TYPE as r}from"./constants.js";import{parseApiProtocolJson as a}from"./json.js";import{generateRequestNonce as i}from"./nonce.js";import{resolveTargetConfig as c,normalizeProtocolParams as p,resolveProtocolLang as u,resolveBrowserInfo as d,formatTimestamp as m,normalizeHeaders as l,appendQueryParams as f,isFormDataBody as g,createRandomAlphaNumericString as y,joinUrlParts as w,collectResponseHeaders as b,readResponseHeader as h,transportDataToUint8Array as v,isJsonResponse as S,isTextResponse as T,transportDataToText as M}from"./utils.js";const D=/* @__PURE__ */new Set(["content-etag","token","req-id"]);function C(t){const e=t.rawBody,s=null!==e&&"object"==typeof e&&"code"in e?e.code:void 0;return{transportStatus:t.transportStatus,...void 0===t.httpStatus?{}:{httpStatus:t.httpStatus},..."number"==typeof s&&Number.isFinite(s)?{businessCode:s}:{}}}function E(t,e){return{code:502,msg:t instanceof Error?t.message:String(t),data:null,time:Math.floor(e/1e3)}}function j(t,e,s,n){if(S(s))return a(M(e.data));if(T(s))return M(e.data);const o=v(e.data),r=n?t.crypto.decryptAes(o):o,i=(new TextDecoder).decode(r);return a(i)}async function B(t,e,s){if(!t.onDebugRecord)return;const n={...e.meta,response:e.response,...s?{error:{name:s instanceof Error?s.name:void 0,message:s instanceof Error?s.message:String(s)}}:{}};try{await t.onDebugRecord(n)}catch{}}async function _(t,e,s,n,o,r,i){const c=b(e.headers),p=h(c,"content-type");if(e.status<200||e.status>=300){let a;if(n)a=void 0;else try{a=j(t,e,p,s)}catch{a=void 0}const u=function(t){if(!t||"object"!=typeof t)return!1;const e=t;return Number.isFinite(e.code)&&"data"in e}(a)?a:function(t,e){return{code:t.status,msg:t.statusText,data:null,time:Math.floor(e/1e3)}}(e,i);return{response:u,meta:{...o,transportStatus:"http_error",httpStatus:e.status,contentType:p,responseHeaders:c,...void 0!==a?{rawBody:a}:{},timings:{totalMs:i-r,upstreamMs:i-r}}}}const u=Date.now();if(n){const t=v(e.data),s=Date.now();return{response:{code:e.status,data:t,time:Math.floor(s/1e3)},meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:t,timings:{totalMs:s-r,upstreamMs:i-r,parseMs:s-u}}}}try{if(S(p)){const s=j(t,e,p,!1),n=Date.now();return{response:s,meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:s,timings:{totalMs:n-r,upstreamMs:i-r,parseMs:n-u}}}}if(T(p)){const t=M(e.data),s=Date.now();return{response:{code:e.status,msg:e.statusText,data:t,time:Math.floor(s/1e3)},meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:t,timings:{totalMs:s-r,upstreamMs:i-r,parseMs:s-u}}}}const n=v(e.data),d=Date.now(),m=s?t.crypto.decryptAes(n):n,l=Date.now(),f=(new TextDecoder).decode(m),g=a(f),y=Date.now();return{response:g,meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:g,timings:{totalMs:y-r,upstreamMs:i-r,parseMs:y-u,...s?{decryptMs:l-d}:{}}}}}catch(t){const s=Date.now();return{response:{code:(d=e.status,Number.isInteger(d)&&d>=400&&d<=599?d:502),msg:t instanceof Error?t.message:String(t),data:null,time:Math.floor(s/1e3)},meta:{...o,transportStatus:"invalid_response",httpStatus:e.status,contentType:p,responseHeaders:c,timings:{totalMs:s-r,upstreamMs:i-r,parseMs:s-u}}}}var d}function I(a){return async function(b,h={}){const v=a.now??(()=>/* @__PURE__ */new Date),S=a.randomNonce??i,T=a.randomRequestId??(()=>`req-${crypto.randomUUID().replaceAll("-","")}`),M=a.randomETag??(()=>y()),j=(h.method??"POST").toUpperCase(),I=h.target??"core",N=c(I,a.config.targets[I]),k=h.prefix??N.prefix??"",q=null!=h.body,P=p(h.data??{}),R="/v1/feedback"===b&&"/bi/h5"===k,U=!R&&(h.encrypt??!q),x=!R&&(h.sign??!q),H=v(),A=M(),O=T(),V=h.token??await(a.getToken?.())??"",L=u(h.locale??a.getLocale?.()),J=a.getBrowserInfo?.()??d(h.userAgent),F={app_id:s,os_type:e,app_version:a.config.appVersion,sign_method:"md5",timestamp:m(H),nonce:S()},X={...F,...P,nonce:F.nonce};let G=F,Y=P,$=X;!R&&x&&(X.sign=a.crypto.generateSign("api",a.config.envType,X,A),F.sign=X.sign);const z={app_version:a.config.appVersion,"X-ENC-VERSION":a.config.appVersion,"X-APP-TYPE":n,"Client-type":r,"Content-ETag":A,"brand-id":a.config.brandId,"channel-id":h.channelId||a.config.channelId,device_brand:J.deviceBrand,device_info:J.deviceInfo,device_number:J.deviceNumber,device_token:J.deviceToken,lang:L,"mch-id":a.config.merchantId,"req-id":O,token:V},K=l(h.headers);let Q,W=b,Z={...z,...Object.fromEntries(Object.entries(K).filter(([t])=>!D.has(t.toLowerCase())))};if(q)Q=h.body??void 0,G=null,Y=h.data??null,$=h.data??null;else if(R){const e=String(H.getTime()),s={"app-id":o,"app-version":a.config.appVersion,"sys-type":n,"sys-version":J.deviceNumber,time:e};G=s,Z={...Z,...s,sign:t(a.crypto,s),"Content-Type":"application/json"},Q=JSON.stringify(P),$=P}else"GET"===j?(W=f(W,X),$=X):U?(Q=a.crypto.encryptAes((new TextEncoder).encode(JSON.stringify(X))),Z["Content-Type"]=Z["Content-Type"]||"application/octet-stream",$=X):(Q=JSON.stringify(X),Z["Content-Type"]=Z["Content-Type"]||"application/json",$=X);g(Q)&&delete Z["Content-Type"];const tt=function(t,e,s,n,o){if(s.customUrl)return t;const r=c(n,e.config.targets[n]),a=s.baseUrl??r.baseUrl;return w(a,o,t)}(W,a,h,I,k),et=Date.now(),st=h.timeoutMs??6e4,nt=function(t,e){const s=new AbortController,n=setTimeout(()=>s.abort(),t),o=()=>s.abort();return e&&(e.aborted?s.abort():e.addEventListener("abort",o,{once:!0})),{signal:s.signal,dispose:()=>{clearTimeout(n),e?.removeEventListener("abort",o)}}}(st,h.signal),ot={requestId:O,eTag:A,method:j,upstreamUrl:tt,requestHeaders:Z,requestCommonParams:G,requestBusinessParams:Y,requestParams:$};let rt;try{const t=await a.transport({url:tt,method:j,headers:Z,body:Q,signal:nt.signal,timeoutMs:st,onUploadProgress:h.onUploadProgress}),e=Date.now(),s=await _(a,t,U&&!R,"raw"===h.responseMode,ot,et,e);return h.onResponse&&(rt=C(s.meta),s.observation=rt),await B(a,s),!h.skipBusinessResponseHandler&&a.onBusinessResponse&&await a.onBusinessResponse(s.response,{request:{path:b,method:j,target:I,url:tt},options:h}),s}catch(t){const e=Date.now(),s={response:E(t,e),...void 0===rt?{}:{observation:rt},meta:{...ot,transportStatus:"network_error",timings:{totalMs:e-et,upstreamMs:e-et}}};return await B(a,s,t),s}finally{nt.dispose()}}}function N(t){const e=I(t);return async function(t,s={}){const n=await e(t,s);return await(s.onResponse?.(n.observation??C(n.meta))),n.response}}export{N as createApiProtocolClient};
1
+ import{computeBiFeedbackHeaderSign as t}from"./bi-feedback.js";import{API_PROTOCOL_OS_TYPE as e,API_PROTOCOL_APP_ID as s,API_PROTOCOL_APP_TYPE as n,API_PROTOCOL_BI_FEEDBACK_APP_ID as o,API_PROTOCOL_CLIENT_TYPE as r}from"./constants.js";import{parseApiProtocolJson as a}from"./json.js";import{generateRequestId as i,generateRequestNonce as c}from"./nonce.js";import{resolveTargetConfig as p,normalizeProtocolParams as u,resolveProtocolLang as d,resolveBrowserInfo as m,formatTimestamp as l,normalizeHeaders as f,appendQueryParams as g,isFormDataBody as y,createRandomAlphaNumericString as w,joinUrlParts as b,collectResponseHeaders as h,readResponseHeader as v,transportDataToUint8Array as S,isJsonResponse as T,isTextResponse as M,transportDataToText as D}from"./utils.js";const C=/* @__PURE__ */new Set(["content-etag","token","req-id"]);function E(t){const e=t.rawBody,s=null!==e&&"object"==typeof e&&"code"in e?e.code:void 0;return{transportStatus:t.transportStatus,...void 0===t.httpStatus?{}:{httpStatus:t.httpStatus},..."number"==typeof s&&Number.isFinite(s)?{businessCode:s}:{}}}function j(t,e){return{code:502,msg:t instanceof Error?t.message:String(t),data:null,time:Math.floor(e/1e3)}}function B(t,e,s,n){if(T(s))return a(D(e.data));if(M(s))return D(e.data);const o=S(e.data),r=n?t.crypto.decryptAes(o):o,i=(new TextDecoder).decode(r);return a(i)}async function _(t,e,s){if(!t.onDebugRecord)return;const n={...e.meta,response:e.response,...s?{error:{name:s instanceof Error?s.name:void 0,message:s instanceof Error?s.message:String(s)}}:{}};try{await t.onDebugRecord(n)}catch{}}async function N(t,e,s,n,o,r,i){const c=h(e.headers),p=v(c,"content-type");if(e.status<200||e.status>=300){let a;if(n)a=void 0;else try{a=B(t,e,p,s)}catch{a=void 0}const u=function(t){if(!t||"object"!=typeof t)return!1;const e=t;return Number.isFinite(e.code)&&"data"in e}(a)?a:function(t,e){return{code:t.status,msg:t.statusText,data:null,time:Math.floor(e/1e3)}}(e,i);return{response:u,meta:{...o,transportStatus:"http_error",httpStatus:e.status,contentType:p,responseHeaders:c,...void 0!==a?{rawBody:a}:{},timings:{totalMs:i-r,upstreamMs:i-r}}}}const u=Date.now();if(n){const t=S(e.data),s=Date.now();return{response:{code:e.status,data:t,time:Math.floor(s/1e3)},meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:t,timings:{totalMs:s-r,upstreamMs:i-r,parseMs:s-u}}}}try{if(T(p)){const s=B(t,e,p,!1),n=Date.now();return{response:s,meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:s,timings:{totalMs:n-r,upstreamMs:i-r,parseMs:n-u}}}}if(M(p)){const t=D(e.data),s=Date.now();return{response:{code:e.status,msg:e.statusText,data:t,time:Math.floor(s/1e3)},meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:t,timings:{totalMs:s-r,upstreamMs:i-r,parseMs:s-u}}}}const n=S(e.data),d=Date.now(),m=s?t.crypto.decryptAes(n):n,l=Date.now(),f=(new TextDecoder).decode(m),g=a(f),y=Date.now();return{response:g,meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:p,responseHeaders:c,rawBody:g,timings:{totalMs:y-r,upstreamMs:i-r,parseMs:y-u,...s?{decryptMs:l-d}:{}}}}}catch(t){const s=Date.now();return{response:{code:(d=e.status,Number.isInteger(d)&&d>=400&&d<=599?d:502),msg:t instanceof Error?t.message:String(t),data:null,time:Math.floor(s/1e3)},meta:{...o,transportStatus:"invalid_response",httpStatus:e.status,contentType:p,responseHeaders:c,timings:{totalMs:s-r,upstreamMs:i-r,parseMs:s-u}}}}var d}function k(a){return async function(h,v={}){const S=a.now??(()=>/* @__PURE__ */new Date),T=a.randomNonce??c,M=a.randomRequestId??i,D=a.randomETag??(()=>w()),B=(v.method??"POST").toUpperCase(),k=v.target??"core",I=p(k,a.config.targets[k]),q=v.prefix??I.prefix??"",P=null!=v.body,R=u(v.data??{}),x="/v1/feedback"===h&&"/bi/h5"===q,H=!x&&(v.encrypt??!P),O=!x&&(v.sign??!P),U=S(),A=D(),V=M(),L=v.token??await(a.getToken?.())??"",J=d(v.locale??a.getLocale?.()),F=a.getBrowserInfo?.()??m(v.userAgent),X={app_id:s,os_type:e,app_version:a.config.appVersion,sign_method:"md5",timestamp:l(U),nonce:T()},G={...X,...R,nonce:X.nonce};let Y=X,z=R,K=G;!x&&O&&(G.sign=a.crypto.generateSign("api",a.config.envType,G,A),X.sign=G.sign);const Q={app_version:a.config.appVersion,"X-ENC-VERSION":a.config.appVersion,"X-APP-TYPE":n,"Client-type":r,"Content-ETag":A,"brand-id":a.config.brandId,"channel-id":v.channelId||a.config.channelId,device_brand:F.deviceBrand,device_info:F.deviceInfo,device_number:F.deviceNumber,device_token:F.deviceToken,lang:J,"mch-id":a.config.merchantId,"req-id":V,token:L},W=f(v.headers);let Z,$=h,tt={...Q,...Object.fromEntries(Object.entries(W).filter(([t])=>!C.has(t.toLowerCase())))};if(P)Z=v.body??void 0,Y=null,z=v.data??null,K=v.data??null;else if(x){const e=String(U.getTime()),s={"app-id":o,"app-version":a.config.appVersion,"sys-type":n,"sys-version":F.deviceNumber,time:e};Y=s,tt={...tt,...s,sign:t(a.crypto,s),"Content-Type":"application/json"},Z=JSON.stringify(R),K=R}else"GET"===B?($=g($,G),K=G):H?(Z=a.crypto.encryptAes((new TextEncoder).encode(JSON.stringify(G))),tt["Content-Type"]=tt["Content-Type"]||"application/octet-stream",K=G):(Z=JSON.stringify(G),tt["Content-Type"]=tt["Content-Type"]||"application/json",K=G);y(Z)&&delete tt["Content-Type"];const et=function(t,e,s,n,o){if(s.customUrl)return t;const r=p(n,e.config.targets[n]),a=s.baseUrl??r.baseUrl;return b(a,o,t)}($,a,v,k,q),st=Date.now(),nt=v.timeoutMs??6e4,ot=function(t,e){const s=new AbortController,n=setTimeout(()=>s.abort(),t),o=()=>s.abort();return e&&(e.aborted?s.abort():e.addEventListener("abort",o,{once:!0})),{signal:s.signal,dispose:()=>{clearTimeout(n),e?.removeEventListener("abort",o)}}}(nt,v.signal),rt={requestId:V,eTag:A,method:B,upstreamUrl:et,requestHeaders:tt,requestCommonParams:Y,requestBusinessParams:z,requestParams:K};let at;try{const t=await a.transport({url:et,method:B,headers:tt,body:Z,signal:ot.signal,timeoutMs:nt,onUploadProgress:v.onUploadProgress}),e=Date.now(),s=await N(a,t,H&&!x,"raw"===v.responseMode,rt,st,e);return v.onResponse&&(at=E(s.meta),s.observation=at),await _(a,s),!v.skipBusinessResponseHandler&&a.onBusinessResponse&&await a.onBusinessResponse(s.response,{request:{path:h,method:B,target:k,url:et},options:v}),s}catch(t){const e=Date.now(),s={response:j(t,e),...void 0===at?{}:{observation:at},meta:{...rt,transportStatus:"network_error",timings:{totalMs:e-st,upstreamMs:e-st}}};return await _(a,s,t),s}finally{ot.dispose()}}}function I(t){const e=k(t);return async function(t,s={}){const n=await e(t,s);return await(s.onResponse?.(n.observation??E(n.meta))),n.response}}export{I as createApiProtocolClient};
@@ -1 +1 @@
1
- const r="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function n(n){if(!Number.isSafeInteger(n)||n<0)throw new RangeError("随机字符串长度必须是非负整数");const t=new Uint8Array(16);let e="";for(;e.length<n;){globalThis.crypto.getRandomValues(t);for(const o of t)if(!(o>=248)&&(e+=r.charAt(o%62),e.length===n))return e}return e}function t(){return n(10)}export{t as generateRequestNonce,n as generateSecureRandomString};
1
+ const r="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";function n(n){if(!Number.isSafeInteger(n)||n<0)throw new RangeError("随机字符串长度必须是非负整数");const t=new Uint8Array(16);let o="";for(;o.length<n;){globalThis.crypto.getRandomValues(t);for(const e of t)if(!(e>=248)&&(o+=r.charAt(e%62),o.length===n))return o}return o}function t(){return n(10)}function o(){const r=globalThis.crypto;if("function"==typeof r?.randomUUID)return`req-${r.randomUUID().replace(/-/g,"")}`;if("function"!=typeof r?.getRandomValues)throw new Error("生成请求标识需要系统安全随机源 crypto.getRandomValues");const n=new Uint8Array(16);return r.getRandomValues(n),n[6]=15&n[6]|64,n[8]=63&n[8]|128,`req-${Array.from(n,r=>r.toString(16).padStart(2,"0")).join("")}`}export{o as generateRequestId,t as generateRequestNonce,n as generateSecureRandomString};
@@ -1 +1 @@
1
- import{createCryptoDriver as t}from"./driver.js";import*as r from"./vendor/crypto/index_bg.js";import{__wbg_set_wasm as n}from"./vendor/crypto/index_bg.js";let e=null,a=null;async function i(){return a||(a=async function(){const e=await fetch(new URL("../../vendor/crypto/index_bg.wasm",import.meta.url));if(!e.ok)throw new Error(`crypto wasm 加载失败:HTTP ${e.status}`);const a={"./index_bg.js":r};let i;if("function"==typeof WebAssembly.instantiateStreaming)try{i=await WebAssembly.instantiateStreaming(e.clone(),a)}catch{i=await WebAssembly.instantiate(await e.arrayBuffer(),a)}else i=await WebAssembly.instantiate(await e.arrayBuffer(),a);return n(i.instance.exports),i.instance.exports.__wbindgen_start(),t(r)}().catch(t=>{throw a=null,t})),e=await a,e}function o(){if(!e)throw new Error("crypto driver 尚未初始化,请先 await loadBrowserCryptoDriver()");return e}function s(t){return o().cryptMd5(t)}function c(t,r,n,e=null){return o().generateSign(t,r,n,e)}function u(t){return o().encryptAes(t)}function f(t){return o().decryptAes(t)}await i();export{s as cryptMd5,f as decryptAes,u as encryptAes,c as generateSign,i as loadBrowserCryptoDriver};
1
+ import{createManagedCryptoDriver as t}from"./driver.js";import{createCryptoModule as e}from"./vendor/crypto/index_bg.js";let n=null,r=null;async function a(){r||(r=async function(){if("undefined"==typeof WebAssembly)throw new ReferenceError("WebAssembly is not defined");const n=e(),r=new URL("../../vendor/crypto/index_bg.wasm",import.meta.url),a=await fetch(r);if(!a.ok)throw new Error(`crypto wasm 加载失败:HTTP ${a.status} (${r.origin}${r.pathname})`);const i={"./index_bg.js":n};let s;const o=a.headers.get("Content-Type");s="function"==typeof WebAssembly.instantiateStreaming&&"application/wasm"===o?await WebAssembly.instantiateStreaming(a,i):await WebAssembly.instantiate(await a.arrayBuffer(),i),n.__wbg_set_wasm(s.instance.exports),s.instance.exports.__wbindgen_start();const c=s.module;return t(n,async()=>{const t=e(),n=await WebAssembly.instantiate(c,{"./index_bg.js":t});return t.__wbg_set_wasm(n.exports),n.exports.__wbindgen_start(),t})}().catch(t=>{throw r=null,t}));const a=await r;return n=await a.ready(),n}function i(){if(!n)throw new Error("crypto driver 尚未初始化,请先 await loadBrowserCryptoDriver()");return n}function s(t){return i().cryptMd5(t)}function o(t,e,n,r=null){return i().generateSign(t,e,n,r)}function c(t){return i().encryptAes(t)}function w(t){return i().decryptAes(t)}await a();export{s as cryptMd5,w as decryptAes,c as encryptAes,o as generateSign,a as loadBrowserCryptoDriver};
@@ -1 +1 @@
1
- function e(e){return{cryptMd5:e.crypt_md5,generateSign:e.generate_sign,encryptAes:e.encrypt_aes,decryptAes:e.decrypt_aes}}export{e as createCryptoDriver};
1
+ function t(t,e){let r,n,o,i=0,c=!1,f=!1;function s(e){t=e,r=void 0,f=!1,o=void 0}function y(t){c=!0,n=t,f=!1,o=void 0}function a(a){if(c)throw n;if(r)throw r;i++;try{const e=a(t);if(r)throw r;return e}catch(t){throw!r&&t instanceof WebAssembly.RuntimeError&&(r=t),void 0===r?t:r}finally{i--,0===i&&r&&function(){if(!f&&!c){f=!0;try{const t=e();"function"==typeof t.then?o=Promise.resolve(t).then(s,y):s(t)}catch(t){y(t)}}}()}}const d={cryptMd5:t=>a(e=>e.crypt_md5(t)),generateSign:(t,e,r,n)=>a(o=>o.generate_sign(t,e,r,n)),encryptAes:t=>a(e=>e.encrypt_aes(t)),decryptAes:t=>a(e=>e.decrypt_aes(t))};return{driver:d,async ready(){for(let t=o;t;t=o)await t;if(c)throw n;if(r)throw r;return d}}}export{t as createManagedCryptoDriver};
@@ -1 +1 @@
1
- let n;function e(e){n=e}function t(e,t){try{return e.apply(this,t)}catch(e){const t=function(e){const t=n.__externref_table_alloc();return n.__wbindgen_export_2.set(t,e),t}(e);n.__wbindgen_exn_store(t)}}function r(n){const e=typeof n;if("number"==e||"boolean"==e||null==n)return`${n}`;if("string"==e)return`"${n}"`;if("symbol"==e){const e=n.description;return null==e?"Symbol":`Symbol(${e})`}if("function"==e){const e=n.name;return"string"==typeof e&&e.length>0?`Function(${e})`:"Function"}if(Array.isArray(n)){const e=n.length;let t="[";e>0&&(t+=r(n[0]));for(let o=1;o<e;o++)t+=`, ${r(n[o])}`;return t+="]",t}const t=/\[object ([^\]]+)\]/.exec(toString.call(n));let o;if(!(t&&t.length>1))return toString.call(n);if(o=t[1],"Object"==o)try{return`Object(${JSON.stringify(n)})`}catch(n){return"Object"}return n instanceof Error?`${n.name}: ${n.message}\n${n.stack}`:o}let o=0,c=null;function i(){return null!==c&&0!==c.byteLength||(c=new Uint8Array(n.memory.buffer)),c}const l=new("undefined"==typeof TextEncoder?(0,module.require)("util").TextEncoder:TextEncoder)("utf-8"),u="function"==typeof l.encodeInto?function(n,e){return l.encodeInto(n,e)}:function(n,e){const t=l.encode(n);return e.set(t),{read:n.length,written:t.length}};function _(n,e,t){if(void 0===t){const t=l.encode(n),r=e(t.length,1)>>>0;return i().subarray(r,r+t.length).set(t),o=t.length,r}let r=n.length,c=e(r,1)>>>0;const _=i();let f=0;for(;f<r;f++){const e=n.charCodeAt(f);if(e>127)break;_[c+f]=e}if(f!==r){0!==f&&(n=n.slice(f)),c=t(c,r,r=f+3*n.length,1)>>>0;const e=i().subarray(c+f,c+r);f+=u(n,e).written,c=t(c,r,f,1)>>>0}return o=f,c}let f=null;function s(){return(null===f||!0===f.buffer.detached||void 0===f.buffer.detached&&f.buffer!==n.memory.buffer)&&(f=new DataView(n.memory.buffer)),f}function d(n){return null==n}const a=new("undefined"==typeof TextDecoder?(0,module.require)("util").TextDecoder:TextDecoder)("utf-8",{ignoreBOM:!0,fatal:!0});function g(n,e){return n>>>=0,a.decode(i().subarray(n,n+e))}function b(e){let t,r;try{const c=_(e,n.__wbindgen_malloc,n.__wbindgen_realloc),i=o,l=n.crypt_md5(c,i);return t=l[0],r=l[1],g(l[0],l[1])}finally{n.__wbindgen_free(t,r,1)}}function w(e,t,r,c){let i,l;try{const u=_(e,n.__wbindgen_malloc,n.__wbindgen_realloc),f=o,s=_(t,n.__wbindgen_malloc,n.__wbindgen_realloc),a=o,b=d(c)?0:_(c,n.__wbindgen_malloc,n.__wbindgen_realloc),w=o,y=n.generate_sign(u,f,s,a,r,b,w);let m=y[0],h=y[1];if(y[3])throw m=0,h=0,function(e){const t=n.__wbindgen_export_2.get(e);return n.__externref_table_dealloc(e),t}(y[2]);return i=m,l=h,g(m,h)}finally{n.__wbindgen_free(i,l,1)}}function y(n,e){const t=e(1*n.length,1)>>>0;return i().set(n,t/1),o=n.length,t}function m(n,e){return n>>>=0,i().subarray(n/1,n/1+e)}function h(e){const t=y(e,n.__wbindgen_malloc),r=o,c=n.encrypt_aes(t,r),i=m(c[0],c[1]).slice();return n.__wbindgen_free(c[0],1*c[1],1),i}function p(e){const t=y(e,n.__wbindgen_malloc),r=o,c=n.decrypt_aes(t,r),i=m(c[0],c[1]).slice();return n.__wbindgen_free(c[0],1*c[1],1),i}function x(){return t((n,e)=>Reflect.get(n,e),arguments)}function $(n,e){return n[e>>>0]}function I(n){return n.length}function T(){return t(n=>Reflect.ownKeys(n),arguments)}function j(e,t){const c=_(r(t),n.__wbindgen_malloc,n.__wbindgen_realloc),i=o;s().setInt32(e+4,i,!0),s().setInt32(e+0,c,!0)}function v(){const e=n.__wbindgen_export_2,t=e.grow(4);e.set(0,void 0),e.set(t+0,void 0),e.set(t+1,null),e.set(t+2,!0),e.set(t+3,!1)}function E(n){return"object"==typeof n&&null!==n}function O(e,t){const r="string"==typeof t?t:void 0,c=d(r)?0:_(r,n.__wbindgen_malloc,n.__wbindgen_realloc),i=o;s().setInt32(e+4,i,!0),s().setInt32(e+0,c,!0)}function S(n,e){return g(n,e)}function A(n,e){throw new Error(g(n,e))}a.decode();export{x as __wbg_get_67b2ba62fc30de12,$ as __wbg_get_b9b93047fe3cf45b,I as __wbg_length_e2d2a49132c1b256,T as __wbg_ownKeys_3930041068756f1f,e as __wbg_set_wasm,j as __wbindgen_debug_string,v as __wbindgen_init_externref_table,E as __wbindgen_is_object,O as __wbindgen_string_get,S as __wbindgen_string_new,A as __wbindgen_throw,b as crypt_md5,p as decrypt_aes,h as encrypt_aes,w as generate_sign};
1
+ function e(){if("undefined"==typeof TextEncoder)throw new ReferenceError("TextEncoder is not defined");if("undefined"==typeof TextDecoder)throw new ReferenceError("TextDecoder is not defined");let e,n,t=[null];function r(e){return t.push(e),t.length-1}function _(e){if((e>>>=0)>=t.length)throw new WebAssembly.RuntimeError("crypto reference index out of bounds");return t[e]}function o(n,t){try{return n.apply(this,t)}catch(n){const t=function(n){const t=e.__externref_table_alloc();return e.__wbindgen_export_2.set(t,n),t}(n);e.__wbindgen_exn_store(t)}}function c(e){const n=typeof e;if("number"==n||"boolean"==n||null==e)return`${e}`;if("string"==n)return`"${e}"`;if("symbol"==n){const n=e.description;return null==n?"Symbol":`Symbol(${n})`}if("function"==n){const n=e.name;return"string"==typeof n&&n.length>0?`Function(${n})`:"Function"}if(Array.isArray(e)){const n=e.length;let t="[";n>0&&(t+=c(e[0]));for(let r=1;r<n;r++)t+=`, ${c(e[r])}`;return t+="]",t}const t=/\[object ([^\]]+)\]/.exec(toString.call(e));let r;if(!(t&&t.length>1))return toString.call(e);if(r=t[1],"Object"==r)try{return`Object(${JSON.stringify(e)})`}catch(e){return"Object"}return e instanceof Error?`${e.name}: ${e.message}\n${e.stack}`:r}let i=0,l=null;function u(){return null!==l&&0!==l.byteLength||(l=new Uint8Array(e.memory.buffer)),l}const f=new TextEncoder,g="function"==typeof f.encodeInto?function(e,n){return f.encodeInto(e,n)}:function(e,n){const t=f.encode(e);return n.set(t),{read:e.length,written:t.length}};function s(e,n,t){if(void 0===t){const t=f.encode(e),r=n(t.length,1)>>>0;return u().subarray(r,r+t.length).set(t),i=t.length,r}let r=e.length,_=n(r,1)>>>0;const o=u();let c=0;for(;c<r;c++){const n=e.charCodeAt(c);if(n>127)break;o[_+c]=n}if(c!==r){0!==c&&(e=e.slice(c)),_=t(_,r,r=c+3*e.length,1)>>>0;const n=u().subarray(_+c,_+r);c+=g(e,n).written,_=t(_,r,c,1)>>>0}return i=c,_}let a=null;function b(){return(null===a||!0===a.buffer.detached||void 0===a.buffer.detached&&a.buffer!==e.memory.buffer)&&(a=new DataView(e.memory.buffer)),a}function d(e){return null==e}const w=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});function y(e,n){return e>>>=0,w.decode(u().subarray(e,e+n))}function p(e,n){const t=n(1*e.length,1)>>>0;return u().set(e,t/1),i=e.length,t}function m(e,n){return e>>>=0,u().subarray(e/1,e/1+n)}return w.decode(),{__wbg_set_wasm:function(_){for(const e of["__compat_result_1","__compat_result_2","__compat_result_3"])if("function"!=typeof _[e])throw new Error("crypto WASM ABI mismatch");t=[null],n=function(){const e=Array(128).fill(null),n=n=>{if((n>>>=0)>=e.length)throw new WebAssembly.RuntimeError("crypto reference table index out of bounds");return n};return{get length(){return e.length},get:t=>e[n(t)],set:(t,r)=>{e[n(t)]=r},grow(n,t=null){n>>>=0;const r=e.length;if(n>4294967295-r)throw new RangeError("crypto reference table cannot grow");return e.length+=n,e.fill(t,r),r}}}(),i=0,l=null,a=null;const o=(e,n,o=-1)=>(...c)=>{const i=t.length;try{o>=0&&(c[o]=r(c[o]));const t=_[e](...c);return 2===n?[t,_.__compat_result_1()]:[t,_.__compat_result_1(),_.__compat_result_2(),_.__compat_result_3()]}finally{t.length=i}};e={..._,__wbindgen_export_2:n,crypt_md5:o("crypt_md5",2),generate_sign:o("generate_sign",4,4),encrypt_aes:o("encrypt_aes",2),decrypt_aes:o("decrypt_aes",2)}},__compat_table_get:function(e){return r(n.get(e))},__compat_table_set:function(e,t){n.set(e,_(t))},__compat_table_grow:function(e,t){const r=_(e);try{return n.grow(t,r)}catch(e){if(e instanceof RangeError)return-1;throw e}},crypt_md5:function(n){let t,r;try{const _=s(n,e.__wbindgen_malloc,e.__wbindgen_realloc),o=i,c=e.crypt_md5(_,o);return t=c[0],r=c[1],y(c[0],c[1])}finally{e.__wbindgen_free(t,r,1)}},generate_sign:function(n,t,r,_){let o,c;try{const l=s(n,e.__wbindgen_malloc,e.__wbindgen_realloc),u=i,f=s(t,e.__wbindgen_malloc,e.__wbindgen_realloc),g=i,a=d(_)?0:s(_,e.__wbindgen_malloc,e.__wbindgen_realloc),b=i,w=e.generate_sign(l,u,f,g,r,a,b);let p=w[0],m=w[1];if(w[3])throw p=0,m=0,function(n){const t=e.__wbindgen_export_2.get(n);return e.__externref_table_dealloc(n),t}(w[2]);return o=p,c=m,y(p,m)}finally{e.__wbindgen_free(o,c,1)}},encrypt_aes:function(n){const t=p(n,e.__wbindgen_malloc),r=i,_=e.encrypt_aes(t,r),o=m(_[0],_[1]).slice();return e.__wbindgen_free(_[0],1*_[1],1),o},decrypt_aes:function(n){const t=p(n,e.__wbindgen_malloc),r=i,_=e.decrypt_aes(t,r),o=m(_[0],_[1]).slice();return e.__wbindgen_free(_[0],1*_[1],1),o},__wbg_get_67b2ba62fc30de12:function(){return r(o((e,n)=>Reflect.get(_(e),_(n)),arguments))},__wbg_get_b9b93047fe3cf45b:function(e,n){return r(_(e)[n>>>0])},__wbg_length_e2d2a49132c1b256:function(e){return _(e).length},__wbg_ownKeys_3930041068756f1f:function(){return r(o(e=>Reflect.ownKeys(_(e)),arguments))},__wbindgen_debug_string:function(n,t){const r=s(c(_(t)),e.__wbindgen_malloc,e.__wbindgen_realloc),o=i;b().setInt32(n+4,o,!0),b().setInt32(n+0,r,!0)},__wbindgen_init_externref_table:function(){const n=e.__wbindgen_export_2,t=n.grow(4);n.set(0,void 0),n.set(t+0,void 0),n.set(t+1,null),n.set(t+2,!0),n.set(t+3,!1)},__wbindgen_is_object:function(e){const n=_(e);return"object"==typeof n&&null!==n},__wbindgen_string_get:function(n,t){const r=_(t),o="string"==typeof r?r:void 0,c=d(o)?0:s(o,e.__wbindgen_malloc,e.__wbindgen_realloc),l=i;b().setInt32(n+4,l,!0),b().setInt32(n+0,c,!0)},__wbindgen_string_new:function(e,n){return r(y(e,n))},__wbindgen_throw:function(e,n){throw new Error(y(e,n))}}}const n=/* @__PURE__ */e(),{__wbg_set_wasm:t,__compat_table_get:r,__compat_table_set:_,__compat_table_grow:o,crypt_md5:c,generate_sign:i,encrypt_aes:l,decrypt_aes:u,__wbg_get_67b2ba62fc30de12:f,__wbg_get_b9b93047fe3cf45b:g,__wbg_length_e2d2a49132c1b256:s,__wbg_ownKeys_3930041068756f1f:a,__wbindgen_debug_string:b,__wbindgen_init_externref_table:d,__wbindgen_is_object:w,__wbindgen_string_get:y,__wbindgen_string_new:p,__wbindgen_throw:m}=n;export{r as __compat_table_get,o as __compat_table_grow,_ as __compat_table_set,f as __wbg_get_67b2ba62fc30de12,g as __wbg_get_b9b93047fe3cf45b,s as __wbg_length_e2d2a49132c1b256,a as __wbg_ownKeys_3930041068756f1f,t as __wbg_set_wasm,b as __wbindgen_debug_string,d as __wbindgen_init_externref_table,w as __wbindgen_is_object,y as __wbindgen_string_get,p as __wbindgen_string_new,m as __wbindgen_throw,e as createCryptoModule,c as crypt_md5,u as decrypt_aes,l as encrypt_aes,i as generate_sign};
@@ -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";class s extends Error{constructor(){super("会话收藏 Core API 未配置"),this.name="SessionFavoriteProviderUnavailableError"}}class c extends Error{constructor(e){super(e),this.name="SessionFavoriteMappingError"}}function d(e){return"string"==typeof e?e:null==e?"":String(e)}function m(e,r){const t=d(e).trim();if(""===t)throw new c(`${r} 不能为空`);return t}function l(e){if("direct"===e)return 0;if("group"===e)return 1;if("channel"===e)return 2;throw new c(`favorite conversation type ${e}`)}function f(e,r){return"text"===r||"location"===r?d(e.content).trim():"file"===r?d(e.fileName||e.file_name||e.name).trim():"mediaAlbum"===r||"filesAlbum"===r?d(e.caption).trim():"liveRoom"===r?d(e.liveRoomName).trim()||d(e.broadcasterUserName).trim():""}function u(e,r){const t=d(e.group_id).trim(),i=d(e.radio_id).trim(),n=Number(d(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=d(e.from_id).trim(),i=d(e.to_id).trim(),n=t===r.trim()?i:t;if(""!==n)return{conversationType:"direct",conversationId:n}}return null}function v(e,r){const t=e.from_user,i=d(t?.nick_name||t?.nickname||t?.name).trim();return""===i?r:i}function p(e,t){const i=d(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(d(e.msg_body),t);if(""===i||null===s||null===c)return null;const m=d(e.from_id).trim();return Object.freeze({collectId:i,msgId:d(e.msg_id).trim(),kind:s,senderId:m,senderName:v(e,m),avatarUrl:d(e.from_user?.avatar).trim(),createdAt:d(e.create_time||e.update_time||e.msg_time).trim(),text:f(c,s),imageUrl:a(s,c),fileName:"filesAlbum"===s?o(c).map(e=>e.fileName).join(" "):"file"===s?f(c,"file"):"",body:"filesAlbum"===s?n(c):Object.freeze({...c}),conversation:u(e,t)})}function y(){if("undefined"==typeof crypto||"function"!=typeof crypto.randomUUID)throw new c("collect uuid 不可用");return crypto.randomUUID()}function g(r){async function d(e,n,o){if(void 0===r.coreClient)throw new s;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=m(r.getUserId(),"favorite userId"),t=await d("/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 c("favorite list data 必须是数组或 { list }")}(t).flatMap(r=>{const t=p(r,e);return null===t?[]:[t]}))},async add(t){const i=m(r.getUserId(),"favorite userId"),s=(r.createCollectId??y)(),c={msg_id:m(t.messageId,"favorite msgId"),content_type:(u=t.kind,"text"===u?1:"image"===u?2:"video"===u?3:"voice"===u?4:"location"===u?5:"mediaAlbum"===u?28:"filesAlbum"===u?29:"liveRoom"===u?30:11),msg_type:l(t.conversation.conversationType),msg_time:String(t.createdAt),from_id:m(t.senderId,"favorite fromId"),to_id:m(t.peerId,"favorite toId"),is_hide:!0===t.hide?"1":"0",uu_id:s,msg_body:e(JSON.stringify(t.plainBody),i)};var u,v;return"group"===t.conversation.conversationType&&(c.group_id=t.conversation.conversationId),"channel"===t.conversation.conversationType&&(c.radio_id=t.conversation.conversationId),await d("/api/v1/user/favorite/add",c,"添加会话收藏"),v={collectId:s,msgId:t.messageId.trim(),kind:t.kind,senderId:t.senderId.trim(),senderName:t.senderId.trim(),avatarUrl:"",createdAt:String(t.createdAt),text:f(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?f(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 c("favorite ids 不能为空");await d("/api/v1/user/favorite/del",{ids:r.join("|")},"删除会话收藏")}}}export{c as SessionFavoriteMappingError,s as SessionFavoriteProviderUnavailableError,g as createSessionFavoriteHttpAdapter};
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};
@@ -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 u,uploadInParts as c,isNoSuchUploadError as m,MISSING_ETAG_MESSAGE as p}from"./s3-multipart-uploader.js";import{installUploadIdleTimeout as f}from"./xhr-upload-idle-timeout.js";const b="分片上传要求该 bucket 的 CORS 放行 POST(Create/CompleteMultipartUpload)、DELETE(AbortMultipartUpload)并 ExposeHeaders: ETag";function g(e,t,r){return void 0!==r?new a("multipart-abort-failed",`media upload: 分片上传失败后的 AbortMultipartUpload 清理未成功,已上传分片可能残留在 bucket 中并继续计费(建议桶侧配置 AbortIncompleteMultipartUpload 生命周期规则);${b}`,{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: 分片上传失败;${b}`,{cause:e})}const y=/* @__PURE__ */new Set(["upload-source-invalid","upload-resume-unavailable","multipart-etag-missing","multipart-abort-failed"]);function v(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 w;function h(){if(void 0!==w)return w;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 w===e&&(w=void 0),t});return w=e,e}function k(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 C(e,t){const a=e.keyPrefix??"";return""===a||t.startsWith(a)?t:`${a}${t}`}function U(p,b){const w=s(p.getUploadCredentials),U=t(i);function E(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 S(e,t,r,i,s,f,b,y){const{multipart:w,partSize:h}=o(b,!0===p.multipartTransfer&&!1!==p.multipartUpload),C=new e.XhrHttpHandler({}),S=E(e,s,C,!0===t.recoveryManaged),A={client:S,handler:C,commands:e.commands,bucket:s.bucket,key:f,...void 0!==t.mimeType&&""!==t.mimeType?{mimeType:t.mimeType}:{}},M={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=v(P),B=w&&R?.logicalBucket===r&&void 0!==l(R.session,A,b,h);let j=B?R?.session:void 0;const H=e=>{j=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}})},I=()=>{j=void 0,delete t.resume,t.onResumeInvalidated?.()};let x;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(A,R.session):await T(P)}catch(e){throw y.cleanupFailed=!0,k(y.retryCause,e)}delete t.resume}if(t.signal?.aborted)throw new DOMException("media upload canceled","AbortError");if(!w)return void await u(A,M,U);const e=j;try{await c({target:A,content:M,partSize:h,queueSize:n,runUpload:U,...void 0===e?{}:{resume:e},onResumable:H,onCompleted:I})}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});j=void 0,await c({target:A,content:M,partSize:h,queueSize:n,runUpload:U,onResumable:H,onCompleted:I})}}catch(e){if("retain"===y.mode&&!0===t.signal?.aborted&&!["offline","paused","page-preserve","cancelled-preserve"].includes(t.signal.reason)&&void 0!==j)try{await d(A,j),I()}catch(e){x=e}if(y.cleanupFailed)throw e;throw g(e,w,x)}finally{S.destroy()}}async function A(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=(u=e.data)instanceof Uint8Array?u.byteLength:"undefined"!=typeof Blob&&u instanceof Blob?u.size:void 0;var u;if(void 0===l)throw new a("upload-source-invalid","media upload: 上传内容必须是 Uint8Array 或 Blob");o(l,!0===p.multipartTransfer&&!1!==p.multipartUpload);const c=await h();if("discard"===i.mode&&e.signal?.aborted)throw new DOMException("media upload canceled","AbortError");const m=v(e.resume,s)?.objectName??(f=e.filename,globalThis.crypto.randomUUID()+function(e){if(void 0===e)return"";const t=e.lastIndexOf(".");return t>=0?e.slice(t):""}(f));var f;const b={...e,onResumable:t=>{b.resume=t,e.onResumable?.(t)},onResumeInvalidated:()=>{delete b.resume,e.onResumeInvalidated?.()}};let g;try{g=await w.resolve(s,!0===e.forceRefreshCredentials?{forceRefresh:!0}:void 0);let t=C(g,m);try{await S(c,b,s,m,g,t,l,i)}catch(r){if(e.signal?.aborted||!0===e.recoveryManaged)throw r;if(r instanceof a&&y.has(r.code))throw r;i.retryCause=r,g=await w.resolve(s,{forceRefresh:!0}),t=C(g,m),await S(c,b,s,m,g,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:`${g.dnsPoint}/${t}`}}catch(t){const o=v(b.resume);if("discard"===i.mode&&!i.cleanupFailed&&void 0!==o&&void 0!==g){const e=new c.XhrHttpHandler({}),a=E(c,g,e);try{await d({client:a,commands:c.commands},o.session)}catch(e){throw k(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 T(e){const t=e.transport;if(void 0===t?.session||""===t.session.uploadId)return;const a=await h(),r=await w.resolve(t.logicalBucket),o=new a.XhrHttpHandler({}),n=E(a,r,o);try{await d({client:n,commands:a.commands},t.session)}finally{n.destroy()}}return{upload:function(e){return A(e,e.kind,e.conversationType)},uploadAvatar:function(e){return A(e,"avatar")},uploadResource:function(e){return A({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,b),abandonUpload:T}}export{U as createMediaTransferAdapter};
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
- function e(e,t={}){const o=void 0!==t.locks?t.locks:globalThis.navigator?.locks,n=void 0!==t.createChannel?t.createChannel:"function"==typeof globalThis.BroadcastChannel?e=>new BroadcastChannel(e):void 0,r="function"==typeof globalThis.addEventListener?globalThis:void 0,s=void 0!==t.pageLifecycleTarget?t.pageLifecycleTarget:r;let a,c=0;function i(t){try{e.onError(t)}catch{}}function l(t,o=!1,n="stopped"){if(a!==t||o||(a=void 0),t.resolveReady(!1),t.closed)return;t.closed=!0,t.controller.abort();const r=[],s=e=>{try{e()}catch(e){r.push(e)}};for(const e of t.cleanups.splice(0))s(e);s(()=>t.channel.close());const c=t.release;t.release=void 0;const l=t.owned;t.owned=!1;try{const t=l?e.onChange(!1,n):void 0;Promise.resolve(t).then(()=>c?.(),i)}catch(e){i(e)}for(const e of r)i(e)}function d(e,t){l(e,!0),i(t)}return{start(t){if(a?.key===t)return a.ready;const r=++c;if(a&&l(a),r!==c)return Promise.resolve(!1);if(!t||!o||!n)return i(new Error("Browser connection ownership requires a key, Web Locks and BroadcastChannel")),Promise.resolve(!1);let p,u;try{p=n(`im-connection:${t}`)}catch(e){return i(e),Promise.resolve(!1)}const h=new Promise(e=>{u=e}),y={key:t,channel:p,cleanups:[],owned:!1,closed:!1,ready:h,resolveReady:u,controller:new AbortController,claim:{startedAt:Date.now(),id:globalThis.crypto.randomUUID()}};a=y;const v=e=>{if(a!==y||y.closed||"object"!=typeof e.data||null===e.data)return;const t=e.data;if("session-ended"===t.type)l(y);else if("takeover"===t.type&&"number"==typeof t.startedAt&&Number.isFinite(t.startedAt)&&"string"==typeof t.id&&t.id!==y.claim.id){t.startedAt>y.claim.startedAt||t.startedAt===y.claim.startedAt&&t.id>y.claim.id?l(y,!0,"replaced"):p.postMessage({type:"takeover",...y.claim})}},f=e=>{a===y&&!0===e.persisted&&l(y)};try{s&&(y.cleanups.push(()=>s.removeEventListener("pagehide",f)),s.addEventListener("pagehide",f)),y.cleanups.push(()=>p.removeEventListener("message",v)),p.addEventListener("message",v);const n=setTimeout(()=>d(y,new Error("Browser IM takeover timed out while waiting for the previous page to close")),15e3);y.cleanups.push(()=>clearTimeout(n));o.request(`im-connection:${t}`,{mode:"exclusive",signal:y.controller.signal},async t=>{if(a!==y||y.closed||!t)return void y.resolveReady(!1);const o=new Promise(e=>{y.release=e});y.owned=!0,clearTimeout(n);try{await e.onChange(!0)}catch(e){d(y,e)}y.resolveReady(a===y&&y.owned),await o}).catch(e=>{a!==y||y.closed||d(y,e)}),p.postMessage({type:"takeover",...y.claim})}catch(e){d(y,e)}return y.ready},stop(){c++,a&&l(a)},terminate(){c++;const e=a;if(e)try{e.closed||e.channel.postMessage({type:"session-ended"})}catch(e){i(e)}finally{l(e)}},get owned(){return a?.owned??!1}}}export{e as createBrowserConnectionOwnership};
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 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 C(e){const t=o(e);return{...e,messageKey:A(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=A(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(C(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(A(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){const a=z,n=$;Z(a,n);const o=e.blob.size;if(o>q||U+o>q)return"skipped";U+=o;try{return await X(()=>async function(e,a,n){Z(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 ae(a,n),c=await ne(i);if(Z(a,n),0===r||r>o.maxEntryBytes||c<=0||r>Math.floor(c/2))return"skipped";const d=O(e),l=ee(),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},v=async()=>{Z(a,n);const e=J().transaction(["mediaAssets","mediaAssetMeta"],"readwrite");await D(e,async()=>{await Promise.all([L(e.objectStore("mediaAssets").put({key:d,blob:s})),L(e.objectStore("mediaAssetMeta").put(u))])})};let m=!1;try{await v()}catch(e){if(!(e instanceof DOMException)||"QuotaExceededError"!==e.name)throw e;m=!0,await se(a,n,Math.max(0,c-r)),await v()}const w=void 0===y?[...i,u]:i.map(e=>e.key===d?u:e);return await se(a,n,void 0,m?void 0:w),Z(a,n),void 0===await H(J(),"mediaAssets",d)?"skipped":"stored"}(e,a,n))}finally{U=Math.max(0,U-o)}},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",A(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(C(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:k(e.conversation,e.messageId),conversationKey:t,conversation:{...e.conversation},sContent:e.sContent.slice()}}(e))},async deleteDecryptRecovery(e,t){await J().delete("decryptRecoveries",k(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(j(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(j(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=A(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(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=>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",j(e)))?.background??null,async saveConversationBackground(e,t){const a=j(e);await J().put("conversationBackgrounds",{key:a,background:t})},async deleteConversationBackground(e){await J().delete("conversationBackgrounds",j(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 N(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)}M=void 0;const r=x.then(async()=>{f(o.input)?await n.draft.clear():await n.draft.save(o.input)}),a={handle:n,generation:t,promise:r};R.add(a),P=r,x=r.catch(()=>{});try{await r,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(a)}}function S(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,H(),f(r)&&N(t).catch(()=>{}),!0}async function H(){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,H()}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},H()}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),H()}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:H,dispose:function(){j||(j=!0,q(),V())}})),{input:y,replyTo:h,editingMessage:I,submitting:T,draftCommitVersion:b,error:k,updateDraft:S,flush:N,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,S({...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;S({...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};
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};