k2-im 0.2.12 → 0.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/chat-kit-pinia.d.ts +3 -3
  2. package/dist/chat-kit.d.ts +2 -2
  3. package/dist/index.d.ts +2 -2
  4. package/dist/modules/api-protocol-client/src/client.js +1 -1
  5. package/dist/modules/api-protocol-client/src/nonce.js +1 -1
  6. package/dist/modules/crypto/browser.js +1 -1
  7. package/dist/modules/crypto/driver.js +1 -1
  8. package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
  9. package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
  10. package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
  11. package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
  12. package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
  13. package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
  14. package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
  15. package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
  16. package/dist/modules/im-core/src/abort.js +1 -1
  17. package/dist/modules/im-core/src/mapping/message-id.js +1 -1
  18. package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
  19. package/dist/modules/im-core/src/state/domain-state.js +1 -1
  20. package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
  21. package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
  22. package/dist/modules/im-sdk/src/product/media.js +1 -1
  23. package/dist/modules/im-sdk/src/runtime/media-upload-recovery.js +1 -1
  24. package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
  25. package/dist/request-crypto.d.ts +3 -2
  26. package/dist/sdk.d.ts +1 -1
  27. package/dist/vendor/crypto/index_bg.wasm +0 -0
  28. 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,Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i=Object.freeze({ok:!0,operation:r});for(const[e,r]of o.entries())if(i=await et(n,{kind:"emoji",token:r.token,resourceId:r.resourceId},!1!==t?.refreshAfterReport&&e===o.length-1),!i.ok&&"stale"===i.reason)return i;return i}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
