k2-im 0.2.11 → 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 (24) hide show
  1. package/dist/chat-kit-pinia.d.ts +1 -1
  2. package/dist/modules/api-protocol-client/src/client.js +1 -1
  3. package/dist/modules/api-protocol-client/src/nonce.js +1 -1
  4. package/dist/modules/crypto/browser.js +1 -1
  5. package/dist/modules/crypto/driver.js +1 -1
  6. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
  7. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
  8. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
  9. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
  10. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  11. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
  12. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
  13. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
  14. package/dist/modules/im-core/src/abort.js +1 -1
  15. package/dist/modules/im-core/src/mapping/message-id.js +1 -1
  16. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  17. package/dist/modules/im-core/src/state/domain-state.js +1 -1
  18. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  19. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
  20. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -1
  21. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
  22. package/dist/request-crypto.d.ts +3 -2
  23. package/dist/vendor/crypto/index_bg.wasm +0 -0
  24. package/package.json +1 -1
@@ -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>;
@@ -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};