k2-im 0.2.15 → 0.2.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/chat-kit-pinia.d.ts +77 -18
  2. package/dist/chat-kit-vue.d.ts +7 -5
  3. package/dist/chat-kit.d.ts +138 -23
  4. package/dist/index.d.ts +142 -26
  5. package/dist/modules/api-protocol-client/src/client.js +1 -1
  6. package/dist/modules/api-protocol-client/src/nonce.js +1 -1
  7. package/dist/modules/crypto/browser.js +1 -1
  8. package/dist/modules/crypto/driver.js +1 -1
  9. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
  10. package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -1
  11. package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
  12. package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
  13. package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
  14. package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
  15. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
  16. package/dist/modules/im-browser/src/media/media-download-request.js +1 -0
  17. package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
  18. package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -1
  19. package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
  20. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
  21. package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
  22. package/dist/modules/im-browser/src/media/webp-encoder.js +1 -0
  23. package/dist/modules/im-browser/src/media/webp-worker-factory.js +1 -0
  24. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
  25. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  26. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
  27. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
  28. package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -1
  29. package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
  30. package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
  31. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
  32. package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
  33. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -1
  34. package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -1
  35. package/dist/modules/im-core/src/abort.js +1 -1
  36. package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
  37. package/dist/modules/im-core/src/mapping/message-id.js +1 -1
  38. package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -1
  39. package/dist/modules/im-core/src/media-thumbnail.js +1 -1
  40. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  41. package/dist/modules/im-core/src/state/domain-state.js +1 -1
  42. package/dist/modules/im-sdk/src/create-im-client.js +1 -1
  43. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  44. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
  45. package/dist/modules/im-sdk/src/product/media.js +1 -1
  46. package/dist/modules/im-sdk/src/runtime/history-page-size.js +1 -0
  47. package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
  48. package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
  49. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
  50. package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
  51. package/dist/request-crypto.d.ts +3 -2
  52. package/dist/sdk.d.ts +75 -21
  53. package/dist/vendor/crypto/index_bg.wasm +0 -0
  54. package/dist/vendor/webp/LICENSE.jsquash +201 -0
  55. package/dist/vendor/webp/LICENSE.libwebp +29 -0
  56. package/dist/vendor/webp/NOTICE +3 -0
  57. package/dist/webp.worker.js +3 -0
  58. package/package.json +1 -1
