k2-im 0.2.10 → 0.2.12

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.
@@ -1943,7 +1943,7 @@ interface ImHttpPort {
1943
1943
  }
1944
1944
 
1945
1945
  /** 可持久化的媒体资产类型;未注册类型必须跳过缓存,不能回退到其它类型。 */
1946
- type MediaAssetKind = 'image' | 'video';
1946
+ type MediaAssetKind = 'image' | 'video' | 'file';
1947
1947
  /** 持久媒体资产的稳定键。resourceVersion 由远端资源标识派生,避免同消息替换资源后误命中旧缓存。 */
1948
1948
  interface MediaAssetCacheKey {
1949
1949
  kind: MediaAssetKind;
@@ -5474,7 +5474,7 @@ interface ImMediaTasksApi {
5474
5474
  clearCache: () => Promise<void>;
5475
5475
  /**
5476
5476
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
5477
- * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
5477
+ * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
5478
5478
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
5479
5479
  * @example const [available] = await client.media.probeCached([messageRef])
5480
5480
  */
@@ -7901,7 +7901,10 @@ interface ImExpressionStoreActions {
7901
7901
  loadRecent: (kind: RecentKind) => Promise<ImExpressionOperationResult>;
7902
7902
  reportRecent: (input: ImExpressionRecentInput) => Promise<ImExpressionOperationResult>;
7903
7903
  rememberEmoji: (entry: ImEmojiRecentEntry) => Promise<ImExpressionOperationResult>;
7904
- rememberEmojis: (entries: readonly ImEmojiRecentEntry[]) => Promise<ImExpressionOperationResult>;
7904
+ /** refreshAfterReport=false 保留本地 MRU,仅上报,不再拉取服务端列表。默认保持权威刷新行为。 */
7905
+ rememberEmojis: (entries: readonly ImEmojiRecentEntry[], options?: {
7906
+ refreshAfterReport?: boolean;
7907
+ }) => Promise<ImExpressionOperationResult>;
7905
7908
  toggleRecentSelection: (kind: RecentKind, recordId: string, selected?: boolean) => void;
7906
7909
  deleteSelectedRecent: (kind: RecentKind) => Promise<ImExpressionOperationResult>;
7907
7910
  loadGiphyTrending: () => Promise<ImExpressionOperationResult>;
@@ -1940,7 +1940,7 @@ interface ImHttpPort {
1940
1940
  }
1941
1941
 
1942
1942
  /** 可持久化的媒体资产类型;未注册类型必须跳过缓存,不能回退到其它类型。 */
1943
- type MediaAssetKind = 'image' | 'video';
1943
+ type MediaAssetKind = 'image' | 'video' | 'file';
1944
1944
  /** 持久媒体资产的稳定键。resourceVersion 由远端资源标识派生,避免同消息替换资源后误命中旧缓存。 */
1945
1945
  interface MediaAssetCacheKey {
1946
1946
  kind: MediaAssetKind;
@@ -5585,7 +5585,7 @@ interface ImMediaTasksApi {
5585
5585
  clearCache: () => Promise<void>;
5586
5586
  /**
5587
5587
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
5588
- * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
5588
+ * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
5589
5589
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
5590
5590
  * @example const [available] = await client.media.probeCached([messageRef])
5591
5591
  */
package/dist/index.d.ts CHANGED
@@ -1981,7 +1981,7 @@ interface ImHttpPort {
1981
1981
  }
1982
1982
 
1983
1983
  /** 可持久化的媒体资产类型;未注册类型必须跳过缓存,不能回退到其它类型。 */
1984
- type MediaAssetKind = 'image' | 'video';
1984
+ type MediaAssetKind = 'image' | 'video' | 'file';
1985
1985
  /** 持久媒体资产的稳定键。resourceVersion 由远端资源标识派生,避免同消息替换资源后误命中旧缓存。 */
1986
1986
  interface MediaAssetCacheKey {
1987
1987
  kind: MediaAssetKind;
@@ -6157,7 +6157,7 @@ interface ImMediaTasksApi {
6157
6157
  clearCache: () => Promise<void>;
6158
6158
  /**
6159
6159
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
6160
- * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
6160
+ * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
6161
6161
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
6162
6162
  * @example const [available] = await client.media.probeCached([messageRef])
6163
6163
  */
@@ -1 +1 @@
1
- import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e){const t="report-recent";if(oe)return Me(t);if(0===e.length)return Object.freeze({ok:!0,operation:t});let r;try{r=Pe()}catch(e){return _e(t,e,$.emoji)}const n=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(r,n))return Me(t);let o=Object.freeze({ok:!0,operation:t});for(const[e,t]of n.entries())if(o=await et(r,{kind:"emoji",token:t.token,resourceId:t.resourceId},e===n.length-1),!o.ok&&"stale"===o.reason)return o;return o}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
1
+ import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,"hydrate-recent"!==e&&"report-recent"!==e||l.record("warn","pinia","hydrate-recent"===e?"storage":"message","expression-recent-operation-failed",()=>({data:{operation:e,code:n.code},error:{message:n.code}})),Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t={}){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i=Object.freeze({ok:!0,operation:r});for(const[e,r]of o.entries())if(i=await et(n,{kind:"emoji",token:r.token,resourceId:r.resourceId},!1!==t.refreshAfterReport&&e===o.length-1),!i.ok&&"stale"===i.reason)return i;return i}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
@@ -1 +1 @@
1
- import{createImSdkError as e}from"./message.js";import{createMediaAssetCacheStrategyRegistry as t,mediaAssetResourceVersion as o}from"../../../im-core/src/ports/media-asset-cache-port.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{resolveMediaThumbnailMimeType as a}from"../../../im-core/src/media-thumbnail.js";import{isCryptoExecutionError as i}from"../../../im-core/src/ports/crypto-task-executor.js";const n=6048e5,s=1048576;function d(e){let t=0,o=!1;const r=[];function a(){if(!o)for(;t<e&&r.length>0;){r.sort((e,t)=>t.getPriority()-e.getPriority());const e=r.shift();if(e.signal.removeEventListener("abort",e.onAbort),e.signal.aborted){e.reject(new DOMException("媒体下载已取消","AbortError"));continue}t+=1;let o=!1;e.resolve(()=>{o||(o=!0,t=Math.max(0,t-1),a())})}}return{acquire:(e,t)=>o?Promise.reject(new Error("媒体下载并发控制器已释放")):new Promise((o,i)=>{const n={resolve:o,reject:i,signal:e,getPriority:t,onAbort:()=>{const e=r.indexOf(n);e>=0&&r.splice(e,1),i(new DOMException("媒体下载已取消","AbortError"))}};e.addEventListener("abort",n.onAbort,{once:!0}),r.push(n),a()}),dispose(){o=!0;for(const e of r.splice(0))e.signal.removeEventListener("abort",e.onAbort),e.reject(new Error("媒体下载并发控制器已释放"))}}}function c(){return t([{kind:"image",softMaxBytes:512*s,maxEntries:512,maxEntryBytes:30*s,maxIdleMs:n},{kind:"video",softMaxBytes:1792*s,maxEntries:64,maxEntryBytes:200*s,maxIdleMs:n}])}function l(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function m(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function p(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function u(e){const t=e.ref.conversationType,o=e.ref.conversationId;if("direct"!==t&&"group"!==t&&"channel"!==t||""===o.trim())throw y({code:"supergroup"===t?"IM_SDK_SUPERGROUP_UNSUPPORTED":"IM_SDK_MEDIA_TASK_REF_INVALID",category:"supergroup"===t?"unsupported":"contract",operation:"media.tasks.project",retryable:!1});const r=m({conversationType:t,conversationId:o});return g({id:p(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:l(e.percent),...void 0===e.items?{}:{items:e.items},...void 0===e.attempt?{}:{attempt:e.attempt},...void 0===e.maxAttempts?{}:{maxAttempts:e.maxAttempts},...void 0===e.bytesTransferred?{}:{bytesTransferred:e.bytesTransferred},...void 0===e.bytesTotal?{}:{bytesTotal:e.bytesTotal},...void 0===e.recovery?{}:{recovery:e.recovery},...void 0===e.recoveryReason?{}:{recoveryReason:e.recoveryReason},...void 0===e.phase?{}:{phase:e.phase},...void 0===e.failure?{}:{error:I(e.failure,r)}})}function y(t){const o=e(t);return Object.assign(new Error(o.code),o,{name:"ImMediaTaskOperationError"})}function f(e){return!(void 0!==e.recalled||void 0!==e.deletedForEveryone||"failed"!==e.status&&"uploading"!==e.status||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable)}function I(t,o){if(void 0===t)return;const r=t.displayCode,a=void 0===r?void 0:{"media.empty":{code:"IM_SDK_MEDIA_EMPTY",category:"validation",retryable:!1},"media.noCrypto":{code:"IM_SDK_MEDIA_CRYPTO_UNAVAILABLE",category:"contract",retryable:!1},"media.previewFailed":{code:"IM_SDK_MEDIA_PREVIEW_FAILED",category:"state",retryable:!1},"media.encryptFailed":{code:"IM_SDK_MEDIA_ENCRYPT_FAILED",category:"state",retryable:!1},"media.uploadFailed":{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"network",retryable:!0},"media.uploadTimeout":{code:"IM_SDK_MEDIA_UPLOAD_TIMEOUT",category:"network",retryable:!0},"media.resumeUnavailable":{code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",retryable:!0},"media.cleanupUnconfirmed":{code:"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED",category:"state",retryable:!0},"media.cancelled":{code:"IM_SDK_MEDIA_UPLOAD_CANCELED",category:"state",retryable:!0},"media.invalidDuration":{code:"IM_SDK_VOICE_DURATION_INVALID",category:"validation",retryable:!1},"media.uploadInterrupted":{code:"IM_SDK_MEDIA_UPLOAD_INTERRUPTED",category:"network",retryable:!0}}[r];return Object.freeze(e({...a??{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"state",retryable:t.retryable??!1},...!1===t.retryable?{retryable:!1}:{},operation:"media.upload",conversation:o}))}function g(e){return Object.freeze({...e,ref:m(e.ref),...void 0===e.items?{}:{items:Object.freeze(e.items.map(e=>Object.freeze({...e})))},...void 0===e.error?{}:{error:Object.freeze({...e.error})}})}function v(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw y({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1});if("direct"!==o&&"group"!==o&&"channel"!==o||"string"!=typeof r||""===r.trim()||"string"!=typeof e?.messageId||""===e.messageId.trim())throw y({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return m({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let c=0,I=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Set,h=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,M=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set,C=e.maxDownloadCheckpointBytes??536870912;function K(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function O(e,t){L.delete(e),S.add(e);const o=_.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:K(o.ref)}:{}};"running"===o.state?$(e):q(e)}}const R=d(3);let U;const P=e.maxCachedBlobs??8,N=e.maxCachedBlobBytes??67108864;let k=0;function V(){if(!t||!e.isActive())throw y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function x(){return Object.freeze([..._.values()])}function F(){const t=x();for(const o of[...E])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function z(){!T&&t&&e.isActive()&&(T=!0,queueMicrotask(()=>{if(T=!1,t&&e.isActive())for(const t of[...w])try{t()}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体缓存订阅者回调异常",cause:t}})}}))}function j(e){const t=A.get(e);void 0!==t&&(k-=t.size,A.delete(e),b.delete(e),M.delete(e),z())}function B(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!D.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&O(e,"download-checkpoint-expired");for(const[e,t]of b)!D.has(e)&&o-t>=n&&j(e);z()}function W(e,t){const o=A.get(e);if(void 0!==o){if(!(M.get(e)!==t||s()-b.get(e)>=n))return A.delete(e),A.set(e,o),b.set(e,s()),o;j(e)}}function Y(){c+=1,A.clear(),b.clear(),M.clear(),z(),k=0;for(const e of[...L.keys()])O(e,"download-checkpoint-cleared")}function H(e){_.delete(e),h.delete(e),L.delete(e),S.delete(e),j(e)}function $(e){_.set(e.id,g(e)),function(){for(;_.size>128;){const e=[..._.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;H(e.id)}}()}function q(o){if(!t||!e.isActive())return;$(o);const r=_.get(o.id);if(F(),!t||!e.isActive()||void 0===r||_.get(o.id)!==r)return;const a={id:r.id,messageId:r.messageId,ref:r.ref,direction:"download",state:r.state,percent:r.percent};e.emitter.emit({type:"media-task:updated",conversation:r.ref,task:a})}function J(e,t,o){if(j(e),!(t.size>N))for(A.set(e,t),M.set(e,o),z(),b.set(e,s()),k+=t.size;A.size>P||k>N;){const e=A.keys().next().value;if(void 0===e)break;j(e)}}function G(t,r=!0){const a=v(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw y({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,d,c;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,c="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,c="video";else if("voice"===i.contentType)n=i.body.voice,s=e.loaders?.loadVoice;else if("file"===i.contentType)n=i.body.file,s=e.loaders?.loadFile,d=i.body.file?.mimeType;else if("filesAlbum"===i.contentType){const o=t.itemIndex;if(n=void 0===o?void 0:i.body.filesAlbum?.items[o],void 0===n)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,d=void 0===r||void 0===o?void 0:o[r];if(void 0===d)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=d,s="video"===d.kind?e.loaders?.loadVideo:e.loaders?.loadImage,c=d.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw y({code:"IM_SDK_MEDIA_REMOTE_URL_UNAVAILABLE",category:"state",operation:"media.download",retryable:!1,conversation:a});return{ref:a,messageId:i.id,...void 0===t.itemIndex?{}:{itemIndex:t.itemIndex},...void 0===d?{}:{mimeType:d},...void 0===c?{}:{cacheKind:c,resourceVersion:o(n.url,{conversation:a,itemIndex:t.itemIndex})},...void 0===s?{}:{load:s},input:{url:n.url,...void 0===n.size?{}:{expectedBytes:n.size},...void 0===n.teaKey?{}:{teaKey:n.teaKey},...void 0===n.fileEncryptType?{}:{fileEncryptType:n.fileEncryptType}}}}function Q(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function X(){return y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function Z(t,o,r=c){if(V(),r!==c)return null;const a=p("download",t.ref,t.messageId,t.itemIndex),i=W(a,t.resourceVersion);if(void 0!==i)return i;if(void 0===e.assetCache||void 0===t.cacheKind||void 0===t.resourceVersion)return null;let n;try{n=await e.assetCache.get({kind:t.cacheKind,messageId:t.messageId,resourceVersion:t.resourceVersion}),e.onAssetCacheEvent?.({operation:"get",outcome:null===n?"miss":"hit",kind:t.cacheKind,messageId:t.messageId,...null===n?{}:{byteLength:n.blob.size}})}catch(r){if(e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.cacheKind,messageId:t.messageId,cause:r}),o)throw y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCached",retryable:!0,conversation:t.ref});return null}if(null===n)return null;if(V(),r!==c)return null;const s=n.blob,d=n.mimeType??t.mimeType??"",l=s.type===d?s:s.slice(0,s.size,d);return J(a,l,t.resourceVersion),l}function ee(e,t){B();const o=L.get(e);if(void 0!==o&&o.url!==t.input.url&&O(e,"download-object-changed"),S.has(e)){const o=K(t.ref),r=_.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||q({...r,error:o}),o}return o?.state}function te(o,r=!1){const a=c,n=p("download",o.ref,o.messageId,o.itemIndex),d=D.get(n);if(void 0!==d&&!d.controller.signal.aborted)return d.promise;if(!r){const e=W(n,o.resourceVersion);if(void 0!==e)return q({id:n,ref:m(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100}),Promise.resolve(e)}j(n);const u=(()=>{const e=ee(n,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),f=m(o.ref);h.set(n,Object.freeze({conversation:f,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const I={id:n,messageId:o.messageId,ref:f,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},g=new AbortController,v=Promise.resolve().then(async()=>{let d;try{if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(d=await R.acquire(g.signal,()=>U===n?1:0),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(q({...I,...u,state:"running"}),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await Z(o,!1,a);if(null!==e){if(g.signal.aborted)throw Q(f);return L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}}const i=o.load;if(void 0===i)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:f});const s=ee(n,o);if(void 0!==u.bytesTransferred&&(void 0===s||a!==c))throw O(n,"download-checkpoint-cleared"),K(f);const m=await i({...o.input,getPriority:()=>U===n?1:0,...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&function(e,t,o){L.delete(e),L.set(e,{url:t,state:o}),S.delete(e);let r=[...L.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;L.size>8||r>C;){const e=L.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,O(e[0],"download-checkpoint-limit")}}(n,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&O(n,"download-checkpoint-invalid")},signal:g.signal,onTransferProgress:o=>{const r=_.get(n);t&&e.isActive()&&!g.signal.aborted&&D.get(n)?.controller===g&&"running"===r?.state&&q({...r,state:"running",percent:Math.min(99,l(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=_.get(n);if(!t||!e.isActive()||g.signal.aborted||D.get(n)?.controller!==g||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||q({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);const p=m instanceof Blob?void 0:m;let v=void 0===p?m:new Blob([p],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&v.type!==o.mimeType&&(v=v.slice(0,v.size,o.mimeType)),a===c&&J(n,v,o.resourceVersion),a===c&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=v.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:v,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{z(),e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:o.cacheKind,messageId:o.messageId,byteLength:t})}).catch(r=>{e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:o.cacheKind,messageId:o.messageId,byteLength:t,cause:r})})}if(L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw X();return v}catch(o){if(!t||!e.isActive())throw X();if(g.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=Q(f);throw D.get(n)?.controller===g&&"canceled"!==_.get(n)?.state&&q({..._.get(n),...I,state:"canceled",percent:_.get(n)?.percent??0,error:S.has(n)?K(f):e}),e}const r=S.has(n)?K(f):i(o)?y({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:f,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:y({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:f});throw D.get(n)?.controller===g&&q({..._.get(n),...I,state:"failed",percent:_.get(n)?.percent??0,error:r}),r}finally{if(d?.(),D.get(n)?.controller===g){D.delete(n);const e=L.get(n);void 0!==e&&(e.idleSince=s())}}});return D.set(n,{controller:g,promise:v}),q({...I,...u,state:"queued"}),v}function oe(e,t){V();const o=_.get(e);if(void 0===o)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function re(e,t){return y({code:"IM_SDK_MEDIA_TASK_INVALID_STATE",category:"state",operation:t,retryable:!1,conversation:e.ref,details:Object.freeze({state:e.state,direction:e.direction})})}const ae=e.emitter.subscribe(e=>{var o,r;t&&"media-task:updated"===e.type&&"upload"===e.task.direction&&(o=e.conversation,r=e.task.ref,o.conversationType===r.conversationType&&o.conversationId===r.conversationId&&($(u(e.task)),F()))});return{api:{async clearCache(){V(),e.connection.invalidateMediaAssetCacheWrites?.(),Y();try{await(e.assetCache?.clear())}catch(t){throw V(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),y({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}V(),z()},getSnapshot:()=>(V(),x()),subscribe:e=>(V(),E.add(e),()=>E.delete(e)),async cancel(t,o){const r=oe(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw re(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=D.get(t);if(void 0===a)throw re(r,"media.cancel");a.controller.abort();const i=S.has(t)?K(r.ref):Q(r.ref);q({...r,state:"canceled",error:i})},async pause(t){const o=oe(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw re(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});V()},async resume(t){const o=oe(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw re(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=oe(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw re(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw re(r,"media.retry");if(("IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED"===r.error?.code||"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED"===r.error?.code)&&!0!==o?.restartUpload)throw y({code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});if(!(void 0===o?e.connection.retryMediaUpload(r.messageId):e.connection.retryMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw re(r,"media.retry");if(D.has(t)&&!D.get(t).controller.signal.aborted)throw y({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=h.get(t);if(void 0===a)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(L.delete(t),S.delete(t)),await te(G(a),!0)},async getUploadRecovery(t){V();const o=v(t);if(void 0!==t.itemIndex)return{available:!1,reason:"unsupported"};const r=t.messageId;if(void 0===e.recoveryPort)return{available:!1,reason:"unavailable"};const a=e.domainState.getConversationMessage(o,r);if(void 0===a)return{available:!1,reason:"not-found"};if(!f(a))return{available:!1,reason:"invalid-state"};try{const t=await e.recoveryPort.get(o,r);V();const a=e.domainState.getConversationMessage(o,r);return void 0===a?{available:!1,reason:"not-found"}:f(a)?void 0===t?{available:!1,reason:"not-found"}:{available:!0,expiresAt:t.savedAt+864e5}:{available:!1,reason:"invalid-state"}}catch(e){V();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){V();const r=v(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw y({code:"IM_SDK_MEDIA_RECOVERY_UNAVAILABLE",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});try{const a=await e.connection.recoverMediaUpload(r,t.messageId,o.file);if(V(),!a.ok&&"paused"===a.reason)throw y({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw y({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw y({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(V(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw y({code:e instanceof Error&&"IM_MEDIA_RECOVERY_FILE_MISMATCH"===e.message?"IM_SDK_MEDIA_RECOVERY_FILE_MISMATCH":"IM_SDK_MEDIA_RECOVERY_FAILED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r})}},download:function(e){try{return V(),te(G(e))}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){V();const t=v(e);U=p("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){V();const o=c,r=t.map(e=>G(e,!1)),a=/* @__PURE__ */new Map,i=s(),d=r.map(e=>{const t=p("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&M.get(t)===e.resourceVersion&&i-(b.get(t)??0)<n});r.forEach((e,t)=>{if(d[t]||void 0===e.cacheKind||void 0===e.resourceVersion)return;const o={kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion};a.set(JSON.stringify(o),o)});const l=[...a.values()];let m=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw y({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(m=await e.assetCache.hasMany(l),m.length!==l.length||m.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw V(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(V(),o!==c)throw y({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const u=new Map(l.map((e,t)=>[JSON.stringify(e),m[t]]));return Object.freeze(r.map((e,t)=>d[t]||!0===u.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(V(),w.add(e),()=>w.delete(e)),getCached:async function(e){const t=G(e,!1);return void 0===t.cacheKind?null:await Z(t,!0)},prepareLocalPreview:async function(t){if(V(),r(t.signal),void 0===e.preparePreview)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++I,kind:t.kind,file:t.file,..."video"===t.kind&&t.includeDisplayPoster?{includeDisplayPoster:!0}:{},...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(!0===t.signal?.aborted||o instanceof Error&&"AbortError"===o.name)throw o;return e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:o}),null}return V(),r(t.signal),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0?(e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:new Error(`预览端口返回了不可用的尺寸 ${o.width}×${o.height}`)}),null):"video"===t.kind?{width:o.width,height:o.height,...void 0===o.duration?{}:{duration:o.duration},...void 0===o.posterData?{}:{posterData:o.posterData},...t.includeDisplayPoster&&o.displayPosterData?.byteLength?{displayPoster:new Blob([o.displayPosterData],{type:a(o.displayPosterData)})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(t){if(V(),r(t.signal),void 0===e.prepareVideoPoster)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++I,kind:"video",file:t.file,...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return V(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),V(),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0||!o.posterData?.byteLength?(e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:new Error("视频封面解码没有返回有效尺寸和图片字节")}),null):new Blob([o.posterData],{type:a(o.posterData)})},prepareLocalImageThumbnail:async function(t){if(V(),r(t.signal),void 0===e.prepareImageThumbnail)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalImageThumbnail",retryable:!1});try{const o=new Uint8Array(await t.file.slice(0,3).arrayBuffer());if(r(t.signal),V(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const i="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),n=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++I,kind:"image",file:i,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),V(),!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0||!n.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和图片字节");return new Blob([n.posterData],{type:a(n.posterData)})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return V(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}}},clearCache:Y,prune:B,dispose(){if(t){t=!1,c+=1,ae();for(const e of D.values())e.controller.abort();R.dispose(),U=void 0,D.clear(),E.clear(),w.clear(),M.clear(),_.clear(),h.clear(),A.clear(),b.clear(),L.clear(),S.clear(),k=0}}}}export{c as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,u as toProductMediaTaskUpdate};
1
+ import{createImSdkError as e}from"./message.js";import{createMediaAssetCacheStrategyRegistry as t,mediaAssetResourceVersion as o}from"../../../im-core/src/ports/media-asset-cache-port.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{resolveMediaThumbnailMimeType as a}from"../../../im-core/src/media-thumbnail.js";import{isCryptoExecutionError as i}from"../../../im-core/src/ports/crypto-task-executor.js";const n=6048e5,s=1048576;function d(e){let t=0,o=!1;const r=[];function a(){if(!o)for(;t<e&&r.length>0;){r.sort((e,t)=>t.getPriority()-e.getPriority());const e=r.shift();if(e.signal.removeEventListener("abort",e.onAbort),e.signal.aborted){e.reject(new DOMException("媒体下载已取消","AbortError"));continue}t+=1;let o=!1;e.resolve(()=>{o||(o=!0,t=Math.max(0,t-1),a())})}}return{acquire:(e,t)=>o?Promise.reject(new Error("媒体下载并发控制器已释放")):new Promise((o,i)=>{const n={resolve:o,reject:i,signal:e,getPriority:t,onAbort:()=>{const e=r.indexOf(n);e>=0&&r.splice(e,1),i(new DOMException("媒体下载已取消","AbortError"))}};e.addEventListener("abort",n.onAbort,{once:!0}),r.push(n),a()}),dispose(){o=!0;for(const e of r.splice(0))e.signal.removeEventListener("abort",e.onAbort),e.reject(new Error("媒体下载并发控制器已释放"))}}}function c(){return t([{kind:"image",softMaxBytes:512*s,maxEntries:512,maxEntryBytes:30*s,maxIdleMs:n},{kind:"video",softMaxBytes:1792*s,maxEntries:64,maxEntryBytes:200*s,maxIdleMs:n},{kind:"file",softMaxBytes:512*s,maxEntries:128,maxEntryBytes:200*s,maxIdleMs:n}])}function l(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round(e))):0}function m(e){return Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function p(e,t,o,r){const a=`${e}:${encodeURIComponent(t.conversationType)}:${encodeURIComponent(t.conversationId)}:${encodeURIComponent(o)}`;return void 0===r?a:`${a}:${r}`}function u(e){const t=e.ref.conversationType,o=e.ref.conversationId;if("direct"!==t&&"group"!==t&&"channel"!==t||""===o.trim())throw y({code:"supergroup"===t?"IM_SDK_SUPERGROUP_UNSUPPORTED":"IM_SDK_MEDIA_TASK_REF_INVALID",category:"supergroup"===t?"unsupported":"contract",operation:"media.tasks.project",retryable:!1});const r=m({conversationType:t,conversationId:o});return g({id:p(e.direction,r,e.messageId),messageId:e.messageId,ref:r,direction:e.direction,state:e.state,percent:l(e.percent),...void 0===e.items?{}:{items:e.items},...void 0===e.attempt?{}:{attempt:e.attempt},...void 0===e.maxAttempts?{}:{maxAttempts:e.maxAttempts},...void 0===e.bytesTransferred?{}:{bytesTransferred:e.bytesTransferred},...void 0===e.bytesTotal?{}:{bytesTotal:e.bytesTotal},...void 0===e.recovery?{}:{recovery:e.recovery},...void 0===e.recoveryReason?{}:{recoveryReason:e.recoveryReason},...void 0===e.phase?{}:{phase:e.phase},...void 0===e.failure?{}:{error:I(e.failure,r)}})}function y(t){const o=e(t);return Object.assign(new Error(o.code),o,{name:"ImMediaTaskOperationError"})}function f(e){return!(void 0!==e.recalled||void 0!==e.deletedForEveryone||"failed"!==e.status&&"uploading"!==e.status||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable)}function I(t,o){if(void 0===t)return;const r=t.displayCode,a=void 0===r?void 0:{"media.empty":{code:"IM_SDK_MEDIA_EMPTY",category:"validation",retryable:!1},"media.noCrypto":{code:"IM_SDK_MEDIA_CRYPTO_UNAVAILABLE",category:"contract",retryable:!1},"media.previewFailed":{code:"IM_SDK_MEDIA_PREVIEW_FAILED",category:"state",retryable:!1},"media.encryptFailed":{code:"IM_SDK_MEDIA_ENCRYPT_FAILED",category:"state",retryable:!1},"media.uploadFailed":{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"network",retryable:!0},"media.uploadTimeout":{code:"IM_SDK_MEDIA_UPLOAD_TIMEOUT",category:"network",retryable:!0},"media.resumeUnavailable":{code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",retryable:!0},"media.cleanupUnconfirmed":{code:"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED",category:"state",retryable:!0},"media.cancelled":{code:"IM_SDK_MEDIA_UPLOAD_CANCELED",category:"state",retryable:!0},"media.invalidDuration":{code:"IM_SDK_VOICE_DURATION_INVALID",category:"validation",retryable:!1},"media.uploadInterrupted":{code:"IM_SDK_MEDIA_UPLOAD_INTERRUPTED",category:"network",retryable:!0}}[r];return Object.freeze(e({...a??{code:"IM_SDK_MEDIA_UPLOAD_FAILED",category:"state",retryable:t.retryable??!1},...!1===t.retryable?{retryable:!1}:{},operation:"media.upload",conversation:o}))}function g(e){return Object.freeze({...e,ref:m(e.ref),...void 0===e.items?{}:{items:Object.freeze(e.items.map(e=>Object.freeze({...e})))},...void 0===e.error?{}:{error:Object.freeze({...e.error})}})}function v(e){const t=e?.conversation,o=t?.conversationType,r=t?.conversationId;if("supergroup"===o)throw y({code:"IM_SDK_SUPERGROUP_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1});if("direct"!==o&&"group"!==o&&"channel"!==o||"string"!=typeof r||""===r.trim()||"string"!=typeof e?.messageId||""===e.messageId.trim())throw y({code:"IM_SDK_MEDIA_MESSAGE_REF_INVALID",category:"validation",operation:"media.download",retryable:!1});return m({conversationType:o,conversationId:r})}function _(e){let t=!0;const s=e.now??Date.now;let c=0,I=0;const _=/* @__PURE__ */new Map,E=/* @__PURE__ */new Set,h=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,A=/* @__PURE__ */new Map,b=/* @__PURE__ */new Map,M=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set;let T=!1;const L=/* @__PURE__ */new Map,S=/* @__PURE__ */new Set,C=e.maxDownloadCheckpointBytes??536870912;function K(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_RESTART_REQUIRED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function O(e,t){L.delete(e),S.add(e);const o=_.get(e);if(void 0!==o){const e={...o,recoveryReason:t,..."failed"===o.state||"canceled"===o.state?{error:K(o.ref)}:{}};"running"===o.state?$(e):q(e)}}const R=d(3);let U;const P=e.maxCachedBlobs??8,N=e.maxCachedBlobBytes??67108864;let k=0;function x(){if(!t||!e.isActive())throw y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.tasks",retryable:!1})}function V(){return Object.freeze([..._.values()])}function F(){const t=V();for(const o of[...E])try{o(t)}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体任务订阅者回调异常",cause:t}})}}function z(){!T&&t&&e.isActive()&&(T=!0,queueMicrotask(()=>{if(T=!1,t&&e.isActive())for(const t of[...w])try{t()}catch(t){e.emitter.emit({type:"error",error:{scope:"unknown",message:"媒体缓存订阅者回调异常",cause:t}})}}))}function B(e){const t=A.get(e);void 0!==t&&(k-=t.size,A.delete(e),b.delete(e),M.delete(e),z())}function j(){if(!t||!e.isActive())return;const o=s();for(const[e,t]of L)!D.has(e)&&void 0!==t.idleSince&&o-t.idleSince>=864e5&&O(e,"download-checkpoint-expired");for(const[e,t]of b)!D.has(e)&&o-t>=n&&B(e);z()}function W(e,t){const o=A.get(e);if(void 0!==o){if(!(M.get(e)!==t||s()-b.get(e)>=n))return A.delete(e),A.set(e,o),b.set(e,s()),o;B(e)}}function Y(){c+=1,A.clear(),b.clear(),M.clear(),z(),k=0;for(const e of[...L.keys()])O(e,"download-checkpoint-cleared")}function H(e){_.delete(e),h.delete(e),L.delete(e),S.delete(e),B(e)}function $(e){_.set(e.id,g(e)),function(){for(;_.size>128;){const e=[..._.values()].find(e=>"completed"===e.state||"failed"===e.state||"canceled"===e.state);if(void 0===e)return;H(e.id)}}()}function q(o){if(!t||!e.isActive())return;$(o);const r=_.get(o.id);if(F(),!t||!e.isActive()||void 0===r||_.get(o.id)!==r)return;const a={id:r.id,messageId:r.messageId,ref:r.ref,direction:"download",state:r.state,percent:r.percent};e.emitter.emit({type:"media-task:updated",conversation:r.ref,task:a})}function J(e,t,o){if(B(e),!(t.size>N))for(A.set(e,t),M.set(e,o),z(),b.set(e,s()),k+=t.size;A.size>P||k>N;){const e=A.keys().next().value;if(void 0===e)break;B(e)}}function G(t,r=!0){const a=v(t),i=e.domainState.getConversationMessage(a,t.messageId);if(void 0===i)throw y({code:"IM_SDK_MEDIA_MESSAGE_NOT_FOUND",category:"state",operation:"media.download",retryable:!1,conversation:a});let n,s,d,c;if("image"===i.contentType)n=i.body.image,s=e.loaders?.loadImage,c="image";else if("video"===i.contentType)n=i.body.video,s=e.loaders?.loadVideo,c="video";else if("voice"===i.contentType)n=i.body.voice,s=e.loaders?.loadVoice;else if("file"===i.contentType)n=i.body.file,s=e.loaders?.loadFile,d=i.body.file?.mimeType,c="file";else if("filesAlbum"===i.contentType){const o=t.itemIndex;if(n=void 0===o?void 0:i.body.filesAlbum?.items[o],void 0===n)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});s=e.loaders?.loadFile,c="file"}else if("mediaAlbum"===i.contentType){const o=i.body.mediaAlbum?.items,r=t.itemIndex,d=void 0===r||void 0===o?void 0:o[r];if(void 0===d)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});n=d,s="video"===d.kind?e.loaders?.loadVideo:e.loaders?.loadImage,c=d.kind}if("mediaAlbum"!==i.contentType&&"filesAlbum"!==i.contentType&&void 0!==t.itemIndex)throw y({code:"IM_SDK_MEDIA_ALBUM_ITEM_INVALID",category:"validation",operation:"media.download",retryable:!1,conversation:a});if(void 0===n)throw y({code:"IM_SDK_MEDIA_MESSAGE_UNSUPPORTED",category:"unsupported",operation:"media.download",retryable:!1,conversation:a});if(r&&void 0===s)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:a});if(""===n.url.trim()||n.url.startsWith("blob:"))throw y({code:"IM_SDK_MEDIA_REMOTE_URL_UNAVAILABLE",category:"state",operation:"media.download",retryable:!1,conversation:a});return{ref:a,messageId:i.id,...void 0===t.itemIndex?{}:{itemIndex:t.itemIndex},...void 0===d?{}:{mimeType:d},...void 0===c?{}:{cacheKind:c,resourceVersion:o(n.url,{conversation:a,itemIndex:t.itemIndex})},...void 0===s?{}:{load:s},input:{url:n.url,...void 0===n.size?{}:{expectedBytes:n.size},...void 0===n.teaKey?{}:{teaKey:n.teaKey},...void 0===n.fileEncryptType?{}:{fileEncryptType:n.fileEncryptType}}}}function Q(e){return y({code:"IM_SDK_MEDIA_DOWNLOAD_CANCELED",category:"state",operation:"media.download",retryable:!0,conversation:e})}function X(){return y({code:"IM_SDK_MEDIA_RUNTIME_INACTIVE",category:"state",operation:"media.download",retryable:!1})}async function Z(t,o,r=c){if(x(),r!==c)return null;const a=p("download",t.ref,t.messageId,t.itemIndex),i=W(a,t.resourceVersion);if(void 0!==i)return i;if(void 0===e.assetCache||void 0===t.cacheKind||void 0===t.resourceVersion)return null;let n;try{n=await e.assetCache.get({kind:t.cacheKind,messageId:t.messageId,resourceVersion:t.resourceVersion}),e.onAssetCacheEvent?.({operation:"get",outcome:null===n?"miss":"hit",kind:t.cacheKind,messageId:t.messageId,...null===n?{}:{byteLength:n.blob.size}})}catch(r){if(e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:t.cacheKind,messageId:t.messageId,cause:r}),o)throw y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.getCached",retryable:!0,conversation:t.ref});return null}if(null===n)return null;if(x(),r!==c)return null;const s=n.blob,d=n.mimeType??t.mimeType??"",l=s.type===d?s:s.slice(0,s.size,d);return J(a,l,t.resourceVersion),l}function ee(e,t){j();const o=L.get(e);if(void 0!==o&&o.url!==t.input.url&&O(e,"download-object-changed"),S.has(e)){const o=K(t.ref),r=_.get(e);throw void 0===r||"failed"!==r.state&&"canceled"!==r.state||q({...r,error:o}),o}return o?.state}function te(o,r=!1){const a=c,n=p("download",o.ref,o.messageId,o.itemIndex),d=D.get(n);if(void 0!==d&&!d.controller.signal.aborted)return d.promise;if(!r){const e=W(n,o.resourceVersion);if(void 0!==e)return q({id:n,ref:m(o.ref),messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex},direction:"download",state:"completed",percent:100}),Promise.resolve(e)}B(n);const u=(()=>{const e=ee(n,o);return void 0===e?{percent:0}:{percent:Math.min(99,Math.round(e.bytesDownloaded/e.bytesTotal*100)),bytesTransferred:e.bytesDownloaded,bytesTotal:e.bytesTotal}})(),f=m(o.ref);h.set(n,Object.freeze({conversation:f,messageId:o.messageId,...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}}));const I={id:n,messageId:o.messageId,ref:f,direction:"download",...void 0===o.itemIndex?{}:{itemIndex:o.itemIndex}},g=new AbortController,v=Promise.resolve().then(async()=>{let d;try{if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(d=await R.acquire(g.signal,()=>U===n?1:0),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(q({...I,...u,state:"running"}),!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);if(!r&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const e=await Z(o,!1,a);if(null!==e){if(g.signal.aborted)throw Q(f);return L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),e}}const i=o.load;if(void 0===i)throw y({code:"IM_SDK_MEDIA_DOWNLOAD_UNAVAILABLE",category:"contract",operation:"media.download",retryable:!1,conversation:f});const s=ee(n,o);if(void 0!==u.bytesTransferred&&(void 0===s||a!==c))throw O(n,"download-checkpoint-cleared"),K(f);const m=await i({...o.input,getPriority:()=>U===n?1:0,...void 0===s?{}:{resume:s},onResumable:r=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&function(e,t,o){L.delete(e),L.set(e,{url:t,state:o}),S.delete(e);let r=[...L.values()].reduce((e,t)=>e+t.state.bytesDownloaded,0);for(;L.size>8||r>C;){const e=L.entries().next().value;if(void 0===e)break;r-=e[1].state.bytesDownloaded,O(e[0],"download-checkpoint-limit")}}(n,o.input.url,r)},onResumeInvalidated:()=>{t&&e.isActive()&&a===c&&D.get(n)?.controller===g&&O(n,"download-checkpoint-invalid")},signal:g.signal,onTransferProgress:o=>{const r=_.get(n);t&&e.isActive()&&!g.signal.aborted&&D.get(n)?.controller===g&&"running"===r?.state&&q({...r,state:"running",percent:Math.min(99,l(o.percent)),bytesTransferred:o.bytesTransferred,bytesTotal:o.bytesTotal,phase:o.bytesTotal>0&&o.bytesTransferred>=o.bytesTotal?"finalizing":"transferring"})},onProgress:o=>{const r=_.get(n);if(!t||!e.isActive()||g.signal.aborted||D.get(n)?.controller!==g||"running"!==r?.state)return;const a=Math.min(99,l(o));a<=r.percent||q({...r,state:"running",percent:a})}});if(!t||!e.isActive())throw X();if(g.signal.aborted)throw Q(f);const p=m instanceof Blob?void 0:m;let v=void 0===p?m:new Blob([p],void 0===o.mimeType?void 0:{type:o.mimeType});if(void 0!==o.mimeType&&v.type!==o.mimeType&&(v=v.slice(0,v.size,o.mimeType)),a===c&&J(n,v,o.resourceVersion),a===c&&void 0!==e.assetCache&&void 0!==o.cacheKind&&void 0!==o.resourceVersion){const t=v.size;e.assetCache.put({kind:o.cacheKind,messageId:o.messageId,resourceVersion:o.resourceVersion,blob:v,...void 0===o.mimeType?{}:{mimeType:o.mimeType}}).then(r=>{z(),e.onAssetCacheEvent?.({operation:"put",outcome:r,kind:o.cacheKind,messageId:o.messageId,byteLength:t})}).catch(r=>{e.onAssetCacheEvent?.({operation:"put",outcome:"failed",kind:o.cacheKind,messageId:o.messageId,byteLength:t,cause:r})})}if(L.delete(n),S.delete(n),q({..._.get(n),...I,state:"completed",percent:100,error:void 0,recoveryReason:void 0}),!t||!e.isActive())throw X();return v}catch(o){if(!t||!e.isActive())throw X();if(g.signal.aborted||"object"==typeof o&&null!==o&&"code"in o&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===o.code){const e=Q(f);throw D.get(n)?.controller===g&&"canceled"!==_.get(n)?.state&&q({..._.get(n),...I,state:"canceled",percent:_.get(n)?.percent??0,error:S.has(n)?K(f):e}),e}const r=S.has(n)?K(f):i(o)?y({code:"IM_SDK_CRYPTO_EXECUTION_FAILED",category:"state",operation:"crypto.execute",retryable:"queue-full"===o.reason,conversation:f,details:{reason:o.reason}}):o instanceof Error&&"ImMediaTaskOperationError"===o.name?o:y({code:"IM_SDK_MEDIA_DOWNLOAD_FAILED",category:"network",operation:"media.download",retryable:!0,conversation:f});throw D.get(n)?.controller===g&&q({..._.get(n),...I,state:"failed",percent:_.get(n)?.percent??0,error:r}),r}finally{if(d?.(),D.get(n)?.controller===g){D.delete(n);const e=L.get(n);void 0!==e&&(e.idleSince=s())}}});return D.set(n,{controller:g,promise:v}),q({...I,...u,state:"queued"}),v}function oe(e,t){x();const o=_.get(e);if(void 0===o)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:t,retryable:!1});return o}function re(e,t){return y({code:"IM_SDK_MEDIA_TASK_INVALID_STATE",category:"state",operation:t,retryable:!1,conversation:e.ref,details:Object.freeze({state:e.state,direction:e.direction})})}const ae=e.emitter.subscribe(e=>{var o,r;t&&"media-task:updated"===e.type&&"upload"===e.task.direction&&(o=e.conversation,r=e.task.ref,o.conversationType===r.conversationType&&o.conversationId===r.conversationId&&($(u(e.task)),F()))});return{api:{async clearCache(){x(),e.connection.invalidateMediaAssetCacheWrites?.(),Y();try{await(e.assetCache?.clear())}catch(t){throw x(),e.emitter.emit({type:"error",error:{scope:"storage",message:"媒体缓存清理失败",cause:t}}),y({code:"IM_SDK_MEDIA_CACHE_CLEAR_FAILED",category:"state",operation:"media.clearCache",retryable:!0})}x(),z()},getSnapshot:()=>(x(),V()),subscribe:e=>(x(),E.add(e),()=>E.delete(e)),async cancel(t,o){const r=oe(t,"media.cancel");if("queued"!==r.state&&"running"!==r.state&&("upload"!==r.direction||"paused"!==r.state))throw re(r,"media.cancel");if("upload"===r.direction){if(!(void 0===o?e.connection.cancelMediaUpload(r.messageId):e.connection.cancelMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.cancel",retryable:!1,conversation:r.ref});return}const a=D.get(t);if(void 0===a)throw re(r,"media.cancel");a.controller.abort();const i=S.has(t)?K(r.ref):Q(r.ref);q({...r,state:"canceled",error:i})},async pause(t){const o=oe(t,"media.pause");if("upload"!==o.direction||"queued"!==o.state&&"running"!==o.state)throw re(o,"media.pause");if(!await(e.connection.pauseMediaUpload?.(o.messageId)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.pause",retryable:!1,conversation:o.ref});x()},async resume(t){const o=oe(t,"media.resume");if("upload"!==o.direction||"paused"!==o.state)throw re(o,"media.resume");if(!e.connection.resumeMediaUpload?.(o.messageId))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.resume",retryable:!1,conversation:o.ref})},async retry(t,o){const r=oe(t,"media.retry");if("failed"!==r.state&&"canceled"!==r.state)throw re(r,"media.retry");if("upload"===r.direction){if(void 0!==o?.restartDownload)throw re(r,"media.retry");if(("IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED"===r.error?.code||"IM_SDK_MEDIA_UPLOAD_CLEANUP_UNCONFIRMED"===r.error?.code)&&!0!==o?.restartUpload)throw y({code:"IM_SDK_MEDIA_UPLOAD_RESTART_REQUIRED",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});if(!(void 0===o?e.connection.retryMediaUpload(r.messageId):e.connection.retryMediaUpload(r.messageId,o)))throw y({code:"IM_SDK_MEDIA_TASK_CONTROL_REJECTED",category:"state",operation:"media.retry",retryable:!1,conversation:r.ref});return}if(void 0!==o?.restartUpload)throw re(r,"media.retry");if(D.has(t)&&!D.get(t).controller.signal.aborted)throw y({code:"IM_SDK_MEDIA_TASK_IN_FLIGHT",category:"state",operation:"media.retry",retryable:!0,conversation:r.ref});const a=h.get(t);if(void 0===a)throw y({code:"IM_SDK_MEDIA_TASK_NOT_FOUND",category:"state",operation:"media.retry",retryable:!1});!0===o?.restartDownload&&(L.delete(t),S.delete(t)),await te(G(a),!0)},async getUploadRecovery(t){x();const o=v(t);if(void 0!==t.itemIndex)return{available:!1,reason:"unsupported"};const r=t.messageId;if(void 0===e.recoveryPort)return{available:!1,reason:"unavailable"};const a=e.domainState.getConversationMessage(o,r);if(void 0===a)return{available:!1,reason:"not-found"};if(!f(a))return{available:!1,reason:"invalid-state"};try{const t=await e.recoveryPort.get(o,r);x();const a=e.domainState.getConversationMessage(o,r);return void 0===a?{available:!1,reason:"not-found"}:f(a)?void 0===t?{available:!1,reason:"not-found"}:{available:!0,expiresAt:t.savedAt+864e5}:{available:!1,reason:"invalid-state"}}catch(e){x();return{available:!1,reason:"object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage"}}},async resumeUpload(t,o){x();const r=v(t);if(void 0!==t.itemIndex||void 0===e.connection.recoverMediaUpload)throw y({code:"IM_SDK_MEDIA_RECOVERY_UNAVAILABLE",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});try{const a=await e.connection.recoverMediaUpload(r,t.messageId,o.file);if(x(),!a.ok&&"paused"===a.reason)throw y({code:"IM_SDK_MEDIA_PAUSED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok&&"cancelled"===a.reason)throw y({code:"IM_SDK_MEDIA_CANCELLED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r});if(!a.ok)throw y({code:"IM_SDK_MEDIA_RECOVERY_UPLOAD_FAILED",category:"state",operation:"media.resumeUpload",retryable:!0,conversation:r})}catch(e){if(x(),"object"==typeof e&&null!==e&&"code"in e&&"string"==typeof e.code&&e.code.startsWith("IM_SDK_"))throw e;throw y({code:e instanceof Error&&"IM_MEDIA_RECOVERY_FILE_MISMATCH"===e.message?"IM_SDK_MEDIA_RECOVERY_FILE_MISMATCH":"IM_SDK_MEDIA_RECOVERY_FAILED",category:"state",operation:"media.resumeUpload",retryable:!1,conversation:r})}},download:function(e){try{return x(),te(G(e))}catch(e){return Promise.reject(e)}},prioritizeDownload:function(e){x();const t=v(e);U=p("download",t,e.messageId,e.itemIndex)},probeCached:async function(t){x();const o=c,r=t.map(e=>G(e,!1)),a=/* @__PURE__ */new Map,i=s(),d=r.map(e=>{const t=p("download",e.ref,e.messageId,e.itemIndex);return A.has(t)&&M.get(t)===e.resourceVersion&&i-(b.get(t)??0)<n});r.forEach((e,t)=>{if(d[t]||void 0===e.cacheKind||void 0===e.resourceVersion)return;const o={kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion};a.set(JSON.stringify(o),o)});const l=[...a.values()];let m=l.map(()=>!1);if(l.length>0&&void 0!==e.assetCache){if(void 0===e.assetCache.hasMany)throw y({code:"IM_SDK_MEDIA_CACHE_PROBE_UNAVAILABLE",category:"contract",operation:"media.probeCached",retryable:!1});try{if(m=await e.assetCache.hasMany(l),m.length!==l.length||m.some(e=>"boolean"!=typeof e))throw new Error("媒体缓存查询结果数量或类型不符")}catch(t){throw x(),e.onAssetCacheEvent?.({operation:"get",outcome:"failed",kind:l[0].kind,messageId:l[0].messageId,cause:t}),y({code:"IM_SDK_MEDIA_CACHE_READ_FAILED",category:"state",operation:"media.probeCached",retryable:!0})}}if(x(),o!==c)throw y({code:"IM_SDK_MEDIA_CACHE_QUERY_STALE",category:"state",operation:"media.probeCached",retryable:!0});const u=new Map(l.map((e,t)=>[JSON.stringify(e),m[t]]));return Object.freeze(r.map((e,t)=>d[t]||!0===u.get(JSON.stringify({kind:e.cacheKind,messageId:e.messageId,resourceVersion:e.resourceVersion}))))},subscribeCacheChanges:e=>(x(),w.add(e),()=>w.delete(e)),getCached:async function(e){const t=G(e,!1);return void 0===t.cacheKind?null:await Z(t,!0)},prepareLocalPreview:async function(t){if(x(),r(t.signal),void 0===e.preparePreview)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalPreview",retryable:!1});let o;try{o=await e.preparePreview({operationId:"media.prepareLocalPreview:"+ ++I,kind:t.kind,file:t.file,..."video"===t.kind&&t.includeDisplayPoster?{includeDisplayPoster:!0}:{},...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(!0===t.signal?.aborted||o instanceof Error&&"AbortError"===o.name)throw o;return e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:o}),null}return x(),r(t.signal),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0?(e.onLocalPreviewError?.({kind:t.kind,byteLength:t.file.size,cause:new Error(`预览端口返回了不可用的尺寸 ${o.width}×${o.height}`)}),null):"video"===t.kind?{width:o.width,height:o.height,...void 0===o.duration?{}:{duration:o.duration},...void 0===o.posterData?{}:{posterData:o.posterData},...t.includeDisplayPoster&&o.displayPosterData?.byteLength?{displayPoster:new Blob([o.displayPosterData],{type:a(o.displayPosterData)})}:{}}:{width:o.width,height:o.height}},prepareLocalVideoPoster:async function(t){if(x(),r(t.signal),void 0===e.prepareVideoPoster)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalVideoPoster",retryable:!1});let o;try{o=await e.prepareVideoPoster({operationId:"media.prepareLocalVideoPoster:"+ ++I,kind:"video",file:t.file,...void 0===t.signal?{}:{signal:t.signal}})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return x(),e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:o}),null}return r(t.signal),x(),!Number.isFinite(o.width)||!Number.isFinite(o.height)||o.width<=0||o.height<=0||!o.posterData?.byteLength?(e.onLocalPreviewError?.({kind:"video",byteLength:t.file.size,cause:new Error("视频封面解码没有返回有效尺寸和图片字节")}),null):new Blob([o.posterData],{type:a(o.posterData)})},prepareLocalImageThumbnail:async function(t){if(x(),r(t.signal),void 0===e.prepareImageThumbnail)throw y({code:"IM_SDK_MEDIA_PREVIEW_UNAVAILABLE",category:"contract",operation:"media.prepareLocalImageThumbnail",retryable:!1});try{const o=new Uint8Array(await t.file.slice(0,3).arrayBuffer());if(r(t.signal),x(),255!==o[0]||216!==o[1]||255!==o[2])return t.file;const i="image/jpeg"===t.file.type?t.file:t.file.slice(0,t.file.size,"image/jpeg"),n=await e.prepareImageThumbnail({operationId:"media.prepareLocalImageThumbnail:"+ ++I,kind:"image",file:i,...void 0===t.signal?{}:{signal:t.signal}});if(r(t.signal),x(),!Number.isFinite(n.width)||!Number.isFinite(n.height)||n.width<=0||n.height<=0||!n.posterData?.byteLength)throw new Error("图片缩略图解码没有返回有效尺寸和图片字节");return new Blob([n.posterData],{type:a(n.posterData)})}catch(o){if(r(t.signal),o instanceof Error&&"AbortError"===o.name)throw o;return x(),e.onLocalPreviewError?.({kind:"image",byteLength:t.file.size,cause:o}),null}}},clearCache:Y,prune:j,dispose(){if(t){t=!1,c+=1,ae();for(const e of D.values())e.controller.abort();R.dispose(),U=void 0,D.clear(),E.clear(),w.clear(),M.clear(),_.clear(),h.clear(),A.clear(),b.clear(),L.clear(),S.clear(),k=0}}}}export{c as createDefaultMediaAssetCacheStrategyRegistry,_ as createMediaTasksRuntime,u as toProductMediaTaskUpdate};
package/dist/sdk.d.ts CHANGED
@@ -5186,7 +5186,7 @@ interface ImMediaTasksApi {
5186
5186
  clearCache: () => Promise<void>;
5187
5187
  /**
5188
5188
  * 按输入顺序查询完整本机媒体是否可用;不下载、不读取 Blob、不续缓存期限或创建任务。
5189
- * 仅支持图片/视频(含媒体合集);未配置持久缓存时只检查内存。
5189
+ * 支持图片、视频和文件(含各自合集);未配置持久缓存时只检查内存。
5190
5190
  * @throws 不支持轻量查询或存储读取失败时明确拒绝,不伪装成未命中。
5191
5191
  * @example const [available] = await client.media.probeCached([messageRef])
5192
5192
  */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "k2-im",
3
3
  "type": "module",
4
- "version": "0.2.10",
4
+ "version": "0.2.12",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "publishConfig": {