k2-im 0.2.13 → 0.2.15

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 (34) hide show
  1. package/README.md +6 -0
  2. package/dist/chat-kit-pinia.d.ts +6 -5
  3. package/dist/chat-kit.d.ts +5 -4
  4. package/dist/crypto.worker.js +1 -1
  5. package/dist/index.d.ts +5 -4
  6. package/dist/modules/api-protocol-client/src/client.js +1 -1
  7. package/dist/modules/api-protocol-client/src/nonce.js +1 -1
  8. package/dist/modules/crypto/browser.js +1 -1
  9. package/dist/modules/crypto/driver.js +1 -1
  10. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
  11. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
  12. package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
  13. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
  14. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
  15. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  16. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
  17. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
  18. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
  19. package/dist/modules/im-core/src/abort.js +1 -1
  20. package/dist/modules/im-core/src/mapping/message-id.js +1 -1
  21. package/dist/modules/im-core/src/mapping/search-text.js +1 -1
  22. package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -1
  23. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  24. package/dist/modules/im-core/src/state/domain-state.js +1 -1
  25. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  26. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
  27. package/dist/modules/im-sdk/src/product/media.js +1 -1
  28. package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
  29. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
  30. package/dist/request-crypto.d.ts +2 -3
  31. package/dist/sdk.d.ts +4 -3
  32. package/dist/vendor/crypto/index_bg.wasm +0 -0
  33. package/package.json +10 -1
  34. package/dist/modules/im-browser/src/media/thumbnail-pixel-profile.js +0 -1