@@ -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,"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
+ 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,s=Object.freeze({ok:!0,operation:r});for(const[e,c]of o.entries()){const a=le.emoji+1;if(s=await et(n,{kind:"emoji",token:c.token,resourceId:c.resourceId},!1!==t.refreshAfterReport&&e===o.length-1),!Re(n)||le.emoji!==a)return Me(r);if(!s.ok){if("stale"===s.reason)return s;i??(i=s)}}return void 0!==i?.error&&($.emoji.error=i.error),i??s}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{createMediaObjectUrlRegistry as e}from"./media-object-url-registry.js";import{validateCachePrefix as o,createImCacheNamespaceFactory as r}from"../../../im-core/src/cache-namespace.js";import{createAdvancedImClient as t,createProductClientFacade as n}from"../../../im-sdk/src/create-im-client.js";import{createIndexedDbStorageAdapter as i,deleteIndexedDbNamespace as s}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createDefaultMediaAssetCacheStrategyRegistry as a}from"../../../im-sdk/src/product/media.js";import{createSdkDiagnosticWriter as c}from"../../../im-sdk/src/product/diagnostics.js";function d(){if("undefined"==typeof navigator)return{maxCachedEntries:6,maxCachedBytes:536870912};const e=navigator,o=e.deviceMemory??4,r=/Android|iPhone|iPad|Mobile/i.test(e.userAgent);return!0===e.connection?.saveData||o<=2||navigator.hardwareConcurrency<=2?{maxCachedEntries:2,maxCachedBytes:134217728}:r?{maxCachedEntries:4,maxCachedBytes:268435456}:o>=8&&navigator.hardwareConcurrency>=8?{maxCachedEntries:9,maxCachedBytes:1073741824}:{maxCachedEntries:6,maxCachedBytes:536870912}}function l(e){const o=`message\0${e.conversationType}\0${e.conversationId}\0${e.messageId}`;return void 0===e.itemIndex?o:`${o}\0${e.itemIndex}`}function u(e){return`source\0${e}`}function m(e){if("object"==typeof e&&null!==e&&"code"in e)return"IM_CONNECTION_OWNED_ELSEWHERE"===e.code?"lifecycle.connectionOccupied":"IM_CONNECTION_OWNERSHIP_UNAVAILABLE"===e.code?"lifecycle.connectionCoordinationUnavailable":void 0}function p(p){const f=o(p.cachePrefix),g=r(f),h=p.createClient??t,v=p.createStorage??(e=>"undefined"==typeof indexedDB?void 0:i({...e,mediaAssetCache:{strategies:a()}})),y=p.createProfile,C=p.deleteStorage??(e=>s(e.accountId,{namespaceFactory:e.namespaceFactory}));let k,w,I,b,M,E,P=null,x=null,T=!1,B=0,S=!1,R=!1;const A={wsUrl:"",userId:"",token:"",deviceToken:"",channelType:"0",cmHttpBaseUrl:""},U=c(p.debug,()=>({generation:B,...""===A.userId?{}:{accountId:A.userId}}));function D(){return{generation:B,...""===A.userId?{}:{accountId:A.userId}}}U.record("debug","chat-kit","session","runtime-created");let L={},N={},j={};const O=/* @__PURE__ */new Map;let $=/* @__PURE__ */new WeakMap;const F=e({...d(),maxIdleMs:6048e5}),H=/* @__PURE__ */new Set,K=/* @__PURE__ */new Set,_=/* @__PURE__ */new Set;function V(){for(const e of _)e()}function W(e=!1){const o=D(),r=P,t=void 0!==w||void 0!==I;w?.(),w=void 0,I?.(),I=void 0,t&&U.record("debug","chat-kit","session","client-subscriptions-released",()=>o),e||r?.connection.disconnect("im-chat-auth-changed"),P=null,x=null;const n=k;let i;k=void 0;try{i=null!==r&&b?.uploadRecovery?.enabled&&!e?r.logout({localData:"preserve"}).finally(()=>r.dispose()):Promise.resolve(null!==r?r.dispose():n?.close())}catch(e){i=Promise.reject(e)}const s=i.catch(e=>{R=!0,E=e,U.record("error","chat-kit","session","previous-client-dispose-failed",()=>({...o,error:{message:"旧 IM Client 清理失败,已阻止新账号准备",data:e}}))});M=void 0===M?s:Promise.all([M,s]).then(()=>{}),B+=1,L={},N={},j={},G(),O.clear(),V()}function q(){if(S)throw new Error("ChatRuntime 已 dispose,不能创建/复用 client");if(null===P){const e=v({namespaceFactory:g});k=e;const o=b?.getCoreClient(),r=b?.getCoreApi?.();T=void 0!==o||void 0!==r;const t=b?.clientType??2,n=B,i=b?.onRequestError,s=o&&y?y({client:o,clientType:t,storage:k}):void 0,a={authProvider:{getLoginContext:async()=>{const e=b?.getSession?.(),o=void 0!==b?.getSession,r=(o?e?.userId:A.userId)?.trim()??"",n=(o?e?.token:A.token)?.trim()??"";return""===r||""===n||r!==A.userId?null:{userId:r,token:n,deviceToken:A.deviceToken,clientType:t,channelType:Number(A.channelType)}}},endpointProvider:{getEndpoints:async()=>[{url:A.wsUrl}],getCmHttpBaseUrl:async()=>A.cmHttpBaseUrl},cache:{prefix:f},adapters:{namespaceFactory:g,storage:{create:o=>{if(o.namespaceFactory!==g)throw new Error("ChatRuntime storage namespace factory 不一致");return e},purgeCurrentAccount:e=>C(e)}},profile:s,media:b?.getMediaConfig(),uploadRecovery:b?.uploadRecovery,expressions:b?.getExpressionOptions?.(),coreApi:r,coreClient:o,onRequestError:void 0===i?void 0:e=>S||B!==n?void 0:i(e),debug:p.debug},c=h(a),d=c.events;if(void 0===d&&K.size>0)throw Promise.resolve(k?.close?.()).catch(()=>{}),k=void 0,new Error("IM client 缺少产品事件 API");P=c,w=P.connection.subscribe(e=>{if(("message:updated"===e.type||"message:received"===e.type)&&"failed"===e.message.status&&"media.uploadInterrupted"===e.message.failure?.displayCode&&!1===e.message.failure.retryable){const o=e.message,r=l({conversationType:o.conversationType,conversationId:o.conversationId,messageId:o.id});F.remove(r),F.removeByPrefix(`${r}\0`)}for(const o of H)o(e)}),void 0!==d&&(I=d.subscribe(e=>{for(const o of K)o(e)})),U.record("debug","chat-kit","session","client-subscriptions-established",()=>D())}return P}function z(){const e=q();return x??(x=n(e,{coreApiAvailable:T})),x}function G(){$=/* @__PURE__ */new WeakMap,F.clearAll()}return{getClient:()=>P,getProductClient:()=>null===P?null:z(),ensureProductClient:z,getConnectionState:()=>P?.connection.state??"idle",getGeneration:()=>B,getCredentials:()=>A,getMediaConfig:()=>b?.getMediaConfig(),getDiagnostics:()=>U,configureHost(e){b=e},applySession(e,o,r){const t=e?.userId??"",n=e?.token??"",i=null!==P&&(A.userId!==t||A.token!==n);return i&&W(A.userId===t&&""!==n),A.wsUrl=o.wsUrl,A.cmHttpBaseUrl=o.cmHttpBaseUrl,A.userId=t,A.token=n,A.deviceToken=r,A.channelType="0",U.record("info","chat-kit","session","session-applied",()=>({data:{accountId:t,hasToken:""!==n,didReset:i}})),{didReset:i,hasToken:""!==n}},ensureClient:q,async prepare(){if(S)return{ok:!1,errorKey:"lifecycle.disposed"};if(""===A.userId)return{ok:!1,errorKey:"lifecycle.missingLoginState"};const e=Date.now(),o=D();U.record("info","chat-kit","session","prepare-start",()=>o);try{const r=A.userId,t=A.token;if(void 0!==M&&await M,S||B!==o.generation||A.userId!==r||A.token!==t)throw new Error("IM session 已变化,取消旧 prepare");if(R)throw new Error("旧 IM Client 未能完成清理,请刷新后重试",{cause:E});const n=q();return await n.connection.prepare(),U.record("info","chat-kit","session","prepare-complete",()=>({...o,durationMs:Date.now()-e})),{ok:!0}}catch(r){U.record("error","chat-kit","session","prepare-failed",()=>({...o,durationMs:Date.now()-e,error:{message:"ChatRuntime prepare 失败",data:r}}));const t=m(r);return void 0!==t?{ok:!1,errorKey:t}:{ok:!1,errorKey:"lifecycle.prepareFailed",errorParams:{reason:r instanceof Error?r.message:String(r)}}}},async connect(){if(S)return{ok:!1,errorKey:"lifecycle.disposed"};if(""===A.wsUrl||""===A.userId||""===A.token)return{ok:!1,errorKey:"lifecycle.missingConnectParams"};const e=Date.now(),o=D();U.record("info","chat-kit","connection","connect-start",()=>o);try{const r=A.userId,t=A.token;if(void 0!==M&&await M,S||B!==o.generation||A.userId!==r||A.token!==t)throw new Error("IM session 已变化,取消旧 connect");if(R)throw new Error("旧 IM Client 未能完成清理,请刷新后重试",{cause:E});const n=q();return await n.connection.connect(),U.record("info","chat-kit","connection","connect-complete",()=>({...o,durationMs:Date.now()-e})),{ok:!0}}catch(r){U.record("error","chat-kit","connection","connect-failed",()=>({...o,durationMs:Date.now()-e,error:{message:"ChatRuntime connect 失败",data:r}}));const t=m(r);return void 0!==t?{ok:!1,errorKey:t}:{ok:!1,errorKey:"lifecycle.connectFailed",errorParams:{reason:r instanceof Error?r.message:String(r)}}}},disconnect(){const e=D();U.record("info","chat-kit","connection","disconnect",()=>e),P?.connection.disconnect("im-chat-manual")},async logout(e){const o=Date.now(),r=D();U.record("info","chat-kit","session","logout-start",()=>({...r,data:e}));const t=P;let n,i;if(null!==t)try{i=t.logout(e)}catch(e){n=e}if(A.userId="",A.token="",A.deviceToken="",A.channelType="0",B+=1,void 0!==i)try{await i}catch(e){n=e}if(L={},N={},j={},G(),O.clear(),V(),U.record(void 0===n?"info":"error","chat-kit","session",void 0===n?"logout-complete":"logout-failed",()=>({...r,durationMs:Date.now()-o,...void 0===n?{}:{error:{message:"ChatRuntime logout 失败",data:n}}})),void 0!==n)throw n},resetForAuthChange:W,dispose(){if(S)return;S=!0;const e=D();U.record("info","chat-kit","session","dispose",()=>e),W(!0),H.clear(),K.clear(),_.clear()},subscribeEvents:e=>(H.add(e),()=>{H.delete(e)}),subscribeProductEvents:e=>(K.add(e),()=>{K.delete(e)}),getSenderProfileCache:()=>L,setSenderProfileCache(e){L=e,V()},getGroupMemberNames:()=>N,setGroupMemberNames(e){N=e,V()},getChannelMemberProfiles:()=>j,setChannelMemberProfiles(e){j=e,V()},subscribeProfileChange:e=>(_.add(e),()=>{_.delete(e)}),putSelfVoiceBytes(e,o){for(O.delete(e),O.set(e,o);O.size>20;){const e=O.keys().next().value;if(void 0===e)break;O.delete(e)}},getSelfVoiceBytes:e=>O.get(e),clearSelfVoiceBytes(){O.clear()},rememberLocalVideoPoster(e,o){$.set(e,o)},createLocalMediaPreview(e){const o=URL.createObjectURL(e);return F.register(u(o),o,{byteSize:e.size,evictable:!1,videoPoster:$.get(e)}),o},discardLocalMediaPreview(e){F.remove(u(e))},trackLocalMediaPreview(e,o){F.move(u(o),l(e))},resolveMediaPreviewToRemote(e,o,r){const t=l(e);"image"===o||"video"===o?F.makeEvictable(t,r):F.remove(t)},hasMediaBlob:e=>F.has(l(e)),acquireMediaBlob:e=>F.acquire(l(e)),async clearMediaCache(){const e=P,o=B;if(null===e)throw new Error("IM session is not ready");if(F.clearCached(),await e.media.clearCache(),B!==o||P!==e)throw new Error("IM session changed during media cache cleanup")},cleanupLocalMediaBlobs:G,cleanupConversationMediaBlobs:function(e){F.removeByPrefix(function(e){return`message\0${e.conversationType}\0${e.conversationId}\0`}(e))}}}export{p as createChatRuntime};
1
+ import{createMediaObjectUrlRegistry as e}from"./media-object-url-registry.js";import{validateCachePrefix as r,createImCacheNamespaceFactory as o}from"../../../im-core/src/cache-namespace.js";import{createAdvancedImClient as t,createProductClientFacade as n}from"../../../im-sdk/src/create-im-client.js";import{createIndexedDbStorageAdapter as i,deleteIndexedDbNamespace as s}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createDefaultMediaAssetCacheStrategyRegistry as c}from"../../../im-sdk/src/product/media.js";import{createSdkDiagnosticWriter as a}from"../../../im-sdk/src/product/diagnostics.js";function d(){if("undefined"==typeof navigator)return{maxCachedEntries:6,maxCachedBytes:536870912};const e=navigator,r=e.deviceMemory??4,o=/Android|iPhone|iPad|Mobile/i.test(e.userAgent);return!0===e.connection?.saveData||r<=2||navigator.hardwareConcurrency<=2?{maxCachedEntries:2,maxCachedBytes:134217728}:o?{maxCachedEntries:4,maxCachedBytes:268435456}:r>=8&&navigator.hardwareConcurrency>=8?{maxCachedEntries:9,maxCachedBytes:1073741824}:{maxCachedEntries:6,maxCachedBytes:536870912}}function l(e){const r=`message\0${e.conversationType}\0${e.conversationId}\0${e.messageId}`;return void 0===e.itemIndex?r:`${r}\0${e.itemIndex}`}function u(e){return`source\0${e}`}function m(e){if("object"==typeof e&&null!==e&&"code"in e)return"IM_CONNECTION_OWNED_ELSEWHERE"===e.code?"lifecycle.connectionOccupied":"IM_CONNECTION_OWNERSHIP_UNAVAILABLE"===e.code?"lifecycle.connectionCoordinationUnavailable":void 0}function p(p){const f=r(p.cachePrefix),g=o(f),h=p.createClient??t,v=p.createStorage??(e=>"undefined"==typeof indexedDB?void 0:i({...e,mediaAssetCache:{strategies:c()}})),y=p.createProfile,C=p.deleteStorage??(e=>s(e.accountId,{namespaceFactory:e.namespaceFactory}));let k,w,I,b,M,E,P=null,x=null,T=!1,B=0,S=!1,R=!1;const U={wsUrl:"",userId:"",token:"",deviceToken:"",channelType:"0",cmHttpBaseUrl:""},A=a(p.debug,()=>({generation:B,...""===U.userId?{}:{accountId:U.userId}}));function D(){return{generation:B,...""===U.userId?{}:{accountId:U.userId}}}A.record("debug","chat-kit","session","runtime-created");let L={},N={},j={};const O=/* @__PURE__ */new Map;let $=/* @__PURE__ */new WeakMap;const F=e({...d(),maxIdleMs:6048e5}),H=/* @__PURE__ */new Set,K=/* @__PURE__ */new Set,_=/* @__PURE__ */new Set;function V(){for(const e of _)e()}function W(e=!1){const r=D(),o=P,t=void 0!==w||void 0!==I;w?.(),w=void 0,I?.(),I=void 0,t&&A.record("debug","chat-kit","session","client-subscriptions-released",()=>r),e||o?.connection.disconnect("im-chat-auth-changed"),P=null,x=null;const n=k;let i;k=void 0;try{i=null!==o&&b?.uploadRecovery?.enabled&&!e?o.logout({localData:"preserve"}).finally(()=>o.dispose()):Promise.resolve(null!==o?o.dispose():n?.close())}catch(e){i=Promise.reject(e)}const s=i.catch(e=>{R=!0,E=e,A.record("error","chat-kit","session","previous-client-dispose-failed",()=>({...r,error:{message:"旧 IM Client 清理失败,已阻止新账号准备",data:e}}))});M=void 0===M?s:Promise.all([M,s]).then(()=>{}),B+=1,L={},N={},j={},G(),O.clear(),V()}function q(){if(S)throw new Error("ChatRuntime 已 dispose,不能创建/复用 client");if(null===P){const e=v({namespaceFactory:g});k=e;const r=b?.getCoreClient(),o=b?.getCoreApi?.();T=void 0!==r||void 0!==o;const t=b?.clientType??2,n=B,i=b?.onRequestError,s=r&&y?y({client:r,clientType:t,storage:k}):void 0,c={authProvider:{getLoginContext:async()=>{const e=b?.getSession?.(),r=void 0!==b?.getSession,o=(r?e?.userId:U.userId)?.trim()??"",n=(r?e?.token:U.token)?.trim()??"";return""===o||""===n||o!==U.userId?null:{userId:o,token:n,deviceToken:U.deviceToken,clientType:t,channelType:Number(U.channelType)}}},endpointProvider:{getEndpoints:async()=>[{url:U.wsUrl}],getCmHttpBaseUrl:async()=>U.cmHttpBaseUrl},cache:{prefix:f},adapters:{namespaceFactory:g,storage:{create:r=>{if(r.namespaceFactory!==g)throw new Error("ChatRuntime storage namespace factory 不一致");return e},purgeCurrentAccount:e=>C(e)}},profile:s,media:b?.getMediaConfig(),uploadRecovery:b?.uploadRecovery,expressions:b?.getExpressionOptions?.(),coreApi:o,coreClient:r,onRequestError:void 0===i?void 0:e=>S||B!==n?void 0:i(e),debug:p.debug},a=h(c),d=a.events;if(void 0===d&&K.size>0)throw Promise.resolve(k?.close?.()).catch(()=>{}),k=void 0,new Error("IM client 缺少产品事件 API");P=a,w=P.connection.subscribe(e=>{if(("message:updated"===e.type||"message:received"===e.type)&&"failed"===e.message.status&&"media.uploadInterrupted"===e.message.failure?.displayCode&&!1===e.message.failure.retryable){const r=e.message,o=l({conversationType:r.conversationType,conversationId:r.conversationId,messageId:r.id});F.remove(o),F.removeByPrefix(`${o}\0`)}for(const r of H)r(e)}),void 0!==d&&(I=d.subscribe(e=>{for(const r of K)r(e)})),A.record("debug","chat-kit","session","client-subscriptions-established",()=>D())}return P}function z(){const e=q();return x??(x=n(e,{coreApiAvailable:T})),x}function G(){$=/* @__PURE__ */new WeakMap,F.clearAll()}return{getClient:()=>P,getProductClient:()=>null===P?null:z(),ensureProductClient:z,getConnectionState:()=>P?.connection.state??"idle",getGeneration:()=>B,getCredentials:()=>U,getMediaConfig:()=>b?.getMediaConfig(),getDiagnostics:()=>A,configureHost(e){b=e},applySession(e,r,o){const t=e?.userId??"",n=e?.token??"",i=null!==P&&(U.userId!==t||U.token!==n);return i&&W(U.userId===t&&""!==n),U.wsUrl=r.wsUrl,U.cmHttpBaseUrl=r.cmHttpBaseUrl,U.userId=t,U.token=n,U.deviceToken=o,U.channelType="0",A.record("info","chat-kit","session","session-applied",()=>({data:{accountId:t,hasToken:""!==n,didReset:i}})),{didReset:i,hasToken:""!==n}},ensureClient:q,async prepare(){if(S)return{ok:!1,errorKey:"lifecycle.disposed"};if(""===U.userId)return{ok:!1,errorKey:"lifecycle.missingLoginState"};const e=Date.now(),r=D();A.record("info","chat-kit","session","prepare-start",()=>r);try{const o=U.userId,t=U.token;if(void 0!==M&&await M,S||B!==r.generation||U.userId!==o||U.token!==t)throw new Error("IM session 已变化,取消旧 prepare");if(R)throw new Error("旧 IM Client 未能完成清理,请刷新后重试",{cause:E});const n=q();return await n.connection.prepare(),A.record("info","chat-kit","session","prepare-complete",()=>({...r,durationMs:Date.now()-e})),{ok:!0}}catch(o){A.record("error","chat-kit","session","prepare-failed",()=>({...r,durationMs:Date.now()-e,error:{message:"ChatRuntime prepare 失败",data:o}}));const t=m(o);return void 0!==t?{ok:!1,errorKey:t}:{ok:!1,errorKey:"lifecycle.prepareFailed",errorParams:{reason:o instanceof Error?o.message:String(o)}}}},async connect(){if(S)return{ok:!1,errorKey:"lifecycle.disposed"};if(""===U.wsUrl||""===U.userId||""===U.token)return{ok:!1,errorKey:"lifecycle.missingConnectParams"};const e=Date.now(),r=D();A.record("info","chat-kit","connection","connect-start",()=>r);try{const o=U.userId,t=U.token;if(void 0!==M&&await M,S||B!==r.generation||U.userId!==o||U.token!==t)throw new Error("IM session 已变化,取消旧 connect");if(R)throw new Error("旧 IM Client 未能完成清理,请刷新后重试",{cause:E});const n=q();return await n.connection.connect(),A.record("info","chat-kit","connection","connect-complete",()=>({...r,durationMs:Date.now()-e})),{ok:!0}}catch(o){A.record("error","chat-kit","connection","connect-failed",()=>({...r,durationMs:Date.now()-e,error:{message:"ChatRuntime connect 失败",data:o}}));const t=m(o);return void 0!==t?{ok:!1,errorKey:t}:{ok:!1,errorKey:"lifecycle.connectFailed",errorParams:{reason:o instanceof Error?o.message:String(o)}}}},disconnect(){const e=D();A.record("info","chat-kit","connection","disconnect",()=>e),P?.connection.disconnect("im-chat-manual")},async logout(e){const r=Date.now(),o=D();A.record("info","chat-kit","session","logout-start",()=>({...o,data:e}));const t=P;let n,i;if(null!==t)try{i=t.logout(e)}catch(e){n=e}if(U.userId="",U.token="",U.deviceToken="",U.channelType="0",B+=1,void 0!==i)try{await i}catch(e){n=e}if(L={},N={},j={},G(),O.clear(),V(),A.record(void 0===n?"info":"error","chat-kit","session",void 0===n?"logout-complete":"logout-failed",()=>({...o,durationMs:Date.now()-r,...void 0===n?{}:{error:{message:"ChatRuntime logout 失败",data:n}}})),void 0!==n)throw n},resetForAuthChange:W,dispose(){if(S)return;S=!0;const e=D();A.record("info","chat-kit","session","dispose",()=>e),W(!0),H.clear(),K.clear(),_.clear()},subscribeEvents:e=>(H.add(e),()=>{H.delete(e)}),subscribeProductEvents:e=>(K.add(e),()=>{K.delete(e)}),getSenderProfileCache:()=>L,setSenderProfileCache(e){L=e,V()},getGroupMemberNames:()=>N,setGroupMemberNames(e){N=e,V()},getChannelMemberProfiles:()=>j,setChannelMemberProfiles(e){j=e,V()},subscribeProfileChange:e=>(_.add(e),()=>{_.delete(e)}),putSelfVoiceBytes(e,r){for(O.delete(e),O.set(e,r);O.size>20;){const e=O.keys().next().value;if(void 0===e)break;O.delete(e)}},getSelfVoiceBytes:e=>O.get(e),clearSelfVoiceBytes(){O.clear()},rememberLocalVideoPoster(e,r){$.set(e,r)},createLocalMediaPreview(e){const r=URL.createObjectURL(e);return F.register(u(r),r,{byteSize:e.size,evictable:!1,videoPoster:$.get(e)}),r},discardLocalMediaPreview(e){F.remove(u(e))},trackLocalMediaPreview(e,r){F.move(u(r),l(e))},resolveMediaPreviewToRemote(e,r,o,t){const n=l(e);if("image"===r||"video"===r){if(void 0!==t&&!F.bindResource(n,t))return;F.makeEvictable(n,o)}else F.remove(n)},hasMediaBlob:e=>F.has(l(e),e.resourceUrl),acquireMediaBlob:e=>F.acquire(l(e),e.resourceUrl),async clearMediaCache(){const e=P,r=B;if(null===e)throw new Error("IM session is not ready");if(F.clearCached(),await e.media.clearCache(),B!==r||P!==e)throw new Error("IM session changed during media cache cleanup")},cleanupLocalMediaBlobs:G,cleanupConversationMediaBlobs:function(e){F.removeByPrefix(function(e){return`message\0${e.conversationType}\0${e.conversationId}\0`}(e))}}}export{p as createChatRuntime};
@@ -1 +1 @@
1
- function e(e){const t=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set,o=e.revokeObjectUrl??(e=>URL.revokeObjectURL(e)),i=e.now??Date.now,r=e.maxIdleMs;if(!Number.isFinite(r)||r<=0)throw new RangeError("maxIdleMs must be a finite positive number");let n,c;function a(){void 0!==n&&clearTimeout(n),n=void 0,c=void 0}function l(){let e=Number.POSITIVE_INFINITY;for(const s of t.values())s.evictable&&0===s.leases&&(e=Math.min(e,s.lastAccessedAt+r));void 0!==n&&c===e||(a(),Number.isFinite(e)&&(c=e,n=setTimeout(()=>{n=void 0,c=void 0,f()},Math.min(2147483647,Math.max(0,e-i()))),n.unref?.()))}function d(e){e.revoked||(e.revoked=!0,s.delete(e),o(e.url))}function v(e){t.get(e.key)===e&&t.delete(e.key),e.retired=!0,0===e.leases?d(e):s.add(e)}function u(){let e=0,s=0;for(const o of t.values())o.evictable&&(e+=1,s+=o.byteSize+(o.videoPoster?.size??0));return{entries:e,bytes:s}}function f(){{const e=i();for(const s of t.values())s.evictable&&0===s.leases&&e-s.lastAccessedAt>=r&&v(s)}!function(){let s=u();for(;s.entries>e.maxCachedEntries||s.bytes>e.maxCachedBytes;){let e;for(const s of t.values())if(s.evictable&&0===s.leases){e=s;break}if(void 0===e)return;v(e),s=u()}}(),l()}function b(e){const s=t.get(e);void 0!==s&&v(s),f()}return{register:function(e,s,o){const r=o.byteSize??0,n=Number.isFinite(r)&&r>0?Math.floor(r):0,c=t.get(e);if(c?.url===s)return c.byteSize=n,c.videoPoster=o.videoPoster,c.evictable=o.evictable,c.lastAccessedAt=i(),t.delete(e),t.set(e,c),void f();void 0!==c&&v(c),t.set(e,{key:e,url:s,byteSize:n,videoPoster:o.videoPoster,evictable:o.evictable,leases:0,retired:!1,revoked:!1,lastAccessedAt:i()}),f()},move:function(e,s){f();const o=t.get(e);if(void 0===o)return!1;const i=t.get(s);return void 0!==i&&i!==o&&v(i),t.delete(e),o.key=s,t.set(s,o),l(),!0},makeEvictable:function(e,s){f();const o=t.get(e);return void 0!==o&&(void 0!==s&&Number.isFinite(s)&&s>0&&(o.byteSize=Math.floor(s)),o.evictable=!0,o.lastAccessedAt=i(),t.delete(e),t.set(e,o),f(),t.get(e)===o)},acquire:function(e){f();const s=t.get(e);if(void 0===s||s.revoked)return;s.leases+=1,s.lastAccessedAt=i(),t.delete(e),t.set(e,s),l();let o=!1;return Object.freeze({url:s.url,...void 0===s.videoPoster?{}:{videoPoster:s.videoPoster},release(){o||(o=!0,s.leases=Math.max(0,s.leases-1),0!==s.leases||s.revoked||(s.lastAccessedAt=i()),s.retired&&0===s.leases&&d(s),f())}})},has:e=>(f(),t.has(e)&&!t.get(e).revoked),remove:b,removeByPrefix:function(e){for(const s of[...t.keys()])s.startsWith(e)&&b(s)},clearAll:function(){a();const e=[...t.values()];t.clear();for(const t of[...e,...s])d(t);s.clear()},clearCached:function(){for(const e of t.values())e.evictable&&v(e);f()},prune:f,getStats:()=>(f(),Object.freeze({activeEntries:t.size,retiredEntries:s.size,...u()}))}}export{e as createMediaObjectUrlRegistry};
1
+ function e(e){const t=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set,r=e.revokeObjectUrl??(e=>URL.revokeObjectURL(e)),s=e.now??Date.now,i=e.maxIdleMs;if(!Number.isFinite(i)||i<=0)throw new RangeError("maxIdleMs must be a finite positive number");let n,c;function l(){void 0!==n&&clearTimeout(n),n=void 0,c=void 0}function a(){let e=Number.POSITIVE_INFINITY;for(const o of t.values())o.evictable&&0===o.leases&&(e=Math.min(e,o.lastAccessedAt+i));void 0!==n&&c===e||(l(),Number.isFinite(e)&&(c=e,n=setTimeout(()=>{n=void 0,c=void 0,f()},Math.min(2147483647,Math.max(0,e-s()))),n.unref?.()))}function d(e){e.revoked||(e.revoked=!0,o.delete(e),r(e.url))}function u(e){t.get(e.key)===e&&t.delete(e.key),e.retired=!0,0===e.leases?d(e):o.add(e)}function v(){let e=0,o=0;for(const r of t.values())r.evictable&&(e+=1,o+=r.byteSize+(r.videoPoster?.size??0));return{entries:e,bytes:o}}function f(){{const e=s();for(const o of t.values())o.evictable&&0===o.leases&&e-o.lastAccessedAt>=i&&u(o)}!function(){let o=v();for(;o.entries>e.maxCachedEntries||o.bytes>e.maxCachedBytes;){let e;for(const o of t.values())if(o.evictable&&0===o.leases){e=o;break}if(void 0===e)return;u(e),o=v()}}(),a()}function b(e){const o=t.get(e);void 0!==o&&u(o),f()}return{register:function(e,o,r){const i=r.byteSize??0,n=Number.isFinite(i)&&i>0?Math.floor(i):0,c=t.get(e);if(c?.url===o)return c.byteSize=n,c.videoPoster=r.videoPoster,c.evictable=r.evictable,c.lastAccessedAt=s(),t.delete(e),t.set(e,c),void f();void 0!==c&&u(c),t.set(e,{key:e,url:o,resourceUrl:o,byteSize:n,videoPoster:r.videoPoster,evictable:r.evictable,leases:0,retired:!1,revoked:!1,lastAccessedAt:s()}),f()},move:function(e,o){f();const r=t.get(e);if(void 0===r)return!1;const s=t.get(o);return void 0!==s&&s!==r&&u(s),t.delete(e),r.key=o,t.set(o,r),a(),!0},bindResource:function(e,o){f();const r=t.get(e);return void 0!==r&&(r.resourceUrl===o||(r.resourceUrl.startsWith("blob:")&&/^https?:\/\//i.test(o)?(r.resourceUrl=o,!0):(u(r),f(),!1)))},makeEvictable:function(e,o){f();const r=t.get(e);return void 0!==r&&(void 0!==o&&Number.isFinite(o)&&o>0&&(r.byteSize=Math.floor(o)),r.evictable=!0,r.lastAccessedAt=s(),t.delete(e),t.set(e,r),f(),t.get(e)===r)},acquire:function(e,o){f();const r=t.get(e);if(void 0===r||r.revoked||void 0!==o&&r.resourceUrl!==o)return;r.leases+=1,r.lastAccessedAt=s(),t.delete(e),t.set(e,r),a();let i=!1;return Object.freeze({url:r.url,...void 0===r.videoPoster?{}:{videoPoster:r.videoPoster},release(){i||(i=!0,r.leases=Math.max(0,r.leases-1),0!==r.leases||r.revoked||(r.lastAccessedAt=s()),r.retired&&0===r.leases&&d(r),f())}})},has:(e,o)=>{f();const r=t.get(e);return void 0!==r&&!r.revoked&&(void 0===o||r.resourceUrl===o)},remove:b,removeByPrefix:function(e){for(const o of[...t.keys()])o.startsWith(e)&&b(o)},clearAll:function(){l();const e=[...t.values()];t.clear();for(const t of[...e,...o])d(t);o.clear()},clearCached:function(){for(const e of t.values())e.evictable&&u(e);f()},prune:f,getStats:()=>(f(),Object.freeze({activeEntries:t.size,retiredEntries:o.size,...v()}))}}export{e as createMediaObjectUrlRegistry};
@@ -1 +1 @@
1
- function e(e,n){if("supergroup"!==e.conversationType)return{conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id,...void 0===n?{}:{itemIndex:n}}}function n(n,t,i){const o=n.getClient(),r=e(t,i);if(null===o||void 0===r)throw new Error("media download unavailable");o.media.prioritizeDownload(r)}async function t(n,t,i,o){const r=n.getClient(),a=e(t,o);if(null===r||void 0===a)throw new Error("media download unavailable");const l=void 0===i?void 0:r.media.subscribe(e=>{const n=e.find(e=>"download"===e.direction&&e.messageId===a.messageId&&e.itemIndex===o&&e.ref.conversationType===a.conversation.conversationType&&e.ref.conversationId===a.conversation.conversationId);void 0!==n&&i(n.percent)});try{return await r.media.download(a)}finally{l?.()}}function i(e){return"object"==typeof e&&null!==e&&"code"in e&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===e.code}async function o(e,n){const t=e.getClient();if(null===t)return null;const i=e.getGeneration(),o=await t.media.prepareLocalPreview(n);return null===o||e.getGeneration()!==i?null:("video"===n.kind&&"displayPoster"in o&&o.displayPoster&&e.rememberLocalVideoPoster(n.file,o.displayPoster),o)}function r(e){return e.length>=3&&255===e[0]&&216===e[1]&&255===e[2]?"image/jpeg":e.length>=8&&137===e[0]&&80===e[1]&&78===e[2]&&71===e[3]?"image/png":e.length>=6&&71===e[0]&&73===e[1]&&70===e[2]?"image/gif":e.length>=12&&87===e[8]&&69===e[9]&&66===e[10]&&80===e[11]?"image/webp":null}async function a(e){const n=r(new Uint8Array(await e.slice(0,12).arrayBuffer()));return null===n?null:URL.createObjectURL(e.type===n?e:e.slice(0,e.size,n))}function l(e){return e.length>=4&&26===e[0]&&69===e[1]&&223===e[2]&&163===e[3]?"video/webm":(e.length>=8&&102===e[4]&&116===e[5]&&121===e[6]&&e[7],"video/mp4")}function c(e,n,t){return e.acquireMediaBlob({conversationType:n.conversationType,conversationId:n.conversationId,messageId:n.id,...void 0===t?{}:{itemIndex:t}})}async function s(e,n,i){const o=e.getClient(),r=n.body.voice;if(null===o||void 0===r)return null;const a=e.getSelfVoiceBytes(n.id);if(void 0!==a)return a;const l=e.getGeneration();try{const o=new Uint8Array(await(await t(e,n)).arrayBuffer());return 0===o.length?(e.getGeneration()===l&&i.setNote(i.t("media.voiceLoadEmpty")),null):o}catch(n){return e.getGeneration()===l&&i.setNote(i.t("media.voiceLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function u(e,n,o,r){const a=e.getClient(),l=n.body.video;if(null===a||void 0===l)return null;const c=e.getGeneration();try{const i=await t(e,n,r);if(0===i.size)return e.getGeneration()===c&&o.setNote(o.t("media.videoOpenEmpty")),null;const a=URL.createObjectURL(i);return e.getGeneration()!==c?(URL.revokeObjectURL(a),null):a}catch(n){return e.getGeneration()!==c||i(n)||o.setNote(o.t("media.videoLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function d(n,t){const i=n.getClient(),o=e(t);if(null===i||void 0===o||void 0===t.body.video)return null;const r=n.getGeneration();try{const e=await i.media.getCached(o);if(null===e||0===e.size||n.getGeneration()!==r)return null;const t=new Uint8Array(await e.slice(0,12).arrayBuffer()),a=e.type||l(t);return n.getGeneration()!==r?null:URL.createObjectURL(e.type===a?e:e.slice(0,e.size,a))}catch{return null}}async function g(e,n,o,r,l){const c=e.getClient(),s=n.body.mediaAlbum?.items[o];if(null===c||void 0===s)return null;const u="video"===s.kind,d=e.getGeneration();try{const i=await t(e,n,l,o);if(u&&0===i.size)return e.getGeneration()===d&&r.setNote(r.t("media.videoOpenEmpty")),null;const c=u?URL.createObjectURL(i):await a(i);return null===c?(e.getGeneration()===d&&r.setNote(r.t("media.imageInvalid",{size:i.size})),null):e.getGeneration()!==d?(URL.revokeObjectURL(c),null):c}catch(n){return e.getGeneration()!==d||i(n)||r.setNote(r.t(u?"media.videoLoadFailed":"media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function v(n,t,i){const o=n.getClient(),r=t.body.mediaAlbum?.items[i],l=e(t,i);if(null===o||void 0===l||void 0===r||!/^https?:\/\//i.test(r.url))return null;const c=n.getGeneration();try{const e=await o.media.getCached(l);if(null===e||0===e.size||n.getGeneration()!==c)return null;const t="video"===r.kind?URL.createObjectURL(e):await a(e);return null===t?null:n.getGeneration()!==c?(URL.revokeObjectURL(t),null):t}catch{return null}}async function f(e,n,o){const r=e.getClient(),l=n.body.image;if(null===r||void 0===l)return null;const c=e.getGeneration();try{const i=await t(e,n),r=await a(i);return null===r?(e.getGeneration()===c&&o.setNote(o.t("media.imageInvalid",{size:i.size})),null):e.getGeneration()!==c?(URL.revokeObjectURL(r),null):r}catch(n){return e.getGeneration()!==c||i(n)||o.setNote(o.t("media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function m(n,t){const i=n.getClient(),o=e(t);if(null===i||void 0===o||void 0===t.body.image)return null;const r=n.getGeneration();try{const e=await i.media.getCached(o);if(null===e||0===e.size||n.getGeneration()!==r)return null;const t=await a(e);return null===t?null:n.getGeneration()!==r?(URL.revokeObjectURL(t),null):t}catch{return null}}async function y(e,n,o,r,a){const l=e.getClient(),c=void 0===a?n.body.file:n.body.filesAlbum?.items[a];if(null===l||void 0===c)return null;const s=e.getGeneration();try{const i=await t(e,n,r,a);if(0===i.size)return e.getGeneration()===s&&o.setNote(o.t("media.fileDownloadEmpty")),null;const l=URL.createObjectURL(i);return e.getGeneration()!==s?(URL.revokeObjectURL(l),null):l}catch(n){return e.getGeneration()!==s||i(n)||o.setNote(o.t("media.fileDownloadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}export{c as acquireMediaBlob,r as detectImageMime,l as detectVideoMime,m as loadCachedImageObjectUrl,v as loadCachedMediaAlbumItemObjectUrl,d as loadCachedVideoObjectUrl,y as loadFileObjectUrl,f as loadImageObjectUrl,g as loadMediaAlbumItemObjectUrl,u as loadVideoObjectUrl,s as loadVoiceBytes,o as prepareLocalMediaPreview,n as prioritizeMediaDownload};
1
+ function e(e){if(e?.aborted)throw e.reason??new DOMException("媒体显示图准备已取消","AbortError")}async function n(e){try{return await e()}catch(e){if("object"==typeof e&&null!==e&&"code"in e&&"IM_SDK_MEDIA_CACHE_READ_FAILED"===e.code)return null;throw e}}function t(e,n){const t=void 0===n?1:e.body.mediaAlbum?.items.length??1;return t<=1?1440:2===t?1080:768}async function i(t,i,o,r,a){if(!i.startsWith("blob:"))throw new TypeError("气泡显示图只接受本机 blob 地址");e(r);const l=t.getClient();if(null===l)return null;const u=t.getGeneration(),c=void 0===a?void 0:s(a.message,a.itemIndex),d=void 0===a?void 0:void 0===a.itemIndex?a.message.body.image?.url:a.message.body.mediaAlbum?.items[a.itemIndex]?.url,g=()=>t.getGeneration()===u&&t.getClient()===l;if(void 0!==c){const t=await n(()=>l.media.getCachedImageDisplay(c,{maxSize:o,signal:r}));if(e(r),!g())return null;if(null!==t)return URL.createObjectURL(t)}const m=await fetch(i,{signal:r});if(!m.ok)throw new Error("无法读取气泡显示图的本机原文件");const f=await m.blob();if(e(r),!g())return null;const v=await l.media.prepareLocalImageDisplay({file:f,maxSize:o,signal:r,message:c,expectedResourceUrl:d});return e(r),null!==v&&g()?URL.createObjectURL(v):null}async function o(i,o,r,a){e(a);const l=i.getClient(),u=s(o,r),c=void 0===r?o.body.image:o.body.mediaAlbum?.items[r];if(null===l||void 0===u||void 0===c||"kind"in c&&"image"!==c.kind)return null;const d=c.url,g=t(o,r),m=i.getGeneration(),f=()=>i.getGeneration()===m&&i.getClient()===l,v=await n(()=>l.media.getCachedImageDisplay(u,{maxSize:g,signal:a}));if(e(a),!f())return null;if(null!==v)return URL.createObjectURL(v);if(!/^https?:\/\//i.test(d))return null;const b=await l.media.getCached(u);if(e(a),null===b||!f())return null;const y=await l.media.prepareLocalImageDisplay({file:b,maxSize:g,signal:a,message:u,expectedResourceUrl:d});return e(a),null!==y&&f()?URL.createObjectURL(y):null}async function r(n,r,a,l,s){const u=n.getGeneration(),c=n.getClient(),d=await o(n,r,s,l.signal);if(null!==d)return d;if(e(l.signal),n.getGeneration()!==u||n.getClient()!==c)return null;const g=void 0===s?await R(n,r,a,l):await p(n,r,s,a,void 0,l);if(null===g)return null;try{return await i(n,g,t(r,s),l.signal,{message:r,itemIndex:s})}finally{URL.revokeObjectURL(g)}}async function a(t,i,o,r,a){if(!i.startsWith("blob:"))throw new TypeError("视频封面只接受本机 blob 地址");e(o);const l=t.getClient();if(null===l)return null;const u=t.getGeneration(),c=()=>t.getGeneration()===u&&t.getClient()===l,d=void 0===r?void 0:s(r.message,r.itemIndex),g=void 0===r?void 0:void 0===r.itemIndex?r.message.body.video?.url:r.message.body.mediaAlbum?.items[r.itemIndex]?.url;if(void 0!==d){const t=await n(()=>l.media.getCachedVideoPoster(d,{signal:o}));if(e(o),!c())return null;if(null!==t)return URL.createObjectURL(t)}let m;if(void 0===a){const e=await fetch(i,{signal:o});if(!e.ok)throw new Error("无法读取本机视频");m=await e.blob()}if(e(o),!c())return null;const f=await l.media.prepareLocalVideoPoster({file:m,poster:a,signal:o,message:d,expectedResourceUrl:g});return e(o),null!==f&&c()?URL.createObjectURL(f):null}async function l(t,i,o,r){e(r);const a=t.getClient(),l=s(i,o),u=void 0===o?i.body.video:i.body.mediaAlbum?.items[o];if(null===a||void 0===l||void 0===u||"kind"in u&&"video"!==u.kind)return null;const c=u.url,d=t.getGeneration(),g=()=>t.getGeneration()===d&&t.getClient()===a,m=await n(()=>a.media.getCachedVideoPoster(l,{signal:r}));if(e(r),!g())return null;if(null!==m)return URL.createObjectURL(m);if(!/^https?:\/\//i.test(c))return null;const f=await a.media.getCached(l);if(e(r),null===f||!g())return null;const v=await a.media.prepareLocalVideoPoster({file:f,signal:r,message:l,expectedResourceUrl:c});return e(r),null!==v&&g()?URL.createObjectURL(v):null}function s(e,n){if("supergroup"!==e.conversationType)return{conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id,...void 0===n?{}:{itemIndex:n}}}function u(e,n,t){const i=e.getClient(),o=s(n,t);if(null===i||void 0===o)throw new Error("media download unavailable");i.media.prioritizeDownload(o)}async function c(e,n,t,i,o){const r=e.getClient(),a=s(n,i);if(null===r||void 0===a)throw new Error("media download unavailable");const l=void 0===t?void 0:r.media.subscribe(e=>{const n=e.find(e=>"download"===e.direction&&e.messageId===a.messageId&&e.itemIndex===i&&e.ref.conversationType===a.conversation.conversationType&&e.ref.conversationId===a.conversation.conversationId);void 0!==n&&t(n.percent)});try{return await(void 0===o?r.media.download(a):r.media.download(a,o))}finally{l?.()}}function d(e){return"object"==typeof e&&null!==e&&"code"in e&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===e.code}async function g(e,n){const t=e.getClient();if(null===t)return null;const i=e.getGeneration(),o=await t.media.prepareLocalPreview(n);return null===o||e.getGeneration()!==i?null:("video"===n.kind&&"displayPoster"in o&&o.displayPoster&&e.rememberLocalVideoPoster(n.file,o.displayPoster),o)}function m(e){return e.length>=3&&255===e[0]&&216===e[1]&&255===e[2]?"image/jpeg":e.length>=8&&137===e[0]&&80===e[1]&&78===e[2]&&71===e[3]?"image/png":e.length>=6&&71===e[0]&&73===e[1]&&70===e[2]?"image/gif":e.length>=12&&87===e[8]&&69===e[9]&&66===e[10]&&80===e[11]?"image/webp":null}async function f(e){const n=m(new Uint8Array(await e.slice(0,12).arrayBuffer()));return null===n?null:URL.createObjectURL(e.type===n?e:e.slice(0,e.size,n))}function v(e){return e.length>=4&&26===e[0]&&69===e[1]&&223===e[2]&&163===e[3]?"video/webm":(e.length>=8&&102===e[4]&&116===e[5]&&121===e[6]&&e[7],"video/mp4")}function b(e,n,t){return e.acquireMediaBlob({conversationType:n.conversationType,conversationId:n.conversationId,messageId:n.id,resourceUrl:void 0===t?n.body.image?.url??n.body.video?.url??n.body.sticker?.url:n.body.mediaAlbum?.items[t]?.url,...void 0===t?{}:{itemIndex:t}})}async function y(e,n,t){const i=e.getClient(),o=n.body.voice;if(null===i||void 0===o)return null;const r=e.getSelfVoiceBytes(n.id);if(void 0!==r)return r;const a=e.getGeneration();try{const i=new Uint8Array(await(await c(e,n)).arrayBuffer());return 0===i.length?(e.getGeneration()===a&&t.setNote(t.t("media.voiceLoadEmpty")),null):i}catch(n){return e.getGeneration()===a&&t.setNote(t.t("media.voiceLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function w(e,n,t,i){const o=e.getClient(),r=n.body.video;if(null===o||void 0===r)return null;const a=e.getGeneration();try{const o=await c(e,n,i);if(0===o.size)return e.getGeneration()===a&&t.setNote(t.t("media.videoOpenEmpty")),null;const r=URL.createObjectURL(o);return e.getGeneration()!==a?(URL.revokeObjectURL(r),null):r}catch(n){return e.getGeneration()!==a||d(n)||t.setNote(t.t("media.videoLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function L(e,n){const t=e.getClient(),i=s(n);if(null===t||void 0===i||void 0===n.body.video)return null;const o=e.getGeneration();try{const n=await t.media.getCached(i);if(null===n||0===n.size||e.getGeneration()!==o)return null;const r=new Uint8Array(await n.slice(0,12).arrayBuffer()),a=n.type||v(r);return e.getGeneration()!==o?null:URL.createObjectURL(n.type===a?n:n.slice(0,n.size,a))}catch{return null}}async function p(e,n,t,i,o,r){const a=e.getClient(),l=n.body.mediaAlbum?.items[t];if(null===a||void 0===l||r?.signal?.aborted)return null;const s="video"===l.kind,u=e.getGeneration();try{const a=await c(e,n,o,t,r);if(e.getGeneration()!==u||r?.signal?.aborted)return null;if(s&&0===a.size)return e.getGeneration()===u&&i.setNote(i.t("media.videoOpenEmpty")),null;const l=s?URL.createObjectURL(a):await f(a);return e.getGeneration()!==u||r?.signal?.aborted?(null!==l&&URL.revokeObjectURL(l),null):null===l?(e.getGeneration()===u&&i.setNote(i.t("media.imageInvalid",{size:a.size})),null):l}catch(n){return e.getGeneration()!==u||r?.signal?.aborted||d(n)||i.setNote(i.t(s?"media.videoLoadFailed":"media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function U(e,n,t){const i=e.getClient(),o=n.body.mediaAlbum?.items[t],r=s(n,t);if(null===i||void 0===r||void 0===o||!/^https?:\/\//i.test(o.url))return null;const a=e.getGeneration();try{const n=await i.media.getCached(r);if(null===n||0===n.size||e.getGeneration()!==a)return null;const t="video"===o.kind?URL.createObjectURL(n):await f(n);return null===t?null:e.getGeneration()!==a?(URL.revokeObjectURL(t),null):t}catch{return null}}async function R(e,n,t,i){const o=e.getClient(),r=n.body.image;if(null===o||void 0===r||i?.signal?.aborted)return null;const a=e.getGeneration();try{const o=await c(e,n,void 0,void 0,i);if(e.getGeneration()!==a||i?.signal?.aborted)return null;const r=await f(o);return e.getGeneration()!==a||i?.signal?.aborted?(null!==r&&URL.revokeObjectURL(r),null):null===r?(e.getGeneration()===a&&t.setNote(t.t("media.imageInvalid",{size:o.size})),null):r}catch(n){return e.getGeneration()!==a||i?.signal?.aborted||d(n)||t.setNote(t.t("media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function G(e,n){const t=e.getClient(),i=s(n);if(null===t||void 0===i||void 0===n.body.image)return null;const o=e.getGeneration();try{const n=await t.media.getCached(i);if(null===n||0===n.size||e.getGeneration()!==o)return null;const r=await f(n);return null===r?null:e.getGeneration()!==o?(URL.revokeObjectURL(r),null):r}catch{return null}}async function h(e,n,t,i,o){const r=e.getClient(),a=void 0===o?n.body.file:n.body.filesAlbum?.items[o];if(null===r||void 0===a)return null;const l=e.getGeneration();try{const r=await c(e,n,i,o);if(0===r.size)return e.getGeneration()===l&&t.setNote(t.t("media.fileDownloadEmpty")),null;const a=URL.createObjectURL(r);return e.getGeneration()!==l?(URL.revokeObjectURL(a),null):a}catch(n){return e.getGeneration()!==l||d(n)||t.setNote(t.t("media.fileDownloadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}export{b as acquireMediaBlob,m as detectImageMime,v as detectVideoMime,o as loadCachedImageDisplayObjectUrl,G as loadCachedImageObjectUrl,U as loadCachedMediaAlbumItemObjectUrl,L as loadCachedVideoObjectUrl,l as loadCachedVideoPosterObjectUrl,h as loadFileObjectUrl,r as loadImageDisplayObjectUrl,R as loadImageObjectUrl,p as loadMediaAlbumItemObjectUrl,w as loadVideoObjectUrl,y as loadVoiceBytes,i as prepareImageDisplayObjectUrl,g as prepareLocalMediaPreview,a as prepareVideoPosterObjectUrl,u as prioritizeMediaDownload,t as resolveImageDisplayMaxSize};
@@ -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.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
+ 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 +1 @@
1
- function e(e){const{message:t}=e,i=e=>e.messageId===t.id&&e.ref.conversationId===t.conversationId&&e.ref.conversationType===t.conversationType,n=void 0!==e.uploadTask&&i(e.uploadTask)?e.uploadTask:void 0,s="uploading"===t.status||"failed"===t.status&&(!0===t.failure?.displayCode?.startsWith("media.")||void 0!==n&&"completed"!==n.state),a=s?"upload":"download",d=t.body.mediaAlbum?.items??t.body.filesAlbum?.items,o=void 0===e.aggregateFrom?[e.itemIndex]:(d??[]).map((e,t)=>t).slice(e.aggregateFrom),r=o.map(a=>{const o=void 0===a?t.body.image??t.body.video??t.body.file:d?.[a];if(s){const e=void 0===a?void 0:n?.items?.find(e=>e.itemIndex===a);return{state:"completed"===e?.state?"completed":"failed"===t.status?"failed":"paused"===n?.state?"paused":"running"===(e?.state??n?.state)?"running":"waiting",percent:e?.percent??(void 0===a?n?.percent:void 0),size:e?.bytesTotal??o?.size}}const r=e.downloadTasks.find(e=>i(e)&&e.itemIndex===a&&"download"===e.direction),l="failed"===r?.state?"failed":"running"===r?.state||"queued"===r?.state?"running":"completed"===r?.state&&!e.unavailableItemIndices?.includes(a)||o?.url.startsWith("blob:")||e.availableItemIndices?.includes(a)?"completed":"waiting";return{state:l,percent:"completed"===l?100:"waiting"===l&&"completed"===r?.state?0:r?.percent??0,size:r?.bytesTotal??o?.size}}),l=r.some(e=>"failed"===e.state)?"failed":r.some(e=>"running"===e.state)?"running":r.some(e=>"paused"===e.state)?"paused":r.length>0&&r.every(e=>"completed"===e.state)?"completed":"waiting",c="download"===a&&"waiting"===l&&o.some(t=>e.pendingItemIndices?.includes(t))?{resolving:!0}:{};if(1===r.length)return{direction:a,state:l,percent:r[0].percent,...c};if(0===r.length||r.some(e=>!Number.isFinite(e.size)||e.size<=0||void 0===e.percent))return{direction:a,state:l,...c};const u=r.reduce((e,t)=>e+t.size,0);return{direction:a,state:l,percent:Math.round(r.reduce((e,t)=>e+t.size*t.percent,0)/u),...c}}export{e as resolveMediaTransferPresentation};
1
+ function e(e){const{message:t}=e,i=e=>e.messageId===t.id&&e.ref.conversationId===t.conversationId&&e.ref.conversationType===t.conversationType,n=void 0!==e.uploadTask&&i(e.uploadTask)?e.uploadTask:void 0,s="uploading"===t.status||"failed"===t.status&&(!0===t.failure?.displayCode?.startsWith("media.")||void 0!==n&&"completed"!==n.state),a=s?"upload":"download",d=t.body.mediaAlbum?.items??t.body.filesAlbum?.items,o=void 0===e.aggregateFrom?[e.itemIndex]:(d??[]).map((e,t)=>t).slice(e.aggregateFrom),r=o.map(a=>{const o=void 0===a?t.body.image??t.body.video??t.body.file:d?.[a];if(s){const e=void 0===a?void 0:n?.items?.find(e=>e.itemIndex===a);return{state:"completed"===e?.state?"completed":"failed"===t.status?"failed":"paused"===n?.state?"paused":"running"===(e?.state??n?.state)?"running":"waiting",percent:e?.percent??(void 0===a?n?.percent:void 0),size:e?.bytesTotal??o?.size}}if(e.displayAvailableItemIndices?.includes(a))return{state:"completed",percent:100,size:o?.size};const r=e.downloadTasks.find(e=>i(e)&&e.itemIndex===a&&"download"===e.direction),l="failed"===r?.state?"failed":"running"===r?.state||"queued"===r?.state?"running":"completed"===r?.state&&!e.unavailableItemIndices?.includes(a)||o?.url.startsWith("blob:")||e.availableItemIndices?.includes(a)?"completed":"waiting";return{state:l,percent:"completed"===l?100:"waiting"===l&&"completed"===r?.state?0:r?.percent??0,size:r?.bytesTotal??o?.size}}),l=r.some(e=>"failed"===e.state)?"failed":r.some(e=>"running"===e.state)?"running":r.some(e=>"paused"===e.state)?"paused":r.length>0&&r.every(e=>"completed"===e.state)?"completed":"waiting",c="download"===a&&"waiting"===l&&o.some(t=>e.pendingItemIndices?.includes(t))?{resolving:!0}:{};if(1===r.length)return{direction:a,state:l,percent:r[0].percent,...c};if(0===r.length||r.some(e=>!Number.isFinite(e.size)||e.size<=0||void 0===e.percent))return{direction:a,state:l,...c};const u=r.reduce((e,t)=>e+t.size,0);return{direction:a,state:l,percent:Math.round(r.reduce((e,t)=>e+t.size*t.percent,0)/u),...c}}export{e as resolveMediaTransferPresentation};
@@ -1 +1 @@
1
- import{shallowReactive as e}from"vue";import{createThreadVisibilityTargets as t}from"./thread-visibility-targets.js";function n(n){const i=/* @__PURE__ */new Map,o=/* @__PURE__ */new Map,l=e(/* @__PURE__ */new Map),r=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let a=[],c=!1;const g=e=>{const t=i.get(e.channel);return void 0===t?e.channel:`${e.channel}\0${t.getKey(e.item)}`},d=t({getRoot:n.getRoot,batchRegistration:n.batchRegistration,getKey:e=>e.key,revealMarginPx:n.revealMarginPx,preloadMarginPx:n.preloadMarginPx,minimumIntersectionRatio:n.minimumIntersectionRatio,scrollIdleMs:n.scrollIdleMs,visibilityDwellMs:n.visibilityDwellMs,onScrollingChange:e=>{for(const t of i.values())t.onScrollingChange?.(e)},onRevealed:e=>e.targets.forEach(e=>i.get(e.channel)?.onRevealed?.(e.item)),onActivated:e=>e.targets.forEach(e=>i.get(e.channel)?.onActivated?.(e.item)),onSettledPreloadChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i){const i=t.filter(t=>t.channel===e).map(e=>e.item);n.onSettledPreloadChange?.(i.slice(0,Math.max(0,n.maxPreloadTargets??Number.POSITIVE_INFINITY)))}},onSettledVisibleChange:e=>{f(e.flatMap(e=>e.targets))}});function f(e){a=e;for(const[t,n]of i){const i=e.filter(e=>e.channel===t).map(e=>e.item),o=void 0===n.maxSettledVisible?i:i.slice(0,n.maxSettledVisible);n.onSettledVisibleChange?.(o)}}function h(e){const t=r.get(e),n=[];for(const e of i.keys()){const i=t?.get(e);void 0!==i&&n.push(i)}const c=l.get(e);if(void 0!==c&&n.length===c.targets.length&&n.every((e,t)=>e===c.targets[t]))return;if(0===n.length)void 0!==c&&(l.delete(e),s.get(c.key)===e&&(s.delete(c.key),d.register(c,null)));else{const t={key:JSON.stringify(n.map(g)),targets:n};void 0!==c&&c.key!==t.key&&s.get(c.key)===e&&s.delete(c.key),l.set(e,t),s.set(t.key,e),d.register(t,e)}const h=a.flatMap(e=>{const t=o.get(e.channel)?.get(i.get(e.channel).getKey(e.item));return void 0===t?[]:[t.target]});(h.length!==a.length||h.some((e,t)=>e!==a[t]))&&f(h)}return{createFactory:function(t){return n=>{if(c)throw new Error("Thread visibility target group 已释放");if(i.has(t))throw new Error(`Thread visibility channel 已存在: ${t}`);i.set(t,n);const s=e(/* @__PURE__ */new Map);o.set(t,s);const a=/* @__PURE__ */new Map;let g=!1;function f(e){a.delete(e);const n=r.get(e);n?.delete(t),0===n?.size&&r.delete(e)}function v(){const e=[...a.keys()];s.clear();for(const t of e)f(t);for(const t of e)h(t);n.onScrollingChange?.(!1),n.onSettledVisibleChange?.([]),n.onSettledPreloadChange?.([])}function m(e,t){const i=s.get(n.getKey(e)),o=void 0===i?void 0:l.get(i.element);return void 0!==o&&t(o)}return{register(e,i){if(g||c)return;const o=n.getKey(e),v=s.get(o);if(null===i)return void(void 0!==v&&(s.delete(o),f(v.element),h(v.element)));if(v?.target.item===e&&v.element===i){const e=l.get(i);return void(void 0!==e&&d.register(e,i))}const m=v?.target.item===e?v.target:(e=>({channel:t,item:e}))(e),u=a.get(i);void 0!==u&&u!==o&&s.delete(u),void 0!==v&&v.element!==i&&f(v.element),s.set(o,{target:m,element:i}),a.set(i,o);let y=r.get(i);void 0===y&&(y=/* @__PURE__ */new Map,r.set(i,y)),y.set(t,m),h(i),void 0!==v&&v.element!==i&&h(v.element)},isRevealed:e=>m(e,d.isRevealed),isActivated:e=>m(e,d.isActivated),isSettledVisible:e=>m(e,d.isSettledVisible),isScrolling:d.isScrolling,notifyScroll:d.notifyScroll,refresh:d.refresh,reset:v,dispose(){g||(v(),g=!0,i.delete(t),o.delete(t))}}}},refresh:d.refresh,dispose(){if(!c){for(const e of l.values())d.register(e,null);l.clear(),r.clear(),s.clear();for(const e of i.values())e.onSettledPreloadChange?.([]);o.clear(),i.clear(),d.dispose(),c=!0}}}}export{n as createThreadVisibilityTargetGroup};
1
+ import{shallowReactive as e}from"vue";import{createThreadVisibilityTargets as t}from"./thread-visibility-targets.js";function n(n){const i=/* @__PURE__ */new Map,o=/* @__PURE__ */new Map,l=e(/* @__PURE__ */new Map),r=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let a=[],c=!1;const g=e=>{const t=i.get(e.channel);return void 0===t?e.channel:`${e.channel}\0${t.getKey(e.item)}`},d=t({getRoot:n.getRoot,batchRegistration:n.batchRegistration,getKey:e=>e.key,revealMarginPx:n.revealMarginPx,preloadMarginPx:n.preloadMarginPx,minimumIntersectionRatio:n.minimumIntersectionRatio,scrollIdleMs:n.scrollIdleMs,visibilityDwellMs:n.visibilityDwellMs,onScrollingChange:e=>{for(const t of i.values())t.onScrollingChange?.(e)},onRevealed:e=>e.targets.forEach(e=>i.get(e.channel)?.onRevealed?.(e.item)),onActivated:e=>e.targets.forEach(e=>i.get(e.channel)?.onActivated?.(e.item)),onSettledPreloadChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i){const i=t.filter(t=>t.channel===e).map(e=>e.item);n.onSettledPreloadChange?.(i.slice(0,Math.max(0,n.maxPreloadTargets??Number.POSITIVE_INFINITY)))}},onViewportVisibleChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i)n.onViewportVisibleChange?.(t.filter(t=>t.channel===e).map(e=>e.item))},onSettledVisibleChange:e=>{f(e.flatMap(e=>e.targets))}});function f(e){a=e;for(const[t,n]of i){const i=e.filter(e=>e.channel===t).map(e=>e.item),o=void 0===n.maxSettledVisible?i:i.slice(0,n.maxSettledVisible);n.onSettledVisibleChange?.(o)}}function h(e){const t=r.get(e),n=[];for(const e of i.keys()){const i=t?.get(e);void 0!==i&&n.push(i)}const c=l.get(e);if(void 0!==c&&n.length===c.targets.length&&n.every((e,t)=>e===c.targets[t]))return;if(0===n.length)void 0!==c&&(l.delete(e),s.get(c.key)===e&&(s.delete(c.key),d.register(c,null)));else{const t={key:JSON.stringify(n.map(g)),targets:n};void 0!==c&&c.key!==t.key&&s.get(c.key)===e&&s.delete(c.key),l.set(e,t),s.set(t.key,e),d.register(t,e)}const h=a.flatMap(e=>{const t=o.get(e.channel)?.get(i.get(e.channel).getKey(e.item));return void 0===t?[]:[t.target]});(h.length!==a.length||h.some((e,t)=>e!==a[t]))&&f(h)}return{createFactory:function(t){return n=>{if(c)throw new Error("Thread visibility target group 已释放");if(i.has(t))throw new Error(`Thread visibility channel 已存在: ${t}`);i.set(t,n);const s=e(/* @__PURE__ */new Map);o.set(t,s);const a=/* @__PURE__ */new Map;let g=!1;function f(e){a.delete(e);const n=r.get(e);n?.delete(t),0===n?.size&&r.delete(e)}function m(){const e=[...a.keys()];s.clear();for(const t of e)f(t);for(const t of e)h(t);n.onScrollingChange?.(!1),n.onViewportVisibleChange?.([]),n.onSettledVisibleChange?.([]),n.onSettledPreloadChange?.([])}function v(e,t){const i=s.get(n.getKey(e)),o=void 0===i?void 0:l.get(i.element);return void 0!==o&&t(o)}return{register(e,i){if(g||c)return;const o=n.getKey(e),m=s.get(o);if(null===i)return void(void 0!==m&&(s.delete(o),f(m.element),h(m.element)));if(m?.target.item===e&&m.element===i){const e=l.get(i);return void(void 0!==e&&d.register(e,i))}const v=m?.target.item===e?m.target:(e=>({channel:t,item:e}))(e),p=a.get(i);void 0!==p&&p!==o&&s.delete(p),void 0!==m&&m.element!==i&&f(m.element),s.set(o,{target:v,element:i}),a.set(i,o);let u=r.get(i);void 0===u&&(u=/* @__PURE__ */new Map,r.set(i,u)),u.set(t,v),h(i),void 0!==m&&m.element!==i&&h(m.element)},isRevealed:e=>v(e,d.isRevealed),isActivated:e=>v(e,d.isActivated),isSettledVisible:e=>v(e,d.isSettledVisible),isScrolling:d.isScrolling,notifyScroll:d.notifyScroll,refresh:d.refresh,reset:m,dispose(){g||(m(),g=!0,i.delete(t),o.delete(t))}}}},refresh:d.refresh,dispose(){if(!c){for(const e of l.values())d.register(e,null);l.clear(),r.clear(),s.clear();for(const e of i.values())e.onSettledPreloadChange?.([]);o.clear(),i.clear(),d.dispose(),c=!0}}}}export{n as createThreadVisibilityTargetGroup};
@@ -1 +1 @@
1
- import{reactive as e,nextTick as t}from"vue";function n(e,t){if(e.width<=0||e.height<=0)return 0;const n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),o=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top));return Math.min(1,n*o/(e.width*e.height))}function o(e,t){return{x:e.x,y:e.top-t,top:e.top-t,bottom:e.bottom+t,left:e.left,right:e.right,width:e.width,height:e.height+2*t,toJSON:()=>({})}}function i(i){const r=Math.max(0,i.scrollIdleMs??140),s=Math.max(0,i.visibilityDwellMs??120),c=Math.min(1,Math.max(0,i.minimumIntersectionRatio??.01)),l=Math.max(0,i.revealMarginPx??0),a=Math.max(0,i.preloadMarginPx??0),f=Math.max(l,a),u=Math.max(0,i.maxPreloadTargets??Number.POSITIVE_INFINITY),g=Math.max(1,i.maxSettledVisible??Number.POSITIVE_INFINITY),d=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,h=e(/* @__PURE__ */new Set),v=/* @__PURE__ */new Set,b=/* @__PURE__ */new Set;let p=[],y=null,M=null,I=null,R=!1,x=!1,k=!1,w=!1;const S=/* @__PURE__ */new Map;let E,N,T=0,P=!1;function C(){T+=1,P=!1,S.clear()}function O(e){const t=[...e].filter(([e,t])=>d.get(e)===t);if(0===t.length)return;const n=z();B(!0,n,t),Y(n,t)}function V(e){if(!i.batchRegistration)return void O(e);for(const[t,n]of e)S.set(t,n);if(P)return;P=!0;const n=T;t(()=>{if(k||n!==T)return;P=!1;const e=[...S];S.clear(),O(e),J()})}function K(){void 0!==E&&clearTimeout(E),E=void 0}function A(){void 0!==N&&clearTimeout(N),N=void 0}function z(){let e;const t=/* @__PURE__ */new Map;return{getRootRect:()=>(void 0===e&&(e=y?.getBoundingClientRect()??null),e),getElementRect(e){let n=t.get(e);return void 0===n&&(n=e.getBoundingClientRect(),t.set(e,n)),n}}}function B(e=!1,t=z(),i=d){if(!e&&null!==M||null===y)return;const r=t.getRootRect();if(null===r)return;const s=o(r,f);for(const[e,o]of i){const i=t.getElementRect(e);o.ratio=n(i,r),o.intersecting=o.ratio>0,o.revealIntersecting=f>0?n(i,s)>0:o.intersecting&&o.ratio>=c}}function F(e){return e.intersecting&&e.ratio>=c}function L(e){const t=m.get(e.key);return void 0!==t&&d.get(t)===e}function Y(e=z(),t=d){const r=[];for(const[i,s]of t)if(s.revealIntersecting&&!h.has(s.key)){if(f>l){if(0===l&&!F(s))continue;if(l>0){const t=e.getRootRect();if(null===t||n(e.getElementRect(i),o(t,l))<=0)continue}}r.push(s)}for(const e of r)L(e)&&!h.has(e.key)&&(h.add(e.key),i.onRevealed?.(e.item))}function _(e,t=!1){const n=new Set(e.map(e=>e.key));if(n.size!==b.size||[...n].some(e=>!b.has(e))||t){b.clear();for(const e of n)b.add(e);i.onSettledVisibleChange?.(e.map(e=>e.item))}}function D(e,t=!1){!t&&e.length===p.length&&e.every((e,t)=>e.key===p[t]?.key&&e.item===p[t]?.item)||(p=e,i.onSettledPreloadChange?.(e.map(e=>e.item)))}function J(){k||R||(A(),N=setTimeout(()=>{N=void 0,function(){if(k||R)return;const e=x;x=!1;const t=T,r=y,s=()=>!k&&!R&&t===T&&y===r,c=z();B(!1,c);const l=c.getRootRect(),f=null===l?0:(l.top+l.bottom)/2,m=[...d.entries()].filter(([,e])=>F(e)).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).sort((e,t)=>Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,g).map(({target:e})=>e);let h;if(void 0!==i.onSettledPreloadChange&&null!==l){const e=o(l,a);h=[...d.entries()].filter(([,e])=>e.revealIntersecting).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).filter(({target:t,rect:o})=>F(t)||a>0&&n(o,e)>0).sort((e,t)=>Number(F(t.target))-Number(F(e.target))||Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,u).map(({target:e})=>e)}if(Y(c),s()&&(_(m.filter(L),e),s())){void 0!==h&&D(h.filter(L),e);for(const e of m){if(!s())return;L(e)&&!v.has(e.key)&&(v.add(e.key),i.onActivated?.(e.item))}}}()},s))}function $(){k||(x=!0,j(!0),D([]),B(),Y(),_([]),A(),K(),E=setTimeout(()=>{E=void 0,j(!1),J()},r))}function j(e){R!==e&&(R=e,i.onScrollingChange?.(e))}function q(){y?.removeEventListener("scroll",$),M?.disconnect(),I?.disconnect(),M=null,I=null,y=null}function G(e=!0){if(k)return;const t=i.getRoot();if(t!==y||null===y)if(D([]),q(),y=t,null!==y){if(y.addEventListener("scroll",$,{passive:!0}),"undefined"!=typeof IntersectionObserver){M=new IntersectionObserver(e=>{for(const t of e){const e=d.get(t.target);void 0!==e&&(e.intersecting=t.isIntersecting,e.ratio=t.intersectionRatio,0===f&&(e.revealIntersecting=t.isIntersecting&&t.intersectionRatio>=c))}Y(),J()},{root:y,threshold:[0,c,1]}),f>0&&(I=new IntersectionObserver(e=>{for(const t of e){const e=d.get(t.target);void 0!==e&&(e.revealIntersecting=t.isIntersecting)}Y(),J()},{root:y,rootMargin:`${f}px 0px`,threshold:0}));for(const e of d.keys())M.observe(e);for(const e of d.keys())I?.observe(e)}V(d)}else e&&!w&&(w=!0,Promise.resolve().then(()=>{w=!1,k||(G(!1),J())}))}function H(e){D(p.filter(t=>t.key!==e)),h.delete(e),v.delete(e),b.delete(e)}return{register(e,t){if(k)return;const n=i.getKey(e),o=h.has(n),r=v.has(n),s=null===t?void 0:d.get(t);void 0!==s&&s.key!==n&&(m.delete(s.key),d.delete(t),H(s.key));const c=m.get(n);if(void 0!==c&&c!==t&&(M?.unobserve(c),I?.unobserve(c),d.delete(c),m.delete(n)),null===t)return void 0!==c&&(M?.unobserve(c),I?.unobserve(c),d.delete(c),m.delete(n)),void H(n);const l=d.get(t);if(l?.key===n&&l.item===e){const e=y;return G(),void(y!==e&&J())}const a={item:e,key:n,intersecting:l?.key===n&&l.intersecting,ratio:l?.key===n?l.ratio:0,revealIntersecting:l?.key===n&&l.revealIntersecting};d.set(t,a),m.set(n,t);const f=y;G(),y===f&&(M?.observe(t),I?.observe(t),V([[t,a]])),o&&i.onRevealed?.(e),r&&L(a)&&i.onActivated?.(e),J()},isRevealed:e=>h.has(i.getKey(e)),isActivated:e=>v.has(i.getKey(e)),isSettledVisible:e=>b.has(i.getKey(e)),isScrolling:()=>R,notifyScroll:$,refresh(){G(),C(),O(d),J()},reset(){C(),K(),A(),j(!1),x=!1,_([]),D([]),q(),d.clear(),m.clear(),h.clear(),v.clear()},dispose(){k||(C(),K(),A(),j(!1),x=!1,_([]),D([]),q(),d.clear(),m.clear(),h.clear(),v.clear(),k=!0)}}}export{i as createThreadVisibilityTargets};
1
+ import{reactive as e,nextTick as t}from"vue";function n(e,t){if(e.width<=0||e.height<=0)return 0;const n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),o=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top));return Math.min(1,n*o/(e.width*e.height))}function o(e,t){return{x:e.x,y:e.top-t,top:e.top-t,bottom:e.bottom+t,left:e.left,right:e.right,width:e.width,height:e.height+2*t,toJSON:()=>({})}}function i(i){const r=Math.max(0,i.scrollIdleMs??140),s=Math.max(0,i.visibilityDwellMs??120),c=Math.min(1,Math.max(0,i.minimumIntersectionRatio??.01)),l=Math.max(0,i.revealMarginPx??0),a=Math.max(0,i.preloadMarginPx??0),f=Math.max(l,a),u=Math.max(0,i.maxPreloadTargets??Number.POSITIVE_INFINITY),g=Math.max(1,i.maxSettledVisible??Number.POSITIVE_INFINITY),m=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,h=e(/* @__PURE__ */new Set),v=/* @__PURE__ */new Set,b=/* @__PURE__ */new Set;let p=[],y=[],M=null,I=null,R=null,k=!1,x=!1,w=!1,S=!1;const N=/* @__PURE__ */new Map;let E,P,T=0,V=!1;function C(){T+=1,V=!1,N.clear()}function O(e){const t=[...e].filter(([e,t])=>m.get(e)===t);if(0===t.length)return;const n=z();B(!0,n,t),F(),D(n,t)}function K(e){if(!i.batchRegistration)return void O(e);for(const[t,n]of e)N.set(t,n);if(V)return;V=!0;const n=T;t(()=>{if(w||n!==T)return;V=!1;const e=[...N];N.clear(),O(e),j()})}function A(){void 0!==E&&clearTimeout(E),E=void 0}function L(){void 0!==P&&clearTimeout(P),P=void 0}function z(){let e;const t=/* @__PURE__ */new Map;return{getRootRect:()=>(void 0===e&&(e=M?.getBoundingClientRect()??null),e),getElementRect(e){let n=t.get(e);return void 0===n&&(n=e.getBoundingClientRect(),t.set(e,n)),n}}}function B(e=!1,t=z(),i=m){if(!e&&null!==I||null===M)return;const r=t.getRootRect();if(null===r)return;const s=o(r,f);for(const[e,o]of i){const i=t.getElementRect(e);o.ratio=n(i,r),o.intersecting=o.ratio>0,o.revealIntersecting=f>0?n(i,s)>0:o.intersecting&&o.ratio>=c}}function F(){if(void 0===i.onViewportVisibleChange)return;const e=null===M?[]:[...m.values()].filter(e=>e.intersecting&&e.ratio>0);e.length===p.length&&e.every((e,t)=>e.key===p[t]?.key&&e.item===p[t]?.item)||(p=e,i.onViewportVisibleChange(e.map(e=>e.item)))}function Y(e){return e.intersecting&&e.ratio>=c}function _(e){const t=d.get(e.key);return void 0!==t&&m.get(t)===e}function D(e=z(),t=m){const r=[];for(const[i,s]of t)if(s.revealIntersecting&&!h.has(s.key)){if(f>l){if(0===l&&!Y(s))continue;if(l>0){const t=e.getRootRect();if(null===t||n(e.getElementRect(i),o(t,l))<=0)continue}}r.push(s)}for(const e of r)_(e)&&!h.has(e.key)&&(h.add(e.key),i.onRevealed?.(e.item))}function J(e,t=!1){const n=new Set(e.map(e=>e.key));if(n.size!==b.size||[...n].some(e=>!b.has(e))||t){b.clear();for(const e of n)b.add(e);i.onSettledVisibleChange?.(e.map(e=>e.item))}}function $(e,t=!1){!t&&e.length===y.length&&e.every((e,t)=>e.key===y[t]?.key&&e.item===y[t]?.item)||(y=e,i.onSettledPreloadChange?.(e.map(e=>e.item)))}function j(){w||k||(L(),P=setTimeout(()=>{P=void 0,function(){if(w||k)return;const e=x;x=!1;const t=T,r=M,s=()=>!w&&!k&&t===T&&M===r,c=z();if(B(!1,c),F(),!s())return;const l=c.getRootRect(),f=null===l?0:(l.top+l.bottom)/2,d=[...m.entries()].filter(([,e])=>Y(e)).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).sort((e,t)=>Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,g).map(({target:e})=>e);let h;if(void 0!==i.onSettledPreloadChange&&null!==l){const e=o(l,a);h=[...m.entries()].filter(([,e])=>e.revealIntersecting).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).filter(({target:t,rect:o})=>Y(t)||a>0&&n(o,e)>0).sort((e,t)=>Number(Y(t.target))-Number(Y(e.target))||Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,u).map(({target:e})=>e)}if(D(c),s()&&(J(d.filter(_),e),s())){void 0!==h&&$(h.filter(_),e);for(const e of d){if(!s())return;_(e)&&!v.has(e.key)&&(v.add(e.key),i.onActivated?.(e.item))}}}()},s))}function q(){w||(x=!0,G(!0),$([]),B(),F(),D(),J([]),L(),A(),E=setTimeout(()=>{E=void 0,G(!1),j()},r))}function G(e){k!==e&&(k=e,i.onScrollingChange?.(e))}function H(){M?.removeEventListener("scroll",q),I?.disconnect(),R?.disconnect(),I=null,R=null,M=null,F()}function Q(e=!0){if(w)return;const t=i.getRoot();if(t!==M||null===M)if($([]),H(),M=t,null!==M){if(M.addEventListener("scroll",q,{passive:!0}),"undefined"!=typeof IntersectionObserver){I=new IntersectionObserver(e=>{for(const t of e){const e=m.get(t.target);void 0!==e&&(e.intersecting=t.isIntersecting,e.ratio=t.intersectionRatio,0===f&&(e.revealIntersecting=t.isIntersecting&&t.intersectionRatio>=c))}F(),D(),j()},{root:M,threshold:[0,Number.EPSILON,c,1]}),f>0&&(R=new IntersectionObserver(e=>{for(const t of e){const e=m.get(t.target);void 0!==e&&(e.revealIntersecting=t.isIntersecting)}D(),j()},{root:M,rootMargin:`${f}px 0px`,threshold:0}));for(const e of m.keys())I.observe(e);for(const e of m.keys())R?.observe(e)}K(m)}else e&&!S&&(S=!0,Promise.resolve().then(()=>{S=!1,w||(Q(!1),j())}))}function U(e){$(y.filter(t=>t.key!==e)),h.delete(e),v.delete(e),b.delete(e),F()}return{register(e,t){if(w)return;const n=i.getKey(e),o=h.has(n),r=v.has(n),s=null===t?void 0:m.get(t);void 0!==s&&s.key!==n&&(d.delete(s.key),m.delete(t),U(s.key));const c=d.get(n);if(void 0!==c&&c!==t&&(I?.unobserve(c),R?.unobserve(c),m.delete(c),d.delete(n)),null===t)return void 0!==c&&(I?.unobserve(c),R?.unobserve(c),m.delete(c),d.delete(n)),void U(n);const l=m.get(t);if(l?.key===n&&l.item===e){const e=M;return Q(),void(M!==e&&j())}const a={item:e,key:n,intersecting:l?.key===n&&l.intersecting,ratio:l?.key===n?l.ratio:0,revealIntersecting:l?.key===n&&l.revealIntersecting};m.set(t,a),d.set(n,t);const f=M;Q(),M===f&&(I?.observe(t),R?.observe(t),K([[t,a]])),o&&i.onRevealed?.(e),r&&_(a)&&i.onActivated?.(e),j()},isRevealed:e=>h.has(i.getKey(e)),isActivated:e=>v.has(i.getKey(e)),isSettledVisible:e=>b.has(i.getKey(e)),isScrolling:()=>k,notifyScroll:q,refresh(){Q(),C(),O(m),j()},reset(){C(),A(),L(),G(!1),x=!1,J([]),$([]),H(),m.clear(),d.clear(),h.clear(),v.clear()},dispose(){w||(C(),A(),L(),G(!1),x=!1,J([]),$([]),H(),m.clear(),d.clear(),h.clear(),v.clear(),w=!0)}}}export{i as createThreadVisibilityTargets};
@@ -1 +1 @@
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
+ 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 +1 @@
1
- import{throwIfAborted as e}from"../abort.js";import{createCryptoBatchPreparation as t}from"./crypto-batch-preparation.js";import{mapIncomingGroupChat as s}from"./group-message-mapper.js";import{mapIncomingGroupNotify as r}from"./group-notify-mapper.js";import{fromWireMsgId as o}from"./message-id.js";import{toWireMessageIds as n,fromWireMissingMessageIds as d}from"./messages-by-id.js";import{mapIncomingGroupReaction as c}from"./reaction-mapper.js";import{groupReadAllMsgReqCodec as i,groupReadAllMsgRespCodec as a,getGroupMsgByIdReqCodec as p,getGroupMsgByIdRespCodec as m,offlineGroupSessionReqCodec as g,offlineGroupSessionRespCodec as u,mesGrpChatCodec as I,mesGrpNotifyDeliverCodec as y,bMessageCodec as l,bContentCodec as f,getGroupHistoryMsgReqCodec as h,getGroupHistoryMsgRespCodec as T,offlineGroupMsgReqCodec as E,offlineGroupMsgRespCodec as M}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as v}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{isCryptoExecutionError as w}from"../ports/crypto-task-executor.js";const G=/* @__PURE__ */new Set([v.MES_GRPCHAT_DELIVER,v.MES_GRPCHAT_EDIT_MSG_C2C]),C=l.create({contentType:1,content:""});function L(e){return E.encode(E.create({userId:BigInt(e.userId),msgId:"",deliveredMsgIds:e.deliveredMsgIds??[],limit:e.limit??50,clientType:e.clientType??0}))}function D(e){return g.encode(g.create({userId:BigInt(e.userId),clientType:String(e.clientType??0),size:BigInt(e.size??21)}))}function b(e,t,n,d){if(R(e.sGroupId,t.expectedGroupId),e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){const s=d?.chat??I.decode(e.sMsgData),r={...s,sMsgId:s.sMsgId||e.sMsgId,sFromId:0n===s.sFromId?e.sFromId:s.sFromId,sGrpId:0n===s.sGrpId?e.sGroupId:s.sGrpId,sToId:0n===s.sToId?e.sGroupId:s.sToId,msgTime:0n===s.msgTime?e.msgTime:s.msgTime,parentMsgId:s.parentMsgId||e.parentMsgId};return R(r.sGrpId,t.expectedGroupId),t.onReaction?.(c(r)),null}if(e.cmdId===v.MES_GRPNOTIFY_DELIVER){const s=d?.notify??y.decode(e.sMsgData);return R(s.sGrpId,t.expectedGroupId),r(s,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw})}if(!G.has(e.cmdId))return null;const i=d?.chat??I.decode(e.sMsgData);R(i.sGrpId,t.expectedGroupId);let a=C,p=!1,m=!1;if(0===i.encrypt)try{a=l.decode(i.sContent)}catch{m=!0}else if(1===i.encrypt&&void 0!==n){const e=function(e,t,s,r){const o=void 0===r?s.resolvePrivateKey({groupId:t,msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion}):null;if("no-key"===r?.kind||void 0===r&&null===o)return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"no-key"}),null;try{if("plain"===r?.kind)return l.decode(r.plain);if("failed"===r?.kind)throw r.cause;const t=f.decode(e.sContent);if(0===t.secretKey.length||0===t.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${t.secretKey.length}B cipherData=${t.cipherData.length}B`);const n=s.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:o});return l.decode(n)}catch(r){return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"decrypt-failed",cause:r}),null}}(i,i.sGrpId.toString(),n,d?.content);a=e??C,p=null===e}else p=!0;const g=s(i,a,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw,decryptFailed:p});return m&&(g.contentType="unknown",g.body={unknown:{reason:"malformed-content"}},g.raw={...g.raw,contentDecodeFailure:{codec:"BMessage",byteLength:i.sContent.length}}),p&&1===i.encrypt&&n?.onDecryptRecovery?.({conversation:{conversationType:"group",conversationId:g.conversationId},messageId:g.id,wireEncrypt:1,sContent:i.sContent.slice(),...""===i.encryptVersion?{}:{encryptVersion:i.encryptVersion},cmdId:e.cmdId,source:t.source??"offline",createdAt:Date.now()}),void 0===g.refMessageId&&e.parentMsgId&&(g.refMessageId=o(e.parentMsgId)),1===e.isEdit&&(g.edited=!0),g}function R(e,t){if(void 0!==t&&e.toString()!==t)throw new Error(`group history: 响应群不属于请求(groupId=${e})`)}function S(t,s){e(t.signal),t.assertCurrent?.(void 0===s?void 0:{conversationType:"group",conversationId:s})}async function _(e){S(e),await e.yieldToEventLoop(),S(e)}function x(e,t){R(e.sGroupId,t);if((G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER||e.cmdId===v.MES_GRPNOTIFY_DELIVER)&&e.sGroupId<=0n)throw new Error("group response: 消息缺少有效群身份");const s={...e.sGroupId>0n?{groupId:e.sGroupId.toString()}:{}};if(G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){s.chat=I.decode(e.sMsgData);R(e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER&&0n===s.chat.sGrpId?e.sGroupId:s.chat.sGrpId,s.groupId)}else e.cmdId===v.MES_GRPNOTIFY_DELIVER&&(s.notify=y.decode(e.sMsgData),R(s.notify.sGrpId,s.groupId));return s}async function A(e,s,r,o,n,d=[],c=!1){const i=await async function(e,s,r,o=[],n=!0){const d=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,i=new Set(o);for(const e of o)S(r,e);for(const[t,{item:s,expectedGroupId:o}]of e.entries()){let e;S(r),t>0&&t%5==0&&await _(r);try{e=x(s,o)}catch(e){if(!n)throw e;c.set(t,e);continue}S(r,e.groupId),d.set(t,e),void 0===e.groupId||void 0===e.chat&&void 0===e.notify||i.add(e.groupId)}S(r),void 0!==s&&i.size>0&&void 0!==r.prepareKeys&&(await r.prepareKeys([...i]),S(r));const a=t({...r,assertCurrent:()=>S(r)},(e,t)=>{d.get(e).content=t});for(const[t,{item:o}]of e.entries()){S(r),t>0&&t%5==0&&await _(r);const e=d.get(t);if(void 0===e)continue;S(r,e.groupId);const n=e.chat;if(!G.has(o.cmdId)||1!==n?.encrypt||void 0===s)continue;let i;try{const r=s.resolvePrivateKey({groupId:e.groupId,msgType:n.msgType,encrypt:n.encrypt,encryptVersion:n.encryptVersion});if(null===r)e.content={kind:"no-key"};else try{const e=f.decode(n.sContent);if(0===e.secretKey.length||0===e.cipherData.length)throw new Error("BContent secretKey/cipherData missing");i={itemIndex:t,input:{secretKey:e.secretKey,cipherData:e.cipherData,privateKey:r}}}catch(t){e.content={kind:"failed",cause:t}}}catch(e){if(w(e)||e instanceof Error&&"AbortError"===e.name)throw e;c.set(t,e)}void 0!==i&&await a.add(i),S(r,e.groupId)}return await a.finish(),S(r),{rows:d,errors:c}}(e,r,o,d,n),a=[],p=[],m=[];for(const[t,{item:d,expectedGroupId:g}]of e.entries()){S(o),t>0&&t%5==0&&await _(o);const e=i.rows.get(t);S(o,e?.groupId);try{if(i.errors.has(t))throw i.errors.get(t);const o=b(d,{...s,expectedGroupId:g},r,e);null!==o&&(c&&1===d.isCancel&&(o.recalled={by:o.senderId,at:o.serverTime??o.createdAt},o.body={}),a.push(o)),p.push({msgId:d.sMsgId,msgTime:d.msgTime,cmdId:d.cmdId})}catch(e){if(!n||w(e)||e instanceof Error&&"AbortError"===e.name)throw e;m.push({msgId:d.sMsgId,cmdId:d.cmdId,cause:e})}S(o,e?.groupId)}return S(o),{messages:a,deliveredMsgInfos:p,...0===m.length?{}:{itemErrors:m}}}async function V(e,t,s,r){S(r);const o=M.decode(e);return{...await A(o.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,r,!0),batchSize:o.msgList.length,responseBytes:e.length}}function B(e,t,s){const r=M.decode(e),o=[],n=[],d=[];for(const e of r.msgList)try{const r=b(e,t,s);null!==r&&o.push(r),n.push({msgId:e.sMsgId,msgTime:e.msgTime,cmdId:e.cmdId})}catch(t){d.push({msgId:e.sMsgId,cmdId:e.cmdId,cause:t})}return{messages:o,deliveredMsgInfos:n,batchSize:r.msgList.length,responseBytes:e.length,...0===d.length?{}:{itemErrors:d}}}function k(e,t,s){const r=u.decode(e),o=[],n=[],d=[];for(const e of r.sessionList){o.push({groupId:e.groupId.toString(),unreadCount:Number(e.unreadCount)});for(const r of e.msgList)try{const e=b(r,t,s);null!==e&&n.push(e)}catch(e){d.push({msgId:r.sMsgId,cmdId:r.cmdId,cause:e})}}return{unreads:o,messages:n,...0===d.length?{}:{itemErrors:d}}}async function K(e,t,s,r){S(r);const o=u.decode(e),n=[],d=[];for(const e of o.sessionList){R(e.groupId,t.expectedGroupId);const s=e.groupId.toString();S(r,s),n.push({groupId:s,unreadCount:Number(e.unreadCount)}),d.push(...e.msgList.map(e=>({item:e,expectedGroupId:s})))}const{messages:c,itemErrors:i}=await A(d,t,s,r,!0,n.map(e=>e.groupId));return{unreads:n,messages:c,...void 0===i?{}:{itemErrors:i}}}function N(e){return h.encode(h.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),baseTime:BigInt(e.baseTime),direct:e.direct??1,limit:e.limit??50,clientType:e.clientType??0}))}function F(e,t,s){const r=T.decode(e),o=[];for(const e of r.msgList){const r=b(e,t,s);null!==r&&o.push(r)}const n=r.msgList.map(e=>Number(e.msgTime));return{messages:o,batchSize:r.msgList.length,...0===n.length?{}:{oldestEntryTime:Math.min(...n),newestEntryTime:Math.max(...n)}}}async function P(t,s,r,o,n){e(o.signal);const d=T.decode(t);if(200!==d.code)throw new Error(`group history: code=${d.code}`);if(void 0!==n){const t={...n,assertCurrent:t=>{e(o.signal),n.assertCurrent?.(t)}},{messages:c}=await A(d.msgList.map(e=>({item:e,expectedGroupId:s.expectedGroupId})),s,r,t,!1);let i,a;for(const e of d.msgList){const t=Number(e.msgTime);i=void 0===i?t:Math.min(i,t),a=void 0===a?t:Math.max(a,t)}return{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}const c=[];let i,a,p=0;for(const t of d.msgList){e(o.signal),p>0&&p%5==0&&(await o.yieldToEventLoop(),e(o.signal));const n=b(t,s,r);null!==n&&c.push(n);const d=Number(t.msgTime);i=void 0===i?d:Math.min(i,d),a=void 0===a?d:Math.max(a,d),p+=1}return e(o.signal),{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}function j(e){return p.encode(p.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),msgIds:n(e.messageIds),clientType:e.clientType??0}))}function z(e,t,s,r){const o=m.decode(e),n=[];for(const e of o.msgList){const r=b(e,t,s);null!==r&&(1===e.isCancel&&(r.recalled={by:r.senderId,at:r.serverTime??r.createdAt},r.body={}),n.push(r))}return{messages:n,missingMessageIds:d(o.missingMsgIds,r),code:o.code}}async function O(e,t,s,r,o){S(o);const n=m.decode(e),c=d(n.missingMsgIds,r);if(200!==n.code)return{messages:[],missingMessageIds:c,code:n.code};const{messages:i}=await A(n.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,o,!1,[],!0);return{messages:i,missingMessageIds:c,code:n.code}}function H(e){return i.encode(i.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId)}))}function $(e){return{code:a.decode(e).code}}export{F as decodeGroupHistoryBatch,P as decodeGroupHistoryBatchAsync,z as decodeGroupMessagesByIdResponse,O as decodeGroupMessagesByIdResponseAsync,B as decodeGroupOfflineBatch,V as decodeGroupOfflineBatchAsync,k as decodeGroupOfflineSession,K as decodeGroupOfflineSessionAsync,$ as decodeGroupReadAllResponse,N as encodeGroupHistoryRequest,j as encodeGroupMessagesByIdRequest,L as encodeGroupOfflinePullRequest,D as encodeGroupOfflineSessionRequest,H as encodeGroupReadAllRequest};
1
+ import{throwIfAborted as e}from"../abort.js";import{createCryptoBatchPreparation as t}from"./crypto-batch-preparation.js";import{mapIncomingGroupChat as s}from"./group-message-mapper.js";import{mapIncomingGroupNotify as r}from"./group-notify-mapper.js";import{fromWireMsgId as o}from"./message-id.js";import{toWireMessageIds as n,fromWireMissingMessageIds as d}from"./messages-by-id.js";import{mapIncomingGroupReaction as c}from"./reaction-mapper.js";import{groupReadAllMsgReqCodec as i,groupReadAllMsgRespCodec as a,getGroupMsgByIdReqCodec as p,getGroupMsgByIdRespCodec as m,offlineGroupSessionReqCodec as g,offlineGroupSessionRespCodec as u,mesGrpChatCodec as I,mesGrpNotifyDeliverCodec as y,bMessageCodec as l,bContentCodec as f,getGroupHistoryMsgReqCodec as h,getGroupHistoryMsgRespCodec as T,offlineGroupMsgReqCodec as E,offlineGroupMsgRespCodec as M}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as v}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{isCryptoExecutionError as w}from"../ports/crypto-task-executor.js";const G=/* @__PURE__ */new Set([v.MES_GRPCHAT_DELIVER,v.MES_GRPCHAT_EDIT_MSG_C2C]),C=l.create({contentType:1,content:""});function L(e){return E.encode(E.create({userId:BigInt(e.userId),msgId:"",deliveredMsgIds:e.deliveredMsgIds??[],limit:e.limit??100,clientType:e.clientType??0}))}function D(e){return g.encode(g.create({userId:BigInt(e.userId),clientType:String(e.clientType??0),size:BigInt(e.size??21)}))}function b(e,t,n,d){if(R(e.sGroupId,t.expectedGroupId),e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){const s=d?.chat??I.decode(e.sMsgData),r={...s,sMsgId:s.sMsgId||e.sMsgId,sFromId:0n===s.sFromId?e.sFromId:s.sFromId,sGrpId:0n===s.sGrpId?e.sGroupId:s.sGrpId,sToId:0n===s.sToId?e.sGroupId:s.sToId,msgTime:0n===s.msgTime?e.msgTime:s.msgTime,parentMsgId:s.parentMsgId||e.parentMsgId};return R(r.sGrpId,t.expectedGroupId),t.onReaction?.(c(r)),null}if(e.cmdId===v.MES_GRPNOTIFY_DELIVER){const s=d?.notify??y.decode(e.sMsgData);return R(s.sGrpId,t.expectedGroupId),r(s,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw})}if(!G.has(e.cmdId))return null;const i=d?.chat??I.decode(e.sMsgData);R(i.sGrpId,t.expectedGroupId);let a=C,p=!1,m=!1;if(0===i.encrypt)try{a=l.decode(i.sContent)}catch{m=!0}else if(1===i.encrypt&&void 0!==n){const e=function(e,t,s,r){const o=void 0===r?s.resolvePrivateKey({groupId:t,msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion}):null;if("no-key"===r?.kind||void 0===r&&null===o)return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"no-key"}),null;try{if("plain"===r?.kind)return l.decode(r.plain);if("failed"===r?.kind)throw r.cause;const t=f.decode(e.sContent);if(0===t.secretKey.length||0===t.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${t.secretKey.length}B cipherData=${t.cipherData.length}B`);const n=s.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:o});return l.decode(n)}catch(r){return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"decrypt-failed",cause:r}),null}}(i,i.sGrpId.toString(),n,d?.content);a=e??C,p=null===e}else p=!0;const g=s(i,a,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw,decryptFailed:p});return m&&(g.contentType="unknown",g.body={unknown:{reason:"malformed-content"}},g.raw={...g.raw,contentDecodeFailure:{codec:"BMessage",byteLength:i.sContent.length}}),p&&1===i.encrypt&&n?.onDecryptRecovery?.({conversation:{conversationType:"group",conversationId:g.conversationId},messageId:g.id,wireEncrypt:1,sContent:i.sContent.slice(),...""===i.encryptVersion?{}:{encryptVersion:i.encryptVersion},cmdId:e.cmdId,source:t.source??"offline",createdAt:Date.now()}),void 0===g.refMessageId&&e.parentMsgId&&(g.refMessageId=o(e.parentMsgId)),1===e.isEdit&&(g.edited=!0),g}function R(e,t){if(void 0!==t&&e.toString()!==t)throw new Error(`group history: 响应群不属于请求(groupId=${e})`)}function S(t,s){e(t.signal),t.assertCurrent?.(void 0===s?void 0:{conversationType:"group",conversationId:s})}async function _(e){S(e),await e.yieldToEventLoop(),S(e)}function x(e,t){R(e.sGroupId,t);if((G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER||e.cmdId===v.MES_GRPNOTIFY_DELIVER)&&e.sGroupId<=0n)throw new Error("group response: 消息缺少有效群身份");const s={...e.sGroupId>0n?{groupId:e.sGroupId.toString()}:{}};if(G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){s.chat=I.decode(e.sMsgData);R(e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER&&0n===s.chat.sGrpId?e.sGroupId:s.chat.sGrpId,s.groupId)}else e.cmdId===v.MES_GRPNOTIFY_DELIVER&&(s.notify=y.decode(e.sMsgData),R(s.notify.sGrpId,s.groupId));return s}async function A(e,s,r,o,n,d=[],c=!1){const i=await async function(e,s,r,o=[],n=!0){const d=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,i=new Set(o);for(const e of o)S(r,e);for(const[t,{item:s,expectedGroupId:o}]of e.entries()){let e;S(r),t>0&&t%5==0&&await _(r);try{e=x(s,o)}catch(e){if(!n)throw e;c.set(t,e);continue}S(r,e.groupId),d.set(t,e),void 0===e.groupId||void 0===e.chat&&void 0===e.notify||i.add(e.groupId)}S(r),void 0!==s&&i.size>0&&void 0!==r.prepareKeys&&(await r.prepareKeys([...i]),S(r));const a=t({...r,assertCurrent:()=>S(r)},(e,t)=>{d.get(e).content=t});for(const[t,{item:o}]of e.entries()){S(r),t>0&&t%5==0&&await _(r);const e=d.get(t);if(void 0===e)continue;S(r,e.groupId);const n=e.chat;if(!G.has(o.cmdId)||1!==n?.encrypt||void 0===s)continue;let i;try{const r=s.resolvePrivateKey({groupId:e.groupId,msgType:n.msgType,encrypt:n.encrypt,encryptVersion:n.encryptVersion});if(null===r)e.content={kind:"no-key"};else try{const e=f.decode(n.sContent);if(0===e.secretKey.length||0===e.cipherData.length)throw new Error("BContent secretKey/cipherData missing");i={itemIndex:t,input:{secretKey:e.secretKey,cipherData:e.cipherData,privateKey:r}}}catch(t){e.content={kind:"failed",cause:t}}}catch(e){if(w(e)||e instanceof Error&&"AbortError"===e.name)throw e;c.set(t,e)}void 0!==i&&await a.add(i),S(r,e.groupId)}return await a.finish(),S(r),{rows:d,errors:c}}(e,r,o,d,n),a=[],p=[],m=[];for(const[t,{item:d,expectedGroupId:g}]of e.entries()){S(o),t>0&&t%5==0&&await _(o);const e=i.rows.get(t);S(o,e?.groupId);try{if(i.errors.has(t))throw i.errors.get(t);const o=b(d,{...s,expectedGroupId:g},r,e);null!==o&&(c&&1===d.isCancel&&(o.recalled={by:o.senderId,at:o.serverTime??o.createdAt},o.body={}),a.push(o)),p.push({msgId:d.sMsgId,msgTime:d.msgTime,cmdId:d.cmdId})}catch(e){if(!n||w(e)||e instanceof Error&&"AbortError"===e.name)throw e;m.push({msgId:d.sMsgId,cmdId:d.cmdId,cause:e})}S(o,e?.groupId)}return S(o),{messages:a,deliveredMsgInfos:p,...0===m.length?{}:{itemErrors:m}}}async function V(e,t,s,r){S(r);const o=M.decode(e);return{...await A(o.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,r,!0),batchSize:o.msgList.length,responseBytes:e.length}}function B(e,t,s){const r=M.decode(e),o=[],n=[],d=[];for(const e of r.msgList)try{const r=b(e,t,s);null!==r&&o.push(r),n.push({msgId:e.sMsgId,msgTime:e.msgTime,cmdId:e.cmdId})}catch(t){d.push({msgId:e.sMsgId,cmdId:e.cmdId,cause:t})}return{messages:o,deliveredMsgInfos:n,batchSize:r.msgList.length,responseBytes:e.length,...0===d.length?{}:{itemErrors:d}}}function k(e,t,s){const r=u.decode(e),o=[],n=[],d=[];for(const e of r.sessionList){o.push({groupId:e.groupId.toString(),unreadCount:Number(e.unreadCount)});for(const r of e.msgList)try{const e=b(r,t,s);null!==e&&n.push(e)}catch(e){d.push({msgId:r.sMsgId,cmdId:r.cmdId,cause:e})}}return{unreads:o,messages:n,...0===d.length?{}:{itemErrors:d}}}async function K(e,t,s,r){S(r);const o=u.decode(e),n=[],d=[];for(const e of o.sessionList){R(e.groupId,t.expectedGroupId);const s=e.groupId.toString();S(r,s),n.push({groupId:s,unreadCount:Number(e.unreadCount)}),d.push(...e.msgList.map(e=>({item:e,expectedGroupId:s})))}const{messages:c,itemErrors:i}=await A(d,t,s,r,!0,n.map(e=>e.groupId));return{unreads:n,messages:c,...void 0===i?{}:{itemErrors:i}}}function N(e){return h.encode(h.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),baseTime:BigInt(e.baseTime),direct:e.direct??1,limit:e.limit??50,clientType:e.clientType??0}))}function F(e,t,s){const r=T.decode(e),o=[];for(const e of r.msgList){const r=b(e,t,s);null!==r&&o.push(r)}const n=r.msgList.map(e=>Number(e.msgTime));return{messages:o,batchSize:r.msgList.length,...0===n.length?{}:{oldestEntryTime:Math.min(...n),newestEntryTime:Math.max(...n)}}}async function P(t,s,r,o,n){e(o.signal);const d=T.decode(t);if(200!==d.code)throw new Error(`group history: code=${d.code}`);if(void 0!==n){const t={...n,assertCurrent:t=>{e(o.signal),n.assertCurrent?.(t)}},{messages:c}=await A(d.msgList.map(e=>({item:e,expectedGroupId:s.expectedGroupId})),s,r,t,!1);let i,a;for(const e of d.msgList){const t=Number(e.msgTime);i=void 0===i?t:Math.min(i,t),a=void 0===a?t:Math.max(a,t)}return{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}const c=[];let i,a,p=0;for(const t of d.msgList){e(o.signal),p>0&&p%5==0&&(await o.yieldToEventLoop(),e(o.signal));const n=b(t,s,r);null!==n&&c.push(n);const d=Number(t.msgTime);i=void 0===i?d:Math.min(i,d),a=void 0===a?d:Math.max(a,d),p+=1}return e(o.signal),{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}function j(e){return p.encode(p.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),msgIds:n(e.messageIds),clientType:e.clientType??0}))}function z(e,t,s,r){const o=m.decode(e),n=[];for(const e of o.msgList){const r=b(e,t,s);null!==r&&(1===e.isCancel&&(r.recalled={by:r.senderId,at:r.serverTime??r.createdAt},r.body={}),n.push(r))}return{messages:n,missingMessageIds:d(o.missingMsgIds,r),code:o.code}}async function O(e,t,s,r,o){S(o);const n=m.decode(e),c=d(n.missingMsgIds,r);if(200!==n.code)return{messages:[],missingMessageIds:c,code:n.code};const{messages:i}=await A(n.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,o,!1,[],!0);return{messages:i,missingMessageIds:c,code:n.code}}function H(e){return i.encode(i.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId)}))}function $(e){return{code:a.decode(e).code}}export{F as decodeGroupHistoryBatch,P as decodeGroupHistoryBatchAsync,z as decodeGroupMessagesByIdResponse,O as decodeGroupMessagesByIdResponseAsync,B as decodeGroupOfflineBatch,V as decodeGroupOfflineBatchAsync,k as decodeGroupOfflineSession,K as decodeGroupOfflineSessionAsync,$ as decodeGroupReadAllResponse,N as encodeGroupHistoryRequest,j as encodeGroupMessagesByIdRequest,L as encodeGroupOfflinePullRequest,D as encodeGroupOfflineSessionRequest,H as encodeGroupReadAllRequest};
@@ -1 +1 @@
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
+ 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 +1 @@
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};
1
+ import{MEDIA_ALBUM_MAX_ITEMS as t,MEDIA_ALBUM_CONTENT_MAX_BYTES as e}from"./mapping/media-album-body.js";const r=Math.floor(3*(e-32768)/4);function a(e=1,r=0){if(!Number.isInteger(e)||e<1||e>t)throw new RangeError(`媒体缩略图项数必须是 1 到 ${t} 的整数`);if(!Number.isInteger(r)||r<0||r>=e)throw new RangeError("媒体缩略图下标必须是当前消息范围内的整数");if(1===e)return{maxSize:1440,targetBytes:16384,maxBytes:32768};if(2===e)return{maxSize:1440,targetBytes:16384,maxBytes:28672};if(r>=4)return{maxSize:240,targetBytes:768,maxBytes:1536};const a=Math.max(0,e-4),m=Math.min(e,4)+1,i=3*Math.floor((153600-2*a*1024)/m/4);return{maxSize:3===e?960:768,targetBytes:Math.min(16384,3*Math.floor((76800-1024*a)/m/4)),maxBytes:Math.min(i,1024*(3===e?20:16))}}export{r as MEDIA_THUMBNAIL_MAX_BYTES,a as resolveMediaThumbnailPolicy};
@@ -1 +1 @@
1
- function t(t){return("string"==typeof t?t.startsWith("iVBORw0KGgo"):t.length>=8&&137===t[0]&&80===t[1]&&78===t[2]&&71===t[3]&&13===t[4]&&10===t[5]&&26===t[6]&&10===t[7])?"image/png":"image/jpeg"}export{t as resolveMediaThumbnailMimeType};
1
+ function t(t){if("string"==typeof t?t.startsWith("iVBORw0KGgo"):t.length>=8&&137===t[0]&&80===t[1]&&78===t[2]&&71===t[3]&&13===t[4]&&10===t[5]&&26===t[6]&&10===t[7])return"image/png";return("string"==typeof t?/^UklGR[g-v][A-Za-z0-9+/]{4}[BFJNRVZdhlptx159]XRUJQ/.test(t):t.length>=12&&82===t[0]&&73===t[1]&&70===t[2]&&70===t[3]&&87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])?"image/webp":"image/jpeg"}export{t as resolveMediaThumbnailMimeType};