@@ -1 +1 @@
1
- import e from"./unicode-emoji-catalog.json.js";function o(e){if(0===e.length||e.trim()!==e)throw new TypeError(`非法 Unicode emoji code: ${e}`);const o=e.split(" ");if(o.some(e=>0===e.length))throw new TypeError(`非法 Unicode emoji code: ${e}`);return Object.freeze(o.map(o=>function(e,o){if(!e.startsWith("0x")||e.length<=2)throw new TypeError(`非法 Unicode emoji code: ${o}`);const t=e.slice(2);for(const e of t)if(!"0123456789abcdef".includes(e))throw new TypeError(`非法 Unicode emoji code: ${o}`);const n=Number.parseInt(t,16);if(!Number.isSafeInteger(n)||n>1114111||n>=55296&&n<=57343)throw new RangeError(`Unicode emoji code point 越界: ${o}`);return n}(o,e)))}function t(e){return String.fromCodePoint(...o(e))}function n(e){return e.map(e=>`0x${e.toString(16)}`).join(" ")}const r=Object.freeze(e.map(function(e){const t=o(e),r=n(t);if(r!==e)throw new TypeError(`Unicode emoji code 必须使用 canonical 小写格式: ${e}`);return Object.freeze({stableKey:`unicode:${r}`,code:e,codePoints:t,text:String.fromCodePoint(...t),kind:"unicode"})})),i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;for(const e of r){if(i.has(e.code)||c.has(e.text))throw new Error(`Unicode emoji 目录存在重复项: ${e.code}`);i.set(e.code,e),c.set(e.text,e)}for(const e of r){const o=65039===e.codePoints.at(-1)?e.codePoints.slice(0,-1):[...e.codePoints,65039],t=n(o),r=String.fromCodePoint(...o);i.has(t)||i.set(t,e),c.has(r)||c.set(r,e)}function s(e){if(e.startsWith("0x")){const t=n(o(e));return i.get(t)}return c.get(e)}export{r as UNICODE_EMOJI_CATALOG,o as parseUnicodeEmojiCode,s as resolveUnicodeEmoji,t as unicodeEmojiTextFromCode};
1
+ import e from"./unicode-emoji-catalog.json.js";function o(e){if(0===e.length||e.trim()!==e)throw new TypeError(`非法 Unicode emoji code: ${e}`);const o=e.split(" ");if(o.some(e=>0===e.length))throw new TypeError(`非法 Unicode emoji code: ${e}`);return Object.freeze(o.map(o=>function(e,o){if(!e.startsWith("0x")||e.length<=2)throw new TypeError(`非法 Unicode emoji code: ${o}`);const t=e.slice(2);for(const e of t)if(!"0123456789abcdef".includes(e))throw new TypeError(`非法 Unicode emoji code: ${o}`);const n=Number.parseInt(t,16);if(!Number.isSafeInteger(n)||n>1114111||n>=55296&&n<=57343)throw new RangeError(`Unicode emoji code point 越界: ${o}`);return n}(o,e)))}function t(e){return String.fromCodePoint(...o(e))}function n(e){return e.map(e=>`0x${e.toString(16)}`).join(" ")}const r=Object.freeze(e.map(function(e){const t=o(e),r=n(t);if(r!==e)throw new TypeError(`Unicode emoji code 必须使用 canonical 小写格式: ${e}`);return Object.freeze({stableKey:`unicode:${r}`,code:e,codePoints:t,text:String.fromCodePoint(...t),kind:"unicode"})})),i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map;for(const e of r){if(i.has(e.code)||c.has(e.text))throw new Error(`Unicode emoji 目录存在重复项: ${e.code}`);i.set(e.code,e),c.set(e.text,e)}for(const e of r){const o=65039===e.codePoints[e.codePoints.length-1]?e.codePoints.slice(0,-1):[...e.codePoints,65039],t=n(o),r=String.fromCodePoint(...o);i.has(t)||i.set(t,e),c.has(r)||c.set(r,e)}function s(e){if(e.startsWith("0x")){const t=n(o(e));return i.get(t)}return c.get(e)}export{r as UNICODE_EMOJI_CATALOG,o as parseUnicodeEmojiCode,s as resolveUnicodeEmoji,t as unicodeEmojiTextFromCode};
@@ -1 +1 @@
1
- function r(r){if(!0!==r?.aborted)return;if(void 0!==r.reason)throw r.reason;const o=new Error("The operation was aborted");throw o.name="AbortError",o}export{r as throwIfAborted};
1
+ const o=/* @__PURE__ */new WeakMap;function r(r){if(!0===r?.aborted)return o.has(r)?o.get(r):r.reason}function t(r,t){r.signal.aborted||(void 0!==t&&o.set(r.signal,t),r.abort(t))}function n(o){if(!0!==o?.aborted)return;const t=r(o);if(void 0!==t)throw t;const n=new Error("The operation was aborted");throw n.name="AbortError",n}export{t as abortWithReason,r as getAbortReason,n as throwIfAborted};
@@ -1 +1 @@
1
- const e=/^[0-9a-f]{32}$/;function t(t){return e.test(t.replace(/-/g,"").toLowerCase())}function r(){return globalThis.crypto.randomUUID()}function o(e){const r=e.replace(/-/g,"").toLowerCase();if(!t(e))throw new Error(`toWireMsgId: 非法消息 id「${e}」(去横线后非 32 位 hex),拒绝作为出站 sMsgId`);return r}function n(t){const r=t.replace(/-/g,"").toLowerCase();return e.test(r)?r:t}function s(t){const r=t.toLowerCase();return e.test(r)?`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`:t}export{s as fromWireMsgId,t as isWireMsgId,r as newClientMessageId,o as toWireMsgId,n as toWireRefMsgId};
1
+ const t=/^[0-9a-f]{32}$/;function e(e){return t.test(e.replace(/-/g,"").toLowerCase())}function o(){const t=globalThis.crypto;if("function"==typeof t?.randomUUID)return t.randomUUID();if("function"!=typeof t?.getRandomValues)throw new Error("生成 UUID 需要系统安全随机源 crypto.getRandomValues");const e=new Uint8Array(16);t.getRandomValues(e),e[6]=15&e[6]|64,e[8]=63&e[8]|128;return s(Array.from(e,t=>t.toString(16).padStart(2,"0")).join(""))}function r(t){const o=t.replace(/-/g,"").toLowerCase();if(!e(t))throw new Error(`toWireMsgId: 非法消息 id「${t}」(去横线后非 32 位 hex),拒绝作为出站 sMsgId`);return o}function n(e){const o=e.replace(/-/g,"").toLowerCase();return t.test(o)?o:e}function s(e){const o=e.toLowerCase();return t.test(o)?`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20)}`:e}export{s as fromWireMsgId,e as isWireMsgId,o as newClientMessageId,r as toWireMsgId,n as toWireRefMsgId};
@@ -1 +1 @@
1
- import{resolveMediaThumbnailPolicy as e,MEDIA_THUMBNAIL_MAX_BYTES as t}from"../../media-thumbnail-policy.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as a,MEDIA_ALBUM_MAX_ITEMS as i,resolveMediaAlbumSendContentType as n,measureMediaAlbumContentBytes as o,mediaAlbumBMessageFields as r,MEDIA_ALBUM_CONTENT_WARN_BYTES as d}from"../../mapping/media-album-body.js";import{computeSortKey as s}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as l}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as c}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as u}from"../../mapping/stored-message.js";function p(e){return Number.isFinite(e)&&e>0}function m(e,a){if(("video"===a||"image"===a)&&void 0!==e&&p(e.width)&&p(e.height)&&("video"!==a||void 0===e.duration||p(e.duration))&&("video"!==a||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>t)))return{width:e.width,height:e.height,..."video"===a&&void 0!==e.duration?{duration:e.duration}:{},..."video"===a&&void 0!==e.posterData?{thumbData:new Uint8Array(e.posterData)}:{}}}function f(e,t){return void 0===t?e:{...e,width:t.width,height:t.height,...void 0===t.thumbData?{}:{thumbData:t.thumbData},...void 0===e.duration&&void 0!==t.duration?{duration:t.duration}:{}}}const v={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(t,a,i,n,o=1){const r=await i.imageDimensions(t,a,n),d=await i.imageThumbnail(t,{mimeType:a,...e(o)},n);return{width:r.width,height:r.height,...d.data.byteLength<=e(o).maxBytes?{thumbData:d.data}:{}}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n})=>({image:{url:e,width:t.width,height:t.height,...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},g={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(t,a,i,n,o=1){const r=await i.videoPoster(t,{mimeType:a,...e(o)},n);return{width:r.width,height:r.height,...r.data.byteLength<=e(o).maxBytes?{thumbData:r.data}:{},duration:r.duration}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n},o)=>({video:{url:e,width:t.width,height:t.height,...void 0!==t.duration?{duration:t.duration}:{},...void 0!==o.caption&&""!==o.caption?{describe:o.caption}:{},...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a,sizeUnit:"bytes"}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},y={contentType:"voice",uploadKind:"voice",encryptMode:"integral",buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody:({url:e,size:t,teaKey:a,fileEncryptType:i},n)=>({voice:{url:e,durationMs:n.durationMs??0,...void 0!==n.waveform&&n.waveform.length>0?{waveform:n.waveform}:{},...void 0!==t?{size:t}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}})},h={contentType:"sticker",uploadKind:"sticker",encryptMode:"none",async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i);return{width:n.width,height:n.height}},buildBody:({url:e,meta:t,size:a})=>({sticker:{url:e,width:t.width,height:t.height,exprType:2,imageType:1,...void 0===a?{}:{size:a}}})};const w={contentType:"file",uploadKind:"file",encryptMode:"simple",streamUpload:!0,buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody({url:e,size:t,teaKey:a,fileEncryptType:i},n){const o=n.filename??"",r=function(e){const t=e.lastIndexOf(".");return t>-1&&t<e.length-1?e.slice(t+1).toLowerCase():""}(o),d=function(e,t){const a=t??"";return a.startsWith("image/")||["jpg","jpeg","png","gif","webp","bmp","heic","svg"].includes(e)?1:a.startsWith("video/")||["mp4","mov","m4v","3gp","avi","mkv","webm","flv"].includes(e)?2:a.startsWith("audio/")||["mp3","m4a","wav","aac","flac","ogg"].includes(e)?3:["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","zip","rar","7z","apk","json"].includes(e)?4:0}(r,n.mimeType);return{file:{url:e,fileName:o,...void 0!==t?{size:t}:{},...""!==r?{extension:r}:{},...0!==d?{fileType:d}:{},...void 0!==n.mimeType&&""!==n.mimeType?{mimeType:n.mimeType}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}}}},b={...w,contentType:"filesAlbum",buildBody(e,t){const a=w.buildBody(e,t).file;return{filesAlbum:{...t.caption?.trim()?{caption:t.caption}:{},items:[{...a,extension:a.extension??"",fileType:a.fileType??0,...["zip","rar","torrent"].includes(a.extension??"")?{fileType:5}:{},...void 0===e.md5?{}:{md5:e.md5}}]}}}};function T(e){switch(e){case"empty":return"media.empty";case"no-crypto":return"media.noCrypto";case"preview-failed":return"media.previewFailed";case"encrypt-failed":return"media.encryptFailed";case"upload-failed":case"offline":return"media.uploadFailed";case"cancelled":return"media.cancelled";case"paused":throw new Error("暂停不是失败状态,不应生成失败文案");case"invalid-duration":return"media.invalidDuration";case"content-too-large":return"media.contentTooLarge"}}function k(e,t){return"video"===e||void 0===t||t>16777216?"large":"small"}function M(){return new DOMException("媒体上传已取消","AbortError")}function I(e){return"album"===e.kind?e.items.flatMap(e=>void 0===e.resume||void 0!==e.uploaded?[]:[{resume:e.resume,kind:e.uploadKind}]):void 0===e.resume?[]:[{resume:e.resume,kind:e.spec.uploadKind}]}function A(e){if("album"===e.kind)return{code:u,reason:"unknown",displayCode:T(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:u,reason:"unknown",displayCode:t?"media.uploadInterrupted":T(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function E(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function C(t){const p=function(e){let t=0,a=0;const i=[];function n(i){return t<e.total&&("large"!==i||a<e.largeFiles)}function o(e){t+=1,"large"===e&&(a+=1);let i=!1;return()=>{i||(i=!0,t-=1,"large"===e&&(a-=1),r())}}function r(){let e=0;for(;e<i.length;){const t=i[e];t.signal.aborted?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.reject(M())):n(t.tier)?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.resolve(o(t.tier))):e+=1}}return{acquire:(e,t)=>t.aborted?Promise.reject(M()):new Promise((a,n)=>{const o={tier:e,signal:t,resolve:a,reject:n,onAbort:()=>{const e=i.indexOf(o);e>=0&&i.splice(e,1),n(M())}};i.push(o),t.addEventListener("abort",o.onAbort,{once:!0}),r()})}}(function(e){if(void 0===e)return{total:5,largeFiles:3};if("number"==typeof e)return E(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;E(t,"total");const a=e.largeFiles??Math.min(3,t);if(E(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(t.maxConcurrentUploads)),C=/* @__PURE__ */new Map,P=/* @__PURE__ */new Map,K=/* @__PURE__ */new Map,R=/* @__PURE__ */new Map;let D=!1;const z=/* @__PURE__ */new Map,U=/* @__PURE__ */new Map,x=/* @__PURE__ */new Set,S=/* @__PURE__ */new Map,_=/* @__PURE__ */new Map;function B(e,t){const a=S.get(e)??/* @__PURE__ */new Set;S.set(e,a),a.add(t),x.add(t),t.finally(()=>{a.delete(t),x.delete(t),0===a.size&&S.get(e)===a&&S.delete(e),ne(e)})}function O(e){return[...S.get(e)??[]]}const F=/* @__PURE__ */new Map,L=/* @__PURE__ */new Set,q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Map,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map,$=/* @__PURE__ */new Map;let W=!0,G=0,H=0;function J(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function Q(e,a,i,n){t.mediaTransfer.abandonUpload(e).catch(e=>{t.onMediaTransferError?.({stage:"upload",kind:a,messageId:i,conversation:n,cause:e})})}function X(e,a,i,n,o,r){if(!W)return;const d=J(a);q.set(e,{input:J(a),state:i,percent:n,phase:r}),t.emitter.emit({type:"media-task:updated",conversation:d,task:{id:`upload:${e}`,messageId:e,ref:d,direction:"upload",state:i,percent:Math.max(0,Math.min(100,Math.round(n))),attempt:R.get(e)?.attempt??1,maxAttempts:3,...j.get(e),...V.has(e)?{items:Object.freeze(V.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===i||"failed"===i?i:e.state})))}:{},...U.get(e),...void 0===r?{}:{phase:r},...void 0===o?{}:{failure:o}}})}function Z(e,t){ie(),Y.delete(e),$.delete(e),Y.set(e,t),ae()}function ee(e){const t=R.get(e);if(C.has(e)||F.has(e)||O(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=q.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function te(e,a){const i=J(a.input),n=I(a),o="media"===a.kind?a.spec.uploadKind:"image",r={...A(a),displayCode:"media.uploadInterrupted",retryable:!1};Y.delete(e),$.delete(e),R.delete(e),N.delete(e),j.delete(e),V.delete(e),U.delete(e),z.delete(e),q.delete(e),K.delete(e);for(const t of n)Q(t.resume,t.kind,e,i);if(function(e,a,i){const n=t.recoveryPort;if(void 0===n)return;const o=O(e),r=Promise.all(o).then(()=>n.remove(J(a),e)).catch(n=>{t.onMediaTransferError?.({stage:"upload",kind:i,messageId:e,conversation:J(a),cause:n})});B(e,r)}(e,i,o),!W)return;const d=t.domainState.getConversationMessage?.(i,e)??a.message;"sent"!==d.status&&(t.domainState.upsertMessages([{...d,status:"failed",failure:r}],"live"),X(e,i,"failed",0,r))}function ae(){if(W)for(const[e,t]of Y){if(Y.size<=3)break;ee(e)&&te(e,t)}}function ie(){if(!W)return;const e=Date.now();for(const[t,a]of Y){const i=$.get(t);void 0!==i&&e-i>=864e5&&ee(t)&&te(t,a)}}function ne(e){W&&(Y.has(e)&&ee(e)&&!$.has(e)&&$.set(e,Date.now()),ae())}async function oe(e,a,i,n,o,r,d=!1){const v=G,g=()=>W&&v===G;if(!g())return void 0!==r&&void 0!==i&&Q(r,e.uploadKind,i,J(a)),{ok:!1,reason:"cancelled"};const y=H;let h,w,b=o,I=r,A=Promise.resolve(void 0);const E=/* @__PURE__ */new Set,x="function"==typeof a.data;const S=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(a.data)?a.data:void 0,O=x||void 0!==S?void 0:a.data,F=x||void 0!==S,L=!0===e.streamUpload&&void 0!==S,V=e=>{if(void 0!==S)return S;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===a.mimeType?void 0:{type:a.mimeType})};if(0===O?.length||0===S?.size)return{ok:!1,reason:"empty"};const $=a.encrypted??!0;if($&&void 0===t.crypto)return{ok:!1,reason:"no-crypto"};const ee=m(a.localPreviewMetadata,e.contentType);if(("video"===e.contentType||"image"===e.contentType)&&void 0!==a.localPreviewMetadata&&void 0===ee)return{ok:!1,reason:"preview-failed"};const te=void 0===i||void 0===n?t.outbox.allocateMessageIdentity({conversationId:a.conversationId,conversationType:a.conversationType}):{id:i,createdAt:n},{id:ae,createdAt:ie}=te,ne=t.getSelfId();let oe=ee??{width:0,height:0};if(!F)try{oe=f(await e.buildPreview(V(O),a.mimeType,t.mediaPreview),ee)}catch{}if(!g())return void 0!==I&&Q(I,e.uploadKind,ae,J(a)),{ok:!1,reason:"cancelled"};const re=S?.size??O?.byteLength,de={url:a.localPreviewUrl??"",...void 0===re?{}:{size:re}};let se={id:ae,conversationId:a.conversationId,conversationType:a.conversationType,senderId:ne,contentType:e.contentType,body:e.buildBody({...de,meta:oe},a),createdAt:ie,sortKey:s(ie,ae),status:"uploading",receipt:"unread",encryption:{encrypted:$},...void 0!==a.refMessageId?{refMessageId:a.refMessageId}:{}};t.domainState.upsertMessages([se],"live",{newOutgoing:!0});const ce=d?0:N.get(ae)??0;d&&j.delete(ae),N.set(ae,ce),X(ae,a,"queued",ce,void 0,"waiting-upload-slot");const ue=(i,n=!1)=>{const o={code:u,reason:"unknown",displayCode:"cleanup-unconfirmed"===h?"media.cleanupUnconfirmed":"resume-unavailable"===h?"media.resumeUnavailable":"timeout"===h?"media.uploadTimeout":T(i),mediaKind:e.uploadKind,retryable:n};if(!g())return{ok:!1,reason:i};const r=R.get(ae);return"paused"===r?.stopped?(X(ae,a,"paused",N.get(ae)??0),{ok:!1,reason:i}):void 0!==r&&void 0===r.stopped&&r.attempt<3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure||"offline"===i&&void 0!==t.waitUntilOnline)?(X(ae,a,"queued",N.get(ae)??0,void 0,"waiting-retry"),{ok:!1,reason:i}):("cancelled"===r?.stopped||void 0!==r&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure)||(t.domainState.upsertMessages([{...se,status:"failed",failure:o}],"live"),X(ae,a,"cancelled"===i?"canceled":"failed",N.get(ae)??0,o)),{ok:!1,reason:i})},pe=async()=>{if(void 0!==I)try{await t.mediaTransfer.abandonUpload(I),I=void 0}catch(i){throw h="cleanup-unconfirmed",t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}),i}},me=async i=>{if(await A,await Promise.all([...E]),"cancelled"===i&&"paused"!==R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint&&"cleanup-unconfirmed"!==h)try{await pe()}catch{}return"cancelled"===i&&"paused"!==R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint&&void 0!==t.recoveryPort&&(await Promise.all([...E]),await t.recoveryPort.remove(J(a),ae).catch(i=>t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}))),g()?(Z(ae,{kind:"media",spec:e,input:a,createdAt:ie,message:se,failureReason:i,...!0===R.get(ae)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===h||"resume-unavailable"===h?{restartRequired:!0}:{},...void 0===b?{}:{teaKey:b},...void 0===I?{}:{resume:I}}),ue(i,!0)):{ok:!1,reason:"cancelled"}},fe=new AbortController;C.set(ae,fe),P.set(ae,J(a));const ve=R.get(ae)?.stopped;void 0!==ve&&fe.abort("cancelled"===ve&&R.get(ae)?.retainCheckpoint?"cancelled-preserve":ve),!1===t.isOnline?.()&&le(ae,"offline");try{if(d&&(await pe(),!g()))return{ok:!1,reason:"cancelled"};if(void 0!==S&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=f(await e.buildPreview(S,a.mimeType,t.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};se={...se,body:e.buildBody({url:a.localPreviewUrl??"",meta:oe,size:S.size},a)},t.domainState.upsertMessages([se],"live")}const i=await p.acquire(k(e.contentType,S?.size??O?.byteLength),fe.signal);try{let i;X(ae,a,"running",N.get(ae)??0);try{L||(i=x?await a.data():void 0!==S?new Uint8Array(await S.arrayBuffer()):O)}catch{return ue("upload-failed",!0)}const n=L?S.size:i.length;if(0===n)return ue("empty");if(x&&("video"!==e.contentType||void 0===ee?.thumbData)){try{oe=f(await e.buildPreview(V(i),a.mimeType,t.mediaPreview,fe.signal),ee)}catch{}if(!g())return{ok:!1,reason:"cancelled"};se={...se,body:e.buildBody({url:a.localPreviewUrl??"",meta:oe,size:n},a)},t.domainState.upsertMessages([se],"live")}if(fe.signal.throwIfAborted(),("video"===e.contentType||"file"===e.contentType||"filesAlbum"===e.contentType)&&void 0!==t.recoveryPort&&!0===t.shouldPersistUpload?.(e.uploadKind,n)){w=new AbortController,_.set(ae,w);const n=w.signal;U.set(ae,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),A=Promise.resolve().then(()=>t.recoveryPort.fingerprint(L?S:i,n)).catch(i=>{!n.aborted&&g()&&(U.set(ae,{recovery:"session-only",recoveryReason:"unavailable"}),t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}))}),L||await A}if(fe.signal.aborted)throw M();let o,r,d=L?S:i,s=1;if($&&void 0!==t.crypto&&"none"!==e.encryptMode){const a=t.crypto;try{b??(b=a.randomTeaKey());const t=b;"simple"===e.encryptMode?(d=L?new Blob([new Uint8Array(a.encryptFileSimple({teaKey:t,plain:new Uint8Array(await S.slice(0,l).arrayBuffer())})),S.slice(l)]):a.encryptFileSimple({teaKey:t,plain:i}),s=2):L?(o=e=>a.encryptSymmetricChunked({teaKey:t,plain:e,signal:fe.signal}),s=3):(d=a.encryptSymmetric({teaKey:t,plain:i}),s=3)}catch{return ue("encrypt-failed")}}try{!1===t.isOnline?.()&&le(ae,"offline"),await(t.waitUntilOnline?.(fe.signal)),fe.signal.throwIfAborted();r=(await t.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===R.get(ae)?.refreshCredentials,data:d,...void 0===o?{}:{transformPart:o},kind:e.uploadKind,conversationType:a.conversationType,signal:fe.signal,...void 0===I?{}:{resume:I},onFailure:e=>{if(g()&&C.get(ae)===fe){h=e;const t=R.get(ae);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{g()&&C.get(ae)===fe&&(I=void 0)},onResumable:i=>{if(g()&&C.get(ae)===fe&&(I=i,!("cancelled"===R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint||void 0===w||void 0===t.recoveryPort||"video"!==e.contentType&&"file"!==e.contentType&&"filesAlbum"!==e.contentType))){const n=z.get(ae)??Date.now();z.set(ae,n);const o=A.then(async o=>{void 0===o||w?.signal.aborted||!g()&&!D||C.get(ae)!==fe||"cancelled"===R.get(ae)?.stopped&&!0!==R.get(ae)?.retainCheckpoint&&!D||(await t.recoveryPort.save({version:1,ref:J(a),messageId:ae,kind:"video"===e.contentType?"video":"file",createdAt:ie,savedAt:n,source:{...o,...void 0===a.filename?{}:{filename:a.filename},...void 0===a.mimeType?{}:{mimeType:a.mimeType}},encrypted:$,...void 0===b?{}:{teaKey:b},resume:i,...void 0===a.caption?{}:{caption:a.caption},...void 0===a.filesAlbum?{}:{filesAlbum:a.filesAlbum},...void 0===a.refMessageId?{}:{refMessageId:a.refMessageId},..."video"===e.contentType?{preview:oe}:{}}),C.get(ae)!==fe||w?.signal.aborted||U.set(ae,{recovery:"available"}))}).catch(i=>{const n="object"==typeof i&&null!==i&&"reason"in i?String(i.reason):"storage";(C.get(ae)===fe||Y.has(ae))&&U.set(ae,{recovery:"session-only",recoveryReason:n}),t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i})});E.add(o),B(ae,o),o.finally(()=>{E.delete(o);const e=q.get(ae);!W||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||X(ae,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==a.filename?{filename:a.filename}:{},...void 0!==a.mimeType?{mimeType:a.mimeType}:{},onProgress:e=>{if(!g()||fe.signal.aborted||C.get(ae)!==fe)return;const i=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,n=Math.max(N.get(ae)??0,i);j.set(ae,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),N.set(ae,n),t.emitter.emit({type:"media:progress",conversation:J(a),messageId:ae,percent:n}),fe.signal.aborted||C.get(ae)!==fe||X(ae,a,"running",n,void 0,e.phase)}})).url}catch(i){if(fe.signal.aborted&&i instanceof Error&&"AbortError"===i.name||t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i}),!g())return{ok:!1,reason:"cancelled"};const n=fe.signal.aborted?K.get(ae)??"cancelled":"upload-failed";return await me(n)}if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.aborted){const e=K.get(ae)??"cancelled";return await me(e)}if(y===H&&("image"===e.contentType||"video"===e.contentType)&&void 0!==t.mediaAssetCache){const n=e.contentType,o=S??new Blob([i],void 0===a.mimeType?void 0:{type:a.mimeType}),d=o.size;t.mediaAssetCache.put({kind:n,messageId:ae,resourceVersion:c(r,{conversation:J(a)}),blob:o,...void 0===a.mimeType?{}:{mimeType:a.mimeType}}).catch(e=>{t.onMediaAssetCacheError?.({operation:"put",kind:n,messageId:ae,byteLength:d,cause:e})})}const u="filesAlbum"===e.contentType?await(t.mediaPreview.fileMd5?.(V(i),fe.signal)):void 0;if(!g())return{ok:!1,reason:"cancelled"};if(fe.signal.throwIfAborted(),"filesAlbum"===e.contentType&&void 0===u)throw new Error("FILES_ALBUM requires fileMd5");return await A,await Promise.all([...E]),g()?(fe.signal.throwIfAborted(),t.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ae,conversationId:a.conversationId,conversationType:a.conversationType,contentType:e.contentType,body:e.buildBody({url:r,meta:oe,size:n,...void 0===u?{}:{md5:u},..."none"===e.encryptMode?{}:{teaKey:b,fileEncryptType:s}},a),encryption:{encrypted:$},createdAt:ie,...void 0!==a.refMessageId?{refMessageId:a.refMessageId}:{}}),await Promise.all([...E]),void 0!==t.recoveryPort&&await t.recoveryPort.remove(J(a),ae).catch(i=>t.onMediaTransferError?.({stage:"upload",kind:e.uploadKind,messageId:ae,conversation:J(a),cause:i})),X(ae,a,"completed",100),{ok:!0,messageId:ae}):{ok:!1,reason:"cancelled"}}finally{i()}}catch{if(!g())return{ok:!1,reason:"cancelled"};const e=fe.signal.aborted?K.get(ae)??"cancelled":"upload-failed";return await me(e)}finally{await A,await Promise.all([...E]),_.get(ae)===w&&_.delete(ae),!g()&&D&&await Promise.all([...E]),g()||void 0===I||D&&"available"===U.get(ae)?.recovery||Q(I,e.uploadKind,ae,J(a)),C.get(ae)===fe&&(C.delete(ae),P.delete(ae),Y.has(ae)||N.delete(ae),K.delete(ae))}}async function re(l,y,h,w,b=!1){const M=G,I=()=>W&&M===G,A=J(l),E=(e,t)=>{for(const a of t)void 0!==a.resume&&Q(a.resume,a.uploadKind,e,A)};if(!I())return void 0!==y&&void 0!==w&&E(y,w),{ok:!1,reason:"cancelled"};if(0===l.items.length)return{ok:!1,reason:"empty"};if(l.items.length>i)throw new RangeError(`媒体合集最多 ${i} 项,收到 ${l.items.length} 项`);const D=void 0!==l.caption&&""!==l.caption.trim()?l.caption:void 0;if(void 0!==D&&Array.from(D).length>a)throw new RangeError(`媒体合集配文最长 ${a} 字符,收到 ${Array.from(D).length}`);if(l.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===w&&"mediaAlbum"!==n(l)){const e=l.items[0];return oe("video"===e.kind?g:v,{conversationId:l.conversationId,conversationType:l.conversationType,data:e.data,...void 0!==e.mimeType?{mimeType:e.mimeType}:{},...void 0!==e.filename?{filename:e.filename}:{},...void 0!==e.localPreviewUrl?{localPreviewUrl:e.localPreviewUrl}:{},...void 0!==e.localPreviewMetadata?{localPreviewMetadata:e.localPreviewMetadata}:{},...void 0!==l.encrypted?{encrypted:l.encrypted}:{},...void 0!==l.refMessageId?{refMessageId:l.refMessageId}:{}},y,h)}const z=l.encrypted??!0;if(z&&void 0===t.crypto)return{ok:!1,reason:"no-crypto"};const U=z?t.crypto:void 0,x=H,S=void 0===y||void 0===h?t.outbox.allocateMessageIdentity(A):{id:y,createdAt:h},{id:_,createdAt:B}=S,O=l.items.map((e,t)=>{const a=w?.[t];return{uploadKind:e.kind,...void 0===a?.uploaded?{}:{uploaded:a.uploaded},...void 0===a?.preview?{}:{preview:a.preview},...void 0===a?.teaKey?{}:{teaKey:a.teaKey},...void 0===a?.resume?{}:{resume:a.resume}}}),F=O.map((e,t)=>{const a=l.items[t].data.size,i=void 0!==e.uploaded?a:b?0:e.resume?.bytesUploaded??0;return{itemIndex:t,bytesTransferred:i,bytesTotal:a,percent:void 0!==e.uploaded?100:Math.min(99,Math.floor(i/a*100)),state:void 0!==e.uploaded?"completed":"queued"}});V.set(_,F);const L=()=>({...void 0===D?{}:{caption:D},items:l.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??m(e.localPreviewMetadata,e.kind)??{width:0,height:0};return{kind:e.kind,url:i?.url??e.localPreviewUrl??"",width:n.width,height:n.height,..."video"===e.kind&&void 0!==n.duration&&n.duration>0?{durationMs:Math.max(1,Math.round(1e3*n.duration))}:{},...void 0===n.thumbData?{}:{thumbData:n.thumbData},size:i?.size??e.data.size,...void 0===i?.teaKey?{}:{teaKey:i.teaKey},...void 0===i?{}:{fileEncryptType:i.fileEncryptType},...void 0===a?{}:{hd:a}}}(e,O[t],l.hd))});let q={id:_,conversationId:l.conversationId,conversationType:l.conversationType,senderId:t.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:L()},createdAt:B,sortKey:s(B,_),status:"uploading",receipt:"unread",encryption:{encrypted:z},...void 0!==l.refMessageId?{refMessageId:l.refMessageId}:{}};t.domainState.upsertMessages([q],"live",{newOutgoing:!0});const $=b?0:N.get(_)??0;let ee;b&&j.delete(_),N.set(_,$),X(_,l,"queued",$,void 0,"waiting-upload-slot");const te=(e,a)=>{const i={code:u,reason:"unknown",displayCode:"cleanup-unconfirmed"===ee?"media.cleanupUnconfirmed":"resume-unavailable"===ee?"media.resumeUnavailable":"timeout"===ee?"media.uploadTimeout":T(e),retryable:a};if(!I())return{ok:!1,reason:e};const n=R.get(_);return"paused"===n?.stopped?(X(_,l,"paused",N.get(_)??0),{ok:!1,reason:e}):void 0!==n&&void 0===n.stopped&&n.attempt<3&&("network"===n.failure||"timeout"===n.failure||"credentials-expired"===n.failure||"offline"===e&&void 0!==t.waitUntilOnline)?(X(_,l,"queued",N.get(_)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===n?.stopped||void 0!==n&&n.attempt>=3&&("network"===n.failure||"timeout"===n.failure||"credentials-expired"===n.failure)||(t.domainState.upsertMessages([{...q,status:"failed",failure:i}],"live"),X(_,l,"cancelled"===e?"canceled":"failed",N.get(_)??0,i)),{ok:!1,reason:e})},ae=new AbortController;C.set(_,ae),P.set(_,A);const ie=R.get(_)?.stopped;void 0!==ie&&ae.abort("cancelled"===ie&&R.get(_)?.retainCheckpoint?"cancelled-preserve":ie),!1===t.isOnline?.()&&le(_,"offline");const ne=()=>I()&&C.get(_)===ae,re=()=>{I()&&ne()&&(q={...q,body:{mediaAlbum:L()}},t.domainState.upsertMessages([q],"live"))},de=l.items.reduce((e,t)=>e+t.data.size,0),se=O.map((e,t)=>void 0!==e.uploaded?l.items[t].data.size:e.resume?.bytesUploaded??0),ce=()=>{if(!I()||!ne()||ae.signal.aborted)return;const e=se.reduce((e,t)=>e+t,0),a=Math.min(99,Math.max(N.get(_)??0,Math.floor(e/de*100)));j.set(_,{bytesTransferred:e,bytesTotal:de}),N.set(_,a),t.emitter.emit({type:"media:progress",conversation:A,messageId:_,percent:a}),!ae.signal.aborted&&ne()&&X(_,l,"running",a,void 0,"transferring")};let ue;const pe=async()=>{let e=!0;return await Promise.all(O.map(async a=>{if(void 0!==a.resume)try{await t.mediaTransfer.abandonUpload(a.resume),delete a.resume}catch(i){e=!1,ee="cleanup-unconfirmed",t.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:_,conversation:A,cause:i})}})),e},me=e=>(Z(_,{kind:"album",input:l,createdAt:B,message:q,failureReason:e,items:O,...!0===R.get(_)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===ee||"resume-unavailable"===ee?{restartRequired:!0}:{}}),te(e,!0));try{if(b){const e=await pe();if(!I())return{ok:!1,reason:"cancelled"};if(!e)return me("cancelled"===K.get(_)?"cancelled":"upload-failed");for(let e=0;e<O.length;e+=1)void 0===O[e].uploaded&&(se[e]=0)}if(await Promise.all(l.items.map(async(a,i)=>{const n=O[i];if(void 0===n.uploaded)try{!1===t.isOnline?.()&&le(_,"offline"),await(t.waitUntilOnline?.(ae.signal)),ae.signal.throwIfAborted();const o=await async function(a){const{conversation:i,encryptWith:n,isCurrentAttempt:o,item:r,onBytesUploaded:d,onPreviewReady:s,onSlotAcquired:l,signal:c,state:u}=a,y="video"===r.kind?g:v,h=e(a.itemCount),w=m(r.localPreviewMetadata,r.kind),b=void 0!==w?.thumbData&&w.thumbData.byteLength>h.maxBytes?{width:w.width,height:w.height,...void 0===w.duration?{}:{duration:w.duration}}:w;let T=b??{width:0,height:0};if("video"!==r.kind||void 0===b?.thumbData)try{T=f(await y.buildPreview(r.data,r.mimeType,t.mediaPreview,c,a.itemCount),b)}catch{}void 0===T.thumbData&&void 0!==u.preview?.thumbData&&u.preview.thumbData.byteLength<=h.maxBytes&&(T=u.preview),u.preview=T,s();const M=await p.acquire(k(r.kind,r.data.size),c);try{let e;l();let s=1;if(void 0!==n){u.teaKey??(u.teaKey=n.randomTeaKey());const t=u.teaKey;e=e=>n.encryptSymmetricChunked({teaKey:t,plain:e,signal:c}),s=3}return{url:(await t.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:a.forceRefreshCredentials,data:r.data,...void 0===e?{}:{transformPart:e},kind:y.uploadKind,conversationType:i.conversationType,signal:c,...void 0===u.resume?{}:{resume:u.resume},onFailure:e=>{o()&&a.onFailure(e)},onResumeInvalidated:()=>{o()&&delete u.resume},onResumable:e=>{W&&o()&&(u.resume=e)},...void 0!==r.filename?{filename:r.filename}:{},...void 0!==r.mimeType?{mimeType:r.mimeType}:{},onProgress:e=>{W&&!c.aborted&&o()&&d(e.bytesTransferred)}})).url,meta:T,size:r.data.size,...void 0===u.teaKey?{}:{teaKey:u.teaKey},fileEncryptType:s}}finally{M()}}({item:a,itemCount:l.items.length,state:n,conversation:A,encryptWith:U,signal:ae.signal,isCurrentAttempt:ne,onPreviewReady:re,onSlotAcquired:()=>{I()&&ne()&&!ae.signal.aborted&&(F[i]={...F[i],state:"running"},X(_,l,"running",N.get(_)??0))},forceRefreshCredentials:!0===R.get(_)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(ae.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===ee||"resume-unavailable"!==e&&"resume-unavailable"===ee)||(ee=e);const a=R.get(_);void 0!==a&&(a.failure=ee)},onBytesUploaded:e=>{se[i]=e,F[i]={...F[i],bytesTransferred:e,percent:Math.min(99,Math.floor(e/a.data.size*100)),state:"running"},ce()}});if(!ne())return;n.uploaded=o,F[i]={...F[i],bytesTransferred:a.data.size,percent:100,state:"completed"},se[i]=a.data.size,ce()}catch(e){ne()&&!ae.signal.aborted&&(F[i]={...F[i],state:"failed"}),((e,a)=>{void 0===ue&&(ue=ae.signal.aborted?K.get(_)??"cancelled":"upload-failed","upload-failed"===ue&&t.onMediaTransferError?.({stage:"upload",kind:e,messageId:_,conversation:A,cause:a}),ae.abort("offline"))})(a.kind,e)}})),!I())return{ok:!1,reason:"cancelled"};if(!ne())return{ok:!1,reason:"cancelled"};if("cancelled"===K.get(_))return"cleanup-unconfirmed"!==ee&&!0!==R.get(_)?.retainCheckpoint&&await pe(),I()?me("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==ue)return me(ue);if(ae.signal.aborted){return me(K.get(_)??"cancelled")}const a=L();let i;try{i=o(r(a).content)}catch(e){return t.onMediaAlbumContentSize?.({messageId:_,conversation:A,itemCount:a.items.length,outcome:"rejected",cause:e}),te("content-too-large",!1)}if(i>=d&&t.onMediaAlbumContentSize?.({messageId:_,conversation:A,itemCount:a.items.length,contentBytes:i,outcome:"warn"}),x===H&&void 0!==t.mediaAssetCache){const e=t.mediaAssetCache;l.items.forEach((a,i)=>{const n=O[i].uploaded;void 0!==n&&e.put({kind:a.kind,messageId:_,resourceVersion:c(n.url,{conversation:A,itemIndex:i}),blob:a.data,...void 0===a.mimeType?{}:{mimeType:a.mimeType}}).catch(e=>{t.onMediaAssetCacheError?.({operation:"put",kind:a.kind,messageId:_,byteLength:a.data.size,cause:e})})})}return t.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:_,conversationId:l.conversationId,conversationType:l.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:a},encryption:{encrypted:z},createdAt:B,...void 0!==l.refMessageId?{refMessageId:l.refMessageId}:{}}),X(_,l,"completed",100),{ok:!0,messageId:_}}finally{I()||E(_,O),C.get(_)===ae&&(C.delete(_),P.delete(_),Y.has(_)||N.delete(_),K.delete(_))}}function de(e,a,i,n=1){const{id:o,createdAt:r}=i??t.outbox.allocateMessageIdentity(J(e)),d={attempt:n};let s,l;$.delete(o),R.set(o,d);const c=new Promise((e,t)=>{s=e,l=t});return d.done=c,(async()=>{let e=await a(o,r);for(;R.get(o)===d&&void 0===d.stopped&&d.attempt<3;){const a=Y.get(o);if(!W||e.ok||void 0===a||a.restartRequired||"network"!==d.failure&&"timeout"!==d.failure&&"credentials-expired"!==d.failure&&(e.ok||"offline"!==e.reason||void 0===t.waitUntilOnline))break;const i=new AbortController;if(d.waiting=i,await(t.waitUntilOnline?.(i.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(a,1===d.attempt?1e3:3e3);function a(){clearTimeout(t),i.signal.removeEventListener("abort",a),e()}i.signal.addEventListener("abort",a,{once:!0}),i.signal.aborted&&a()}),await(t.waitUntilOnline?.(i.signal).catch(()=>{})),delete d.waiting,!W||void 0!==d.stopped||R.get(o)!==d)break;d.attempt+=1,d.refreshCredentials="credentials-expired"===d.failure,delete d.failure,Y.delete(o),$.delete(o),e=await se(o,a,!1)}const i=Y.get(o),n="cancelled"!==d.stopped&&d.attempt>=3&&("network"===d.failure||"timeout"===d.failure||"credentials-expired"===d.failure);if(W&&R.get(o)===d&&void 0!==i&&n&&!0===t.retainFailedUploads){d.stopped="cancelled",d.retainCheckpoint=!0,i.retainCheckpoint=!0;const e={...A(i),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};t.domainState.upsertMessages([{...i.message,status:"failed",failure:e}],"live"),X(o,i.input,"failed",N.get(o)??0,e)}else if(W&&R.get(o)===d&&void 0!==i&&("cancelled"===d.stopped||n)){d.stopped="cancelled";const a={...A(i),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===d.retainCheckpoint&&!n};(!0!==d.retainCheckpoint||n)&&await pe(o,i),W&&R.get(o)===d&&(t.domainState.upsertMessages([{...i.message,status:"failed",failure:a}],"live"),X(o,i.input,"canceled",N.get(o)??0,a)),e={ok:!1,reason:"cancelled"}}return"paused"===d.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{d.settled=!0,ne(o),s(e)},e=>{d.settled=!0,ne(o),l(e)}),c.then(()=>{R.get(o)===d&&"paused"!==d.stopped&&(R.delete(o),Y.has(o)||(N.delete(o),j.delete(o),V.delete(o),U.delete(o),z.delete(o),q.delete(o)))},()=>{R.get(o)===d&&R.delete(o)}),c}function se(e,t,a){return"album"===t.kind?re(t.input,e,t.createdAt,t.items,a):oe(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function le(e,t){const a=R.get(e);if(!W||void 0===a||"cancelled"===a.stopped)return;if("paused"===a.stopped)return void("pagehide"===t&&"offline"===a.pauseReason&&(a.pauseReason="pagehide"));a.stopped="paused",a.pauseReason=t;const i=C.get(e);a.waiting?.abort(),i?.abort("paused");const n=q.get(e);void 0!==n&&R.get(e)===a&&"paused"===a.stopped&&X(e,n.input,"paused",N.get(e)??n.percent)}async function ce(e,t="manual"){const a=R.get(e);if(!W||void 0===a||"cancelled"===a.stopped)return!1;if("paused"===a.stopped)return("manual"===t||"pagehide"===t&&"offline"===a.pauseReason)&&(a.pauseReason=t),await a.done,ne(e),W&&R.get(e)===a&&Y.has(e);le(e,t),await a.done,await Promise.all(O(e));const i=Y.get(e);return!(!W||R.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(X(e,i.input,"paused",N.get(e)??0),!0)}function ue(e){ie();const a=R.get(e),i=Y.get(e);if(!W||"paused"!==a?.stopped||!0!==a.settled||void 0===i||C.has(e))return!1;Y.delete(e),$.delete(e);const n=G;return de(i.input,()=>se(e,i,!1),{id:e,createdAt:i.createdAt},a.attempt).catch(a=>{W&&n===G&&t.onMediaTransferError?.({stage:"upload",kind:"media"===i.kind?i.spec.uploadKind:"image",messageId:e,conversation:J(i.input),cause:a})}),!0}async function pe(e,a){Y.delete(e),$.delete(e),U.delete(e),z.delete(e),j.delete(e),V.delete(e),L.add(e);try{await Promise.all(O(e)),await(t.recoveryPort?.remove(J(a.input),e).catch(i=>{t.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:J(a.input),cause:i})})),await Promise.all(I(a).map(async i=>{try{await t.mediaTransfer.abandonUpload(i.resume)}catch(n){t.onMediaTransferError?.({stage:"upload",kind:i.kind,messageId:e,conversation:J(a.input),cause:n})}}))}catch(i){t.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:J(a.input),cause:i})}finally{L.delete(e),U.delete(e),z.delete(e),j.delete(e)}}function me(e,a){if(ie(),!W)return!1;const i=R.get(e),n=C.get(e);if(!0!==a?.retainCheckpoint&&_.get(e)?.abort(),void 0!==i&&(i.stopped="cancelled",i.retainCheckpoint=!0===a?.retainCheckpoint,i.waiting?.abort()),void 0!==n){const i=P.get(e);return void 0!==i&&!0!==a?.retainCheckpoint&&function(e,a){if(void 0===t.recoveryPort)return;const i=O(e),n="video"===t.domainState.getConversationMessage?.(a,e)?.contentType?"video":"file",o=Promise.all(i).then(()=>t.recoveryPort.remove(a,e)).catch(i=>{t.onMediaTransferError?.({stage:"upload",kind:n,messageId:e,conversation:a,cause:i})});B(e,o)}(e,i),K.set(e,"cancelled"),n.abort(!0===a?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const o=Y.get(e);if(void 0===o||void 0===i)return void 0!==i&&"queued"===q.get(e)?.state;if(!0===a?.retainCheckpoint)o.retainCheckpoint=!0,o.failureReason="cancelled";else{B(e,pe(e,o))}const r={...A(o),displayCode:"media.cancelled",retryable:!0===a?.retainCheckpoint};return t.domainState.upsertMessages([{...o.message,status:"failed",failure:r}],"live"),X(e,o.input,"canceled",N.get(e)??0,r),R.get(e)===i&&R.delete(e),ne(e),!0!==a?.retainCheckpoint&&(N.delete(e),V.delete(e),q.delete(e)),!0}async function fe(e,t,a,i){ie();const n=G,o=O(t);return o.length>0&&await Promise.all(o),W&&n===G?(z.delete(t),de(i,()=>oe(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>de(e,(t,a)=>oe(v,e,t,a)),sendVideo:e=>de(e,(t,a)=>oe(g,e,t,a)),replaceVideo:(e,t,a)=>fe(g,e,t,a),sendVoice:e=>{const t=e.durationMs;return void 0===t||!Number.isFinite(t)||t<1e3?Promise.resolve({ok:!1,reason:"invalid-duration"}):de(e,(t,a)=>oe(y,e,t,a))},sendFile:e=>void 0!==e.caption&&Array.from(e.caption).length>a?Promise.resolve({ok:!1,reason:"content-too-large"}):de(e,(t,a)=>oe(e.filesAlbum||e.caption?.trim()?b:w,e,t,a)),sendGif:e=>de(e,(t,a)=>oe(h,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>de(e,(t,a)=>re(e,t,a)),replaceFile:(e,t,i)=>void 0!==i.caption&&Array.from(i.caption).length>a?Promise.resolve({ok:!1,reason:"content-too-large"}):fe(i.filesAlbum||i.caption?.trim()?b:w,e,t,i),cancel:me,pause:ce,async pauseAll(e="pagehide"){for(const{controller:e}of F.values())e.abort();await Promise.all([...R.keys()].map(t=>ce(t,e)))},async resumePaused(e,t){await Promise.all([...R.entries()].map(async([a,i])=>{if(t?.aborted||"paused"!==i.stopped||"manual"===i.pauseReason)return;if(void 0===e&&"offline"!==i.pauseReason)return;const n=q.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=Y.get(a);t?.aborted||R.get(a)!==i||void 0===o||void 0===e&&"offline"!==i.pauseReason||(void 0===e||o.input.conversationType===e.conversationType&&o.input.conversationId===e.conversationId)&&ue(a)}))},resume:ue,cancelConversation(e,a="offline"){for(const t of F.values())t.ref.conversationType===e.conversationType&&t.ref.conversationId===e.conversationId&&t.controller.abort();for(const[a,i]of Y)if(i.input.conversationType===e.conversationType&&i.input.conversationId===e.conversationId){if(R.has(a))me(a);else{for(const e of I(i))Q(e.resume,e.kind,a,J(i.input));t.recoveryPort?.remove(J(i.input),a).catch(n=>t.onMediaTransferError?.({stage:"upload",kind:"media"===i.kind?i.spec.uploadKind:"image",messageId:a,conversation:e,cause:n}))}Y.delete(a),$.delete(a),V.delete(a),j.delete(a),N.delete(a),q.delete(a)}if(W)for(const[t,i]of P){if(i.conversationType!==e.conversationType||i.conversationId!==e.conversationId)continue;const n=C.get(t);if(void 0===n)continue;const o=R.get(t);void 0!==o&&(o.stopped="cancelled"),K.set(t,a),_.get(t)?.abort(),n.abort(a)}},cancelAll(e="offline"){if(W){if("offline"===e){const e=G;for(const a of R.keys()){const i=q.get(a)?.input;ce(a,"offline").catch(n=>{W&&e===G&&void 0!==i&&t.onMediaTransferError?.({stage:"upload",kind:"video"===t.domainState.getConversationMessage?.(i,a)?.contentType?"video":"file",messageId:a,conversation:i,cause:n})})}return}if("session-ended"===e){for(const{controller:e}of F.values())e.abort();for(const e of R.values())e.stopped="cancelled",e.waiting?.abort();G+=1,H+=1}for(const t of _.values())t.abort(e);for(const t of C.values())t.abort(e)}},retry(e,t){if(ie(),L.has(e))return!1;if(!W)return!1;const a=Y.get(e);if(void 0===a)return!1;if(!0===R.get(e)?.retainCheckpoint&&!0!==R.get(e)?.settled)return!1;if(a.restartRequired&&!0!==t?.restartUpload)return!1;const i=!0===t?.restartUpload||"cancelled"===a.failureReason&&!0!==a.retainCheckpoint;return Y.delete(e),$.delete(e),de(a.input,()=>se(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:ie,invalidateAssetCacheWrites(){H+=1},async dispose(e){if(!W)return;D=!0===e?.preserveRecovery;for(const{controller:e}of F.values())e.abort();const a=[...R.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of R.values())e.stopped="cancelled",e.waiting?.abort();if(W=!1,H+=1,!D)for(const e of _.values())e.abort();for(const e of C.values())e.abort(D?"page-preserve":"cancelled");for(const[e,t]of Y)if(!D||"available"!==U.get(e)?.recovery)for(const a of I(t))Q(a.resume,a.kind,e,J(t.input));Y.clear(),$.clear(),await Promise.allSettled(a),await Promise.all([...x]),C.clear(),N.clear(),K.clear();for(const[e,t]of Y)if(!D||"available"!==U.get(e)?.recovery)for(const a of I(t))Q(a.resume,a.kind,e,J(t.input));Y.clear(),$.clear(),R.clear(),j.clear(),V.clear(),U.clear(),z.clear(),q.clear(),await(t.recoveryPort?.drain())},async recoverUpload(e,a,i){ie();const n=t.recoveryPort;if(!W||void 0===n)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(R.has(a)||F.has(a))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const o=new AbortController;F.set(a,{controller:o,ref:e});const r=()=>{if(!W||o.signal.aborted||F.get(a)?.controller!==o)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},d=(e,a)=>{if(void 0===e||e.senderId!==t.getSelfId()||void 0!==e.recalled||void 0!==e.deletedForEveryone||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable||"failed"!==e.status&&"uploading"!==e.status)return!1;const i="video"===e.contentType,n="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(i||n)&&(void 0===a||e.contentType===a)};let s;try{s=await n.acquireLease(o.signal),r();const l=t.domainState.getConversationMessage?.(e,a);if(!d(l))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const c=await n.get(e,a);if(r(),void 0===c)throw new Error("IM_MEDIA_RECOVERY_NOT_FOUND");const u="video"===c.kind?"video":c.filesAlbum||c.caption?.trim()?"filesAlbum":"file";if(!d(l,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const p=await n.fingerprint(i,o.signal);if(r(),p.size!==c.source.size||p.sha256!==c.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=t.domainState.getConversationMessage?.(e,a);if(R.has(a)||!d(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:i,encrypted:c.encrypted,filename:c.source.filename,mimeType:c.source.mimeType,caption:c.caption,filesAlbum:c.filesAlbum,refMessageId:c.refMessageId,...void 0===c.preview?{}:{localPreviewMetadata:{width:c.preview.width,height:c.preview.height,duration:c.preview.duration,posterData:c.preview.thumbData}}};return z.set(a,c.savedAt),await de(f,()=>oe("video"===c.kind?g:c.filesAlbum||c.caption?.trim()?b:w,f,a,c.createdAt,c.teaKey,c.resume),{id:a,createdAt:c.createdAt})}finally{F.get(a)?.controller===o&&F.delete(a),ne(a),s?.release()}}}}export{C as createMediaSender};
1
+ import{abortWithReason as e,throwIfAborted as t}from"../../abort.js";import{resolveMediaThumbnailPolicy as a,MEDIA_THUMBNAIL_MAX_BYTES as i}from"../../media-thumbnail-policy.js";import{MEDIA_ALBUM_CAPTION_MAX_LENGTH as n,MEDIA_ALBUM_MAX_ITEMS as o,resolveMediaAlbumSendContentType as r,measureMediaAlbumContentBytes as d,mediaAlbumBMessageFields as s,MEDIA_ALBUM_CONTENT_WARN_BYTES as l}from"../../mapping/media-album-body.js";import{computeSortKey as c}from"../../mapping/sort.js";import{SIMPLE_ENCRYPT_HEAD_BYTES as u}from"../../ports/crypto-port.js";import{mediaAssetResourceVersion as p}from"../../ports/media-asset-cache-port.js";import{LOCAL_MEDIA_ERROR_CODE as m}from"../../mapping/stored-message.js";function f(e){return Number.isFinite(e)&&e>0}function v(e,t){if(("video"===t||"image"===t)&&void 0!==e&&f(e.width)&&f(e.height)&&("video"!==t||void 0===e.duration||f(e.duration))&&("video"!==t||void 0===e.posterData||e.posterData instanceof Uint8Array&&0!==e.posterData.length&&!(e.posterData.length>i)))return{width:e.width,height:e.height,..."video"===t&&void 0!==e.duration?{duration:e.duration}:{},..."video"===t&&void 0!==e.posterData?{thumbData:new Uint8Array(e.posterData)}:{}}}function g(e,t){return void 0===t?e:{...e,width:t.width,height:t.height,...void 0===t.thumbData?{}:{thumbData:t.thumbData},...void 0===e.duration&&void 0!==t.duration?{duration:t.duration}:{}}}const y={contentType:"image",uploadKind:"image",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,i,n,o=1){const r=await i.imageDimensions(e,t,n),d=await i.imageThumbnail(e,{mimeType:t,...a(o)},n);return{width:r.width,height:r.height,...d.data.byteLength<=a(o).maxBytes?{thumbData:d.data}:{}}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n})=>({image:{url:e,width:t.width,height:t.height,...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},h={contentType:"video",uploadKind:"video",encryptMode:"integral",streamUpload:!0,async buildPreview(e,t,i,n,o=1){const r=await i.videoPoster(e,{mimeType:t,...a(o)},n);return{width:r.width,height:r.height,...r.data.byteLength<=a(o).maxBytes?{thumbData:r.data}:{},duration:r.duration}},buildBody:({url:e,meta:t,size:a,teaKey:i,fileEncryptType:n},o)=>({video:{url:e,width:t.width,height:t.height,...void 0!==t.duration?{duration:t.duration}:{},...void 0!==o.caption&&""!==o.caption?{describe:o.caption}:{},...void 0!==t.thumbData?{thumbData:t.thumbData}:{},...void 0!==a?{size:a,sizeUnit:"bytes"}:{},...void 0!==n?{fileEncryptType:n}:{},...void 0!==i?{teaKey:i}:{}}})},w={contentType:"voice",uploadKind:"voice",encryptMode:"integral",buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody:({url:e,size:t,teaKey:a,fileEncryptType:i},n)=>({voice:{url:e,durationMs:n.durationMs??0,...void 0!==n.waveform&&n.waveform.length>0?{waveform:n.waveform}:{},...void 0!==t?{size:t}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}})},b={contentType:"sticker",uploadKind:"sticker",encryptMode:"none",async buildPreview(e,t,a,i){const n=await a.imageDimensions(e,t,i);return{width:n.width,height:n.height}},buildBody:({url:e,meta:t,size:a})=>({sticker:{url:e,width:t.width,height:t.height,exprType:2,imageType:1,...void 0===a?{}:{size:a}}})};const T={contentType:"file",uploadKind:"file",encryptMode:"simple",streamUpload:!0,buildPreview:()=>Promise.resolve({width:0,height:0}),buildBody({url:e,size:t,teaKey:a,fileEncryptType:i},n){const o=n.filename??"",r=function(e){const t=e.lastIndexOf(".");return t>-1&&t<e.length-1?e.slice(t+1).toLowerCase():""}(o),d=function(e,t){const a=t??"";return a.startsWith("image/")||["jpg","jpeg","png","gif","webp","bmp","heic","svg"].includes(e)?1:a.startsWith("video/")||["mp4","mov","m4v","3gp","avi","mkv","webm","flv"].includes(e)?2:a.startsWith("audio/")||["mp3","m4a","wav","aac","flac","ogg"].includes(e)?3:["pdf","doc","docx","xls","xlsx","ppt","pptx","txt","csv","zip","rar","7z","apk","json"].includes(e)?4:0}(r,n.mimeType);return{file:{url:e,fileName:o,...void 0!==t?{size:t}:{},...""!==r?{extension:r}:{},...0!==d?{fileType:d}:{},...void 0!==n.mimeType&&""!==n.mimeType?{mimeType:n.mimeType}:{},...void 0!==i?{fileEncryptType:i}:{},...void 0!==a?{teaKey:a}:{}}}}},k={...T,contentType:"filesAlbum",buildBody(e,t){const a=T.buildBody(e,t).file;return{filesAlbum:{...t.caption?.trim()?{caption:t.caption}:{},items:[{...a,extension:a.extension??"",fileType:a.fileType??0,...["zip","rar","torrent"].includes(a.extension??"")?{fileType:5}:{},...void 0===e.md5?{}:{md5:e.md5}}]}}}};function M(e){switch(e){case"empty":return"media.empty";case"no-crypto":return"media.noCrypto";case"preview-failed":return"media.previewFailed";case"encrypt-failed":return"media.encryptFailed";case"upload-failed":case"offline":return"media.uploadFailed";case"cancelled":return"media.cancelled";case"paused":throw new Error("暂停不是失败状态,不应生成失败文案");case"invalid-duration":return"media.invalidDuration";case"content-too-large":return"media.contentTooLarge"}}function I(e,t){return"video"===e||void 0===t||t>16777216?"large":"small"}function A(){return new DOMException("媒体上传已取消","AbortError")}function E(e){return"album"===e.kind?e.items.flatMap(e=>void 0===e.resume||void 0!==e.uploaded?[]:[{resume:e.resume,kind:e.uploadKind}]):void 0===e.resume?[]:[{resume:e.resume,kind:e.spec.uploadKind}]}function C(e){if("album"===e.kind)return{code:m,reason:"unknown",displayCode:M(e.failureReason),retryable:!1};const t="video"===e.spec.contentType||"file"===e.spec.contentType||"filesAlbum"===e.spec.contentType;return{code:m,reason:"unknown",displayCode:t?"media.uploadInterrupted":M(e.failureReason),mediaKind:e.spec.uploadKind,retryable:!1}}function P(e,t){if(!Number.isInteger(e)||e<1||e>6)throw new RangeError(`媒体上传并发数必须是 1-6 的整数(${t})`)}function K(i){const f=function(e){let t=0,a=0;const i=[];function n(i){return t<e.total&&("large"!==i||a<e.largeFiles)}function o(e){t+=1,"large"===e&&(a+=1);let i=!1;return()=>{i||(i=!0,t-=1,"large"===e&&(a-=1),r())}}function r(){let e=0;for(;e<i.length;){const t=i[e];t.signal.aborted?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.reject(A())):n(t.tier)?(i.splice(e,1),t.signal.removeEventListener("abort",t.onAbort),t.resolve(o(t.tier))):e+=1}}return{acquire:(e,t)=>t.aborted?Promise.reject(A()):new Promise((a,n)=>{const o={tier:e,signal:t,resolve:a,reject:n,onAbort:()=>{const e=i.indexOf(o);e>=0&&i.splice(e,1),n(A())}};i.push(o),t.addEventListener("abort",o.onAbort,{once:!0}),r()})}}(function(e){if(void 0===e)return{total:5,largeFiles:3};if("number"==typeof e)return P(e,"总数"),{total:e,largeFiles:e};const t=e.total??5;P(t,"total");const a=e.largeFiles??Math.min(3,t);if(P(a,"largeFiles"),a>t)throw new RangeError(`媒体上传大文件档并发数 ${a} 不能超过总并发数 ${t}`);return{total:t,largeFiles:a}}(i.maxConcurrentUploads)),K=/* @__PURE__ */new Map,R=/* @__PURE__ */new Map,D=/* @__PURE__ */new Map,z=/* @__PURE__ */new Map;let U=!1;const x=/* @__PURE__ */new Map,S=/* @__PURE__ */new Map,_=/* @__PURE__ */new Set,B=/* @__PURE__ */new Map,O=/* @__PURE__ */new Map;function F(e,t){const a=B.get(e)??/* @__PURE__ */new Set;B.set(e,a),a.add(t),_.add(t),t.finally(()=>{a.delete(t),_.delete(t),0===a.size&&B.get(e)===a&&B.delete(e),re(e)})}function L(e){return[...B.get(e)??[]]}const q=/* @__PURE__ */new Map,V=/* @__PURE__ */new Set,j=/* @__PURE__ */new Map,N=/* @__PURE__ */new Map,Y=/* @__PURE__ */new Map,$=/* @__PURE__ */new Map,W=/* @__PURE__ */new Map,G=/* @__PURE__ */new Map;let H=!0,J=0,Q=0;function X(e){return{conversationType:e.conversationType,conversationId:e.conversationId}}function Z(e,t,a,n){i.mediaTransfer.abandonUpload(e).catch(e=>{i.onMediaTransferError?.({stage:"upload",kind:t,messageId:a,conversation:n,cause:e})})}function ee(e,t,a,n,o,r){if(!H)return;const d=X(t);j.set(e,{input:X(t),state:a,percent:n,phase:r}),i.emitter.emit({type:"media-task:updated",conversation:d,task:{id:`upload:${e}`,messageId:e,ref:d,direction:"upload",state:a,percent:Math.max(0,Math.min(100,Math.round(n))),attempt:z.get(e)?.attempt??1,maxAttempts:3,...Y.get(e),...N.has(e)?{items:Object.freeze(N.get(e).map(e=>Object.freeze({...e,state:"completed"===e.state?"completed":"canceled"===a||"failed"===a?a:e.state})))}:{},...S.get(e),...void 0===r?{}:{phase:r},...void 0===o?{}:{failure:o}}})}function te(e,t){oe(),W.delete(e),G.delete(e),W.set(e,t),ne()}function ae(e){const t=z.get(e);if(K.has(e)||q.has(e)||L(e).length>0||void 0!==t&&(!0!==t.settled||void 0!==t.waiting))return!1;const a=j.get(e)?.state;return"failed"===a||"canceled"===a||"paused"===a&&"manual"===t?.pauseReason}function ie(e,t){const a=X(t.input),n=E(t),o="media"===t.kind?t.spec.uploadKind:"image",r={...C(t),displayCode:"media.uploadInterrupted",retryable:!1};W.delete(e),G.delete(e),z.delete(e),$.delete(e),Y.delete(e),N.delete(e),S.delete(e),x.delete(e),j.delete(e),D.delete(e);for(const t of n)Z(t.resume,t.kind,e,a);if(function(e,t,a){const n=i.recoveryPort;if(void 0===n)return;const o=L(e),r=Promise.all(o).then(()=>n.remove(X(t),e)).catch(n=>{i.onMediaTransferError?.({stage:"upload",kind:a,messageId:e,conversation:X(t),cause:n})});F(e,r)}(e,a,o),!H)return;const d=i.domainState.getConversationMessage?.(a,e)??t.message;"sent"!==d.status&&(i.domainState.upsertMessages([{...d,status:"failed",failure:r}],"live"),ee(e,a,"failed",0,r))}function ne(){if(H)for(const[e,t]of W){if(W.size<=3)break;ae(e)&&ie(e,t)}}function oe(){if(!H)return;const e=Date.now();for(const[t,a]of W){const i=G.get(t);void 0!==i&&e-i>=864e5&&ae(t)&&ie(t,a)}}function re(e){H&&(W.has(e)&&ae(e)&&!G.has(e)&&G.set(e,Date.now()),ne())}async function de(a,n,o,r,d,s,l=!1){const y=J,h=()=>H&&y===J;if(!h())return void 0!==s&&void 0!==o&&Z(s,a.uploadKind,o,X(n)),{ok:!1,reason:"cancelled"};const w=Q;let b,T,k=d,E=s,C=Promise.resolve(void 0);const P=/* @__PURE__ */new Set,_="function"==typeof n.data;const B=function(e){return"undefined"!=typeof Blob&&e instanceof Blob}(n.data)?n.data:void 0,L=_||void 0!==B?void 0:n.data,q=_||void 0!==B,V=!0===a.streamUpload&&void 0!==B,N=e=>{if(void 0!==B)return B;if(void 0===e)throw new Error("媒体预览缺少内容:非 Blob 输入必须先读出字节");return new Blob([e],void 0===n.mimeType?void 0:{type:n.mimeType})};if(0===L?.length||0===B?.size)return{ok:!1,reason:"empty"};const G=n.encrypted??!0;if(G&&void 0===i.crypto)return{ok:!1,reason:"no-crypto"};const ae=v(n.localPreviewMetadata,a.contentType);if(("video"===a.contentType||"image"===a.contentType)&&void 0!==n.localPreviewMetadata&&void 0===ae)return{ok:!1,reason:"preview-failed"};const ie=void 0===o||void 0===r?i.outbox.allocateMessageIdentity({conversationId:n.conversationId,conversationType:n.conversationType}):{id:o,createdAt:r},{id:ne,createdAt:oe}=ie,re=i.getSelfId();let de=ae??{width:0,height:0};if(!q)try{de=g(await a.buildPreview(N(L),n.mimeType,i.mediaPreview),ae)}catch{}if(!h())return void 0!==E&&Z(E,a.uploadKind,ne,X(n)),{ok:!1,reason:"cancelled"};const se=B?.size??L?.byteLength,le={url:n.localPreviewUrl??"",...void 0===se?{}:{size:se}};let ce={id:ne,conversationId:n.conversationId,conversationType:n.conversationType,senderId:re,contentType:a.contentType,body:a.buildBody({...le,meta:de},n),createdAt:oe,sortKey:c(oe,ne),status:"uploading",receipt:"unread",encryption:{encrypted:G},...void 0!==n.refMessageId?{refMessageId:n.refMessageId}:{}};i.domainState.upsertMessages([ce],"live",{newOutgoing:!0});const pe=l?0:$.get(ne)??0;l&&Y.delete(ne),$.set(ne,pe),ee(ne,n,"queued",pe,void 0,"waiting-upload-slot");const me=(e,t=!1)=>{const o={code:m,reason:"unknown",displayCode:"cleanup-unconfirmed"===b?"media.cleanupUnconfirmed":"resume-unavailable"===b?"media.resumeUnavailable":"timeout"===b?"media.uploadTimeout":M(e),mediaKind:a.uploadKind,retryable:t};if(!h())return{ok:!1,reason:e};const r=z.get(ne);return"paused"===r?.stopped?(ee(ne,n,"paused",$.get(ne)??0),{ok:!1,reason:e}):void 0!==r&&void 0===r.stopped&&r.attempt<3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure||"offline"===e&&void 0!==i.waitUntilOnline)?(ee(ne,n,"queued",$.get(ne)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===r?.stopped||void 0!==r&&r.attempt>=3&&("network"===r.failure||"timeout"===r.failure||"credentials-expired"===r.failure)||(i.domainState.upsertMessages([{...ce,status:"failed",failure:o}],"live"),ee(ne,n,"cancelled"===e?"canceled":"failed",$.get(ne)??0,o)),{ok:!1,reason:e})},fe=async()=>{if(void 0!==E)try{await i.mediaTransfer.abandonUpload(E),E=void 0}catch(e){throw b="cleanup-unconfirmed",i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}),e}},ve=async e=>{if(await C,await Promise.all([...P]),"cancelled"===e&&"paused"!==z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&"cleanup-unconfirmed"!==b)try{await fe()}catch{}return"cancelled"===e&&"paused"!==z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&void 0!==i.recoveryPort&&(await Promise.all([...P]),await i.recoveryPort.remove(X(n),ne).catch(e=>i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}))),h()?(te(ne,{kind:"media",spec:a,input:n,createdAt:oe,message:ce,failureReason:e,...!0===z.get(ne)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===b||"resume-unavailable"===b?{restartRequired:!0}:{},...void 0===k?{}:{teaKey:k},...void 0===E?{}:{resume:E}}),me(e,!0)):{ok:!1,reason:"cancelled"}},ge=new AbortController;K.set(ne,ge),R.set(ne,X(n));const ye=z.get(ne)?.stopped;void 0!==ye&&e(ge,"cancelled"===ye&&z.get(ne)?.retainCheckpoint?"cancelled-preserve":ye),!1===i.isOnline?.()&&ue(ne,"offline");try{if(l&&(await fe(),!h()))return{ok:!1,reason:"cancelled"};if(void 0!==B&&("video"!==a.contentType||void 0===ae?.thumbData)){try{de=g(await a.buildPreview(B,n.mimeType,i.mediaPreview,ge.signal),ae)}catch{}if(!h())return{ok:!1,reason:"cancelled"};ce={...ce,body:a.buildBody({url:n.localPreviewUrl??"",meta:de,size:B.size},n)},i.domainState.upsertMessages([ce],"live")}const e=await f.acquire(I(a.contentType,B?.size??L?.byteLength),ge.signal);try{let e;ee(ne,n,"running",$.get(ne)??0);try{V||(e=_?await n.data():void 0!==B?new Uint8Array(await B.arrayBuffer()):L)}catch{return me("upload-failed",!0)}const o=V?B.size:e.length;if(0===o)return me("empty");if(_&&("video"!==a.contentType||void 0===ae?.thumbData)){try{de=g(await a.buildPreview(N(e),n.mimeType,i.mediaPreview,ge.signal),ae)}catch{}if(!h())return{ok:!1,reason:"cancelled"};ce={...ce,body:a.buildBody({url:n.localPreviewUrl??"",meta:de,size:o},n)},i.domainState.upsertMessages([ce],"live")}if(t(ge.signal),("video"===a.contentType||"file"===a.contentType||"filesAlbum"===a.contentType)&&void 0!==i.recoveryPort&&!0===i.shouldPersistUpload?.(a.uploadKind,o)){T=new AbortController,O.set(ne,T);const t=T.signal;S.set(ne,{recovery:"session-only",recoveryReason:"fingerprint-pending"}),C=Promise.resolve().then(()=>i.recoveryPort.fingerprint(V?B:e,t)).catch(e=>{!t.aborted&&h()&&(S.set(ne,{recovery:"session-only",recoveryReason:"unavailable"}),i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}))}),V||await C}if(ge.signal.aborted)throw A();let r,d,s=V?B:e,l=1;if(G&&void 0!==i.crypto&&"none"!==a.encryptMode){const t=i.crypto;try{k??(k=t.randomTeaKey());const i=k;"simple"===a.encryptMode?(s=V?new Blob([new Uint8Array(t.encryptFileSimple({teaKey:i,plain:new Uint8Array(await B.slice(0,u).arrayBuffer())})),B.slice(u)]):t.encryptFileSimple({teaKey:i,plain:e}),l=2):V?(r=e=>t.encryptSymmetricChunked({teaKey:i,plain:e,signal:ge.signal}),l=3):(s=t.encryptSymmetric({teaKey:i,plain:e}),l=3)}catch{return me("encrypt-failed")}}try{!1===i.isOnline?.()&&ue(ne,"offline"),await(i.waitUntilOnline?.(ge.signal)),t(ge.signal);d=(await i.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:!0===z.get(ne)?.refreshCredentials,data:s,...void 0===r?{}:{transformPart:r},kind:a.uploadKind,conversationType:n.conversationType,signal:ge.signal,...void 0===E?{}:{resume:E},onFailure:e=>{if(h()&&K.get(ne)===ge){b=e;const t=z.get(ne);void 0!==t&&(t.failure=e)}},onResumeInvalidated:()=>{h()&&K.get(ne)===ge&&(E=void 0)},onResumable:e=>{if(h()&&K.get(ne)===ge&&(E=e,!("cancelled"===z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint||void 0===T||void 0===i.recoveryPort||"video"!==a.contentType&&"file"!==a.contentType&&"filesAlbum"!==a.contentType))){const t=x.get(ne)??Date.now();x.set(ne,t);const o=C.then(async o=>{void 0===o||T?.signal.aborted||!h()&&!U||K.get(ne)!==ge||"cancelled"===z.get(ne)?.stopped&&!0!==z.get(ne)?.retainCheckpoint&&!U||(await i.recoveryPort.save({version:1,ref:X(n),messageId:ne,kind:"video"===a.contentType?"video":"file",createdAt:oe,savedAt:t,source:{...o,...void 0===n.filename?{}:{filename:n.filename},...void 0===n.mimeType?{}:{mimeType:n.mimeType}},encrypted:G,...void 0===k?{}:{teaKey:k},resume:e,...void 0===n.caption?{}:{caption:n.caption},...void 0===n.filesAlbum?{}:{filesAlbum:n.filesAlbum},...void 0===n.refMessageId?{}:{refMessageId:n.refMessageId},..."video"===a.contentType?{preview:de}:{}}),K.get(ne)!==ge||T?.signal.aborted||S.set(ne,{recovery:"available"}))}).catch(e=>{const t="object"==typeof e&&null!==e&&"reason"in e?String(e.reason):"storage";(K.get(ne)===ge||W.has(ne))&&S.set(ne,{recovery:"session-only",recoveryReason:t}),i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e})});P.add(o),F(ne,o),o.finally(()=>{P.delete(o);const e=j.get(ne);!H||void 0===e||"running"!==e.state&&"paused"!==e.state&&"queued"!==e.state||ee(ne,e.input,e.state,e.percent,void 0,e.phase)})}},...void 0!==n.filename?{filename:n.filename}:{},...void 0!==n.mimeType?{mimeType:n.mimeType}:{},onProgress:e=>{if(!h()||ge.signal.aborted||K.get(ne)!==ge)return;const t=Number.isFinite(e.percent)?Math.max(0,Math.min(100,Math.round(e.percent))):0,a=Math.max($.get(ne)??0,t);Y.set(ne,{bytesTransferred:e.bytesTransferred,bytesTotal:e.bytesTotal}),$.set(ne,a),i.emitter.emit({type:"media:progress",conversation:X(n),messageId:ne,percent:a}),ge.signal.aborted||K.get(ne)!==ge||ee(ne,n,"running",a,void 0,e.phase)}})).url}catch(e){if(ge.signal.aborted&&e instanceof Error&&"AbortError"===e.name||i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e}),!h())return{ok:!1,reason:"cancelled"};const t=ge.signal.aborted?D.get(ne)??"cancelled":"upload-failed";return await ve(t)}if(!h())return{ok:!1,reason:"cancelled"};if(ge.signal.aborted){const e=D.get(ne)??"cancelled";return await ve(e)}if(w===Q&&("image"===a.contentType||"video"===a.contentType)&&void 0!==i.mediaAssetCache){const t=a.contentType,o=B??new Blob([e],void 0===n.mimeType?void 0:{type:n.mimeType}),r=o.size;i.mediaAssetCache.put({kind:t,messageId:ne,resourceVersion:p(d,{conversation:X(n)}),blob:o,...void 0===n.mimeType?{}:{mimeType:n.mimeType}}).catch(e=>{i.onMediaAssetCacheError?.({operation:"put",kind:t,messageId:ne,byteLength:r,cause:e})})}const c="filesAlbum"===a.contentType?await(i.mediaPreview.fileMd5?.(N(e),ge.signal)):void 0;if(!h())return{ok:!1,reason:"cancelled"};if(t(ge.signal),"filesAlbum"===a.contentType&&void 0===c)throw new Error("FILES_ALBUM requires fileMd5");return await C,await Promise.all([...P]),h()?(t(ge.signal),i.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:ne,conversationId:n.conversationId,conversationType:n.conversationType,contentType:a.contentType,body:a.buildBody({url:d,meta:de,size:o,...void 0===c?{}:{md5:c},..."none"===a.encryptMode?{}:{teaKey:k,fileEncryptType:l}},n),encryption:{encrypted:G},createdAt:oe,...void 0!==n.refMessageId?{refMessageId:n.refMessageId}:{}}),await Promise.all([...P]),void 0!==i.recoveryPort&&await i.recoveryPort.remove(X(n),ne).catch(e=>i.onMediaTransferError?.({stage:"upload",kind:a.uploadKind,messageId:ne,conversation:X(n),cause:e})),ee(ne,n,"completed",100),{ok:!0,messageId:ne}):{ok:!1,reason:"cancelled"}}finally{e()}}catch{if(!h())return{ok:!1,reason:"cancelled"};const e=ge.signal.aborted?D.get(ne)??"cancelled":"upload-failed";return await ve(e)}finally{await C,await Promise.all([...P]),O.get(ne)===T&&O.delete(ne),!h()&&U&&await Promise.all([...P]),h()||void 0===E||U&&"available"===S.get(ne)?.recovery||Z(E,a.uploadKind,ne,X(n)),K.get(ne)===ge&&(K.delete(ne),R.delete(ne),W.has(ne)||$.delete(ne),D.delete(ne))}}async function se(u,w,b,T,k=!1){const A=J,E=()=>H&&A===J,C=X(u),P=(e,t)=>{for(const a of t)void 0!==a.resume&&Z(a.resume,a.uploadKind,e,C)};if(!E())return void 0!==w&&void 0!==T&&P(w,T),{ok:!1,reason:"cancelled"};if(0===u.items.length)return{ok:!1,reason:"empty"};if(u.items.length>o)throw new RangeError(`媒体合集最多 ${o} 项,收到 ${u.items.length} 项`);const U=void 0!==u.caption&&""!==u.caption.trim()?u.caption:void 0;if(void 0!==U&&Array.from(U).length>n)throw new RangeError(`媒体合集配文最长 ${n} 字符,收到 ${Array.from(U).length}`);if(u.items.some(e=>0===e.data.size))return{ok:!1,reason:"empty"};if(void 0===T&&"mediaAlbum"!==r(u)){const e=u.items[0];return de("video"===e.kind?h:y,{conversationId:u.conversationId,conversationType:u.conversationType,data:e.data,...void 0!==e.mimeType?{mimeType:e.mimeType}:{},...void 0!==e.filename?{filename:e.filename}:{},...void 0!==e.localPreviewUrl?{localPreviewUrl:e.localPreviewUrl}:{},...void 0!==e.localPreviewMetadata?{localPreviewMetadata:e.localPreviewMetadata}:{},...void 0!==u.encrypted?{encrypted:u.encrypted}:{},...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}},w,b)}const x=u.encrypted??!0;if(x&&void 0===i.crypto)return{ok:!1,reason:"no-crypto"};const S=x?i.crypto:void 0,_=Q,B=void 0===w||void 0===b?i.outbox.allocateMessageIdentity(C):{id:w,createdAt:b},{id:O,createdAt:F}=B,L=u.items.map((e,t)=>{const a=T?.[t];return{uploadKind:e.kind,...void 0===a?.uploaded?{}:{uploaded:a.uploaded},...void 0===a?.preview?{}:{preview:a.preview},...void 0===a?.teaKey?{}:{teaKey:a.teaKey},...void 0===a?.resume?{}:{resume:a.resume}}}),q=L.map((e,t)=>{const a=u.items[t].data.size,i=void 0!==e.uploaded?a:k?0:e.resume?.bytesUploaded??0;return{itemIndex:t,bytesTransferred:i,bytesTotal:a,percent:void 0!==e.uploaded?100:Math.min(99,Math.floor(i/a*100)),state:void 0!==e.uploaded?"completed":"queued"}});N.set(O,q);const V=()=>({...void 0===U?{}:{caption:U},items:u.items.map((e,t)=>function(e,t,a){const i=t.uploaded,n=i?.meta??t.preview??v(e.localPreviewMetadata,e.kind)??{width:0,height:0};return{kind:e.kind,url:i?.url??e.localPreviewUrl??"",width:n.width,height:n.height,..."video"===e.kind&&void 0!==n.duration&&n.duration>0?{durationMs:Math.max(1,Math.round(1e3*n.duration))}:{},...void 0===n.thumbData?{}:{thumbData:n.thumbData},size:i?.size??e.data.size,...void 0===i?.teaKey?{}:{teaKey:i.teaKey},...void 0===i?{}:{fileEncryptType:i.fileEncryptType},...void 0===a?{}:{hd:a}}}(e,L[t],u.hd))});let j={id:O,conversationId:u.conversationId,conversationType:u.conversationType,senderId:i.getSelfId(),contentType:"mediaAlbum",body:{mediaAlbum:V()},createdAt:F,sortKey:c(F,O),status:"uploading",receipt:"unread",encryption:{encrypted:x},...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}};i.domainState.upsertMessages([j],"live",{newOutgoing:!0});const G=k?0:$.get(O)??0;let ae;k&&Y.delete(O),$.set(O,G),ee(O,u,"queued",G,void 0,"waiting-upload-slot");const ie=(e,t)=>{const a={code:m,reason:"unknown",displayCode:"cleanup-unconfirmed"===ae?"media.cleanupUnconfirmed":"resume-unavailable"===ae?"media.resumeUnavailable":"timeout"===ae?"media.uploadTimeout":M(e),retryable:t};if(!E())return{ok:!1,reason:e};const n=z.get(O);return"paused"===n?.stopped?(ee(O,u,"paused",$.get(O)??0),{ok:!1,reason:e}):void 0!==n&&void 0===n.stopped&&n.attempt<3&&("network"===n.failure||"timeout"===n.failure||"credentials-expired"===n.failure||"offline"===e&&void 0!==i.waitUntilOnline)?(ee(O,u,"queued",$.get(O)??0,void 0,"waiting-retry"),{ok:!1,reason:e}):("cancelled"===n?.stopped||void 0!==n&&n.attempt>=3&&("network"===n.failure||"timeout"===n.failure||"credentials-expired"===n.failure)||(i.domainState.upsertMessages([{...j,status:"failed",failure:a}],"live"),ee(O,u,"cancelled"===e?"canceled":"failed",$.get(O)??0,a)),{ok:!1,reason:e})},ne=new AbortController;K.set(O,ne),R.set(O,C);const oe=z.get(O)?.stopped;void 0!==oe&&e(ne,"cancelled"===oe&&z.get(O)?.retainCheckpoint?"cancelled-preserve":oe),!1===i.isOnline?.()&&ue(O,"offline");const re=()=>E()&&K.get(O)===ne,se=()=>{E()&&re()&&(j={...j,body:{mediaAlbum:V()}},i.domainState.upsertMessages([j],"live"))},le=u.items.reduce((e,t)=>e+t.data.size,0),ce=L.map((e,t)=>void 0!==e.uploaded?u.items[t].data.size:e.resume?.bytesUploaded??0),pe=()=>{if(!E()||!re()||ne.signal.aborted)return;const e=ce.reduce((e,t)=>e+t,0),t=Math.min(99,Math.max($.get(O)??0,Math.floor(e/le*100)));Y.set(O,{bytesTransferred:e,bytesTotal:le}),$.set(O,t),i.emitter.emit({type:"media:progress",conversation:C,messageId:O,percent:t}),!ne.signal.aborted&&re()&&ee(O,u,"running",t,void 0,"transferring")};let me;const fe=async()=>{let e=!0;return await Promise.all(L.map(async t=>{if(void 0!==t.resume)try{await i.mediaTransfer.abandonUpload(t.resume),delete t.resume}catch(a){e=!1,ae="cleanup-unconfirmed",i.onMediaTransferError?.({stage:"upload",kind:t.uploadKind,messageId:O,conversation:C,cause:a})}})),e},ve=e=>(te(O,{kind:"album",input:u,createdAt:F,message:j,failureReason:e,items:L,...!0===z.get(O)?.retainCheckpoint?{retainCheckpoint:!0}:{},..."cleanup-unconfirmed"===ae||"resume-unavailable"===ae?{restartRequired:!0}:{}}),ie(e,!0));try{if(k){const e=await fe();if(!E())return{ok:!1,reason:"cancelled"};if(!e)return ve("cancelled"===D.get(O)?"cancelled":"upload-failed");for(let e=0;e<L.length;e+=1)void 0===L[e].uploaded&&(ce[e]=0)}if(await Promise.all(u.items.map(async(n,o)=>{const r=L[o];if(void 0===r.uploaded)try{!1===i.isOnline?.()&&ue(O,"offline"),await(i.waitUntilOnline?.(ne.signal)),t(ne.signal);const e=await async function(e){const{conversation:t,encryptWith:n,isCurrentAttempt:o,item:r,onBytesUploaded:d,onPreviewReady:s,onSlotAcquired:l,signal:c,state:u}=e,p="video"===r.kind?h:y,m=a(e.itemCount),w=v(r.localPreviewMetadata,r.kind),b=void 0!==w?.thumbData&&w.thumbData.byteLength>m.maxBytes?{width:w.width,height:w.height,...void 0===w.duration?{}:{duration:w.duration}}:w;let T=b??{width:0,height:0};if("video"!==r.kind||void 0===b?.thumbData)try{T=g(await p.buildPreview(r.data,r.mimeType,i.mediaPreview,c,e.itemCount),b)}catch{}void 0===T.thumbData&&void 0!==u.preview?.thumbData&&u.preview.thumbData.byteLength<=m.maxBytes&&(T=u.preview),u.preview=T,s();const k=await f.acquire(I(r.kind,r.data.size),c);try{let a;l();let s=1;if(void 0!==n){u.teaKey??(u.teaKey=n.randomTeaKey());const e=u.teaKey;a=t=>n.encryptSymmetricChunked({teaKey:e,plain:t,signal:c}),s=3}return{url:(await i.mediaTransfer.upload({recoveryManaged:!0,forceRefreshCredentials:e.forceRefreshCredentials,data:r.data,...void 0===a?{}:{transformPart:a},kind:p.uploadKind,conversationType:t.conversationType,signal:c,...void 0===u.resume?{}:{resume:u.resume},onFailure:t=>{o()&&e.onFailure(t)},onResumeInvalidated:()=>{o()&&delete u.resume},onResumable:e=>{H&&o()&&(u.resume=e)},...void 0!==r.filename?{filename:r.filename}:{},...void 0!==r.mimeType?{mimeType:r.mimeType}:{},onProgress:e=>{H&&!c.aborted&&o()&&d(e.bytesTransferred)}})).url,meta:T,size:r.data.size,...void 0===u.teaKey?{}:{teaKey:u.teaKey},fileEncryptType:s}}finally{k()}}({item:n,itemCount:u.items.length,state:r,conversation:C,encryptWith:S,signal:ne.signal,isCurrentAttempt:re,onPreviewReady:se,onSlotAcquired:()=>{E()&&re()&&!ne.signal.aborted&&(q[o]={...q[o],state:"running"},ee(O,u,"running",$.get(O)??0))},forceRefreshCredentials:!0===z.get(O)?.refreshCredentials,onFailure:e=>{const t="cleanup-unconfirmed"===e||"resume-unavailable"===e;if(ne.signal.aborted&&!t)return;"cleanup-unconfirmed"!==e&&("cleanup-unconfirmed"===ae||"resume-unavailable"!==e&&"resume-unavailable"===ae)||(ae=e);const a=z.get(O);void 0!==a&&(a.failure=ae)},onBytesUploaded:e=>{ce[o]=e,q[o]={...q[o],bytesTransferred:e,percent:Math.min(99,Math.floor(e/n.data.size*100)),state:"running"},pe()}});if(!re())return;r.uploaded=e,q[o]={...q[o],bytesTransferred:n.data.size,percent:100,state:"completed"},ce[o]=n.data.size,pe()}catch(t){re()&&!ne.signal.aborted&&(q[o]={...q[o],state:"failed"}),((t,a)=>{void 0===me&&(me=ne.signal.aborted?D.get(O)??"cancelled":"upload-failed","upload-failed"===me&&i.onMediaTransferError?.({stage:"upload",kind:t,messageId:O,conversation:C,cause:a}),e(ne,"offline"))})(n.kind,t)}})),!E())return{ok:!1,reason:"cancelled"};if(!re())return{ok:!1,reason:"cancelled"};if("cancelled"===D.get(O))return"cleanup-unconfirmed"!==ae&&!0!==z.get(O)?.retainCheckpoint&&await fe(),E()?ve("cancelled"):{ok:!1,reason:"cancelled"};if(void 0!==me)return ve(me);if(ne.signal.aborted){return ve(D.get(O)??"cancelled")}const n=V();let o;try{o=d(s(n).content)}catch(e){return i.onMediaAlbumContentSize?.({messageId:O,conversation:C,itemCount:n.items.length,outcome:"rejected",cause:e}),ie("content-too-large",!1)}if(o>=l&&i.onMediaAlbumContentSize?.({messageId:O,conversation:C,itemCount:n.items.length,contentBytes:o,outcome:"warn"}),_===Q&&void 0!==i.mediaAssetCache){const e=i.mediaAssetCache;u.items.forEach((t,a)=>{const n=L[a].uploaded;void 0!==n&&e.put({kind:t.kind,messageId:O,resourceVersion:p(n.url,{conversation:C,itemIndex:a}),blob:t.data,...void 0===t.mimeType?{}:{mimeType:t.mimeType}}).catch(e=>{i.onMediaAssetCacheError?.({operation:"put",kind:t.kind,messageId:O,byteLength:t.data.size,cause:e})})})}return i.outbox.enqueueMedia({optimisticAlreadyCreated:!0,id:O,conversationId:u.conversationId,conversationType:u.conversationType,contentType:"mediaAlbum",body:{mediaAlbum:n},encryption:{encrypted:x},createdAt:F,...void 0!==u.refMessageId?{refMessageId:u.refMessageId}:{}}),ee(O,u,"completed",100),{ok:!0,messageId:O}}finally{E()||P(O,L),K.get(O)===ne&&(K.delete(O),R.delete(O),W.has(O)||$.delete(O),D.delete(O))}}function le(e,t,a,n=1){const{id:o,createdAt:r}=a??i.outbox.allocateMessageIdentity(X(e)),d={attempt:n};let s,l;G.delete(o),z.set(o,d);const c=new Promise((e,t)=>{s=e,l=t});return d.done=c,(async()=>{let e=await t(o,r);for(;z.get(o)===d&&void 0===d.stopped&&d.attempt<3;){const t=W.get(o);if(!H||e.ok||void 0===t||t.restartRequired||"network"!==d.failure&&"timeout"!==d.failure&&"credentials-expired"!==d.failure&&(e.ok||"offline"!==e.reason||void 0===i.waitUntilOnline))break;const a=new AbortController;if(d.waiting=a,await(i.waitUntilOnline?.(a.signal).catch(()=>{})),await new Promise(e=>{const t=setTimeout(i,1===d.attempt?1e3:3e3);function i(){clearTimeout(t),a.signal.removeEventListener("abort",i),e()}a.signal.addEventListener("abort",i,{once:!0}),a.signal.aborted&&i()}),await(i.waitUntilOnline?.(a.signal).catch(()=>{})),delete d.waiting,!H||void 0!==d.stopped||z.get(o)!==d)break;d.attempt+=1,d.refreshCredentials="credentials-expired"===d.failure,delete d.failure,W.delete(o),G.delete(o),e=await ce(o,t,!1)}const a=W.get(o),n="cancelled"!==d.stopped&&d.attempt>=3&&("network"===d.failure||"timeout"===d.failure||"credentials-expired"===d.failure);if(H&&z.get(o)===d&&void 0!==a&&n&&!0===i.retainFailedUploads){d.stopped="cancelled",d.retainCheckpoint=!0,a.retainCheckpoint=!0;const e={...C(a),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.uploadFailed",retryable:!0};i.domainState.upsertMessages([{...a.message,status:"failed",failure:e}],"live"),ee(o,a.input,"failed",$.get(o)??0,e)}else if(H&&z.get(o)===d&&void 0!==a&&("cancelled"===d.stopped||n)){d.stopped="cancelled";const t={...C(a),displayCode:"timeout"===d.failure?"media.uploadTimeout":"media.cancelled",retryable:!0===d.retainCheckpoint&&!n};(!0!==d.retainCheckpoint||n)&&await fe(o,a),H&&z.get(o)===d&&(i.domainState.upsertMessages([{...a.message,status:"failed",failure:t}],"live"),ee(o,a.input,"canceled",$.get(o)??0,t)),e={ok:!1,reason:"cancelled"}}return"paused"===d.stopped?{ok:!1,reason:"paused"}:e})().then(e=>{d.settled=!0,re(o),s(e)},e=>{d.settled=!0,re(o),l(e)}),c.then(()=>{z.get(o)===d&&"paused"!==d.stopped&&(z.delete(o),W.has(o)||($.delete(o),Y.delete(o),N.delete(o),S.delete(o),x.delete(o),j.delete(o)))},()=>{z.get(o)===d&&z.delete(o)}),c}function ce(e,t,a){return"album"===t.kind?se(t.input,e,t.createdAt,t.items,a):de(t.spec,t.input,e,t.createdAt,t.teaKey,t.resume,a)}function ue(t,a){const i=z.get(t);if(!H||void 0===i||"cancelled"===i.stopped)return;if("paused"===i.stopped)return void("pagehide"===a&&"offline"===i.pauseReason&&(i.pauseReason="pagehide"));i.stopped="paused",i.pauseReason=a;const n=K.get(t);i.waiting?.abort(),void 0!==n&&e(n,"paused");const o=j.get(t);void 0!==o&&z.get(t)===i&&"paused"===i.stopped&&ee(t,o.input,"paused",$.get(t)??o.percent)}async function pe(e,t="manual"){const a=z.get(e);if(!H||void 0===a||"cancelled"===a.stopped)return!1;if("paused"===a.stopped)return("manual"===t||"pagehide"===t&&"offline"===a.pauseReason)&&(a.pauseReason=t),await a.done,re(e),H&&z.get(e)===a&&W.has(e);ue(e,t),await a.done,await Promise.all(L(e));const i=W.get(e);return!(!H||z.get(e)!==a||"paused"!==a.stopped||void 0===i)&&(ee(e,i.input,"paused",$.get(e)??0),!0)}function me(e){oe();const t=z.get(e),a=W.get(e);if(!H||"paused"!==t?.stopped||!0!==t.settled||void 0===a||K.has(e))return!1;W.delete(e),G.delete(e);const n=J;return le(a.input,()=>ce(e,a,!1),{id:e,createdAt:a.createdAt},t.attempt).catch(t=>{H&&n===J&&i.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:X(a.input),cause:t})}),!0}async function fe(e,t){W.delete(e),G.delete(e),S.delete(e),x.delete(e),Y.delete(e),N.delete(e),V.add(e);try{await Promise.all(L(e)),await(i.recoveryPort?.remove(X(t.input),e).catch(a=>{i.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:X(t.input),cause:a})})),await Promise.all(E(t).map(async a=>{try{await i.mediaTransfer.abandonUpload(a.resume)}catch(n){i.onMediaTransferError?.({stage:"upload",kind:a.kind,messageId:e,conversation:X(t.input),cause:n})}}))}catch(a){i.onMediaTransferError?.({stage:"upload",kind:"media"===t.kind?t.spec.uploadKind:"image",messageId:e,conversation:X(t.input),cause:a})}finally{V.delete(e),S.delete(e),x.delete(e),Y.delete(e)}}function ve(t,a){if(oe(),!H)return!1;const n=z.get(t),o=K.get(t);if(!0!==a?.retainCheckpoint&&O.get(t)?.abort(),void 0!==n&&(n.stopped="cancelled",n.retainCheckpoint=!0===a?.retainCheckpoint,n.waiting?.abort()),void 0!==o){const n=R.get(t);return void 0!==n&&!0!==a?.retainCheckpoint&&function(e,t){if(void 0===i.recoveryPort)return;const a=L(e),n="video"===i.domainState.getConversationMessage?.(t,e)?.contentType?"video":"file",o=Promise.all(a).then(()=>i.recoveryPort.remove(t,e)).catch(a=>{i.onMediaTransferError?.({stage:"upload",kind:n,messageId:e,conversation:t,cause:a})});F(e,o)}(t,n),D.set(t,"cancelled"),e(o,!0===a?.retainCheckpoint?"cancelled-preserve":"cancelled"),!0}const r=W.get(t);if(void 0===r||void 0===n)return void 0!==n&&"queued"===j.get(t)?.state;if(!0===a?.retainCheckpoint)r.retainCheckpoint=!0,r.failureReason="cancelled";else{F(t,fe(t,r))}const d={...C(r),displayCode:"media.cancelled",retryable:!0===a?.retainCheckpoint};return i.domainState.upsertMessages([{...r.message,status:"failed",failure:d}],"live"),ee(t,r.input,"canceled",$.get(t)??0,d),z.get(t)===n&&z.delete(t),re(t),!0!==a?.retainCheckpoint&&($.delete(t),N.delete(t),j.delete(t)),!0}async function ge(e,t,a,i){oe();const n=J,o=L(t);return o.length>0&&await Promise.all(o),H&&n===J?(x.delete(t),le(i,()=>de(e,i,t,a,void 0,void 0,!0),{id:t,createdAt:a})):{ok:!1,reason:"cancelled"}}return{sendImage:e=>le(e,(t,a)=>de(y,e,t,a)),sendVideo:e=>le(e,(t,a)=>de(h,e,t,a)),replaceVideo:(e,t,a)=>ge(h,e,t,a),sendVoice:e=>{const t=e.durationMs;return void 0===t||!Number.isFinite(t)||t<1e3?Promise.resolve({ok:!1,reason:"invalid-duration"}):le(e,(t,a)=>de(w,e,t,a))},sendFile:e=>void 0!==e.caption&&Array.from(e.caption).length>n?Promise.resolve({ok:!1,reason:"content-too-large"}):le(e,(t,a)=>de(e.filesAlbum||e.caption?.trim()?k:T,e,t,a)),sendGif:e=>le(e,(t,a)=>de(b,{...e,encrypted:!1},t,a)),sendMediaAlbum:e=>le(e,(t,a)=>se(e,t,a)),replaceFile:(e,t,a)=>void 0!==a.caption&&Array.from(a.caption).length>n?Promise.resolve({ok:!1,reason:"content-too-large"}):ge(a.filesAlbum||a.caption?.trim()?k:T,e,t,a),cancel:ve,pause:pe,async pauseAll(e="pagehide"){for(const{controller:e}of q.values())e.abort();await Promise.all([...z.keys()].map(t=>pe(t,e)))},async resumePaused(e,t){await Promise.all([...z.entries()].map(async([a,i])=>{if(t?.aborted||"paused"!==i.stopped||"manual"===i.pauseReason)return;if(void 0===e&&"offline"!==i.pauseReason)return;const n=j.get(a)?.input;if(void 0!==e&&(n?.conversationType!==e.conversationType||n.conversationId!==e.conversationId))return;await i.done;const o=W.get(a);t?.aborted||z.get(a)!==i||void 0===o||void 0===e&&"offline"!==i.pauseReason||(void 0===e||o.input.conversationType===e.conversationType&&o.input.conversationId===e.conversationId)&&me(a)}))},resume:me,cancelConversation(t,a="offline"){for(const e of q.values())e.ref.conversationType===t.conversationType&&e.ref.conversationId===t.conversationId&&e.controller.abort();for(const[e,a]of W)if(a.input.conversationType===t.conversationType&&a.input.conversationId===t.conversationId){if(z.has(e))ve(e);else{for(const t of E(a))Z(t.resume,t.kind,e,X(a.input));i.recoveryPort?.remove(X(a.input),e).catch(n=>i.onMediaTransferError?.({stage:"upload",kind:"media"===a.kind?a.spec.uploadKind:"image",messageId:e,conversation:t,cause:n}))}W.delete(e),G.delete(e),N.delete(e),Y.delete(e),$.delete(e),j.delete(e)}if(H)for(const[i,n]of R){if(n.conversationType!==t.conversationType||n.conversationId!==t.conversationId)continue;const o=K.get(i);if(void 0===o)continue;const r=z.get(i);void 0!==r&&(r.stopped="cancelled"),D.set(i,a),O.get(i)?.abort(),e(o,a)}},cancelAll(t="offline"){if(H){if("offline"===t){const e=J;for(const t of z.keys()){const a=j.get(t)?.input;pe(t,"offline").catch(n=>{H&&e===J&&void 0!==a&&i.onMediaTransferError?.({stage:"upload",kind:"video"===i.domainState.getConversationMessage?.(a,t)?.contentType?"video":"file",messageId:t,conversation:a,cause:n})})}return}if("session-ended"===t){for(const{controller:e}of q.values())e.abort();for(const e of z.values())e.stopped="cancelled",e.waiting?.abort();J+=1,Q+=1}for(const a of O.values())e(a,t);for(const a of K.values())e(a,t)}},retry(e,t){if(oe(),V.has(e))return!1;if(!H)return!1;const a=W.get(e);if(void 0===a)return!1;if(!0===z.get(e)?.retainCheckpoint&&!0!==z.get(e)?.settled)return!1;if(a.restartRequired&&!0!==t?.restartUpload)return!1;const i=!0===t?.restartUpload||"cancelled"===a.failureReason&&!0!==a.retainCheckpoint;return W.delete(e),G.delete(e),le(a.input,()=>ce(e,a,i),{id:e,createdAt:a.createdAt}),!0},expireRetainedUploads:oe,invalidateAssetCacheWrites(){Q+=1},async dispose(t){if(!H)return;U=!0===t?.preserveRecovery;for(const{controller:e}of q.values())e.abort();const a=[...z.values()].flatMap(e=>void 0===e.done?[]:[e.done]);for(const e of z.values())e.stopped="cancelled",e.waiting?.abort();if(H=!1,Q+=1,!U)for(const e of O.values())e.abort();for(const t of K.values())e(t,U?"page-preserve":"cancelled");for(const[e,t]of W)if(!U||"available"!==S.get(e)?.recovery)for(const a of E(t))Z(a.resume,a.kind,e,X(t.input));W.clear(),G.clear(),await Promise.allSettled(a),await Promise.all([..._]),K.clear(),$.clear(),D.clear();for(const[e,t]of W)if(!U||"available"!==S.get(e)?.recovery)for(const a of E(t))Z(a.resume,a.kind,e,X(t.input));W.clear(),G.clear(),z.clear(),Y.clear(),N.clear(),S.clear(),x.clear(),j.clear(),await(i.recoveryPort?.drain())},async recoverUpload(e,t,a){oe();const n=i.recoveryPort;if(!H||void 0===n)throw new Error("IM_MEDIA_RECOVERY_UNAVAILABLE");if(z.has(t)||q.has(t))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const o=new AbortController;q.set(t,{controller:o,ref:e});const r=()=>{if(!H||o.signal.aborted||q.get(t)?.controller!==o)throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE")},d=(e,t)=>{if(void 0===e||e.senderId!==i.getSelfId()||void 0!==e.recalled||void 0!==e.deletedForEveryone||"media.cancelled"===e.failure?.displayCode&&!0!==e.failure.retryable||"media.uploadTimeout"===e.failure?.displayCode&&!1===e.failure.retryable||"failed"!==e.status&&"uploading"!==e.status)return!1;const a="video"===e.contentType,n="file"===e.contentType||"filesAlbum"===e.contentType&&1===e.body.filesAlbum?.items.length;return(a||n)&&(void 0===t||e.contentType===t)};let s;try{s=await n.acquireLease(o.signal),r();const l=i.domainState.getConversationMessage?.(e,t);if(!d(l))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const c=await n.get(e,t);if(r(),void 0===c)throw new Error("IM_MEDIA_RECOVERY_NOT_FOUND");const u="video"===c.kind?"video":c.filesAlbum||c.caption?.trim()?"filesAlbum":"file";if(!d(l,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const p=await n.fingerprint(a,o.signal);if(r(),p.size!==c.source.size||p.sha256!==c.source.sha256)throw new Error("IM_MEDIA_RECOVERY_FILE_MISMATCH");const m=i.domainState.getConversationMessage?.(e,t);if(z.has(t)||!d(m,u))throw new Error("IM_MEDIA_RECOVERY_INVALID_STATE");const f={conversationId:e.conversationId,conversationType:e.conversationType,data:a,encrypted:c.encrypted,filename:c.source.filename,mimeType:c.source.mimeType,caption:c.caption,filesAlbum:c.filesAlbum,refMessageId:c.refMessageId,...void 0===c.preview?{}:{localPreviewMetadata:{width:c.preview.width,height:c.preview.height,duration:c.preview.duration,posterData:c.preview.thumbData}}};return x.set(t,c.savedAt),await le(f,()=>de("video"===c.kind?h:c.filesAlbum||c.caption?.trim()?k:T,f,t,c.createdAt,c.teaKey,c.resume),{id:t,createdAt:c.createdAt})}finally{q.get(t)?.controller===o&&q.delete(t),re(t),s?.release()}}}}export{K as createMediaSender};