@@ -1 +1 @@
1
- import{readImageDimensionsFromHeader as t}from"./image-header-dimensions.js";import{compressCanvasPng as e}from"./png-lossless-compression.js";import{isPhotoThumbnailCandidate as r}from"./thumbnail-pixel-profile.js";import{resolveMediaThumbnailPolicy as i}from"../../../im-core/src/media-thumbnail-policy.js";const a=i();function o(t){const e={active:0,disposed:!1},r=[];function i(){for(;!e.disposed&&e.active<t&&r.length>0;){const t=r.shift();if(t.signal?.aborted){t.reject(new DOMException("媒体预览准备已取消","AbortError"));continue}void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),e.active+=1;let a=!1;t.resolve(()=>{a||(a=!0,e.active-=1,i())})}}return{acquire:t=>e.disposed?Promise.reject(new Error("媒体预览执行器已释放")):new Promise((e,a)=>{const o={resolve:e,reject:a,...void 0===t?{}:{signal:t}};void 0!==t&&(o.onAbort=()=>{const t=r.indexOf(o);t>=0&&r.splice(t,1),a(new DOMException("媒体预览准备已取消","AbortError"))},t.addEventListener("abort",o.onAbort,{once:!0})),r.push(o),i()}),dispose(){e.disposed=!0;for(const t of r.splice(0))void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),t.reject(new Error("媒体预览执行器已释放"))}}}function n(t){if(t?.aborted)throw new DOMException("媒体预览准备已取消","AbortError")}const s=16777216;function h(t,e,r){const i=Math.min(1,r/Math.max(t,e));return function(t,e){const r=Math.min(1,4096/Math.max(t,e));let i=Math.max(1,Math.round(t*r)),a=Math.max(1,Math.round(e*r));const o=i*a;if(o>s){const t=Math.sqrt(s/o);i=Math.max(1,Math.floor(i*t)),a=Math.max(1,Math.floor(a*t))}return{width:i,height:a}}(Math.max(1,Math.round(t*i)),Math.max(1,Math.round(e*i)))}async function d(t,r){n(r);const i=await new Promise(e=>t.toBlob(e,"image/png"));if(n(r),null===i)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await e(await i.arrayBuffer(),r)}async function c(t,e,r){n(r);const i=await new Promise(r=>t.toBlob(r,"image/jpeg",e));if(n(r),null===i)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await i.arrayBuffer()}function m(t,e){if(!Number.isInteger(t)||t<=0)throw new RangeError(`${e}必须是正整数`)}function l(t,e){if(!Number.isFinite(t)||t<=0||t>1)throw new RangeError(`${e}必须大于 0 且不超过 1`)}async function f(t,e,i,o,s){const f="video"===o.kind,u=f?"视频封面":"图片缩略图",w=o.maxSize??a.maxSize,g=o.maxBytes??a.maxBytes,v=o.targetBytes??g,y=Math.min(w,Math.max(e,i)),b=y<=320?.94:y<=640?.9:y<=800?.86:.72;let M=o.quality??Math.max(b,o.minQuality??0),p=o.minQuality??Math.min(M,.72);if(m(w,`${u}最大边长`),m(v,`${u}目标字节数`),m(g,`${u}最大字节数`),l(M,`${u}初始质量`),l(p,`${u}最低质量`),v>g)throw new RangeError(`${u}目标字节数不能超过最大字节数`);if(p>M)throw new RangeError(`${u}最低质量不能高于初始质量`);n(s);const x=document.createElement("canvas");try{const a=x.getContext("2d");if(null===a)throw new Error("媒体预览准备失败:无法创建 Canvas 2D 上下文");const m=e=>{n(s),x.width=e.width,x.height=e.height,a.drawImage(t,0,0,e.width,e.height)};let l=h(e,i,w);m(l);const b=f?void 0:a.getImageData(0,0,l.width,l.height).data;let E=!1;if(void 0!==b)for(let t=3;t<b.length;t+=4)if(b[t]<255){E=!0;break}if(E){const t=Math.min(32,Math.max(l.width,l.height));let r;for(let a=0;a<6;a+=1){const o=await d(x,s);if((void 0===r||o.byteLength<r.byteLength)&&(r=o),o.byteLength<=v)return o;const n=Math.max(l.width,l.height);if(n<=t||5===a)break;const c=Math.min(.8,Math.max(.35,.9*Math.sqrt(v/o.byteLength)));l=h(e,i,Math.max(t,Math.floor(n*c))),m(l)}if(void 0!==r&&r.byteLength<=g)return r;throw new Error(`${u}生成失败:编码结果超过 ${g} 字节硬上限`)}y>800&&void 0!==b&&void 0===o.quality&&void 0===o.minQuality&&void 0===o.targetBytes&&r(b,l.width,l.height)&&(M=.68,p=.68);const L=Math.min(200,Math.max(l.width,l.height));let B;const j=[.../* @__PURE__ */new Set([M,Math.max(p,M-.12),p])];for(const t of j){const e=await c(x,t,s);if((void 0===B||e.byteLength<B.byteLength)&&(B=e),e.byteLength<=v)return e}for(let t=0;t<3;t+=1){const t=Math.max(l.width,l.height);if(t<=L||void 0===B||B.byteLength<=g)break;const r=Math.sqrt(v/B.byteLength);l=h(e,i,Math.max(L,Math.floor(t*Math.min(.9,Math.max(.5,r))))),m(l);for(const t of[M,p]){const e=await c(x,t,s);if(e.byteLength<B.byteLength&&(B=e),e.byteLength<=v)return e}}if(void 0!==B&&B.byteLength<=g)return B;throw new Error(`${u}生成失败:编码结果超过 ${g} 字节硬上限`)}finally{x.width=0,x.height=0}}function u(t,e,r,i){return n(r),new Promise((a,o)=>{let n,s,h,d;const c=()=>{void 0!==n&&clearTimeout(n),t.removeEventListener(e,s),t.removeEventListener("error",h),r?.removeEventListener("abort",d)};s=()=>{("seeked"===e?!t.seeking:t.readyState>=("loadedmetadata"===e?1:2))&&(c(),a())},h=()=>{c(),o(new Error(`视频预览准备失败:${e} 前解码错误`))},d=()=>{c(),o(new DOMException("媒体预览准备已取消","AbortError"))},n=setTimeout(()=>{c(),o(new Error(`视频预览准备失败:${e} 超时`))},15e3),t.addEventListener(e,s),t.addEventListener("error",h,{once:!0}),r?.addEventListener("abort",d,{once:!0});try{i?.(),r?.aborted?d():null!==t.error?h():s()}catch(t){c(),o(t)}})}function w(e={}){const r=e.maxConcurrency??function(){if("undefined"==typeof navigator)return 2;const t=navigator.userAgent;if(/iPad|iPhone|iPod/.test(t)||/Macintosh/.test(t)&&(navigator.maxTouchPoints??0)>1)return 1;const e=navigator.deviceMemory;return void 0!==e&&e<=2?1:2}();if(!Number.isInteger(r)||r<1||r>4)throw new RangeError("媒体预览并发数必须是 1-4 的整数");const i=o(r),s=o(1);let d=!1;return{async prepare(e,r){if(d)throw new Error("媒体预览执行器已释放");const o="video"===e.kind,c=await(o?s:i).acquire(r);try{const i=o?await async function(t,e){const r=URL.createObjectURL(t.file),i=document.createElement("video");i.muted=!0,i.preload="metadata",i.playsInline=!0;try{await u(i,"loadedmetadata",e,()=>{i.src=r,i.load()});const a=i.videoWidth,o=i.videoHeight;if(a<=0||o<=0)throw new Error("视频预览准备失败:视频尺寸无效");const n=Number.isFinite(i.duration)&&i.duration>0?i.duration:void 0,s=void 0===t.atTime?void 0===n?0:Math.min(1,n/2):Math.max(0,Math.min(t.atTime,n??t.atTime));s>0&&await u(i,"seeked",e,()=>{i.currentTime=s}),await u(i,"loadeddata",e,()=>{i.preload="auto"});const h=void 0===n?void 0:n;let d,c;try{d=await f(i,a,o,t,e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}if(t.includeDisplayPoster)try{c=await f(i,a,o,{...t,maxSize:960,targetBytes:163840,maxBytes:262144,quality:.9,minQuality:.8},e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}return{width:a,height:o,...void 0===h?{}:{duration:h},...void 0===d?{}:{posterData:d},...void 0===c?{}:{displayPosterData:c}}}finally{i.pause(),i.removeAttribute("src"),i.load(),URL.revokeObjectURL(r)}}(e,r):await async function(e,r){n(r);const i=e.maxSize??a.maxSize,o=e.maxBytes??a.maxBytes,s=await t(e.file);function d(t,r){return"image/jpeg"===e.file.type&&e.file.size<=o&&Math.max(t,r)<=Math.min(i,480)}async function c(t,a){return"image/jpeg"===e.file.type&&Math.max(a.width,a.height)<=i&&e.file.size<=t.byteLength?(n(r),await e.file.arrayBuffer()):t}if(n(r),void 0!==s){if(!1===e.includePoster)return s;if(d(s.width,s.height))return{...s,posterData:await e.file.arrayBuffer()}}const m=void 0===s?void 0:h(s.width,s.height,i);let l;try{l=void 0===m?await createImageBitmap(e.file):await createImageBitmap(e.file,{resizeWidth:m.width,resizeHeight:m.height,resizeQuality:"high"})}catch(t){if(r?.aborted)throw t}if(void 0!==l)try{n(r);const t=s??{width:l.width,height:l.height};return!1===e.includePoster?t:void 0===s&&d(l.width,l.height)?{...t,posterData:await e.file.arrayBuffer()}:{...t,posterData:await c(await f(l,l.width,l.height,e,r),t)}}finally{l.close()}const u=URL.createObjectURL(e.file),w=new Image;try{await new Promise((t,e)=>{let i,a;const o=()=>{void 0!==i&&clearTimeout(i),w.onload=null,w.onerror=null,r?.removeEventListener("abort",a)};a=()=>{o(),e(new DOMException("媒体预览准备已取消","AbortError"))},w.onload=()=>{o(),t()},w.onerror=()=>{o(),e(new Error("图片预览准备失败:Image 解码错误"))},i=setTimeout(()=>{o(),e(new Error("图片预览准备失败:Image 解码超时"))},15e3),r?.addEventListener("abort",a,{once:!0}),w.src=u});const t=s??{width:w.naturalWidth,height:w.naturalHeight};return!1===e.includePoster?t:d(w.naturalWidth,w.naturalHeight)?{...t,posterData:await e.file.arrayBuffer()}:{...t,posterData:await c(await f(w,w.naturalWidth,w.naturalHeight,e,r),t)}}finally{w.removeAttribute("src"),URL.revokeObjectURL(u)}}(e,r);return n(r),i}finally{c()}},dispose(){d||(d=!0,i.dispose(),s.dispose())}}}export{w as createMediaPreviewPreparationExecutor};
1
+ var t=Object.defineProperty,e=(e,i,r)=>((e,i,r)=>i in e?t(e,i,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[i]=r)(e,"symbol"!=typeof i?i+"":i,r);import{readImageDimensionsFromHeader as i}from"./image-header-dimensions.js";import{compressCanvasPng as r}from"./png-lossless-compression.js";import{resolveMediaThumbnailPolicy as a}from"../../../im-core/src/media-thumbnail-policy.js";const n=a();function o(t){const e={active:0,disposed:!1},i=[];function r(){for(;!e.disposed&&e.active<t&&i.length>0;){const t=i.shift();if(t.signal?.aborted){t.reject(new DOMException("媒体预览准备已取消","AbortError"));continue}void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),e.active+=1;let a=!1;t.resolve(()=>{a||(a=!0,e.active-=1,r())})}}return{acquire:t=>e.disposed?Promise.reject(new Error("媒体预览执行器已释放")):new Promise((e,a)=>{const n={resolve:e,reject:a,...void 0===t?{}:{signal:t}};void 0!==t&&(n.onAbort=()=>{const t=i.indexOf(n);t>=0&&i.splice(t,1),a(new DOMException("媒体预览准备已取消","AbortError"))},t.addEventListener("abort",n.onAbort,{once:!0})),i.push(n),r()}),dispose(){e.disposed=!0;for(const t of i.splice(0))void 0!==t.onAbort&&t.signal?.removeEventListener("abort",t.onAbort),t.reject(new Error("媒体预览执行器已释放"))}}}function s(t){if(t?.aborted)throw new DOMException("媒体预览准备已取消","AbortError")}const h=16777216;function c(t,e,i){const r=Math.min(1,i/Math.max(t,e));return function(t,e){const i=Math.min(1,4096/Math.max(t,e));let r=Math.max(1,Math.round(t*i)),a=Math.max(1,Math.round(e*i));const n=r*a;if(n>h){const t=Math.sqrt(h/n);r=Math.max(1,Math.floor(r*t)),a=Math.max(1,Math.floor(a*t))}return{width:r,height:a}}(Math.max(1,Math.round(t*r)),Math.max(1,Math.round(e*r)))}async function d(t,e){s(e);const i=await new Promise(e=>t.toBlob(e,"image/png"));if(s(e),null===i)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await r(await i.arrayBuffer(),e)}async function l(t,e,i){s(i);const r=await new Promise(i=>t.toBlob(i,"image/jpeg",e));if(s(i),null===r)throw new Error("媒体预览准备失败:Canvas 编码返回空结果");return await r.arrayBuffer()}function f(t,e){if(!Number.isInteger(t)||t<=0)throw new RangeError(`${e}必须是正整数`)}function m(t,e){if(!Number.isFinite(t)||t<=0||t>1)throw new RangeError(`${e}必须大于 0 且不超过 1`)}function u(t){const e="video"===t.kind?"视频封面":"图片缩略图",i=t.maxSize??n.maxSize,r=t.maxBytes??n.maxBytes,a=t.targetBytes??Math.min(n.targetBytes,r),o=t.quality??Math.max(.72,t.minQuality??0),s=t.minQuality??Math.min(o,.55);if(f(i,`${e}最大边长`),f(a,`${e}目标字节数`),f(r,`${e}最大字节数`),m(o,`${e}初始质量`),m(s,`${e}最低质量`),a>r)throw new RangeError(`${e}目标字节数不能超过最大字节数`);if(s>o)throw new RangeError(`${e}最低质量不能高于初始质量`);return{label:e,maxSize:i,targetBytes:a,maxBytes:r,initialQuality:o,minQuality:s}}class g extends Error{constructor(){super(...arguments),e(this,"name","ThumbnailByteLimitError")}}async function w(t,e,i,r,a){const{label:n,maxSize:o,targetBytes:h,maxBytes:f,initialQuality:m,minQuality:w}=u(r),y="video"===r.kind;s(a);const v=document.createElement("canvas");try{const u=v.getContext("2d");if(null===u)throw new Error("媒体预览准备失败:无法创建 Canvas 2D 上下文");let b;const M=e=>{s(a),v.width=e.width,v.height=e.height,void 0!==b&&(u.fillStyle=b,u.fillRect(0,0,e.width,e.height)),u.drawImage(t,0,0,e.width,e.height)},p=c(e,i,o);let x=p;const E=Math.min(o<=640?240:320,Math.max(x.width,x.height));M(x);const L=y?void 0:u.getImageData(0,0,x.width,x.height).data;let B,P,R=!1;if(void 0!==L)for(let t=3;t<L.length;t+=4)if(L[t]<255){R=!0;break}if(R){let t;for(let r=0;r<4;r+=1){const n=await d(v,a);if((void 0===t||n.byteLength<t.byteLength)&&(t=n),n.byteLength<=f)return n;const o=Math.max(x.width,x.height);if(o<=E||3===r)break;const s=Math.min(.8,Math.max(.35,.9*Math.sqrt(f/n.byteLength)));x=c(e,i,Math.max(E,Math.floor(o*s))),M(x)}if(void 0!==t&&t.byteLength<=f)return t;b=function(t,e){const i=[128,64,192],r=i.map(()=>0),a=4*e;for(let n=0;n<t.length;n+=4){const o=t[n+3];if(0===o)continue;const s=n/4%e;if(!(s>0&&t[n-1]<o||s+1<e&&t[n+7]<o||n>=a&&t[n-a+3]<o||n+a+3<t.length&&t[n+a+3]<o))continue;const h=o/255;for(let e=0;e<i.length;e+=1){const a=i[e],o=Math.max(Math.abs(t[n]-a),Math.abs(t[n+1]-a),Math.abs(t[n+2]-a))*h;r[e]=r[e]+Math.min(64,o)}}let n=0;for(let t=1;t<i.length;t+=1)r[t]>r[n]&&(n=t);return`#${i[n].toString(16).padStart(2,"0").repeat(3)}`}(L,p.width),x=p,M(x)}const j=[.../* @__PURE__ */new Set([m,Math.max(w,m-.12),w])];for(const t of j){const e=await l(v,t,a);if((void 0===B||e.byteLength<B.byteLength)&&(B=e),void 0===P&&e.byteLength<=f&&(P=e),e.byteLength<=h)return e}if(void 0!==P)return P;for(let t=0;t<3;t+=1){const t=Math.max(x.width,x.height);if(t<=E||void 0===B)break;const r=Math.sqrt(f/B.byteLength);x=c(e,i,Math.max(E,Math.floor(t*Math.min(.9,Math.max(.5,r))))),M(x);for(const t of/* @__PURE__ */new Set([m,w])){const e=await l(v,t,a);if(e.byteLength<B.byteLength&&(B=e),void 0===P&&e.byteLength<=f&&(P=e),e.byteLength<=h)return e}if(void 0!==P)return P}if(void 0!==B&&B.byteLength<=f)return B;const D=Math.min(o<=640?160:240,Math.max(x.width,x.height)),A=r.minQuality??Math.min(m,.45);for(let t=0;t<2&&void 0!==B;t+=1){const r=Math.max(x.width,x.height),n=1===t?D:Math.max(D,Math.floor(r*Math.min(.9,.95*Math.sqrt(f/B.byteLength))));x=c(e,i,n),M(x);for(const t of/* @__PURE__ */new Set([w,A])){const e=await l(v,t,a);if(e.byteLength<B.byteLength&&(B=e),e.byteLength<=f)return e}if(n<=D)break}throw new g(`${n}生成失败:编码结果超过 ${f} 字节硬上限`)}finally{v.width=0,v.height=0}}function y(t,e,i,r){return s(i),new Promise((a,n)=>{let o,s,h,c;const d=()=>{void 0!==o&&clearTimeout(o),t.removeEventListener(e,s),t.removeEventListener("error",h),i?.removeEventListener("abort",c)};s=()=>{("seeked"===e?!t.seeking:t.readyState>=("loadedmetadata"===e?1:2))&&(d(),a())},h=()=>{d(),n(new Error(`视频预览准备失败:${e} 前解码错误`))},c=()=>{d(),n(new DOMException("媒体预览准备已取消","AbortError"))},o=setTimeout(()=>{d(),n(new Error(`视频预览准备失败:${e} 超时`))},15e3),t.addEventListener(e,s),t.addEventListener("error",h,{once:!0}),i?.addEventListener("abort",c,{once:!0});try{r?.(),i?.aborted?c():null!==t.error?h():s()}catch(t){d(),n(t)}})}function v(t={}){const e=t.maxConcurrency??function(){if("undefined"==typeof navigator)return 2;const t=navigator.userAgent;if(/iPad|iPhone|iPod/.test(t)||/Macintosh/.test(t)&&(navigator.maxTouchPoints??0)>1)return 1;const e=navigator.deviceMemory;return void 0!==e&&e<=2?1:2}();if(!Number.isInteger(e)||e<1||e>4)throw new RangeError("媒体预览并发数必须是 1-4 的整数");const r=o(e),a=o(1);let n=!1;return{async prepare(t,e){if(n)throw new Error("媒体预览执行器已释放");const o="video"===t.kind,h=await(o?a:r).acquire(e);try{const r=o?await async function(t,e){const i=URL.createObjectURL(t.file),r=document.createElement("video");r.muted=!0,r.preload="metadata",r.playsInline=!0;try{await y(r,"loadedmetadata",e,()=>{r.src=i,r.load()});const a=r.videoWidth,n=r.videoHeight;if(a<=0||n<=0)throw new Error("视频预览准备失败:视频尺寸无效");const o=Number.isFinite(r.duration)&&r.duration>0?r.duration:void 0,s=void 0===t.atTime?void 0===o?0:Math.min(1,o/2):Math.max(0,Math.min(t.atTime,o??t.atTime));s>0&&await y(r,"seeked",e,()=>{r.currentTime=s}),await y(r,"loadeddata",e,()=>{r.preload="auto"});const h=void 0===o?void 0:o;let c,d;try{c=await w(r,a,n,t,e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}if(t.includeDisplayPoster)try{d=await w(r,a,n,{...t,maxSize:960,targetBytes:163840,maxBytes:262144,quality:.9,minQuality:.8},e)}catch(t){if(e?.aborted||t instanceof RangeError)throw t}return{width:a,height:n,...void 0===h?{}:{duration:h},...void 0===c?{}:{posterData:c},...void 0===d?{}:{displayPosterData:d}}}finally{r.pause(),r.removeAttribute("src"),r.load(),URL.revokeObjectURL(i)}}(t,e):await async function(t,e){s(e);const{maxSize:r,targetBytes:a,maxBytes:n}=u(t),o=await i(t.file);function h(e,i){return"image/jpeg"===t.file.type&&t.file.size<=a&&Math.max(e,i)<=r}async function d(i,a){const o="image/jpeg"===t.file.type&&Math.max(a.width,a.height)<=r&&t.file.size<=n;try{const e=await i;if(!o||t.file.size>e.byteLength)return e}catch(t){if(!(o&&t instanceof g))throw t}return s(e),await t.file.arrayBuffer()}if(s(e),void 0!==o){if(!1===t.includePoster)return o;if(h(o.width,o.height))return{...o,posterData:await t.file.arrayBuffer()}}const l=void 0===o?void 0:c(o.width,o.height,r);let f;try{f=void 0===l?await createImageBitmap(t.file):await createImageBitmap(t.file,{resizeWidth:l.width,resizeHeight:l.height,resizeQuality:"high"})}catch(t){if(e?.aborted)throw t}if(void 0!==f)try{s(e);const i=o??{width:f.width,height:f.height};return!1===t.includePoster?i:void 0===o&&h(f.width,f.height)?{...i,posterData:await t.file.arrayBuffer()}:{...i,posterData:await d(w(f,f.width,f.height,t,e),i)}}finally{f.close()}const m=URL.createObjectURL(t.file),y=new Image;try{await new Promise((t,i)=>{let r,a;const n=()=>{void 0!==r&&clearTimeout(r),y.onload=null,y.onerror=null,e?.removeEventListener("abort",a)};a=()=>{n(),i(new DOMException("媒体预览准备已取消","AbortError"))},y.onload=()=>{n(),t()},y.onerror=()=>{n(),i(new Error("图片预览准备失败:Image 解码错误"))},r=setTimeout(()=>{n(),i(new Error("图片预览准备失败:Image 解码超时"))},15e3),e?.addEventListener("abort",a,{once:!0}),y.src=m});const i=o??{width:y.naturalWidth,height:y.naturalHeight};return!1===t.includePoster?i:h(y.naturalWidth,y.naturalHeight)?{...i,posterData:await t.file.arrayBuffer()}:{...i,posterData:await d(w(y,y.naturalWidth,y.naturalHeight,t,e),i)}}finally{y.removeAttribute("src"),URL.revokeObjectURL(m)}}(t,e);return s(e),r}finally{h()}},dispose(){n||(n=!0,r.dispose(),a.dispose())}}}export{v as createMediaPreviewPreparationExecutor};
@@ -1 +1 @@
1
- import{createMediaDownloader as e}from"./media-downloader.js";import{createMediaRequestLimiter as t}from"./media-request-limiter.js";import{MediaTransferError as a,recoverableUploadFailure as r}from"./media-transfer-errors.js";import{resolveMediaUploadPlan as o,MEDIA_UPLOAD_PART_CONCURRENCY as n,MEDIA_TRANSFER_REQUEST_CONCURRENCY as i}from"./media-transfer-policy.js";import{createMediaUploadCredentialStore as s}from"./media-upload-credentials.js";import{abortMultipartSession as d,resumableParts as l,putWholeObject as 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
+ 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 +1 @@
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
+ 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 +1 @@
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
+ 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 +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 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};
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 +1 @@
1
- import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i=Object.freeze({ok:!0,operation:r});for(const[e,r]of o.entries())if(i=await et(n,{kind:"emoji",token:r.token,resourceId:r.resourceId},!1!==t?.refreshAfterReport&&e===o.length-1),!i.ok&&"stale"===i.reason)return i;return i}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
1
+ import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,"hydrate-recent"!==e&&"report-recent"!==e||l.record("warn","pinia","hydrate-recent"===e?"storage":"message","expression-recent-operation-failed",()=>({data:{operation:e,code:n.code},error:{message:n.code}})),Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t={}){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i=Object.freeze({ok:!0,operation:r});for(const[e,r]of o.entries())if(i=await et(n,{kind:"emoji",token:r.token,resourceId:r.resourceId},!1!==t.refreshAfterReport&&e===o.length-1),!i.ok&&"stale"===i.reason)return i;return i}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
@@ -1 +1 @@
1
- import e from"./unicode-emoji-catalog.json.js";function o(e){if(0===e.length||e.trim()!==e)throw new TypeError(`非法 Unicode emoji code: ${e}`);const o=e.split(" ");if(o.some(e=>0===e.length))throw new TypeError(`非法 Unicode emoji code: ${e}`);return Object.freeze(o.map(o=>function(e,o){if(!e.startsWith("0x")||e.length<=2)throw new TypeError(`非法 Unicode emoji code: ${o}`);const t=e.slice(2);for(const e of t)if(!"0123456789abcdef".includes(e))throw new TypeError(`非法 Unicode emoji code: ${o}`);const n=Number.parseInt(t,16);if(!Number.isSafeInteger(n)||n>1114111||n>=55296&&n<=57343)throw new RangeError(`Unicode emoji code point 越界: ${o}`);return n}(o,e)))}function t(e){return String.fromCodePoint(...o(e))}function n(e){return e.map(e=>`0x${e.toString(16)}`).join(" ")}const r=Object.freeze(e.map(function(e){const t=o(e),r=n(t);if(r!==e)throw new TypeError(`Unicode emoji code 必须使用 canonical 小写格式: ${e}`);return Object.freeze({stableKey:`unicode:${r}`,code:e,codePoints:t,text:String.fromCodePoint(...t),kind:"unicode"})})),i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;for(const e of r){if(i.has(e.code)||c.has(e.text))throw new Error(`Unicode emoji 目录存在重复项: ${e.code}`);i.set(e.code,e),c.set(e.text,e)}for(const e of r){const o=65039===e.codePoints[e.codePoints.length-1]?e.codePoints.slice(0,-1):[...e.codePoints,65039],t=n(o),r=String.fromCodePoint(...o);i.has(t)||i.set(t,e),c.has(r)||c.set(r,e)}function s(e){if(e.startsWith("0x")){const t=n(o(e));return i.get(t)}return c.get(e)}export{r as UNICODE_EMOJI_CATALOG,o as parseUnicodeEmojiCode,s as resolveUnicodeEmoji,t as unicodeEmojiTextFromCode};
1
+ import e from"./unicode-emoji-catalog.json.js";function o(e){if(0===e.length||e.trim()!==e)throw new TypeError(`非法 Unicode emoji code: ${e}`);const o=e.split(" ");if(o.some(e=>0===e.length))throw new TypeError(`非法 Unicode emoji code: ${e}`);return Object.freeze(o.map(o=>function(e,o){if(!e.startsWith("0x")||e.length<=2)throw new TypeError(`非法 Unicode emoji code: ${o}`);const t=e.slice(2);for(const e of t)if(!"0123456789abcdef".includes(e))throw new TypeError(`非法 Unicode emoji code: ${o}`);const n=Number.parseInt(t,16);if(!Number.isSafeInteger(n)||n>1114111||n>=55296&&n<=57343)throw new RangeError(`Unicode emoji code point 越界: ${o}`);return n}(o,e)))}function t(e){return String.fromCodePoint(...o(e))}function n(e){return e.map(e=>`0x${e.toString(16)}`).join(" ")}const r=Object.freeze(e.map(function(e){const t=o(e),r=n(t);if(r!==e)throw new TypeError(`Unicode emoji code 必须使用 canonical 小写格式: ${e}`);return Object.freeze({stableKey:`unicode:${r}`,code:e,codePoints:t,text:String.fromCodePoint(...t),kind:"unicode"})})),i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;for(const e of r){if(i.has(e.code)||c.has(e.text))throw new Error(`Unicode emoji 目录存在重复项: ${e.code}`);i.set(e.code,e),c.set(e.text,e)}for(const e of r){const o=65039===e.codePoints.at(-1)?e.codePoints.slice(0,-1):[...e.codePoints,65039],t=n(o),r=String.fromCodePoint(...o);i.has(t)||i.set(t,e),c.has(r)||c.set(r,e)}function s(e){if(e.startsWith("0x")){const t=n(o(e));return i.get(t)}return c.get(e)}export{r as UNICODE_EMOJI_CATALOG,o as parseUnicodeEmojiCode,s as resolveUnicodeEmoji,t as unicodeEmojiTextFromCode};
@@ -1 +1 @@
1
- const o=/* @__PURE__ */new WeakMap;function r(r){if(!0===r?.aborted)return o.has(r)?o.get(r):r.reason}function t(r,t){r.signal.aborted||(void 0!==t&&o.set(r.signal,t),r.abort(t))}function n(o){if(!0!==o?.aborted)return;const t=r(o);if(void 0!==t)throw t;const n=new Error("The operation was aborted");throw n.name="AbortError",n}export{t as abortWithReason,r as getAbortReason,n as throwIfAborted};
1
+ function r(r){if(!0!==r?.aborted)return;if(void 0!==r.reason)throw r.reason;const o=new Error("The operation was aborted");throw o.name="AbortError",o}export{r as throwIfAborted};
@@ -1 +1 @@
1
- const t=/^[0-9a-f]{32}$/;function e(e){return t.test(e.replace(/-/g,"").toLowerCase())}function o(){const t=globalThis.crypto;if("function"==typeof t?.randomUUID)return t.randomUUID();if("function"!=typeof t?.getRandomValues)throw new Error("生成 UUID 需要系统安全随机源 crypto.getRandomValues");const e=new Uint8Array(16);t.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;return s(Array.from(e,t=>t.toString(16).padStart(2,"0")).join(""))}function r(t){const o=t.replace(/-/g,"").toLowerCase();if(!e(t))throw new Error(`toWireMsgId: 非法消息 id「${t}」(去横线后非 32 位 hex),拒绝作为出站 sMsgId`);return o}function n(e){const o=e.replace(/-/g,"").toLowerCase();return t.test(o)?o:e}function s(e){const o=e.toLowerCase();return t.test(o)?`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`:e}export{s as fromWireMsgId,e as isWireMsgId,o as newClientMessageId,r as toWireMsgId,n as toWireRefMsgId};
1
+ const e=/^[0-9a-f]{32}$/;function t(t){return e.test(t.replace(/-/g,"").toLowerCase())}function r(){return globalThis.crypto.randomUUID()}function o(e){const r=e.replace(/-/g,"").toLowerCase();if(!t(e))throw new Error(`toWireMsgId: 非法消息 id「${e}」(去横线后非 32 位 hex),拒绝作为出站 sMsgId`);return r}function n(t){const r=t.replace(/-/g,"").toLowerCase();return e.test(r)?r:t}function s(t){const r=t.toLowerCase();return e.test(r)?`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`:t}export{s as fromWireMsgId,t as isWireMsgId,r as newClientMessageId,o as toWireMsgId,n as toWireRefMsgId};
@@ -1 +1 @@
1
- let e,t;const r={customerService:e=>e.customerService?.text??"",text:e=>e.text??"",file:e=>[e.file?.fileName,e.file?.extension].filter(e=>void 0!==e&&""!==e).join(" "),contact:e=>[e.contact?.displayName,e.contact?.username,e.contact?.targetId].filter(e=>void 0!==e&&""!==e).join(" "),image:()=>"",video:()=>"",voice:()=>"",sticker:()=>"",filesAlbum:e=>[e.filesAlbum?.caption,...e.filesAlbum?.items.map(e=>e.fileName)??[]].filter(Boolean).join(" "),mediaAlbum:e=>e.mediaAlbum?.caption?.trim()??"",miniProgram:e=>[e.miniProgram?.name,e.miniProgram?.description].filter(e=>void 0!==e&&""!==e).join(" "),robot:e=>e.robot?.modules.flatMap(e=>"section"===e.type?[e.content]:[]).filter(e=>""!==e.trim()).join(" ")??"",game:()=>"",transfer:e=>[e.transfer?.fromUserName,e.transfer?.toUserName,e.transfer?.remark,e.transfer?.coinName].filter(e=>void 0!==e&&""!==e).join(" "),gift:e=>[e.gift?.giftName,e.gift?.fromUserName,e.gift?.toUserName,e.gift?.explain].filter(e=>void 0!==e&&""!==e).join(" "),liveRoom:e=>[e.liveRoom?.liveRoomName,e.liveRoom?.broadcasterUserName].filter(e=>void 0!==e&&""!==e).join(" "),call:()=>"",redPacket:e=>e.redPacket?.coinName?.trim()??"",system:()=>"",unknown:()=>""};function n(e){return r[e.contentType](e.body)}async function i(e){const r=e.trim(),n=r.charAt(0);if(/^[A-Z]$/i.test(n))return n.toLocaleUpperCase();if(!/\p{Script=Han}/u.test(n))return"#";const i=(await(t??(t=import("pinyin-pro").then(e=>e.pinyin)),t))(r,{type:"array"}),o=i[0]?.charAt(0).toLocaleUpperCase();return/^[A-Z]$/.test(o??"")?o:"#"}async function o(t){const r=t.trim().toLocaleLowerCase();if(""===r)throw new Error("IM 文本搜索关键词不能为空");const n=r.replace(/[\s'-]+/g,""),i=/^[a-z]+$/.test(n)?await(e??(e=import("pinyin-pro").then(e=>e.match)),e):void 0;return Object.freeze({keyword:r,match(e,t={}){const o=function(e,t){const r=[],n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(const t of e.matchAll(new RegExp(n,"giu"))){const e=t.index;r.push(Object.freeze({start:e,end:e+t[0].length}))}return Object.freeze(r)}(e,r);if(o.length>0)return Object.freeze({method:"direct",ranges:o});if(!1===t.pinyin||void 0===i||!/\p{Script=Han}/u.test(e))return null;const a=i(e,n);if(null===a)return null;const c=function(e,t){if(0===t.length)return Object.freeze([]);const r=[...new Set(t)].filter(t=>Number.isSafeInteger(t)&&t>=0&&t<e.length).sort((e,t)=>e-t);if(0===r.length)return Object.freeze([]);const n=[];let i=r[0],o=i;for(const e of r.slice(1))e!==o+1?(n.push(Object.freeze({start:i,end:o+1})),i=e,o=e):o=e;return n.push(Object.freeze({start:i,end:o+1})),Object.freeze(n)}(e,a);return 0===c.length?null:Object.freeze({method:"pinyin",ranges:c})}})}export{o as createImTextSearchMatcher,n as extractSearchText,i as getImTextSearchInitial};
1
+ let e,t;const r={customerService:e=>e.customerService?.text??"",text:e=>e.text??"",file:e=>[e.file?.fileName,e.file?.extension].filter(e=>void 0!==e&&""!==e).join(" "),contact:e=>[e.contact?.displayName,e.contact?.username,e.contact?.targetId].filter(e=>void 0!==e&&""!==e).join(" "),image:()=>"",video:()=>"",voice:()=>"",sticker:()=>"",filesAlbum:e=>[e.filesAlbum?.caption,...e.filesAlbum?.items.map(e=>e.fileName)??[]].filter(Boolean).join(" "),mediaAlbum:e=>e.mediaAlbum?.caption?.trim()??"",miniProgram:e=>[e.miniProgram?.name,e.miniProgram?.description].filter(e=>void 0!==e&&""!==e).join(" "),robot:e=>e.robot?.modules.flatMap(e=>"section"===e.type?[e.content]:[]).filter(e=>""!==e.trim()).join(" ")??"",game:()=>"",transfer:e=>[e.transfer?.fromUserName,e.transfer?.toUserName,e.transfer?.remark,e.transfer?.coinName].filter(e=>void 0!==e&&""!==e).join(" "),gift:e=>[e.gift?.giftName,e.gift?.fromUserName,e.gift?.toUserName,e.gift?.explain].filter(e=>void 0!==e&&""!==e).join(" "),liveRoom:e=>[e.liveRoom?.liveRoomName,e.liveRoom?.broadcasterUserName].filter(e=>void 0!==e&&""!==e).join(" "),call:()=>"",redPacket:e=>e.redPacket?.coinName?.trim()??"",system:()=>"",unknown:()=>""};function n(e){return r[e.contentType](e.body)}async function i(e){const r=e.trim(),n=r.charAt(0);if(/^[A-Z]$/i.test(n))return n.toLocaleUpperCase();if(!new RegExp("\\p{Script=Han}","u").test(n))return"#";const i=(await(t??(t=import("pinyin-pro").then(e=>e.pinyin)),t))(r,{type:"array"}),o=i[0]?.charAt(0).toLocaleUpperCase();return/^[A-Z]$/.test(o??"")?o:"#"}async function o(t){const r=t.trim().toLocaleLowerCase();if(""===r)throw new Error("IM 文本搜索关键词不能为空");const n=r.replace(/[\s'-]+/g,""),i=/^[a-z]+$/.test(n)?await(e??(e=import("pinyin-pro").then(e=>e.match)),e):void 0;return Object.freeze({keyword:r,match(e,t={}){const o=function(e,t){const r=[],n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");for(const t of e.matchAll(new RegExp(n,"giu"))){const e=t.index;r.push(Object.freeze({start:e,end:e+t[0].length}))}return Object.freeze(r)}(e,r);if(o.length>0)return Object.freeze({method:"direct",ranges:o});if(!1===t.pinyin||void 0===i||!new RegExp("\\p{Script=Han}","u").test(e))return null;const a=i(e,n);if(null===a)return null;const c=function(e,t){if(0===t.length)return Object.freeze([]);const r=[...new Set(t)].filter(t=>Number.isSafeInteger(t)&&t>=0&&t<e.length).sort((e,t)=>e-t);if(0===r.length)return Object.freeze([]);const n=[];let i=r[0],o=i;for(const e of r.slice(1))e!==o+1?(n.push(Object.freeze({start:i,end:o+1})),i=e,o=e):o=e;return n.push(Object.freeze({start:i,end:o+1})),Object.freeze(n)}(e,a);return 0===c.length?null:Object.freeze({method:"pinyin",ranges:c})}})}export{o as createImTextSearchMatcher,n as extractSearchText,i as getImTextSearchInitial};
@@ -1 +1 @@
1
- import{MEDIA_ALBUM_MAX_ITEMS as r,MEDIA_ALBUM_CONTENT_MAX_BYTES as o}from"./mapping/media-album-body.js";const e=Math.floor(3*(o-32768)/4),t=e;function a(o=1){if(!Number.isInteger(o)||o<1||o>r)throw new RangeError(`媒体缩略图项数必须是 1 到 ${r} 的整数`);return{maxSize:o<=2?960:720,maxBytes:Math.floor(e/o)}}export{t as MEDIA_THUMBNAIL_MAX_BYTES,a as resolveMediaThumbnailPolicy};
1
+ import{MEDIA_ALBUM_MAX_ITEMS as t,MEDIA_ALBUM_CONTENT_MAX_BYTES as o}from"./mapping/media-album-body.js";const r=Math.floor(3*(o-32768)/4);function a(o=1){if(!Number.isInteger(o)||o<1||o>t)throw new RangeError(`媒体缩略图项数必须是 1 到 ${t} 的整数`);const r=1===o?1:o+1;return{maxSize:o<=2?960:640,targetBytes:Math.min(8192,3*Math.floor(49152/r/3)),maxBytes:Math.min(o<=2?24576:16384,3*Math.floor(73728/r/3))}}export{r as MEDIA_THUMBNAIL_MAX_BYTES,a as resolveMediaThumbnailPolicy};