k2-im 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-kit-pinia.d.ts +77 -18
- package/dist/chat-kit-vue.d.ts +7 -5
- package/dist/chat-kit.d.ts +138 -23
- package/dist/index.d.ts +142 -26
- package/dist/modules/api-protocol-client/src/client.js +1 -1
- package/dist/modules/api-protocol-client/src/nonce.js +1 -1
- package/dist/modules/crypto/browser.js +1 -1
- package/dist/modules/crypto/driver.js +1 -1
- package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
- package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
- package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-download-request.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
- package/dist/modules/im-browser/src/media/webp-encoder.js +1 -0
- package/dist/modules/im-browser/src/media/webp-worker-factory.js +1 -0
- package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -1
- package/dist/modules/im-core/src/abort.js +1 -1
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
- package/dist/modules/im-core/src/mapping/message-id.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail.js +1 -1
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-core/src/state/domain-state.js +1 -1
- package/dist/modules/im-sdk/src/create-im-client.js +1 -1
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
- package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
- package/dist/modules/im-sdk/src/product/media.js +1 -1
- package/dist/modules/im-sdk/src/runtime/history-page-size.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
- package/dist/request-crypto.d.ts +3 -2
- package/dist/sdk.d.ts +75 -21
- package/dist/vendor/crypto/index_bg.wasm +0 -0
- package/dist/vendor/webp/LICENSE.jsquash +201 -0
- package/dist/vendor/webp/LICENSE.libwebp +29 -0
- package/dist/vendor/webp/NOTICE +3 -0
- package/dist/webp.worker.js +3 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,"hydrate-recent"!==e&&"report-recent"!==e||l.record("warn","pinia","hydrate-recent"===e?"storage":"message","expression-recent-operation-failed",()=>({data:{operation:e,code:n.code},error:{message:n.code}})),Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t={}){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i=Object.freeze({ok:!0,operation:r});for(const[e,r]of o.entries())if(i=await et(n,{kind:"emoji",token:r.token,resourceId:r.resourceId},!1!==t.refreshAfterReport&&e===o.length-1),!i.ok&&"stale"===i.reason)return i;return i}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
|
|
1
|
+
import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,"hydrate-recent"!==e&&"report-recent"!==e||l.record("warn","pinia","hydrate-recent"===e?"storage":"message","expression-recent-operation-failed",()=>({data:{operation:e,code:n.code},error:{message:n.code}})),Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t={}){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i,s=Object.freeze({ok:!0,operation:r});for(const[e,c]of o.entries()){const a=le.emoji+1;if(s=await et(n,{kind:"emoji",token:c.token,resourceId:c.resourceId},!1!==t.refreshAfterReport&&e===o.length-1),!Re(n)||le.emoji!==a)return Me(r);if(!s.ok){if("stale"===s.reason)return s;i??(i=s)}}return void 0!==i?.error&&($.emoji.error=i.error),i??s}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createMediaObjectUrlRegistry as e}from"./media-object-url-registry.js";import{validateCachePrefix as
|
|
1
|
+
import{createMediaObjectUrlRegistry as e}from"./media-object-url-registry.js";import{validateCachePrefix as r,createImCacheNamespaceFactory as o}from"../../../im-core/src/cache-namespace.js";import{createAdvancedImClient as t,createProductClientFacade as n}from"../../../im-sdk/src/create-im-client.js";import{createIndexedDbStorageAdapter as i,deleteIndexedDbNamespace as s}from"../../../im-browser/src/storage/indexed-db-storage-adapter.js";import{createDefaultMediaAssetCacheStrategyRegistry as c}from"../../../im-sdk/src/product/media.js";import{createSdkDiagnosticWriter as a}from"../../../im-sdk/src/product/diagnostics.js";function d(){if("undefined"==typeof navigator)return{maxCachedEntries:6,maxCachedBytes:536870912};const e=navigator,r=e.deviceMemory??4,o=/Android|iPhone|iPad|Mobile/i.test(e.userAgent);return!0===e.connection?.saveData||r<=2||navigator.hardwareConcurrency<=2?{maxCachedEntries:2,maxCachedBytes:134217728}:o?{maxCachedEntries:4,maxCachedBytes:268435456}:r>=8&&navigator.hardwareConcurrency>=8?{maxCachedEntries:9,maxCachedBytes:1073741824}:{maxCachedEntries:6,maxCachedBytes:536870912}}function l(e){const r=`message\0${e.conversationType}\0${e.conversationId}\0${e.messageId}`;return void 0===e.itemIndex?r:`${r}\0${e.itemIndex}`}function u(e){return`source\0${e}`}function m(e){if("object"==typeof e&&null!==e&&"code"in e)return"IM_CONNECTION_OWNED_ELSEWHERE"===e.code?"lifecycle.connectionOccupied":"IM_CONNECTION_OWNERSHIP_UNAVAILABLE"===e.code?"lifecycle.connectionCoordinationUnavailable":void 0}function p(p){const f=r(p.cachePrefix),g=o(f),h=p.createClient??t,v=p.createStorage??(e=>"undefined"==typeof indexedDB?void 0:i({...e,mediaAssetCache:{strategies:c()}})),y=p.createProfile,C=p.deleteStorage??(e=>s(e.accountId,{namespaceFactory:e.namespaceFactory}));let k,w,I,b,M,E,P=null,x=null,T=!1,B=0,S=!1,R=!1;const U={wsUrl:"",userId:"",token:"",deviceToken:"",channelType:"0",cmHttpBaseUrl:""},A=a(p.debug,()=>({generation:B,...""===U.userId?{}:{accountId:U.userId}}));function D(){return{generation:B,...""===U.userId?{}:{accountId:U.userId}}}A.record("debug","chat-kit","session","runtime-created");let L={},N={},j={};const O=/* @__PURE__ */new Map;let $=/* @__PURE__ */new WeakMap;const F=e({...d(),maxIdleMs:6048e5}),H=/* @__PURE__ */new Set,K=/* @__PURE__ */new Set,_=/* @__PURE__ */new Set;function V(){for(const e of _)e()}function W(e=!1){const r=D(),o=P,t=void 0!==w||void 0!==I;w?.(),w=void 0,I?.(),I=void 0,t&&A.record("debug","chat-kit","session","client-subscriptions-released",()=>r),e||o?.connection.disconnect("im-chat-auth-changed"),P=null,x=null;const n=k;let i;k=void 0;try{i=null!==o&&b?.uploadRecovery?.enabled&&!e?o.logout({localData:"preserve"}).finally(()=>o.dispose()):Promise.resolve(null!==o?o.dispose():n?.close())}catch(e){i=Promise.reject(e)}const s=i.catch(e=>{R=!0,E=e,A.record("error","chat-kit","session","previous-client-dispose-failed",()=>({...r,error:{message:"旧 IM Client 清理失败,已阻止新账号准备",data:e}}))});M=void 0===M?s:Promise.all([M,s]).then(()=>{}),B+=1,L={},N={},j={},G(),O.clear(),V()}function q(){if(S)throw new Error("ChatRuntime 已 dispose,不能创建/复用 client");if(null===P){const e=v({namespaceFactory:g});k=e;const r=b?.getCoreClient(),o=b?.getCoreApi?.();T=void 0!==r||void 0!==o;const t=b?.clientType??2,n=B,i=b?.onRequestError,s=r&&y?y({client:r,clientType:t,storage:k}):void 0,c={authProvider:{getLoginContext:async()=>{const e=b?.getSession?.(),r=void 0!==b?.getSession,o=(r?e?.userId:U.userId)?.trim()??"",n=(r?e?.token:U.token)?.trim()??"";return""===o||""===n||o!==U.userId?null:{userId:o,token:n,deviceToken:U.deviceToken,clientType:t,channelType:Number(U.channelType)}}},endpointProvider:{getEndpoints:async()=>[{url:U.wsUrl}],getCmHttpBaseUrl:async()=>U.cmHttpBaseUrl},cache:{prefix:f},adapters:{namespaceFactory:g,storage:{create:r=>{if(r.namespaceFactory!==g)throw new Error("ChatRuntime storage namespace factory 不一致");return e},purgeCurrentAccount:e=>C(e)}},profile:s,media:b?.getMediaConfig(),uploadRecovery:b?.uploadRecovery,expressions:b?.getExpressionOptions?.(),coreApi:o,coreClient:r,onRequestError:void 0===i?void 0:e=>S||B!==n?void 0:i(e),debug:p.debug},a=h(c),d=a.events;if(void 0===d&&K.size>0)throw Promise.resolve(k?.close?.()).catch(()=>{}),k=void 0,new Error("IM client 缺少产品事件 API");P=a,w=P.connection.subscribe(e=>{if(("message:updated"===e.type||"message:received"===e.type)&&"failed"===e.message.status&&"media.uploadInterrupted"===e.message.failure?.displayCode&&!1===e.message.failure.retryable){const r=e.message,o=l({conversationType:r.conversationType,conversationId:r.conversationId,messageId:r.id});F.remove(o),F.removeByPrefix(`${o}\0`)}for(const r of H)r(e)}),void 0!==d&&(I=d.subscribe(e=>{for(const r of K)r(e)})),A.record("debug","chat-kit","session","client-subscriptions-established",()=>D())}return P}function z(){const e=q();return x??(x=n(e,{coreApiAvailable:T})),x}function G(){$=/* @__PURE__ */new WeakMap,F.clearAll()}return{getClient:()=>P,getProductClient:()=>null===P?null:z(),ensureProductClient:z,getConnectionState:()=>P?.connection.state??"idle",getGeneration:()=>B,getCredentials:()=>U,getMediaConfig:()=>b?.getMediaConfig(),getDiagnostics:()=>A,configureHost(e){b=e},applySession(e,r,o){const t=e?.userId??"",n=e?.token??"",i=null!==P&&(U.userId!==t||U.token!==n);return i&&W(U.userId===t&&""!==n),U.wsUrl=r.wsUrl,U.cmHttpBaseUrl=r.cmHttpBaseUrl,U.userId=t,U.token=n,U.deviceToken=o,U.channelType="0",A.record("info","chat-kit","session","session-applied",()=>({data:{accountId:t,hasToken:""!==n,didReset:i}})),{didReset:i,hasToken:""!==n}},ensureClient:q,async prepare(){if(S)return{ok:!1,errorKey:"lifecycle.disposed"};if(""===U.userId)return{ok:!1,errorKey:"lifecycle.missingLoginState"};const e=Date.now(),r=D();A.record("info","chat-kit","session","prepare-start",()=>r);try{const o=U.userId,t=U.token;if(void 0!==M&&await M,S||B!==r.generation||U.userId!==o||U.token!==t)throw new Error("IM session 已变化,取消旧 prepare");if(R)throw new Error("旧 IM Client 未能完成清理,请刷新后重试",{cause:E});const n=q();return await n.connection.prepare(),A.record("info","chat-kit","session","prepare-complete",()=>({...r,durationMs:Date.now()-e})),{ok:!0}}catch(o){A.record("error","chat-kit","session","prepare-failed",()=>({...r,durationMs:Date.now()-e,error:{message:"ChatRuntime prepare 失败",data:o}}));const t=m(o);return void 0!==t?{ok:!1,errorKey:t}:{ok:!1,errorKey:"lifecycle.prepareFailed",errorParams:{reason:o instanceof Error?o.message:String(o)}}}},async connect(){if(S)return{ok:!1,errorKey:"lifecycle.disposed"};if(""===U.wsUrl||""===U.userId||""===U.token)return{ok:!1,errorKey:"lifecycle.missingConnectParams"};const e=Date.now(),r=D();A.record("info","chat-kit","connection","connect-start",()=>r);try{const o=U.userId,t=U.token;if(void 0!==M&&await M,S||B!==r.generation||U.userId!==o||U.token!==t)throw new Error("IM session 已变化,取消旧 connect");if(R)throw new Error("旧 IM Client 未能完成清理,请刷新后重试",{cause:E});const n=q();return await n.connection.connect(),A.record("info","chat-kit","connection","connect-complete",()=>({...r,durationMs:Date.now()-e})),{ok:!0}}catch(o){A.record("error","chat-kit","connection","connect-failed",()=>({...r,durationMs:Date.now()-e,error:{message:"ChatRuntime connect 失败",data:o}}));const t=m(o);return void 0!==t?{ok:!1,errorKey:t}:{ok:!1,errorKey:"lifecycle.connectFailed",errorParams:{reason:o instanceof Error?o.message:String(o)}}}},disconnect(){const e=D();A.record("info","chat-kit","connection","disconnect",()=>e),P?.connection.disconnect("im-chat-manual")},async logout(e){const r=Date.now(),o=D();A.record("info","chat-kit","session","logout-start",()=>({...o,data:e}));const t=P;let n,i;if(null!==t)try{i=t.logout(e)}catch(e){n=e}if(U.userId="",U.token="",U.deviceToken="",U.channelType="0",B+=1,void 0!==i)try{await i}catch(e){n=e}if(L={},N={},j={},G(),O.clear(),V(),A.record(void 0===n?"info":"error","chat-kit","session",void 0===n?"logout-complete":"logout-failed",()=>({...o,durationMs:Date.now()-r,...void 0===n?{}:{error:{message:"ChatRuntime logout 失败",data:n}}})),void 0!==n)throw n},resetForAuthChange:W,dispose(){if(S)return;S=!0;const e=D();A.record("info","chat-kit","session","dispose",()=>e),W(!0),H.clear(),K.clear(),_.clear()},subscribeEvents:e=>(H.add(e),()=>{H.delete(e)}),subscribeProductEvents:e=>(K.add(e),()=>{K.delete(e)}),getSenderProfileCache:()=>L,setSenderProfileCache(e){L=e,V()},getGroupMemberNames:()=>N,setGroupMemberNames(e){N=e,V()},getChannelMemberProfiles:()=>j,setChannelMemberProfiles(e){j=e,V()},subscribeProfileChange:e=>(_.add(e),()=>{_.delete(e)}),putSelfVoiceBytes(e,r){for(O.delete(e),O.set(e,r);O.size>20;){const e=O.keys().next().value;if(void 0===e)break;O.delete(e)}},getSelfVoiceBytes:e=>O.get(e),clearSelfVoiceBytes(){O.clear()},rememberLocalVideoPoster(e,r){$.set(e,r)},createLocalMediaPreview(e){const r=URL.createObjectURL(e);return F.register(u(r),r,{byteSize:e.size,evictable:!1,videoPoster:$.get(e)}),r},discardLocalMediaPreview(e){F.remove(u(e))},trackLocalMediaPreview(e,r){F.move(u(r),l(e))},resolveMediaPreviewToRemote(e,r,o,t){const n=l(e);if("image"===r||"video"===r){if(void 0!==t&&!F.bindResource(n,t))return;F.makeEvictable(n,o)}else F.remove(n)},hasMediaBlob:e=>F.has(l(e),e.resourceUrl),acquireMediaBlob:e=>F.acquire(l(e),e.resourceUrl),async clearMediaCache(){const e=P,r=B;if(null===e)throw new Error("IM session is not ready");if(F.clearCached(),await e.media.clearCache(),B!==r||P!==e)throw new Error("IM session changed during media cache cleanup")},cleanupLocalMediaBlobs:G,cleanupConversationMediaBlobs:function(e){F.removeByPrefix(function(e){return`message\0${e.conversationType}\0${e.conversationId}\0`}(e))}}}export{p as createChatRuntime};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e){const t=/* @__PURE__ */new Map,
|
|
1
|
+
function e(e){const t=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set,r=e.revokeObjectUrl??(e=>URL.revokeObjectURL(e)),s=e.now??Date.now,i=e.maxIdleMs;if(!Number.isFinite(i)||i<=0)throw new RangeError("maxIdleMs must be a finite positive number");let n,c;function l(){void 0!==n&&clearTimeout(n),n=void 0,c=void 0}function a(){let e=Number.POSITIVE_INFINITY;for(const o of t.values())o.evictable&&0===o.leases&&(e=Math.min(e,o.lastAccessedAt+i));void 0!==n&&c===e||(l(),Number.isFinite(e)&&(c=e,n=setTimeout(()=>{n=void 0,c=void 0,f()},Math.min(2147483647,Math.max(0,e-s()))),n.unref?.()))}function d(e){e.revoked||(e.revoked=!0,o.delete(e),r(e.url))}function u(e){t.get(e.key)===e&&t.delete(e.key),e.retired=!0,0===e.leases?d(e):o.add(e)}function v(){let e=0,o=0;for(const r of t.values())r.evictable&&(e+=1,o+=r.byteSize+(r.videoPoster?.size??0));return{entries:e,bytes:o}}function f(){{const e=s();for(const o of t.values())o.evictable&&0===o.leases&&e-o.lastAccessedAt>=i&&u(o)}!function(){let o=v();for(;o.entries>e.maxCachedEntries||o.bytes>e.maxCachedBytes;){let e;for(const o of t.values())if(o.evictable&&0===o.leases){e=o;break}if(void 0===e)return;u(e),o=v()}}(),a()}function b(e){const o=t.get(e);void 0!==o&&u(o),f()}return{register:function(e,o,r){const i=r.byteSize??0,n=Number.isFinite(i)&&i>0?Math.floor(i):0,c=t.get(e);if(c?.url===o)return c.byteSize=n,c.videoPoster=r.videoPoster,c.evictable=r.evictable,c.lastAccessedAt=s(),t.delete(e),t.set(e,c),void f();void 0!==c&&u(c),t.set(e,{key:e,url:o,resourceUrl:o,byteSize:n,videoPoster:r.videoPoster,evictable:r.evictable,leases:0,retired:!1,revoked:!1,lastAccessedAt:s()}),f()},move:function(e,o){f();const r=t.get(e);if(void 0===r)return!1;const s=t.get(o);return void 0!==s&&s!==r&&u(s),t.delete(e),r.key=o,t.set(o,r),a(),!0},bindResource:function(e,o){f();const r=t.get(e);return void 0!==r&&(r.resourceUrl===o||(r.resourceUrl.startsWith("blob:")&&/^https?:\/\//i.test(o)?(r.resourceUrl=o,!0):(u(r),f(),!1)))},makeEvictable:function(e,o){f();const r=t.get(e);return void 0!==r&&(void 0!==o&&Number.isFinite(o)&&o>0&&(r.byteSize=Math.floor(o)),r.evictable=!0,r.lastAccessedAt=s(),t.delete(e),t.set(e,r),f(),t.get(e)===r)},acquire:function(e,o){f();const r=t.get(e);if(void 0===r||r.revoked||void 0!==o&&r.resourceUrl!==o)return;r.leases+=1,r.lastAccessedAt=s(),t.delete(e),t.set(e,r),a();let i=!1;return Object.freeze({url:r.url,...void 0===r.videoPoster?{}:{videoPoster:r.videoPoster},release(){i||(i=!0,r.leases=Math.max(0,r.leases-1),0!==r.leases||r.revoked||(r.lastAccessedAt=s()),r.retired&&0===r.leases&&d(r),f())}})},has:(e,o)=>{f();const r=t.get(e);return void 0!==r&&!r.revoked&&(void 0===o||r.resourceUrl===o)},remove:b,removeByPrefix:function(e){for(const o of[...t.keys()])o.startsWith(e)&&b(o)},clearAll:function(){l();const e=[...t.values()];t.clear();for(const t of[...e,...o])d(t);o.clear()},clearCached:function(){for(const e of t.values())e.evictable&&u(e);f()},prune:f,getStats:()=>(f(),Object.freeze({activeEntries:t.size,retiredEntries:o.size,...v()}))}}export{e as createMediaObjectUrlRegistry};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,n){if("supergroup"!==e.conversationType)return{conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id,...void 0===n?{}:{itemIndex:n}}}function n(n,t,i){const o=n.getClient(),r=e(t,i);if(null===o||void 0===r)throw new Error("media download unavailable");o.media.prioritizeDownload(r)}async function t(n,t,i,o){const r=n.getClient(),a=e(t,o);if(null===r||void 0===a)throw new Error("media download unavailable");const l=void 0===i?void 0:r.media.subscribe(e=>{const n=e.find(e=>"download"===e.direction&&e.messageId===a.messageId&&e.itemIndex===o&&e.ref.conversationType===a.conversation.conversationType&&e.ref.conversationId===a.conversation.conversationId);void 0!==n&&i(n.percent)});try{return await r.media.download(a)}finally{l?.()}}function i(e){return"object"==typeof e&&null!==e&&"code"in e&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===e.code}async function o(e,n){const t=e.getClient();if(null===t)return null;const i=e.getGeneration(),o=await t.media.prepareLocalPreview(n);return null===o||e.getGeneration()!==i?null:("video"===n.kind&&"displayPoster"in o&&o.displayPoster&&e.rememberLocalVideoPoster(n.file,o.displayPoster),o)}function r(e){return e.length>=3&&255===e[0]&&216===e[1]&&255===e[2]?"image/jpeg":e.length>=8&&137===e[0]&&80===e[1]&&78===e[2]&&71===e[3]?"image/png":e.length>=6&&71===e[0]&&73===e[1]&&70===e[2]?"image/gif":e.length>=12&&87===e[8]&&69===e[9]&&66===e[10]&&80===e[11]?"image/webp":null}async function a(e){const n=r(new Uint8Array(await e.slice(0,12).arrayBuffer()));return null===n?null:URL.createObjectURL(e.type===n?e:e.slice(0,e.size,n))}function l(e){return e.length>=4&&26===e[0]&&69===e[1]&&223===e[2]&&163===e[3]?"video/webm":(e.length>=8&&102===e[4]&&116===e[5]&&121===e[6]&&e[7],"video/mp4")}function c(e,n,t){return e.acquireMediaBlob({conversationType:n.conversationType,conversationId:n.conversationId,messageId:n.id,...void 0===t?{}:{itemIndex:t}})}async function s(e,n,i){const o=e.getClient(),r=n.body.voice;if(null===o||void 0===r)return null;const a=e.getSelfVoiceBytes(n.id);if(void 0!==a)return a;const l=e.getGeneration();try{const o=new Uint8Array(await(await t(e,n)).arrayBuffer());return 0===o.length?(e.getGeneration()===l&&i.setNote(i.t("media.voiceLoadEmpty")),null):o}catch(n){return e.getGeneration()===l&&i.setNote(i.t("media.voiceLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function u(e,n,o,r){const a=e.getClient(),l=n.body.video;if(null===a||void 0===l)return null;const c=e.getGeneration();try{const i=await t(e,n,r);if(0===i.size)return e.getGeneration()===c&&o.setNote(o.t("media.videoOpenEmpty")),null;const a=URL.createObjectURL(i);return e.getGeneration()!==c?(URL.revokeObjectURL(a),null):a}catch(n){return e.getGeneration()!==c||i(n)||o.setNote(o.t("media.videoLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function d(n,t){const i=n.getClient(),o=e(t);if(null===i||void 0===o||void 0===t.body.video)return null;const r=n.getGeneration();try{const e=await i.media.getCached(o);if(null===e||0===e.size||n.getGeneration()!==r)return null;const t=new Uint8Array(await e.slice(0,12).arrayBuffer()),a=e.type||l(t);return n.getGeneration()!==r?null:URL.createObjectURL(e.type===a?e:e.slice(0,e.size,a))}catch{return null}}async function g(e,n,o,r,l){const c=e.getClient(),s=n.body.mediaAlbum?.items[o];if(null===c||void 0===s)return null;const u="video"===s.kind,d=e.getGeneration();try{const i=await t(e,n,l,o);if(u&&0===i.size)return e.getGeneration()===d&&r.setNote(r.t("media.videoOpenEmpty")),null;const c=u?URL.createObjectURL(i):await a(i);return null===c?(e.getGeneration()===d&&r.setNote(r.t("media.imageInvalid",{size:i.size})),null):e.getGeneration()!==d?(URL.revokeObjectURL(c),null):c}catch(n){return e.getGeneration()!==d||i(n)||r.setNote(r.t(u?"media.videoLoadFailed":"media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function v(n,t,i){const o=n.getClient(),r=t.body.mediaAlbum?.items[i],l=e(t,i);if(null===o||void 0===l||void 0===r||!/^https?:\/\//i.test(r.url))return null;const c=n.getGeneration();try{const e=await o.media.getCached(l);if(null===e||0===e.size||n.getGeneration()!==c)return null;const t="video"===r.kind?URL.createObjectURL(e):await a(e);return null===t?null:n.getGeneration()!==c?(URL.revokeObjectURL(t),null):t}catch{return null}}async function f(e,n,o){const r=e.getClient(),l=n.body.image;if(null===r||void 0===l)return null;const c=e.getGeneration();try{const i=await t(e,n),r=await a(i);return null===r?(e.getGeneration()===c&&o.setNote(o.t("media.imageInvalid",{size:i.size})),null):e.getGeneration()!==c?(URL.revokeObjectURL(r),null):r}catch(n){return e.getGeneration()!==c||i(n)||o.setNote(o.t("media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function m(n,t){const i=n.getClient(),o=e(t);if(null===i||void 0===o||void 0===t.body.image)return null;const r=n.getGeneration();try{const e=await i.media.getCached(o);if(null===e||0===e.size||n.getGeneration()!==r)return null;const t=await a(e);return null===t?null:n.getGeneration()!==r?(URL.revokeObjectURL(t),null):t}catch{return null}}async function y(e,n,o,r,a){const l=e.getClient(),c=void 0===a?n.body.file:n.body.filesAlbum?.items[a];if(null===l||void 0===c)return null;const s=e.getGeneration();try{const i=await t(e,n,r,a);if(0===i.size)return e.getGeneration()===s&&o.setNote(o.t("media.fileDownloadEmpty")),null;const l=URL.createObjectURL(i);return e.getGeneration()!==s?(URL.revokeObjectURL(l),null):l}catch(n){return e.getGeneration()!==s||i(n)||o.setNote(o.t("media.fileDownloadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}export{c as acquireMediaBlob,r as detectImageMime,l as detectVideoMime,m as loadCachedImageObjectUrl,v as loadCachedMediaAlbumItemObjectUrl,d as loadCachedVideoObjectUrl,y as loadFileObjectUrl,f as loadImageObjectUrl,g as loadMediaAlbumItemObjectUrl,u as loadVideoObjectUrl,s as loadVoiceBytes,o as prepareLocalMediaPreview,n as prioritizeMediaDownload};
|
|
1
|
+
function e(e){if(e?.aborted)throw e.reason??new DOMException("媒体显示图准备已取消","AbortError")}async function n(e){try{return await e()}catch(e){if("object"==typeof e&&null!==e&&"code"in e&&"IM_SDK_MEDIA_CACHE_READ_FAILED"===e.code)return null;throw e}}function t(e,n){const t=void 0===n?1:e.body.mediaAlbum?.items.length??1;return t<=1?1440:2===t?1080:768}async function i(t,i,o,r,a){if(!i.startsWith("blob:"))throw new TypeError("气泡显示图只接受本机 blob 地址");e(r);const l=t.getClient();if(null===l)return null;const u=t.getGeneration(),c=void 0===a?void 0:s(a.message,a.itemIndex),d=void 0===a?void 0:void 0===a.itemIndex?a.message.body.image?.url:a.message.body.mediaAlbum?.items[a.itemIndex]?.url,g=()=>t.getGeneration()===u&&t.getClient()===l;if(void 0!==c){const t=await n(()=>l.media.getCachedImageDisplay(c,{maxSize:o,signal:r}));if(e(r),!g())return null;if(null!==t)return URL.createObjectURL(t)}const m=await fetch(i,{signal:r});if(!m.ok)throw new Error("无法读取气泡显示图的本机原文件");const f=await m.blob();if(e(r),!g())return null;const v=await l.media.prepareLocalImageDisplay({file:f,maxSize:o,signal:r,message:c,expectedResourceUrl:d});return e(r),null!==v&&g()?URL.createObjectURL(v):null}async function o(i,o,r,a){e(a);const l=i.getClient(),u=s(o,r),c=void 0===r?o.body.image:o.body.mediaAlbum?.items[r];if(null===l||void 0===u||void 0===c||"kind"in c&&"image"!==c.kind)return null;const d=c.url,g=t(o,r),m=i.getGeneration(),f=()=>i.getGeneration()===m&&i.getClient()===l,v=await n(()=>l.media.getCachedImageDisplay(u,{maxSize:g,signal:a}));if(e(a),!f())return null;if(null!==v)return URL.createObjectURL(v);if(!/^https?:\/\//i.test(d))return null;const b=await l.media.getCached(u);if(e(a),null===b||!f())return null;const y=await l.media.prepareLocalImageDisplay({file:b,maxSize:g,signal:a,message:u,expectedResourceUrl:d});return e(a),null!==y&&f()?URL.createObjectURL(y):null}async function r(n,r,a,l,s){const u=n.getGeneration(),c=n.getClient(),d=await o(n,r,s,l.signal);if(null!==d)return d;if(e(l.signal),n.getGeneration()!==u||n.getClient()!==c)return null;const g=void 0===s?await R(n,r,a,l):await p(n,r,s,a,void 0,l);if(null===g)return null;try{return await i(n,g,t(r,s),l.signal,{message:r,itemIndex:s})}finally{URL.revokeObjectURL(g)}}async function a(t,i,o,r,a){if(!i.startsWith("blob:"))throw new TypeError("视频封面只接受本机 blob 地址");e(o);const l=t.getClient();if(null===l)return null;const u=t.getGeneration(),c=()=>t.getGeneration()===u&&t.getClient()===l,d=void 0===r?void 0:s(r.message,r.itemIndex),g=void 0===r?void 0:void 0===r.itemIndex?r.message.body.video?.url:r.message.body.mediaAlbum?.items[r.itemIndex]?.url;if(void 0!==d){const t=await n(()=>l.media.getCachedVideoPoster(d,{signal:o}));if(e(o),!c())return null;if(null!==t)return URL.createObjectURL(t)}let m;if(void 0===a){const e=await fetch(i,{signal:o});if(!e.ok)throw new Error("无法读取本机视频");m=await e.blob()}if(e(o),!c())return null;const f=await l.media.prepareLocalVideoPoster({file:m,poster:a,signal:o,message:d,expectedResourceUrl:g});return e(o),null!==f&&c()?URL.createObjectURL(f):null}async function l(t,i,o,r){e(r);const a=t.getClient(),l=s(i,o),u=void 0===o?i.body.video:i.body.mediaAlbum?.items[o];if(null===a||void 0===l||void 0===u||"kind"in u&&"video"!==u.kind)return null;const c=u.url,d=t.getGeneration(),g=()=>t.getGeneration()===d&&t.getClient()===a,m=await n(()=>a.media.getCachedVideoPoster(l,{signal:r}));if(e(r),!g())return null;if(null!==m)return URL.createObjectURL(m);if(!/^https?:\/\//i.test(c))return null;const f=await a.media.getCached(l);if(e(r),null===f||!g())return null;const v=await a.media.prepareLocalVideoPoster({file:f,signal:r,message:l,expectedResourceUrl:c});return e(r),null!==v&&g()?URL.createObjectURL(v):null}function s(e,n){if("supergroup"!==e.conversationType)return{conversation:{conversationType:e.conversationType,conversationId:e.conversationId},messageId:e.id,...void 0===n?{}:{itemIndex:n}}}function u(e,n,t){const i=e.getClient(),o=s(n,t);if(null===i||void 0===o)throw new Error("media download unavailable");i.media.prioritizeDownload(o)}async function c(e,n,t,i,o){const r=e.getClient(),a=s(n,i);if(null===r||void 0===a)throw new Error("media download unavailable");const l=void 0===t?void 0:r.media.subscribe(e=>{const n=e.find(e=>"download"===e.direction&&e.messageId===a.messageId&&e.itemIndex===i&&e.ref.conversationType===a.conversation.conversationType&&e.ref.conversationId===a.conversation.conversationId);void 0!==n&&t(n.percent)});try{return await(void 0===o?r.media.download(a):r.media.download(a,o))}finally{l?.()}}function d(e){return"object"==typeof e&&null!==e&&"code"in e&&"IM_SDK_MEDIA_DOWNLOAD_CANCELED"===e.code}async function g(e,n){const t=e.getClient();if(null===t)return null;const i=e.getGeneration(),o=await t.media.prepareLocalPreview(n);return null===o||e.getGeneration()!==i?null:("video"===n.kind&&"displayPoster"in o&&o.displayPoster&&e.rememberLocalVideoPoster(n.file,o.displayPoster),o)}function m(e){return e.length>=3&&255===e[0]&&216===e[1]&&255===e[2]?"image/jpeg":e.length>=8&&137===e[0]&&80===e[1]&&78===e[2]&&71===e[3]?"image/png":e.length>=6&&71===e[0]&&73===e[1]&&70===e[2]?"image/gif":e.length>=12&&87===e[8]&&69===e[9]&&66===e[10]&&80===e[11]?"image/webp":null}async function f(e){const n=m(new Uint8Array(await e.slice(0,12).arrayBuffer()));return null===n?null:URL.createObjectURL(e.type===n?e:e.slice(0,e.size,n))}function v(e){return e.length>=4&&26===e[0]&&69===e[1]&&223===e[2]&&163===e[3]?"video/webm":(e.length>=8&&102===e[4]&&116===e[5]&&121===e[6]&&e[7],"video/mp4")}function b(e,n,t){return e.acquireMediaBlob({conversationType:n.conversationType,conversationId:n.conversationId,messageId:n.id,resourceUrl:void 0===t?n.body.image?.url??n.body.video?.url??n.body.sticker?.url:n.body.mediaAlbum?.items[t]?.url,...void 0===t?{}:{itemIndex:t}})}async function y(e,n,t){const i=e.getClient(),o=n.body.voice;if(null===i||void 0===o)return null;const r=e.getSelfVoiceBytes(n.id);if(void 0!==r)return r;const a=e.getGeneration();try{const i=new Uint8Array(await(await c(e,n)).arrayBuffer());return 0===i.length?(e.getGeneration()===a&&t.setNote(t.t("media.voiceLoadEmpty")),null):i}catch(n){return e.getGeneration()===a&&t.setNote(t.t("media.voiceLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function w(e,n,t,i){const o=e.getClient(),r=n.body.video;if(null===o||void 0===r)return null;const a=e.getGeneration();try{const o=await c(e,n,i);if(0===o.size)return e.getGeneration()===a&&t.setNote(t.t("media.videoOpenEmpty")),null;const r=URL.createObjectURL(o);return e.getGeneration()!==a?(URL.revokeObjectURL(r),null):r}catch(n){return e.getGeneration()!==a||d(n)||t.setNote(t.t("media.videoLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function L(e,n){const t=e.getClient(),i=s(n);if(null===t||void 0===i||void 0===n.body.video)return null;const o=e.getGeneration();try{const n=await t.media.getCached(i);if(null===n||0===n.size||e.getGeneration()!==o)return null;const r=new Uint8Array(await n.slice(0,12).arrayBuffer()),a=n.type||v(r);return e.getGeneration()!==o?null:URL.createObjectURL(n.type===a?n:n.slice(0,n.size,a))}catch{return null}}async function p(e,n,t,i,o,r){const a=e.getClient(),l=n.body.mediaAlbum?.items[t];if(null===a||void 0===l||r?.signal?.aborted)return null;const s="video"===l.kind,u=e.getGeneration();try{const a=await c(e,n,o,t,r);if(e.getGeneration()!==u||r?.signal?.aborted)return null;if(s&&0===a.size)return e.getGeneration()===u&&i.setNote(i.t("media.videoOpenEmpty")),null;const l=s?URL.createObjectURL(a):await f(a);return e.getGeneration()!==u||r?.signal?.aborted?(null!==l&&URL.revokeObjectURL(l),null):null===l?(e.getGeneration()===u&&i.setNote(i.t("media.imageInvalid",{size:a.size})),null):l}catch(n){return e.getGeneration()!==u||r?.signal?.aborted||d(n)||i.setNote(i.t(s?"media.videoLoadFailed":"media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function U(e,n,t){const i=e.getClient(),o=n.body.mediaAlbum?.items[t],r=s(n,t);if(null===i||void 0===r||void 0===o||!/^https?:\/\//i.test(o.url))return null;const a=e.getGeneration();try{const n=await i.media.getCached(r);if(null===n||0===n.size||e.getGeneration()!==a)return null;const t="video"===o.kind?URL.createObjectURL(n):await f(n);return null===t?null:e.getGeneration()!==a?(URL.revokeObjectURL(t),null):t}catch{return null}}async function R(e,n,t,i){const o=e.getClient(),r=n.body.image;if(null===o||void 0===r||i?.signal?.aborted)return null;const a=e.getGeneration();try{const o=await c(e,n,void 0,void 0,i);if(e.getGeneration()!==a||i?.signal?.aborted)return null;const r=await f(o);return e.getGeneration()!==a||i?.signal?.aborted?(null!==r&&URL.revokeObjectURL(r),null):null===r?(e.getGeneration()===a&&t.setNote(t.t("media.imageInvalid",{size:o.size})),null):r}catch(n){return e.getGeneration()!==a||i?.signal?.aborted||d(n)||t.setNote(t.t("media.imageLoadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}async function G(e,n){const t=e.getClient(),i=s(n);if(null===t||void 0===i||void 0===n.body.image)return null;const o=e.getGeneration();try{const n=await t.media.getCached(i);if(null===n||0===n.size||e.getGeneration()!==o)return null;const r=await f(n);return null===r?null:e.getGeneration()!==o?(URL.revokeObjectURL(r),null):r}catch{return null}}async function h(e,n,t,i,o){const r=e.getClient(),a=void 0===o?n.body.file:n.body.filesAlbum?.items[o];if(null===r||void 0===a)return null;const l=e.getGeneration();try{const r=await c(e,n,i,o);if(0===r.size)return e.getGeneration()===l&&t.setNote(t.t("media.fileDownloadEmpty")),null;const a=URL.createObjectURL(r);return e.getGeneration()!==l?(URL.revokeObjectURL(a),null):a}catch(n){return e.getGeneration()!==l||d(n)||t.setNote(t.t("media.fileDownloadFailed",{reason:n instanceof Error?n.message:String(n)})),null}}export{b as acquireMediaBlob,m as detectImageMime,v as detectVideoMime,o as loadCachedImageDisplayObjectUrl,G as loadCachedImageObjectUrl,U as loadCachedMediaAlbumItemObjectUrl,L as loadCachedVideoObjectUrl,l as loadCachedVideoPosterObjectUrl,h as loadFileObjectUrl,r as loadImageDisplayObjectUrl,R as loadImageObjectUrl,p as loadMediaAlbumItemObjectUrl,w as loadVideoObjectUrl,y as loadVoiceBytes,i as prepareImageDisplayObjectUrl,g as prepareLocalMediaPreview,a as prepareVideoPosterObjectUrl,u as prioritizeMediaDownload,t as resolveImageDisplayMaxSize};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"./unicode-emoji-catalog.json.js";function o(e){if(0===e.length||e.trim()!==e)throw new TypeError(`非法 Unicode emoji code: ${e}`);const o=e.split(" ");if(o.some(e=>0===e.length))throw new TypeError(`非法 Unicode emoji code: ${e}`);return Object.freeze(o.map(o=>function(e,o){if(!e.startsWith("0x")||e.length<=2)throw new TypeError(`非法 Unicode emoji code: ${o}`);const t=e.slice(2);for(const e of t)if(!"0123456789abcdef".includes(e))throw new TypeError(`非法 Unicode emoji code: ${o}`);const n=Number.parseInt(t,16);if(!Number.isSafeInteger(n)||n>1114111||n>=55296&&n<=57343)throw new RangeError(`Unicode emoji code point 越界: ${o}`);return n}(o,e)))}function t(e){return String.fromCodePoint(...o(e))}function n(e){return e.map(e=>`0x${e.toString(16)}`).join(" ")}const r=Object.freeze(e.map(function(e){const t=o(e),r=n(t);if(r!==e)throw new TypeError(`Unicode emoji code 必须使用 canonical 小写格式: ${e}`);return Object.freeze({stableKey:`unicode:${r}`,code:e,codePoints:t,text:String.fromCodePoint(...t),kind:"unicode"})})),i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;for(const e of r){if(i.has(e.code)||c.has(e.text))throw new Error(`Unicode emoji 目录存在重复项: ${e.code}`);i.set(e.code,e),c.set(e.text,e)}for(const e of r){const o=65039===e.codePoints.
|
|
1
|
+
import e from"./unicode-emoji-catalog.json.js";function o(e){if(0===e.length||e.trim()!==e)throw new TypeError(`非法 Unicode emoji code: ${e}`);const o=e.split(" ");if(o.some(e=>0===e.length))throw new TypeError(`非法 Unicode emoji code: ${e}`);return Object.freeze(o.map(o=>function(e,o){if(!e.startsWith("0x")||e.length<=2)throw new TypeError(`非法 Unicode emoji code: ${o}`);const t=e.slice(2);for(const e of t)if(!"0123456789abcdef".includes(e))throw new TypeError(`非法 Unicode emoji code: ${o}`);const n=Number.parseInt(t,16);if(!Number.isSafeInteger(n)||n>1114111||n>=55296&&n<=57343)throw new RangeError(`Unicode emoji code point 越界: ${o}`);return n}(o,e)))}function t(e){return String.fromCodePoint(...o(e))}function n(e){return e.map(e=>`0x${e.toString(16)}`).join(" ")}const r=Object.freeze(e.map(function(e){const t=o(e),r=n(t);if(r!==e)throw new TypeError(`Unicode emoji code 必须使用 canonical 小写格式: ${e}`);return Object.freeze({stableKey:`unicode:${r}`,code:e,codePoints:t,text:String.fromCodePoint(...t),kind:"unicode"})})),i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;for(const e of r){if(i.has(e.code)||c.has(e.text))throw new Error(`Unicode emoji 目录存在重复项: ${e.code}`);i.set(e.code,e),c.set(e.text,e)}for(const e of r){const o=65039===e.codePoints[e.codePoints.length-1]?e.codePoints.slice(0,-1):[...e.codePoints,65039],t=n(o),r=String.fromCodePoint(...o);i.has(t)||i.set(t,e),c.has(r)||c.set(r,e)}function s(e){if(e.startsWith("0x")){const t=n(o(e));return i.get(t)}return c.get(e)}export{r as UNICODE_EMOJI_CATALOG,o as parseUnicodeEmojiCode,s as resolveUnicodeEmoji,t as unicodeEmojiTextFromCode};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e){const{message:t}=e,i=e=>e.messageId===t.id&&e.ref.conversationId===t.conversationId&&e.ref.conversationType===t.conversationType,n=void 0!==e.uploadTask&&i(e.uploadTask)?e.uploadTask:void 0,s="uploading"===t.status||"failed"===t.status&&(!0===t.failure?.displayCode?.startsWith("media.")||void 0!==n&&"completed"!==n.state),a=s?"upload":"download",d=t.body.mediaAlbum?.items??t.body.filesAlbum?.items,o=void 0===e.aggregateFrom?[e.itemIndex]:(d??[]).map((e,t)=>t).slice(e.aggregateFrom),r=o.map(a=>{const o=void 0===a?t.body.image??t.body.video??t.body.file:d?.[a];if(s){const e=void 0===a?void 0:n?.items?.find(e=>e.itemIndex===a);return{state:"completed"===e?.state?"completed":"failed"===t.status?"failed":"paused"===n?.state?"paused":"running"===(e?.state??n?.state)?"running":"waiting",percent:e?.percent??(void 0===a?n?.percent:void 0),size:e?.bytesTotal??o?.size}}const r=e.downloadTasks.find(e=>i(e)&&e.itemIndex===a&&"download"===e.direction),l="failed"===r?.state?"failed":"running"===r?.state||"queued"===r?.state?"running":"completed"===r?.state&&!e.unavailableItemIndices?.includes(a)||o?.url.startsWith("blob:")||e.availableItemIndices?.includes(a)?"completed":"waiting";return{state:l,percent:"completed"===l?100:"waiting"===l&&"completed"===r?.state?0:r?.percent??0,size:r?.bytesTotal??o?.size}}),l=r.some(e=>"failed"===e.state)?"failed":r.some(e=>"running"===e.state)?"running":r.some(e=>"paused"===e.state)?"paused":r.length>0&&r.every(e=>"completed"===e.state)?"completed":"waiting",c="download"===a&&"waiting"===l&&o.some(t=>e.pendingItemIndices?.includes(t))?{resolving:!0}:{};if(1===r.length)return{direction:a,state:l,percent:r[0].percent,...c};if(0===r.length||r.some(e=>!Number.isFinite(e.size)||e.size<=0||void 0===e.percent))return{direction:a,state:l,...c};const u=r.reduce((e,t)=>e+t.size,0);return{direction:a,state:l,percent:Math.round(r.reduce((e,t)=>e+t.size*t.percent,0)/u),...c}}export{e as resolveMediaTransferPresentation};
|
|
1
|
+
function e(e){const{message:t}=e,i=e=>e.messageId===t.id&&e.ref.conversationId===t.conversationId&&e.ref.conversationType===t.conversationType,n=void 0!==e.uploadTask&&i(e.uploadTask)?e.uploadTask:void 0,s="uploading"===t.status||"failed"===t.status&&(!0===t.failure?.displayCode?.startsWith("media.")||void 0!==n&&"completed"!==n.state),a=s?"upload":"download",d=t.body.mediaAlbum?.items??t.body.filesAlbum?.items,o=void 0===e.aggregateFrom?[e.itemIndex]:(d??[]).map((e,t)=>t).slice(e.aggregateFrom),r=o.map(a=>{const o=void 0===a?t.body.image??t.body.video??t.body.file:d?.[a];if(s){const e=void 0===a?void 0:n?.items?.find(e=>e.itemIndex===a);return{state:"completed"===e?.state?"completed":"failed"===t.status?"failed":"paused"===n?.state?"paused":"running"===(e?.state??n?.state)?"running":"waiting",percent:e?.percent??(void 0===a?n?.percent:void 0),size:e?.bytesTotal??o?.size}}if(e.displayAvailableItemIndices?.includes(a))return{state:"completed",percent:100,size:o?.size};const r=e.downloadTasks.find(e=>i(e)&&e.itemIndex===a&&"download"===e.direction),l="failed"===r?.state?"failed":"running"===r?.state||"queued"===r?.state?"running":"completed"===r?.state&&!e.unavailableItemIndices?.includes(a)||o?.url.startsWith("blob:")||e.availableItemIndices?.includes(a)?"completed":"waiting";return{state:l,percent:"completed"===l?100:"waiting"===l&&"completed"===r?.state?0:r?.percent??0,size:r?.bytesTotal??o?.size}}),l=r.some(e=>"failed"===e.state)?"failed":r.some(e=>"running"===e.state)?"running":r.some(e=>"paused"===e.state)?"paused":r.length>0&&r.every(e=>"completed"===e.state)?"completed":"waiting",c="download"===a&&"waiting"===l&&o.some(t=>e.pendingItemIndices?.includes(t))?{resolving:!0}:{};if(1===r.length)return{direction:a,state:l,percent:r[0].percent,...c};if(0===r.length||r.some(e=>!Number.isFinite(e.size)||e.size<=0||void 0===e.percent))return{direction:a,state:l,...c};const u=r.reduce((e,t)=>e+t.size,0);return{direction:a,state:l,percent:Math.round(r.reduce((e,t)=>e+t.size*t.percent,0)/u),...c}}export{e as resolveMediaTransferPresentation};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{shallowReactive as e}from"vue";import{createThreadVisibilityTargets as t}from"./thread-visibility-targets.js";function n(n){const i=/* @__PURE__ */new Map,o=/* @__PURE__ */new Map,l=e(/* @__PURE__ */new Map),r=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let a=[],c=!1;const g=e=>{const t=i.get(e.channel);return void 0===t?e.channel:`${e.channel}\0${t.getKey(e.item)}`},d=t({getRoot:n.getRoot,batchRegistration:n.batchRegistration,getKey:e=>e.key,revealMarginPx:n.revealMarginPx,preloadMarginPx:n.preloadMarginPx,minimumIntersectionRatio:n.minimumIntersectionRatio,scrollIdleMs:n.scrollIdleMs,visibilityDwellMs:n.visibilityDwellMs,onScrollingChange:e=>{for(const t of i.values())t.onScrollingChange?.(e)},onRevealed:e=>e.targets.forEach(e=>i.get(e.channel)?.onRevealed?.(e.item)),onActivated:e=>e.targets.forEach(e=>i.get(e.channel)?.onActivated?.(e.item)),onSettledPreloadChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i){const i=t.filter(t=>t.channel===e).map(e=>e.item);n.onSettledPreloadChange?.(i.slice(0,Math.max(0,n.maxPreloadTargets??Number.POSITIVE_INFINITY)))}},onSettledVisibleChange:e=>{f(e.flatMap(e=>e.targets))}});function f(e){a=e;for(const[t,n]of i){const i=e.filter(e=>e.channel===t).map(e=>e.item),o=void 0===n.maxSettledVisible?i:i.slice(0,n.maxSettledVisible);n.onSettledVisibleChange?.(o)}}function h(e){const t=r.get(e),n=[];for(const e of i.keys()){const i=t?.get(e);void 0!==i&&n.push(i)}const c=l.get(e);if(void 0!==c&&n.length===c.targets.length&&n.every((e,t)=>e===c.targets[t]))return;if(0===n.length)void 0!==c&&(l.delete(e),s.get(c.key)===e&&(s.delete(c.key),d.register(c,null)));else{const t={key:JSON.stringify(n.map(g)),targets:n};void 0!==c&&c.key!==t.key&&s.get(c.key)===e&&s.delete(c.key),l.set(e,t),s.set(t.key,e),d.register(t,e)}const h=a.flatMap(e=>{const t=o.get(e.channel)?.get(i.get(e.channel).getKey(e.item));return void 0===t?[]:[t.target]});(h.length!==a.length||h.some((e,t)=>e!==a[t]))&&f(h)}return{createFactory:function(t){return n=>{if(c)throw new Error("Thread visibility target group 已释放");if(i.has(t))throw new Error(`Thread visibility channel 已存在: ${t}`);i.set(t,n);const s=e(/* @__PURE__ */new Map);o.set(t,s);const a=/* @__PURE__ */new Map;let g=!1;function f(e){a.delete(e);const n=r.get(e);n?.delete(t),0===n?.size&&r.delete(e)}function
|
|
1
|
+
import{shallowReactive as e}from"vue";import{createThreadVisibilityTargets as t}from"./thread-visibility-targets.js";function n(n){const i=/* @__PURE__ */new Map,o=/* @__PURE__ */new Map,l=e(/* @__PURE__ */new Map),r=/* @__PURE__ */new Map,s=/* @__PURE__ */new Map;let a=[],c=!1;const g=e=>{const t=i.get(e.channel);return void 0===t?e.channel:`${e.channel}\0${t.getKey(e.item)}`},d=t({getRoot:n.getRoot,batchRegistration:n.batchRegistration,getKey:e=>e.key,revealMarginPx:n.revealMarginPx,preloadMarginPx:n.preloadMarginPx,minimumIntersectionRatio:n.minimumIntersectionRatio,scrollIdleMs:n.scrollIdleMs,visibilityDwellMs:n.visibilityDwellMs,onScrollingChange:e=>{for(const t of i.values())t.onScrollingChange?.(e)},onRevealed:e=>e.targets.forEach(e=>i.get(e.channel)?.onRevealed?.(e.item)),onActivated:e=>e.targets.forEach(e=>i.get(e.channel)?.onActivated?.(e.item)),onSettledPreloadChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i){const i=t.filter(t=>t.channel===e).map(e=>e.item);n.onSettledPreloadChange?.(i.slice(0,Math.max(0,n.maxPreloadTargets??Number.POSITIVE_INFINITY)))}},onViewportVisibleChange:e=>{const t=e.flatMap(e=>e.targets);for(const[e,n]of i)n.onViewportVisibleChange?.(t.filter(t=>t.channel===e).map(e=>e.item))},onSettledVisibleChange:e=>{f(e.flatMap(e=>e.targets))}});function f(e){a=e;for(const[t,n]of i){const i=e.filter(e=>e.channel===t).map(e=>e.item),o=void 0===n.maxSettledVisible?i:i.slice(0,n.maxSettledVisible);n.onSettledVisibleChange?.(o)}}function h(e){const t=r.get(e),n=[];for(const e of i.keys()){const i=t?.get(e);void 0!==i&&n.push(i)}const c=l.get(e);if(void 0!==c&&n.length===c.targets.length&&n.every((e,t)=>e===c.targets[t]))return;if(0===n.length)void 0!==c&&(l.delete(e),s.get(c.key)===e&&(s.delete(c.key),d.register(c,null)));else{const t={key:JSON.stringify(n.map(g)),targets:n};void 0!==c&&c.key!==t.key&&s.get(c.key)===e&&s.delete(c.key),l.set(e,t),s.set(t.key,e),d.register(t,e)}const h=a.flatMap(e=>{const t=o.get(e.channel)?.get(i.get(e.channel).getKey(e.item));return void 0===t?[]:[t.target]});(h.length!==a.length||h.some((e,t)=>e!==a[t]))&&f(h)}return{createFactory:function(t){return n=>{if(c)throw new Error("Thread visibility target group 已释放");if(i.has(t))throw new Error(`Thread visibility channel 已存在: ${t}`);i.set(t,n);const s=e(/* @__PURE__ */new Map);o.set(t,s);const a=/* @__PURE__ */new Map;let g=!1;function f(e){a.delete(e);const n=r.get(e);n?.delete(t),0===n?.size&&r.delete(e)}function m(){const e=[...a.keys()];s.clear();for(const t of e)f(t);for(const t of e)h(t);n.onScrollingChange?.(!1),n.onViewportVisibleChange?.([]),n.onSettledVisibleChange?.([]),n.onSettledPreloadChange?.([])}function v(e,t){const i=s.get(n.getKey(e)),o=void 0===i?void 0:l.get(i.element);return void 0!==o&&t(o)}return{register(e,i){if(g||c)return;const o=n.getKey(e),m=s.get(o);if(null===i)return void(void 0!==m&&(s.delete(o),f(m.element),h(m.element)));if(m?.target.item===e&&m.element===i){const e=l.get(i);return void(void 0!==e&&d.register(e,i))}const v=m?.target.item===e?m.target:(e=>({channel:t,item:e}))(e),p=a.get(i);void 0!==p&&p!==o&&s.delete(p),void 0!==m&&m.element!==i&&f(m.element),s.set(o,{target:v,element:i}),a.set(i,o);let u=r.get(i);void 0===u&&(u=/* @__PURE__ */new Map,r.set(i,u)),u.set(t,v),h(i),void 0!==m&&m.element!==i&&h(m.element)},isRevealed:e=>v(e,d.isRevealed),isActivated:e=>v(e,d.isActivated),isSettledVisible:e=>v(e,d.isSettledVisible),isScrolling:d.isScrolling,notifyScroll:d.notifyScroll,refresh:d.refresh,reset:m,dispose(){g||(m(),g=!0,i.delete(t),o.delete(t))}}}},refresh:d.refresh,dispose(){if(!c){for(const e of l.values())d.register(e,null);l.clear(),r.clear(),s.clear();for(const e of i.values())e.onSettledPreloadChange?.([]);o.clear(),i.clear(),d.dispose(),c=!0}}}}export{n as createThreadVisibilityTargetGroup};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{reactive as e,nextTick as t}from"vue";function n(e,t){if(e.width<=0||e.height<=0)return 0;const n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),o=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top));return Math.min(1,n*o/(e.width*e.height))}function o(e,t){return{x:e.x,y:e.top-t,top:e.top-t,bottom:e.bottom+t,left:e.left,right:e.right,width:e.width,height:e.height+2*t,toJSON:()=>({})}}function i(i){const r=Math.max(0,i.scrollIdleMs??140),s=Math.max(0,i.visibilityDwellMs??120),c=Math.min(1,Math.max(0,i.minimumIntersectionRatio??.01)),l=Math.max(0,i.revealMarginPx??0),a=Math.max(0,i.preloadMarginPx??0),f=Math.max(l,a),u=Math.max(0,i.maxPreloadTargets??Number.POSITIVE_INFINITY),g=Math.max(1,i.maxSettledVisible??Number.POSITIVE_INFINITY),
|
|
1
|
+
import{reactive as e,nextTick as t}from"vue";function n(e,t){if(e.width<=0||e.height<=0)return 0;const n=Math.max(0,Math.min(e.right,t.right)-Math.max(e.left,t.left)),o=Math.max(0,Math.min(e.bottom,t.bottom)-Math.max(e.top,t.top));return Math.min(1,n*o/(e.width*e.height))}function o(e,t){return{x:e.x,y:e.top-t,top:e.top-t,bottom:e.bottom+t,left:e.left,right:e.right,width:e.width,height:e.height+2*t,toJSON:()=>({})}}function i(i){const r=Math.max(0,i.scrollIdleMs??140),s=Math.max(0,i.visibilityDwellMs??120),c=Math.min(1,Math.max(0,i.minimumIntersectionRatio??.01)),l=Math.max(0,i.revealMarginPx??0),a=Math.max(0,i.preloadMarginPx??0),f=Math.max(l,a),u=Math.max(0,i.maxPreloadTargets??Number.POSITIVE_INFINITY),g=Math.max(1,i.maxSettledVisible??Number.POSITIVE_INFINITY),m=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,h=e(/* @__PURE__ */new Set),v=/* @__PURE__ */new Set,b=/* @__PURE__ */new Set;let p=[],y=[],M=null,I=null,R=null,k=!1,x=!1,w=!1,S=!1;const N=/* @__PURE__ */new Map;let E,P,T=0,V=!1;function C(){T+=1,V=!1,N.clear()}function O(e){const t=[...e].filter(([e,t])=>m.get(e)===t);if(0===t.length)return;const n=z();B(!0,n,t),F(),D(n,t)}function K(e){if(!i.batchRegistration)return void O(e);for(const[t,n]of e)N.set(t,n);if(V)return;V=!0;const n=T;t(()=>{if(w||n!==T)return;V=!1;const e=[...N];N.clear(),O(e),j()})}function A(){void 0!==E&&clearTimeout(E),E=void 0}function L(){void 0!==P&&clearTimeout(P),P=void 0}function z(){let e;const t=/* @__PURE__ */new Map;return{getRootRect:()=>(void 0===e&&(e=M?.getBoundingClientRect()??null),e),getElementRect(e){let n=t.get(e);return void 0===n&&(n=e.getBoundingClientRect(),t.set(e,n)),n}}}function B(e=!1,t=z(),i=m){if(!e&&null!==I||null===M)return;const r=t.getRootRect();if(null===r)return;const s=o(r,f);for(const[e,o]of i){const i=t.getElementRect(e);o.ratio=n(i,r),o.intersecting=o.ratio>0,o.revealIntersecting=f>0?n(i,s)>0:o.intersecting&&o.ratio>=c}}function F(){if(void 0===i.onViewportVisibleChange)return;const e=null===M?[]:[...m.values()].filter(e=>e.intersecting&&e.ratio>0);e.length===p.length&&e.every((e,t)=>e.key===p[t]?.key&&e.item===p[t]?.item)||(p=e,i.onViewportVisibleChange(e.map(e=>e.item)))}function Y(e){return e.intersecting&&e.ratio>=c}function _(e){const t=d.get(e.key);return void 0!==t&&m.get(t)===e}function D(e=z(),t=m){const r=[];for(const[i,s]of t)if(s.revealIntersecting&&!h.has(s.key)){if(f>l){if(0===l&&!Y(s))continue;if(l>0){const t=e.getRootRect();if(null===t||n(e.getElementRect(i),o(t,l))<=0)continue}}r.push(s)}for(const e of r)_(e)&&!h.has(e.key)&&(h.add(e.key),i.onRevealed?.(e.item))}function J(e,t=!1){const n=new Set(e.map(e=>e.key));if(n.size!==b.size||[...n].some(e=>!b.has(e))||t){b.clear();for(const e of n)b.add(e);i.onSettledVisibleChange?.(e.map(e=>e.item))}}function $(e,t=!1){!t&&e.length===y.length&&e.every((e,t)=>e.key===y[t]?.key&&e.item===y[t]?.item)||(y=e,i.onSettledPreloadChange?.(e.map(e=>e.item)))}function j(){w||k||(L(),P=setTimeout(()=>{P=void 0,function(){if(w||k)return;const e=x;x=!1;const t=T,r=M,s=()=>!w&&!k&&t===T&&M===r,c=z();if(B(!1,c),F(),!s())return;const l=c.getRootRect(),f=null===l?0:(l.top+l.bottom)/2,d=[...m.entries()].filter(([,e])=>Y(e)).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).sort((e,t)=>Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,g).map(({target:e})=>e);let h;if(void 0!==i.onSettledPreloadChange&&null!==l){const e=o(l,a);h=[...m.entries()].filter(([,e])=>e.revealIntersecting).map(([e,t])=>({target:t,rect:c.getElementRect(e)})).filter(({target:t,rect:o})=>Y(t)||a>0&&n(o,e)>0).sort((e,t)=>Number(Y(t.target))-Number(Y(e.target))||Math.abs((e.rect.top+e.rect.bottom)/2-f)-Math.abs((t.rect.top+t.rect.bottom)/2-f)).slice(0,u).map(({target:e})=>e)}if(D(c),s()&&(J(d.filter(_),e),s())){void 0!==h&&$(h.filter(_),e);for(const e of d){if(!s())return;_(e)&&!v.has(e.key)&&(v.add(e.key),i.onActivated?.(e.item))}}}()},s))}function q(){w||(x=!0,G(!0),$([]),B(),F(),D(),J([]),L(),A(),E=setTimeout(()=>{E=void 0,G(!1),j()},r))}function G(e){k!==e&&(k=e,i.onScrollingChange?.(e))}function H(){M?.removeEventListener("scroll",q),I?.disconnect(),R?.disconnect(),I=null,R=null,M=null,F()}function Q(e=!0){if(w)return;const t=i.getRoot();if(t!==M||null===M)if($([]),H(),M=t,null!==M){if(M.addEventListener("scroll",q,{passive:!0}),"undefined"!=typeof IntersectionObserver){I=new IntersectionObserver(e=>{for(const t of e){const e=m.get(t.target);void 0!==e&&(e.intersecting=t.isIntersecting,e.ratio=t.intersectionRatio,0===f&&(e.revealIntersecting=t.isIntersecting&&t.intersectionRatio>=c))}F(),D(),j()},{root:M,threshold:[0,Number.EPSILON,c,1]}),f>0&&(R=new IntersectionObserver(e=>{for(const t of e){const e=m.get(t.target);void 0!==e&&(e.revealIntersecting=t.isIntersecting)}D(),j()},{root:M,rootMargin:`${f}px 0px`,threshold:0}));for(const e of m.keys())I.observe(e);for(const e of m.keys())R?.observe(e)}K(m)}else e&&!S&&(S=!0,Promise.resolve().then(()=>{S=!1,w||(Q(!1),j())}))}function U(e){$(y.filter(t=>t.key!==e)),h.delete(e),v.delete(e),b.delete(e),F()}return{register(e,t){if(w)return;const n=i.getKey(e),o=h.has(n),r=v.has(n),s=null===t?void 0:m.get(t);void 0!==s&&s.key!==n&&(d.delete(s.key),m.delete(t),U(s.key));const c=d.get(n);if(void 0!==c&&c!==t&&(I?.unobserve(c),R?.unobserve(c),m.delete(c),d.delete(n)),null===t)return void 0!==c&&(I?.unobserve(c),R?.unobserve(c),m.delete(c),d.delete(n)),void U(n);const l=m.get(t);if(l?.key===n&&l.item===e){const e=M;return Q(),void(M!==e&&j())}const a={item:e,key:n,intersecting:l?.key===n&&l.intersecting,ratio:l?.key===n?l.ratio:0,revealIntersecting:l?.key===n&&l.revealIntersecting};m.set(t,a),d.set(n,t);const f=M;Q(),M===f&&(I?.observe(t),R?.observe(t),K([[t,a]])),o&&i.onRevealed?.(e),r&&_(a)&&i.onActivated?.(e),j()},isRevealed:e=>h.has(i.getKey(e)),isActivated:e=>v.has(i.getKey(e)),isSettledVisible:e=>b.has(i.getKey(e)),isScrolling:()=>k,notifyScroll:q,refresh(){Q(),C(),O(m),j()},reset(){C(),A(),L(),G(!1),x=!1,J([]),$([]),H(),m.clear(),d.clear(),h.clear(),v.clear()},dispose(){w||(C(),A(),L(),G(!1),x=!1,J([]),$([]),H(),m.clear(),d.clear(),h.clear(),v.clear(),w=!0)}}}export{i as createThreadVisibilityTargets};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function r(r){if(!0!==r?.aborted)return;if(void 0!==
|
|
1
|
+
const o=/* @__PURE__ */new WeakMap;function r(r){if(!0===r?.aborted)return o.has(r)?o.get(r):r.reason}function t(r,t){r.signal.aborted||(void 0!==t&&o.set(r.signal,t),r.abort(t))}function n(o){if(!0!==o?.aborted)return;const t=r(o);if(void 0!==t)throw t;const n=new Error("The operation was aborted");throw n.name="AbortError",n}export{t as abortWithReason,r as getAbortReason,n as throwIfAborted};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{throwIfAborted as e}from"../abort.js";import{createCryptoBatchPreparation as t}from"./crypto-batch-preparation.js";import{mapIncomingGroupChat as s}from"./group-message-mapper.js";import{mapIncomingGroupNotify as r}from"./group-notify-mapper.js";import{fromWireMsgId as o}from"./message-id.js";import{toWireMessageIds as n,fromWireMissingMessageIds as d}from"./messages-by-id.js";import{mapIncomingGroupReaction as c}from"./reaction-mapper.js";import{groupReadAllMsgReqCodec as i,groupReadAllMsgRespCodec as a,getGroupMsgByIdReqCodec as p,getGroupMsgByIdRespCodec as m,offlineGroupSessionReqCodec as g,offlineGroupSessionRespCodec as u,mesGrpChatCodec as I,mesGrpNotifyDeliverCodec as y,bMessageCodec as l,bContentCodec as f,getGroupHistoryMsgReqCodec as h,getGroupHistoryMsgRespCodec as T,offlineGroupMsgReqCodec as E,offlineGroupMsgRespCodec as M}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as v}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{isCryptoExecutionError as w}from"../ports/crypto-task-executor.js";const G=/* @__PURE__ */new Set([v.MES_GRPCHAT_DELIVER,v.MES_GRPCHAT_EDIT_MSG_C2C]),C=l.create({contentType:1,content:""});function L(e){return E.encode(E.create({userId:BigInt(e.userId),msgId:"",deliveredMsgIds:e.deliveredMsgIds??[],limit:e.limit??50,clientType:e.clientType??0}))}function D(e){return g.encode(g.create({userId:BigInt(e.userId),clientType:String(e.clientType??0),size:BigInt(e.size??21)}))}function b(e,t,n,d){if(R(e.sGroupId,t.expectedGroupId),e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){const s=d?.chat??I.decode(e.sMsgData),r={...s,sMsgId:s.sMsgId||e.sMsgId,sFromId:0n===s.sFromId?e.sFromId:s.sFromId,sGrpId:0n===s.sGrpId?e.sGroupId:s.sGrpId,sToId:0n===s.sToId?e.sGroupId:s.sToId,msgTime:0n===s.msgTime?e.msgTime:s.msgTime,parentMsgId:s.parentMsgId||e.parentMsgId};return R(r.sGrpId,t.expectedGroupId),t.onReaction?.(c(r)),null}if(e.cmdId===v.MES_GRPNOTIFY_DELIVER){const s=d?.notify??y.decode(e.sMsgData);return R(s.sGrpId,t.expectedGroupId),r(s,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw})}if(!G.has(e.cmdId))return null;const i=d?.chat??I.decode(e.sMsgData);R(i.sGrpId,t.expectedGroupId);let a=C,p=!1,m=!1;if(0===i.encrypt)try{a=l.decode(i.sContent)}catch{m=!0}else if(1===i.encrypt&&void 0!==n){const e=function(e,t,s,r){const o=void 0===r?s.resolvePrivateKey({groupId:t,msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion}):null;if("no-key"===r?.kind||void 0===r&&null===o)return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"no-key"}),null;try{if("plain"===r?.kind)return l.decode(r.plain);if("failed"===r?.kind)throw r.cause;const t=f.decode(e.sContent);if(0===t.secretKey.length||0===t.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${t.secretKey.length}B cipherData=${t.cipherData.length}B`);const n=s.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:o});return l.decode(n)}catch(r){return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"decrypt-failed",cause:r}),null}}(i,i.sGrpId.toString(),n,d?.content);a=e??C,p=null===e}else p=!0;const g=s(i,a,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw,decryptFailed:p});return m&&(g.contentType="unknown",g.body={unknown:{reason:"malformed-content"}},g.raw={...g.raw,contentDecodeFailure:{codec:"BMessage",byteLength:i.sContent.length}}),p&&1===i.encrypt&&n?.onDecryptRecovery?.({conversation:{conversationType:"group",conversationId:g.conversationId},messageId:g.id,wireEncrypt:1,sContent:i.sContent.slice(),...""===i.encryptVersion?{}:{encryptVersion:i.encryptVersion},cmdId:e.cmdId,source:t.source??"offline",createdAt:Date.now()}),void 0===g.refMessageId&&e.parentMsgId&&(g.refMessageId=o(e.parentMsgId)),1===e.isEdit&&(g.edited=!0),g}function R(e,t){if(void 0!==t&&e.toString()!==t)throw new Error(`group history: 响应群不属于请求(groupId=${e})`)}function S(t,s){e(t.signal),t.assertCurrent?.(void 0===s?void 0:{conversationType:"group",conversationId:s})}async function _(e){S(e),await e.yieldToEventLoop(),S(e)}function x(e,t){R(e.sGroupId,t);if((G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER||e.cmdId===v.MES_GRPNOTIFY_DELIVER)&&e.sGroupId<=0n)throw new Error("group response: 消息缺少有效群身份");const s={...e.sGroupId>0n?{groupId:e.sGroupId.toString()}:{}};if(G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){s.chat=I.decode(e.sMsgData);R(e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER&&0n===s.chat.sGrpId?e.sGroupId:s.chat.sGrpId,s.groupId)}else e.cmdId===v.MES_GRPNOTIFY_DELIVER&&(s.notify=y.decode(e.sMsgData),R(s.notify.sGrpId,s.groupId));return s}async function A(e,s,r,o,n,d=[],c=!1){const i=await async function(e,s,r,o=[],n=!0){const d=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,i=new Set(o);for(const e of o)S(r,e);for(const[t,{item:s,expectedGroupId:o}]of e.entries()){let e;S(r),t>0&&t%5==0&&await _(r);try{e=x(s,o)}catch(e){if(!n)throw e;c.set(t,e);continue}S(r,e.groupId),d.set(t,e),void 0===e.groupId||void 0===e.chat&&void 0===e.notify||i.add(e.groupId)}S(r),void 0!==s&&i.size>0&&void 0!==r.prepareKeys&&(await r.prepareKeys([...i]),S(r));const a=t({...r,assertCurrent:()=>S(r)},(e,t)=>{d.get(e).content=t});for(const[t,{item:o}]of e.entries()){S(r),t>0&&t%5==0&&await _(r);const e=d.get(t);if(void 0===e)continue;S(r,e.groupId);const n=e.chat;if(!G.has(o.cmdId)||1!==n?.encrypt||void 0===s)continue;let i;try{const r=s.resolvePrivateKey({groupId:e.groupId,msgType:n.msgType,encrypt:n.encrypt,encryptVersion:n.encryptVersion});if(null===r)e.content={kind:"no-key"};else try{const e=f.decode(n.sContent);if(0===e.secretKey.length||0===e.cipherData.length)throw new Error("BContent secretKey/cipherData missing");i={itemIndex:t,input:{secretKey:e.secretKey,cipherData:e.cipherData,privateKey:r}}}catch(t){e.content={kind:"failed",cause:t}}}catch(e){if(w(e)||e instanceof Error&&"AbortError"===e.name)throw e;c.set(t,e)}void 0!==i&&await a.add(i),S(r,e.groupId)}return await a.finish(),S(r),{rows:d,errors:c}}(e,r,o,d,n),a=[],p=[],m=[];for(const[t,{item:d,expectedGroupId:g}]of e.entries()){S(o),t>0&&t%5==0&&await _(o);const e=i.rows.get(t);S(o,e?.groupId);try{if(i.errors.has(t))throw i.errors.get(t);const o=b(d,{...s,expectedGroupId:g},r,e);null!==o&&(c&&1===d.isCancel&&(o.recalled={by:o.senderId,at:o.serverTime??o.createdAt},o.body={}),a.push(o)),p.push({msgId:d.sMsgId,msgTime:d.msgTime,cmdId:d.cmdId})}catch(e){if(!n||w(e)||e instanceof Error&&"AbortError"===e.name)throw e;m.push({msgId:d.sMsgId,cmdId:d.cmdId,cause:e})}S(o,e?.groupId)}return S(o),{messages:a,deliveredMsgInfos:p,...0===m.length?{}:{itemErrors:m}}}async function V(e,t,s,r){S(r);const o=M.decode(e);return{...await A(o.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,r,!0),batchSize:o.msgList.length,responseBytes:e.length}}function B(e,t,s){const r=M.decode(e),o=[],n=[],d=[];for(const e of r.msgList)try{const r=b(e,t,s);null!==r&&o.push(r),n.push({msgId:e.sMsgId,msgTime:e.msgTime,cmdId:e.cmdId})}catch(t){d.push({msgId:e.sMsgId,cmdId:e.cmdId,cause:t})}return{messages:o,deliveredMsgInfos:n,batchSize:r.msgList.length,responseBytes:e.length,...0===d.length?{}:{itemErrors:d}}}function k(e,t,s){const r=u.decode(e),o=[],n=[],d=[];for(const e of r.sessionList){o.push({groupId:e.groupId.toString(),unreadCount:Number(e.unreadCount)});for(const r of e.msgList)try{const e=b(r,t,s);null!==e&&n.push(e)}catch(e){d.push({msgId:r.sMsgId,cmdId:r.cmdId,cause:e})}}return{unreads:o,messages:n,...0===d.length?{}:{itemErrors:d}}}async function K(e,t,s,r){S(r);const o=u.decode(e),n=[],d=[];for(const e of o.sessionList){R(e.groupId,t.expectedGroupId);const s=e.groupId.toString();S(r,s),n.push({groupId:s,unreadCount:Number(e.unreadCount)}),d.push(...e.msgList.map(e=>({item:e,expectedGroupId:s})))}const{messages:c,itemErrors:i}=await A(d,t,s,r,!0,n.map(e=>e.groupId));return{unreads:n,messages:c,...void 0===i?{}:{itemErrors:i}}}function N(e){return h.encode(h.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),baseTime:BigInt(e.baseTime),direct:e.direct??1,limit:e.limit??50,clientType:e.clientType??0}))}function F(e,t,s){const r=T.decode(e),o=[];for(const e of r.msgList){const r=b(e,t,s);null!==r&&o.push(r)}const n=r.msgList.map(e=>Number(e.msgTime));return{messages:o,batchSize:r.msgList.length,...0===n.length?{}:{oldestEntryTime:Math.min(...n),newestEntryTime:Math.max(...n)}}}async function P(t,s,r,o,n){e(o.signal);const d=T.decode(t);if(200!==d.code)throw new Error(`group history: code=${d.code}`);if(void 0!==n){const t={...n,assertCurrent:t=>{e(o.signal),n.assertCurrent?.(t)}},{messages:c}=await A(d.msgList.map(e=>({item:e,expectedGroupId:s.expectedGroupId})),s,r,t,!1);let i,a;for(const e of d.msgList){const t=Number(e.msgTime);i=void 0===i?t:Math.min(i,t),a=void 0===a?t:Math.max(a,t)}return{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}const c=[];let i,a,p=0;for(const t of d.msgList){e(o.signal),p>0&&p%5==0&&(await o.yieldToEventLoop(),e(o.signal));const n=b(t,s,r);null!==n&&c.push(n);const d=Number(t.msgTime);i=void 0===i?d:Math.min(i,d),a=void 0===a?d:Math.max(a,d),p+=1}return e(o.signal),{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}function j(e){return p.encode(p.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),msgIds:n(e.messageIds),clientType:e.clientType??0}))}function z(e,t,s,r){const o=m.decode(e),n=[];for(const e of o.msgList){const r=b(e,t,s);null!==r&&(1===e.isCancel&&(r.recalled={by:r.senderId,at:r.serverTime??r.createdAt},r.body={}),n.push(r))}return{messages:n,missingMessageIds:d(o.missingMsgIds,r),code:o.code}}async function O(e,t,s,r,o){S(o);const n=m.decode(e),c=d(n.missingMsgIds,r);if(200!==n.code)return{messages:[],missingMessageIds:c,code:n.code};const{messages:i}=await A(n.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,o,!1,[],!0);return{messages:i,missingMessageIds:c,code:n.code}}function H(e){return i.encode(i.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId)}))}function $(e){return{code:a.decode(e).code}}export{F as decodeGroupHistoryBatch,P as decodeGroupHistoryBatchAsync,z as decodeGroupMessagesByIdResponse,O as decodeGroupMessagesByIdResponseAsync,B as decodeGroupOfflineBatch,V as decodeGroupOfflineBatchAsync,k as decodeGroupOfflineSession,K as decodeGroupOfflineSessionAsync,$ as decodeGroupReadAllResponse,N as encodeGroupHistoryRequest,j as encodeGroupMessagesByIdRequest,L as encodeGroupOfflinePullRequest,D as encodeGroupOfflineSessionRequest,H as encodeGroupReadAllRequest};
|
|
1
|
+
import{throwIfAborted as e}from"../abort.js";import{createCryptoBatchPreparation as t}from"./crypto-batch-preparation.js";import{mapIncomingGroupChat as s}from"./group-message-mapper.js";import{mapIncomingGroupNotify as r}from"./group-notify-mapper.js";import{fromWireMsgId as o}from"./message-id.js";import{toWireMessageIds as n,fromWireMissingMessageIds as d}from"./messages-by-id.js";import{mapIncomingGroupReaction as c}from"./reaction-mapper.js";import{groupReadAllMsgReqCodec as i,groupReadAllMsgRespCodec as a,getGroupMsgByIdReqCodec as p,getGroupMsgByIdRespCodec as m,offlineGroupSessionReqCodec as g,offlineGroupSessionRespCodec as u,mesGrpChatCodec as I,mesGrpNotifyDeliverCodec as y,bMessageCodec as l,bContentCodec as f,getGroupHistoryMsgReqCodec as h,getGroupHistoryMsgRespCodec as T,offlineGroupMsgReqCodec as E,offlineGroupMsgRespCodec as M}from"../../../im-protocol/src/protobuf/registry.js";import{CmdId as v}from"../../../im-protocol/src/protobuf/gen/im.pub_pb.js";import{isCryptoExecutionError as w}from"../ports/crypto-task-executor.js";const G=/* @__PURE__ */new Set([v.MES_GRPCHAT_DELIVER,v.MES_GRPCHAT_EDIT_MSG_C2C]),C=l.create({contentType:1,content:""});function L(e){return E.encode(E.create({userId:BigInt(e.userId),msgId:"",deliveredMsgIds:e.deliveredMsgIds??[],limit:e.limit??100,clientType:e.clientType??0}))}function D(e){return g.encode(g.create({userId:BigInt(e.userId),clientType:String(e.clientType??0),size:BigInt(e.size??21)}))}function b(e,t,n,d){if(R(e.sGroupId,t.expectedGroupId),e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){const s=d?.chat??I.decode(e.sMsgData),r={...s,sMsgId:s.sMsgId||e.sMsgId,sFromId:0n===s.sFromId?e.sFromId:s.sFromId,sGrpId:0n===s.sGrpId?e.sGroupId:s.sGrpId,sToId:0n===s.sToId?e.sGroupId:s.sToId,msgTime:0n===s.msgTime?e.msgTime:s.msgTime,parentMsgId:s.parentMsgId||e.parentMsgId};return R(r.sGrpId,t.expectedGroupId),t.onReaction?.(c(r)),null}if(e.cmdId===v.MES_GRPNOTIFY_DELIVER){const s=d?.notify??y.decode(e.sMsgData);return R(s.sGrpId,t.expectedGroupId),r(s,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw})}if(!G.has(e.cmdId))return null;const i=d?.chat??I.decode(e.sMsgData);R(i.sGrpId,t.expectedGroupId);let a=C,p=!1,m=!1;if(0===i.encrypt)try{a=l.decode(i.sContent)}catch{m=!0}else if(1===i.encrypt&&void 0!==n){const e=function(e,t,s,r){const o=void 0===r?s.resolvePrivateKey({groupId:t,msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion}):null;if("no-key"===r?.kind||void 0===r&&null===o)return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"no-key"}),null;try{if("plain"===r?.kind)return l.decode(r.plain);if("failed"===r?.kind)throw r.cause;const t=f.decode(e.sContent);if(0===t.secretKey.length||0===t.cipherData.length)throw new Error(`BContent 字段缺失:secretKey=${t.secretKey.length}B cipherData=${t.cipherData.length}B`);const n=s.crypto.decryptEndToEnd({secretKey:t.secretKey,cipherData:t.cipherData,privateKey:o});return l.decode(n)}catch(r){return s.onDecryptError?.({msgId:e.sMsgId,groupId:t,fromId:String(e.sFromId),msgType:e.msgType,encrypt:e.encrypt,encryptVersion:e.encryptVersion,reason:"decrypt-failed",cause:r}),null}}(i,i.sGrpId.toString(),n,d?.content);a=e??C,p=null===e}else p=!0;const g=s(i,a,{selfId:t.selfId,cmdId:e.cmdId,receivedAt:t.receivedAt,keepRaw:t.keepRaw,decryptFailed:p});return m&&(g.contentType="unknown",g.body={unknown:{reason:"malformed-content"}},g.raw={...g.raw,contentDecodeFailure:{codec:"BMessage",byteLength:i.sContent.length}}),p&&1===i.encrypt&&n?.onDecryptRecovery?.({conversation:{conversationType:"group",conversationId:g.conversationId},messageId:g.id,wireEncrypt:1,sContent:i.sContent.slice(),...""===i.encryptVersion?{}:{encryptVersion:i.encryptVersion},cmdId:e.cmdId,source:t.source??"offline",createdAt:Date.now()}),void 0===g.refMessageId&&e.parentMsgId&&(g.refMessageId=o(e.parentMsgId)),1===e.isEdit&&(g.edited=!0),g}function R(e,t){if(void 0!==t&&e.toString()!==t)throw new Error(`group history: 响应群不属于请求(groupId=${e})`)}function S(t,s){e(t.signal),t.assertCurrent?.(void 0===s?void 0:{conversationType:"group",conversationId:s})}async function _(e){S(e),await e.yieldToEventLoop(),S(e)}function x(e,t){R(e.sGroupId,t);if((G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER||e.cmdId===v.MES_GRPNOTIFY_DELIVER)&&e.sGroupId<=0n)throw new Error("group response: 消息缺少有效群身份");const s={...e.sGroupId>0n?{groupId:e.sGroupId.toString()}:{}};if(G.has(e.cmdId)||e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER){s.chat=I.decode(e.sMsgData);R(e.cmdId===v.MES_GRPCHAT_REACTION_DELIVER&&0n===s.chat.sGrpId?e.sGroupId:s.chat.sGrpId,s.groupId)}else e.cmdId===v.MES_GRPNOTIFY_DELIVER&&(s.notify=y.decode(e.sMsgData),R(s.notify.sGrpId,s.groupId));return s}async function A(e,s,r,o,n,d=[],c=!1){const i=await async function(e,s,r,o=[],n=!0){const d=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,i=new Set(o);for(const e of o)S(r,e);for(const[t,{item:s,expectedGroupId:o}]of e.entries()){let e;S(r),t>0&&t%5==0&&await _(r);try{e=x(s,o)}catch(e){if(!n)throw e;c.set(t,e);continue}S(r,e.groupId),d.set(t,e),void 0===e.groupId||void 0===e.chat&&void 0===e.notify||i.add(e.groupId)}S(r),void 0!==s&&i.size>0&&void 0!==r.prepareKeys&&(await r.prepareKeys([...i]),S(r));const a=t({...r,assertCurrent:()=>S(r)},(e,t)=>{d.get(e).content=t});for(const[t,{item:o}]of e.entries()){S(r),t>0&&t%5==0&&await _(r);const e=d.get(t);if(void 0===e)continue;S(r,e.groupId);const n=e.chat;if(!G.has(o.cmdId)||1!==n?.encrypt||void 0===s)continue;let i;try{const r=s.resolvePrivateKey({groupId:e.groupId,msgType:n.msgType,encrypt:n.encrypt,encryptVersion:n.encryptVersion});if(null===r)e.content={kind:"no-key"};else try{const e=f.decode(n.sContent);if(0===e.secretKey.length||0===e.cipherData.length)throw new Error("BContent secretKey/cipherData missing");i={itemIndex:t,input:{secretKey:e.secretKey,cipherData:e.cipherData,privateKey:r}}}catch(t){e.content={kind:"failed",cause:t}}}catch(e){if(w(e)||e instanceof Error&&"AbortError"===e.name)throw e;c.set(t,e)}void 0!==i&&await a.add(i),S(r,e.groupId)}return await a.finish(),S(r),{rows:d,errors:c}}(e,r,o,d,n),a=[],p=[],m=[];for(const[t,{item:d,expectedGroupId:g}]of e.entries()){S(o),t>0&&t%5==0&&await _(o);const e=i.rows.get(t);S(o,e?.groupId);try{if(i.errors.has(t))throw i.errors.get(t);const o=b(d,{...s,expectedGroupId:g},r,e);null!==o&&(c&&1===d.isCancel&&(o.recalled={by:o.senderId,at:o.serverTime??o.createdAt},o.body={}),a.push(o)),p.push({msgId:d.sMsgId,msgTime:d.msgTime,cmdId:d.cmdId})}catch(e){if(!n||w(e)||e instanceof Error&&"AbortError"===e.name)throw e;m.push({msgId:d.sMsgId,cmdId:d.cmdId,cause:e})}S(o,e?.groupId)}return S(o),{messages:a,deliveredMsgInfos:p,...0===m.length?{}:{itemErrors:m}}}async function V(e,t,s,r){S(r);const o=M.decode(e);return{...await A(o.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,r,!0),batchSize:o.msgList.length,responseBytes:e.length}}function B(e,t,s){const r=M.decode(e),o=[],n=[],d=[];for(const e of r.msgList)try{const r=b(e,t,s);null!==r&&o.push(r),n.push({msgId:e.sMsgId,msgTime:e.msgTime,cmdId:e.cmdId})}catch(t){d.push({msgId:e.sMsgId,cmdId:e.cmdId,cause:t})}return{messages:o,deliveredMsgInfos:n,batchSize:r.msgList.length,responseBytes:e.length,...0===d.length?{}:{itemErrors:d}}}function k(e,t,s){const r=u.decode(e),o=[],n=[],d=[];for(const e of r.sessionList){o.push({groupId:e.groupId.toString(),unreadCount:Number(e.unreadCount)});for(const r of e.msgList)try{const e=b(r,t,s);null!==e&&n.push(e)}catch(e){d.push({msgId:r.sMsgId,cmdId:r.cmdId,cause:e})}}return{unreads:o,messages:n,...0===d.length?{}:{itemErrors:d}}}async function K(e,t,s,r){S(r);const o=u.decode(e),n=[],d=[];for(const e of o.sessionList){R(e.groupId,t.expectedGroupId);const s=e.groupId.toString();S(r,s),n.push({groupId:s,unreadCount:Number(e.unreadCount)}),d.push(...e.msgList.map(e=>({item:e,expectedGroupId:s})))}const{messages:c,itemErrors:i}=await A(d,t,s,r,!0,n.map(e=>e.groupId));return{unreads:n,messages:c,...void 0===i?{}:{itemErrors:i}}}function N(e){return h.encode(h.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),baseTime:BigInt(e.baseTime),direct:e.direct??1,limit:e.limit??50,clientType:e.clientType??0}))}function F(e,t,s){const r=T.decode(e),o=[];for(const e of r.msgList){const r=b(e,t,s);null!==r&&o.push(r)}const n=r.msgList.map(e=>Number(e.msgTime));return{messages:o,batchSize:r.msgList.length,...0===n.length?{}:{oldestEntryTime:Math.min(...n),newestEntryTime:Math.max(...n)}}}async function P(t,s,r,o,n){e(o.signal);const d=T.decode(t);if(200!==d.code)throw new Error(`group history: code=${d.code}`);if(void 0!==n){const t={...n,assertCurrent:t=>{e(o.signal),n.assertCurrent?.(t)}},{messages:c}=await A(d.msgList.map(e=>({item:e,expectedGroupId:s.expectedGroupId})),s,r,t,!1);let i,a;for(const e of d.msgList){const t=Number(e.msgTime);i=void 0===i?t:Math.min(i,t),a=void 0===a?t:Math.max(a,t)}return{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}const c=[];let i,a,p=0;for(const t of d.msgList){e(o.signal),p>0&&p%5==0&&(await o.yieldToEventLoop(),e(o.signal));const n=b(t,s,r);null!==n&&c.push(n);const d=Number(t.msgTime);i=void 0===i?d:Math.min(i,d),a=void 0===a?d:Math.max(a,d),p+=1}return e(o.signal),{messages:c,batchSize:d.msgList.length,...void 0===i?{}:{oldestEntryTime:i,newestEntryTime:a}}}function j(e){return p.encode(p.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId),msgIds:n(e.messageIds),clientType:e.clientType??0}))}function z(e,t,s,r){const o=m.decode(e),n=[];for(const e of o.msgList){const r=b(e,t,s);null!==r&&(1===e.isCancel&&(r.recalled={by:r.senderId,at:r.serverTime??r.createdAt},r.body={}),n.push(r))}return{messages:n,missingMessageIds:d(o.missingMsgIds,r),code:o.code}}async function O(e,t,s,r,o){S(o);const n=m.decode(e),c=d(n.missingMsgIds,r);if(200!==n.code)return{messages:[],missingMessageIds:c,code:n.code};const{messages:i}=await A(n.msgList.map(e=>({item:e,expectedGroupId:t.expectedGroupId})),t,s,o,!1,[],!0);return{messages:i,missingMessageIds:c,code:n.code}}function H(e){return i.encode(i.create({userId:BigInt(e.userId),groupId:BigInt(e.groupId)}))}function $(e){return{code:a.decode(e).code}}export{F as decodeGroupHistoryBatch,P as decodeGroupHistoryBatchAsync,z as decodeGroupMessagesByIdResponse,O as decodeGroupMessagesByIdResponseAsync,B as decodeGroupOfflineBatch,V as decodeGroupOfflineBatchAsync,k as decodeGroupOfflineSession,K as decodeGroupOfflineSessionAsync,$ as decodeGroupReadAllResponse,N as encodeGroupHistoryRequest,j as encodeGroupMessagesByIdRequest,L as encodeGroupOfflinePullRequest,D as encodeGroupOfflineSessionRequest,H as encodeGroupReadAllRequest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const t=/^[0-9a-f]{32}$/;function e(e){return t.test(e.replace(/-/g,"").toLowerCase())}function o(){const t=globalThis.crypto;if("function"==typeof t?.randomUUID)return t.randomUUID();if("function"!=typeof t?.getRandomValues)throw new Error("生成 UUID 需要系统安全随机源 crypto.getRandomValues");const e=new Uint8Array(16);t.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;return s(Array.from(e,t=>t.toString(16).padStart(2,"0")).join(""))}function r(t){const o=t.replace(/-/g,"").toLowerCase();if(!e(t))throw new Error(`toWireMsgId: 非法消息 id「${t}」(去横线后非 32 位 hex),拒绝作为出站 sMsgId`);return o}function n(e){const o=e.replace(/-/g,"").toLowerCase();return t.test(o)?o:e}function s(e){const o=e.toLowerCase();return t.test(o)?`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`:e}export{s as fromWireMsgId,e as isWireMsgId,o as newClientMessageId,r as toWireMsgId,n as toWireRefMsgId};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MEDIA_ALBUM_MAX_ITEMS as t,MEDIA_ALBUM_CONTENT_MAX_BYTES as
|
|
1
|
+
import{MEDIA_ALBUM_MAX_ITEMS as t,MEDIA_ALBUM_CONTENT_MAX_BYTES as e}from"./mapping/media-album-body.js";const r=Math.floor(3*(e-32768)/4);function a(e=1,r=0){if(!Number.isInteger(e)||e<1||e>t)throw new RangeError(`媒体缩略图项数必须是 1 到 ${t} 的整数`);if(!Number.isInteger(r)||r<0||r>=e)throw new RangeError("媒体缩略图下标必须是当前消息范围内的整数");if(1===e)return{maxSize:1440,targetBytes:16384,maxBytes:32768};if(2===e)return{maxSize:1440,targetBytes:16384,maxBytes:28672};if(r>=4)return{maxSize:240,targetBytes:768,maxBytes:1536};const a=Math.max(0,e-4),m=Math.min(e,4)+1,i=3*Math.floor((153600-2*a*1024)/m/4);return{maxSize:3===e?960:768,targetBytes:Math.min(16384,3*Math.floor((76800-1024*a)/m/4)),maxBytes:Math.min(i,1024*(3===e?20:16))}}export{r as MEDIA_THUMBNAIL_MAX_BYTES,a as resolveMediaThumbnailPolicy};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function t(t){
|
|
1
|
+
function t(t){if("string"==typeof t?t.startsWith("iVBORw0KGgo"):t.length>=8&&137===t[0]&&80===t[1]&&78===t[2]&&71===t[3]&&13===t[4]&&10===t[5]&&26===t[6]&&10===t[7])return"image/png";return("string"==typeof t?/^UklGR[g-v][A-Za-z0-9+/]{4}[BFJNRVZdhlptx159]XRUJQ/.test(t):t.length>=12&&82===t[0]&&73===t[1]&&70===t[2]&&70===t[3]&&87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])?"image/webp":"image/jpeg"}export{t as resolveMediaThumbnailMimeType};
|