k2-im 0.2.9 → 0.2.11

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.
@@ -7901,7 +7901,10 @@ interface ImExpressionStoreActions {
7901
7901
  loadRecent: (kind: RecentKind) => Promise<ImExpressionOperationResult>;
7902
7902
  reportRecent: (input: ImExpressionRecentInput) => Promise<ImExpressionOperationResult>;
7903
7903
  rememberEmoji: (entry: ImEmojiRecentEntry) => Promise<ImExpressionOperationResult>;
7904
- rememberEmojis: (entries: readonly ImEmojiRecentEntry[]) => Promise<ImExpressionOperationResult>;
7904
+ /** refreshAfterReport=false 保留本地 MRU,仅上报,不再拉取服务端列表。默认保持权威刷新行为。 */
7905
+ rememberEmojis: (entries: readonly ImEmojiRecentEntry[], options?: {
7906
+ refreshAfterReport?: boolean;
7907
+ }) => Promise<ImExpressionOperationResult>;
7905
7908
  toggleRecentSelection: (kind: RecentKind, recordId: string, selected?: boolean) => void;
7906
7909
  deleteSelectedRecent: (kind: RecentKind) => Promise<ImExpressionOperationResult>;
7907
7910
  loadGiphyTrending: () => Promise<ImExpressionOperationResult>;
@@ -1 +1 @@
1
- import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{compareBySortKey as c}from"../../../../im-core/src/mapping/sort.js";import{pullChannelMessagesRespCodec as d}from"../../../../im-protocol/src/protobuf/registry.js";async function l(o){const t=[];for(const a of u(o.channels,20)){const s=e({userId:o.userId,clientType:o.clientType,channels:a}),i=await o.http.postProtobuf({path:"/channel/v1/sessions",body:s}),r={selfId:o.userId,keepRaw:o.keepRaw??!0,expectedChannelIds:a.map(e=>e.channelId),diagnostic:{endpoint:"sessions",surface:"session-last",...void 0===o.operationId?{}:{operationId:o.operationId},clientTypeHeader:o.clientType,clientTypeBody:o.clientType}},c=n(i,r);await f(o,c.sessions.filter(e=>"active"===e.channelState||0===e.raw?.status).map(e=>e.channelId)),t.push(...n(i,{...r,onContentDecodeError:o.onContentDecodeError,onReaction:o.onReaction},o.decryptDeps).sessions)}return t}async function p(e){const n=function(e){if(void 0===e)return 10;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: channelBatchSize 必须为正整数");return Math.min(e,10)}(e.channelBatchSize),s=e.messageCount??30,i=function(e){if(void 0===e)return 100;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: maxPagesPerBatch 必须为正整数");return e}(e.maxPagesPerBatch),d=/* @__PURE__ */new Map;for(const c of u(e.pulls,n)){let n=c.map(e=>({...e}));const l=new Map(n.map(e=>[e.channelId,/* @__PURE__ */new Set([e.baseIndex])]));let p=0;for(;n.length>0;){r(e.signal),await(e.beforePage?.()),r(e.signal);const c=e.isChannelCurrent;if(void 0!==c&&(n=n.filter(e=>c(e.channelId))),0===n.length)break;if(p>=i){const e=n.map(({channelId:e,baseIndex:n})=>`${e}@${n}`).join(",");throw new Error(`channel offline 分页超过 maxPagesPerBatch=${i}(active=${e})`)}p+=1;const h=o({userId:e.userId,clientType:e.clientType,pulls:n.map(e=>({channelId:e.channelId,baseIndex:e.baseIndex,direction:0,count:s,contain:0}))});r(e.signal);const I=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:h,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal),await f(e,n.map(e=>e.channelId)),r(e.signal);const u={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:n.map(e=>e.channelId),diagnostic:{endpoint:"offlineMessages",surface:"offline-batch",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},g=void 0===e.yieldToEventLoop?t(I,u,e.decryptDeps):await a(I,u,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal});r(e.signal);const y=[];for(const e of n){const n=g.nextBaseIndexes[e.channelId],o=g.messageCounts[e.channelId]??0;if(void 0===n)continue;const t=l.get(e.channelId);if(t.has(n))throw new Error(`channel offline cursor 循环(channelId=${e.channelId}, baseIndex=${n})`);o<s||(t.add(n),y.push({channelId:e.channelId,baseIndex:n}))}await(e.onPage?.(g.messages,{pulls:n.map(e=>({...e})),nextBaseIndexes:{...g.nextBaseIndexes},messageCounts:{...g.messageCounts}})),r(e.signal);for(const e of g.messages)d.has(e.id)||d.set(e.id,e);n=y}}return[...d.values()].sort(c)}async function h(e){r(e.signal);const n=e.count??30;if(!Number.isInteger(n)||n<=0)throw new Error("channel latest: count 必须为正整数");void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const s=o({userId:e.userId,clientType:e.clientType,pulls:[{channelId:e.channelId,baseIndex:"",direction:1,count:n,contain:0}]});r(e.signal);const i=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:s,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);const c={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:[e.channelId],diagnostic:{endpoint:"offlineMessages",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},l=void 0===e.yieldToEventLoop?{...t(i,c,e.decryptDeps),firstBaseIndex:d.decode(i).lsMessage[0]?.sIndex}:await a(i,c,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal}),p=l.batchSize===n,h=l.firstBaseIndex;if(p&&("string"!=typeof h||""===h.trim()))throw new Error(`channel latest: 满页缺少向旧 cursor(channelId=${e.channelId})`);return{messages:l.messages,hasOlder:p,...p?{nextCursor:h}:{}}}async function I(e){r(e.signal);const n=e.count??30;void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const o=s({userId:e.userId,clientType:e.clientType,channelId:e.channelId,baseIndex:e.baseIndex,count:n,contain:e.contain??0});r(e.signal);const t=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:o,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);return i(t,{selfId:e.userId,channelId:e.channelId,requestedBaseIndex:e.baseIndex,requestedCount:n,keepRaw:e.keepRaw??!0,diagnostic:{endpoint:"history",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},e.decryptDeps)}async function f(e,n){if(void 0===e.decryptDeps||void 0===e.prepareKeys)return;const o=[...new Set(n.filter(Boolean))];o.length>0&&await e.prepareKeys(o)}function u(e,n){const o=[];for(let t=0;t<e.length;t+=n)o.push(e.slice(t,t+n));return o}export{I as pullChannelHistory,h as pullChannelLatestPage,p as pullChannelOfflineMessages,l as pullChannelSessions};
1
+ import{encodeChannelSessionsRequest as e,decodeChannelSessionsResponse as n,encodeChannelMessagesRequest as o,decodeChannelMessagesResponse as t,decodeChannelMessagesResponseAsync as a,encodeChannelHistoryRequest as s,decodeChannelHistoryResponse as i}from"../../../../im-core/src/mapping/channel-offline-mapper.js";import{throwIfAborted as r}from"../../../../im-core/src/abort.js";import{pullChannelMessagesRespCodec as c}from"../../../../im-protocol/src/protobuf/registry.js";import{compareBySortKey as d}from"../../../../im-core/src/mapping/sort.js";async function l(o){const t=[];for(const a of u(o.channels,20)){const s=e({userId:o.userId,clientType:o.clientType,channels:a}),i=await o.http.postProtobuf({path:"/channel/v1/sessions",body:s}),r={selfId:o.userId,keepRaw:o.keepRaw??!0,expectedChannelIds:a.map(e=>e.channelId),diagnostic:{endpoint:"sessions",surface:"session-last",...void 0===o.operationId?{}:{operationId:o.operationId},clientTypeHeader:o.clientType,clientTypeBody:o.clientType}},c=n(i,r);await f(o,c.sessions.filter(e=>"active"===e.channelState||0===e.raw?.status).map(e=>e.channelId)),t.push(...n(i,{...r,onContentDecodeError:o.onContentDecodeError,onReaction:o.onReaction},o.decryptDeps).sessions)}return t}async function p(e){const n=function(e){if(void 0===e)return 10;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: channelBatchSize 必须为正整数");return Math.min(e,10)}(e.channelBatchSize),s=e.messageCount??30,i=function(e){if(void 0===e)return 100;if(!Number.isInteger(e)||e<=0)throw new Error("channel offline: maxPagesPerBatch 必须为正整数");return e}(e.maxPagesPerBatch),c=/* @__PURE__ */new Map;for(const d of u(e.pulls,n)){let n=d.map(e=>({...e}));const l=new Map(n.map(e=>[e.channelId,/* @__PURE__ */new Set([e.baseIndex])]));let p=0;for(;n.length>0;){r(e.signal),await(e.beforePage?.()),r(e.signal);const d=e.isChannelCurrent;if(void 0!==d&&(n=n.filter(e=>d(e.channelId))),0===n.length)break;if(p>=i){const e=n.map(({channelId:e,baseIndex:n})=>`${e}@${n}`).join(",");throw new Error(`channel offline 分页超过 maxPagesPerBatch=${i}(active=${e})`)}p+=1;const h=o({userId:e.userId,clientType:e.clientType,pulls:n.map(e=>({channelId:e.channelId,baseIndex:e.baseIndex,direction:0,count:s,contain:0}))});r(e.signal);const I=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:h,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal),await f(e,n.map(e=>e.channelId)),r(e.signal);const u={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:n.map(e=>e.channelId),diagnostic:{endpoint:"offlineMessages",surface:"offline-batch",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},g=void 0===e.yieldToEventLoop?t(I,u,e.decryptDeps):await a(I,u,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal});r(e.signal);const y=[];for(const e of n){const n=g.nextBaseIndexes[e.channelId],o=g.messageCounts[e.channelId]??0;if(void 0===n)continue;const t=l.get(e.channelId);if(t.has(n))throw new Error(`channel offline cursor 循环(channelId=${e.channelId}, baseIndex=${n})`);o<s||(t.add(n),y.push({channelId:e.channelId,baseIndex:n}))}await(e.onPage?.(g.messages,{pulls:n.map(e=>({...e})),nextBaseIndexes:{...g.nextBaseIndexes},messageCounts:{...g.messageCounts}})),r(e.signal);for(const e of g.messages)c.has(e.id)||c.set(e.id,e);n=y}}return[...c.values()].sort(d)}async function h(e){r(e.signal);const n=e.count??30;if(!Number.isInteger(n)||n<=0)throw new Error("channel latest: count 必须为正整数");void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const s=o({userId:e.userId,clientType:e.clientType,pulls:[{channelId:e.channelId,baseIndex:"",direction:1,count:n,contain:0}]});r(e.signal);const i=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:s,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);const d={selfId:e.userId,keepRaw:e.keepRaw??!0,expectedChannelIds:[e.channelId],diagnostic:{endpoint:"offlineMessages",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},l=void 0===e.yieldToEventLoop?{...t(i,d,e.decryptDeps),firstBaseIndex:c.decode(i).lsMessage[0]?.sIndex}:await a(i,d,e.decryptDeps,{yieldToEventLoop:e.yieldToEventLoop,signal:e.signal}),p=l.batchSize===n,h=l.firstBaseIndex;if(p&&("string"!=typeof h||""===h.trim()))throw new Error(`channel latest: 满页缺少向旧 cursor(channelId=${e.channelId})`);return{messages:l.messages,hasOlder:p,...p?{nextCursor:h}:{}}}async function I(e){r(e.signal);const n=e.count??30;void 0!==e.decryptDeps&&void 0!==e.prepareKey&&await e.prepareKey(e.channelId);const o=s({userId:e.userId,clientType:e.clientType,channelId:e.channelId,baseIndex:e.baseIndex,count:n,contain:e.contain??0});r(e.signal);const t=await e.http.postProtobuf({path:"/channel/v1/offlineMessages",body:o,...void 0===e.signal?{}:{signal:e.signal}});r(e.signal);return i(t,{selfId:e.userId,channelId:e.channelId,requestedBaseIndex:e.baseIndex,requestedCount:n,keepRaw:e.keepRaw??!0,diagnostic:{endpoint:"history",surface:"history-page",...void 0===e.operationId?{}:{operationId:e.operationId},clientTypeHeader:e.clientType,clientTypeBody:e.clientType},onContentDecodeError:e.onContentDecodeError,onReaction:e.onReaction},e.decryptDeps)}async function f(e,n){if(void 0===e.decryptDeps||void 0===e.prepareKeys)return;const o=[...new Set(n.filter(Boolean))];o.length>0&&await e.prepareKeys(o)}function u(e,n){const o=[];for(let t=0;t<e.length;t+=n)o.push(e.slice(t,t+n));return o}export{I as pullChannelHistory,h as pullChannelLatestPage,p as pullChannelOfflineMessages,l as pullChannelSessions};
@@ -1 +1 @@
1
- import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e){const t="report-recent";if(oe)return Me(t);if(0===e.length)return Object.freeze({ok:!0,operation:t});let r;try{r=Pe()}catch(e){return _e(t,e,$.emoji)}const n=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(r,n))return Me(t);let o=Object.freeze({ok:!0,operation:t});for(const[e,t]of n.entries())if(o=await et(r,{kind:"emoji",token:t.token,resourceId:t.resourceId},e===n.length-1),!o.ok&&"stale"===o.reason)return o;return o}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
1
+ import{defineStore as e}from"pinia";import{ref as t,reactive as r,computed as n}from"vue";import{resolveEmojiToken as o}from"../utils/emoji/index.js";import{getImChatKitContext as i,registerImChatKitStoreDisposer as s,resolveImChatKitPinia as c}from"./context.js";import{prependRecentEmoji as a,EMOJI_GAME_DICE_STABLE_KEY as l,EMOJI_GAME_RPS_STABLE_KEY as u,MAX_RECENT_EMOJI_COUNT as f}from"../utils/emoji/recent.js";import{resolveUnicodeEmoji as d}from"../utils/emoji/unicode.js";const p=/* @__PURE__ */new WeakMap;function v(e){return"object"==typeof e&&null!==e}function g(e,t){if("string"!=typeof e||""===e.trim())throw new TypeError(`expression recent persistence ${t} 必须是非空字符串`);return e.trim()}function k(e,t){if(!Number.isSafeInteger(e)||Number(e)<=0||Number(e)>4294967295)throw new TypeError(`expression recent persistence ${t} 必须是正 uint32`);return Number(e)}function j(e,t){if(!v(e)||e.kind!==t)throw new TypeError("expression recent persistence asset kind 无效");const r=g(e.url,"asset.url");let n;try{n=new URL(r)}catch{throw new TypeError("expression recent persistence asset.url 必须是合法 URL")}if("http:"!==n.protocol&&"https:"!==n.protocol||""!==n.username||""!==n.password)throw new TypeError("expression recent persistence asset.url 只允许无凭据 HTTP(S)");const o=k(e.width,"asset.width"),i=k(e.height,"asset.height");if("sticker"===t)return Object.freeze({kind:"sticker",packageId:g(e.packageId,"asset.packageId"),resourceId:g(e.resourceId,"asset.resourceId"),url:r,width:o,height:i});if(Object.prototype.hasOwnProperty.call(e,"packageId"))throw new TypeError("expression recent persistence GIF 不允许 packageId");const s=void 0===e.resourceId?void 0:g(e.resourceId,"asset.resourceId");return Object.freeze({kind:"gif",...void 0===s?{}:{resourceId:s},url:r,width:o,height:i})}function m(e,t){let r=p.get(e);void 0===r&&(r=/* @__PURE__ */new Map,p.set(e,r));let n=r.get(t);return void 0===n&&(n={revision:0,kindRevisions:{sticker:0,gif:0,emoji:0},status:"idle",tail:Promise.resolve(),latestSnapshot:null,error:null},r.set(t,n)),n}function h(e,t,r,n){const o=m(e,t),i=++o.revision;for(const e of n)o.kindRevisions[e]+=1;o.status="pending",o.latestSnapshot=r,o.error=null;const s=o.tail.catch(()=>{}).then(()=>e.save(t,r));return o.tail=s,s.then(()=>{o.revision===i&&(o.status="saved",o.error=null)},e=>{o.revision===i&&(o.status="failed",o.error=e)}),{coordinator:o,revision:i,promise:s}}const y=/* @__PURE__ */new WeakMap;function b(){return r({loading:!1,loaded:!1,error:null})}function w(e){return{sticker:e(),gif:e()}}function O(e){return{sticker:e(),gif:e(),emoji:e()}}function I(e,t){return Object.freeze({loading:e.loading,loaded:e.loaded,empty:e.loaded&&!e.loading&&null===e.error&&0===t,error:e.error})}function z(e,t){const r="object"==typeof e&&null!==e?e:null;return Object.freeze({code:null!==r&&"string"==typeof r.code?r.code:"IM_CHAT_KIT_EXPRESSION_OPERATION_FAILED",category:null!==r&&(n=r.category,"auth"===n||"network"===n||"protocol"===n||"permission"===n||"validation"===n||"state"===n||"unsupported"===n||"contract"===n)?r.category:"state",operation:null!==r&&"string"==typeof r.operation?r.operation:`expressions.${t}`,retryable:null!==r&&"boolean"==typeof r.retryable?r.retryable:"hydrate-recent"===t||t.startsWith("load-")});var n}function S(e){return Object.freeze({code:e.code,category:e.category??"state",operation:e.operation,retryable:e.retryable??!1})}function E(e){const t=e.trim();if(""===t)throw new TypeError("expression recordId 必须是非空字符串");return t}function x(e){return"recordId"in e?e.recordId:void 0}function T(e){return"gif"===e?20:15}function P(e){return"sticker"===e.kind?["sticker",e.packageId.trim(),e.resourceId.trim()].join("\0"):["gif",e.resourceId?.trim()||e.url].join("\0")}function R(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>"emoji"===e.kind||P(e)!==r)].slice(0,T(t.kind)))}function M(e,t){const r=P(t);return Object.freeze([Object.freeze({...t}),...e.filter(e=>P(e)!==r)])}function _(e,t,r){const n=[],o=/* @__PURE__ */new Set;for(const i of[...r.values(),...t]){if("emoji"===i.kind)continue;const t=P(i);if(i.kind===e&&!o.has(t)&&(o.add(t),n.push(Object.freeze({...i})),n.length===T(e)))break}return Object.freeze(n)}function K(e){const t=/* @__PURE__ */new Set;return Object.freeze(e.filter(e=>!t.has(e.resourceId)&&(t.add(e.resourceId),!0)))}function A(e){const t=o(e.token);return void 0!==t?`token:${t.code}`:d(e.resourceId)?.stableKey??d(e.token)?.stableKey??`server:${e.resourceId}`}function C(e,t,r){const n=e.filter(e=>"emoji"===e.kind).slice(0,f).map(e=>Object.freeze({kind:"emoji",stableKey:A(e),token:e.token,resourceId:e.resourceId})),o=t.filter(e=>"game"===e.kind||r.has(e.stableKey)),i=[],s=/* @__PURE__ */new Set;for(const e of[...o,...n])if(!s.has(e.stableKey)&&(s.add(e.stableKey),i.push(e),i.length===f))break;return Object.freeze(i)}function G(e){return Object.freeze({kind:"game",gameType:e,stableKey:"dice"===e?l:u})}function F(o){return e("k2-im-expression",()=>{const e=i(o),s=e.runtime,c=e.expressionRecentPersistence,l=s.getDiagnostics(),u=t(""),d=t([]),p=t({}),k=b(),F=r({}),N=t({sticker:[],gif:[]}),H=w(b),D=t({sticker:[],gif:[]}),L=t({sticker:[],gif:[],emoji:[]}),$=O(b),W=t({sticker:[],gif:[],emoji:[]}),X=t([]),U=t("idle"),q=t(""),Q=t([]),V=t(0),B=b(),J=t(void 0),Y=n(()=>I(k,d.value.length)),Z=n(()=>{const e=/* @__PURE__ */new Set([...Object.keys(F),...Object.keys(p.value)]);return Object.fromEntries([...e].map(e=>[e,I(F[e]??{loading:!1,loaded:!0,error:null},p.value[e]?.length??0)]))}),ee=n(()=>({sticker:I(H.sticker,N.value.sticker.length),gif:I(H.gif,N.value.gif.length)})),te=n(()=>({sticker:I($.sticker,L.value.sticker.length),gif:I($.gif,L.value.gif.length),emoji:I($.emoji,X.value.length)})),re=n(()=>I(B,Q.value.length)),ne=n(()=>void 0!==J.value);let oe=!1,ie=0,se=0;const ce={},ae=w(()=>0),le=O(()=>0);let ue=0,fe=0,de=0,pe=0,ve=0,ge=null,ke=null,je=null,me="emoji";const he=/* @__PURE__ */new Set,ye=[];let be=null,we=null,Oe=null,Ie=null;const ze=w(()=>/* @__PURE__ */new Map),Se=w(()=>/* @__PURE__ */new Map),Ee=/* @__PURE__ */new Map,xe=/* @__PURE__ */new Map;let Te=w(()=>Promise.resolve());function Pe(){const e=s.getCredentials();return{client:s.ensureProductClient(),generation:s.getGeneration(),stateEpoch:ie,accountId:e.userId}}function Re(e){return!oe&&e.client===s.getProductClient()&&e.generation===s.getGeneration()&&e.stateEpoch===ie&&e.accountId===s.getCredentials().userId}function Me(e){return Object.freeze({ok:!1,operation:e,reason:"stale"})}function _e(e,t,r){const n=z(t,e);return r.error=n,"hydrate-recent"!==e&&"report-recent"!==e||l.record("warn","pinia","hydrate-recent"===e?"storage":"message","expression-recent-operation-failed",()=>({data:{operation:e,code:n.code},error:{message:n.code}})),Object.freeze({ok:!1,operation:e,reason:"failed",error:n})}function Ke(){return Object.freeze({ok:!1,reason:"stale"})}function Ae(){const e=e=>Object.freeze(L.value[e].flatMap(t=>{const r=function(e){return"emoji"===e.kind?null:"sticker"===e.kind?Object.freeze({kind:"sticker",packageId:e.packageId,resourceId:e.resourceId,url:e.url,width:e.width,height:e.height}):Object.freeze({kind:"gif",...void 0===e.resourceId||""===e.resourceId?{}:{resourceId:e.resourceId},url:e.url,width:e.width,height:e.height})}(t);return null===r?[]:[Object.freeze({asset:r,pendingSync:ze[e].has(P(r))})]}).slice(0,T(e)));return Object.freeze({version:1,sticker:e("sticker"),gif:e("gif"),emoji:Object.freeze(X.value.map(e=>"game"===e.kind?Object.freeze({...e}):Object.freeze({...e,pendingSync:Ee.has(e.stableKey)})))})}function Ce(){for(const e of["sticker","gif","emoji"])"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED"===$[e].error?.code&&($[e].error=null)}function Ge(e,t){const r=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return t.error=r,Object.freeze({ok:!1,operation:e,reason:"failed",error:r})}function Fe(e,t,r,n=[t]){const o=++de,i=h(c,e.accountId,r,n);ve=i.revision;const s=i.promise.then(()=>(Re(e)&&o===de&&Ce(),!0),r=>{if(!Re(e)||o!==de)return!1;const n=S({code:"IM_CHAT_KIT_EXPRESSION_RECENT_PERSIST_FAILED",operation:"expressions.recent.persist",retryable:!0});return $[t].error=n,l.record("warn","pinia","storage","expression-recent-persist-failed",()=>({generation:e.generation,error:{message:n.code,data:r}})),!1});return{...i,settled:s}}function Ne(e){return null!==ge&&Ue(ge,e)}function He(e,t,r){if(!Re(e))return Promise.resolve();if(pe+=1,void 0===c||""===e.accountId)return ge=e,Promise.resolve();const n=Ae();return Ne(e)?Fe(e,t,n).settled.then(()=>{}):(je=n,me=t,he.add(t),ye.push(r),function(e){if(null!==Oe)return Oe;const t=(async()=>{for(;Re(e)&&!Ne(e);){const t=null!==Ie&&Ue(Ie.context,e)?Ie:null;if(null!==t){const r=await t.promise;if(r.ok||!Re(e)||"stale"!==r.reason)return;continue}const r=await qe();if(r.ok||!Re(e)||"stale"!==r.reason)return}})();Oe=t;const r=()=>{Oe===t&&(Oe=null)};return t.then(r,r),t}(e))}function De(){return{sticker:Object.freeze([]),gif:Object.freeze([]),emoji:Object.freeze([]),pendingSticker:/* @__PURE__ */new Map,pendingGif:/* @__PURE__ */new Map,pendingEmoji:/* @__PURE__ */new Map}}function Le(e){if(!(v(e)&&1===e.version&&Array.isArray(e.sticker)&&Array.isArray(e.gif)&&Array.isArray(e.emoji)))throw new TypeError("expression recent persistence snapshot 格式或版本无效");const t=(e,t)=>{const r=[],n=/* @__PURE__ */new Map,o=/* @__PURE__ */new Set;for(const i of t){if(!v(i)||"boolean"!=typeof i.pendingSync)throw new TypeError("expression recent persistence asset entry 格式无效");const t=j(i.asset,e),s=P(t);o.has(s)||(o.add(s),r.length<T(e)&&(r.push(t),i.pendingSync&&n.set(s,t)))}return{items:Object.freeze(r),pending:n}},r=t("sticker",e.sticker),n=t("gif",e.gif),o=[],i=/* @__PURE__ */new Map,s=/* @__PURE__ */new Set;for(const t of e.emoji){if(!v(t)||"string"!=typeof t.stableKey||""===t.stableKey.trim()||"emoji"!==t.kind&&"game"!==t.kind)throw new TypeError("expression recent persistence emoji entry 格式无效");const e=t.stableKey.trim();let r,n=!1;if("game"===t.kind){if("dice"!==t.gameType&&"rock-paper-scissors"!==t.gameType)throw new TypeError("expression recent persistence gameType 无效");if(r=G(t.gameType),r.stableKey!==e)throw new TypeError("expression recent persistence game stableKey 无效")}else{const o=g(t.token,"emoji.token"),i=g(t.resourceId,"emoji.resourceId");if("boolean"!=typeof t.pendingSync)throw new TypeError("expression recent persistence emoji.pendingSync 无效");n=t.pendingSync,r=Object.freeze({kind:"emoji",stableKey:e,token:o,resourceId:i})}s.has(e)||(s.add(e),o.length<f&&(o.push(r),"emoji"===r.kind&&n&&i.set(e,r)))}return{sticker:r.items,gif:n.items,emoji:Object.freeze(o),pendingSticker:r.pending,pendingGif:n.pending,pendingEmoji:i}}function $e(e,t){if(void 0===c||""===e.accountId)return 0;const r=m(c,e.accountId);return void 0===t?r.revision:r.kindRevisions[t]}function We(e){if(void 0===c||""===e.accountId||!Ne(e))return;const t=m(c,e.accountId);if(t.revision===ve)return;const r=null===t.latestSnapshot?De():Le(t.latestSnapshot),n=(e,t)=>{const n="sticker"===e?r.pendingSticker:r.pendingGif,o=new Map(L.value[e].flatMap(t=>"emoji"===t.kind||t.kind!==e?[]:[[P(t),t]]));return Object.freeze(t.map(t=>{if("emoji"===t.kind||t.kind!==e)return t;const r=P(t);if(n.has(r))return t;const i=x(o.get(r)??t);return Object.freeze({...t,...void 0===i?{}:{recordId:i}})}))};L.value={sticker:n("sticker",r.sticker),gif:n("gif",r.gif),emoji:L.value.emoji},X.value=r.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[e,t]of r.pendingSticker)ze.sticker.set(e,t);for(const[e,t]of r.pendingGif)ze.gif.set(e,t);for(const[e,t]of r.pendingEmoji)Ee.set(e,t);for(const e of["sticker","gif"]){const t=new Set(L.value[e].flatMap(e=>void 0===x(e)?[]:[x(e)]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>t.has(e)))}}ve=t.revision}async function Xe(e,t,r,n){const o="hydrate-recent";$.emoji.error=null;try{let i=null,s=0;if(void 0!==c&&""!==e.accountId){i=m(c,e.accountId);const a=i.latestSnapshot;if(!n&&"failed"===i.status&&null!==a&&h(c,e.accountId,a,[]),s=i.revision,await i.tail.catch(()=>{}),t!==fe||!Re(e)||pe!==r||i.revision!==s)return Me(o);if(!n&&"failed"===i.status)return Ge(o,$.emoji);"saved"===i.status&&null!==be&&i.latestSnapshot===be&&je===we&&(je=null,he.clear(),ye.length=0,be=null,we=null)}const l=void 0===c||""===e.accountId?null:await c.load(e.accountId);if(t!==fe||!Re(e)||pe!==r||null!==i&&i.revision!==s)return Me(o);let u;try{u=null===l?De():Le(l)}catch(t){const r=c?.clearInvalid;if(null!==l&&""!==e.accountId&&void 0!==r)try{await r(e.accountId,l)}catch(e){throw new Error("expression recent persistence 损坏快照清理失败",{cause:e})}throw t}const f=n?null:je,d=new Set(he),p=[...ye],v=null===f?u:function(e,t){let r=[...e.sticker],n=[...e.gif],o=[...e.emoji];const i=new Map(e.pendingSticker),s=new Map(e.pendingGif),c=new Map(e.pendingEmoji);for(const e of t){if("prepend-asset"===e.type){("sticker"===e.kind?i:s).set(P(e.asset),e.asset),"sticker"===e.kind?r=[...R(r,e.asset)]:n=[...R(n,e.asset)];continue}if("prepend-emoji"===e.type||"prepend-emojis"===e.type){const t="prepend-emoji"===e.type?[e.entry]:e.entries;for(const e of t)"emoji"===e.kind&&c.set(e.stableKey,e),o=[...a(o,e)];continue}if("authoritative"===e.type){if("emoji"===e.kind){for(const t of e.items)if("emoji"===t.kind)for(const[e,r]of c)r.resourceId===t.resourceId&&c.delete(e);o=[...C(e.items,o,new Set(c.keys()))]}else{const t="sticker"===e.kind?i:s;for(const r of e.items)r.kind===e.kind&&t.delete(P(r));const o=_(e.kind,e.items,t);"sticker"===e.kind?r=[...o]:n=[...o]}continue}if("delete-assets"===e.type){const t=new Set(e.identities),o="sticker"===e.kind?i:s,c=e=>"emoji"===e.kind||!t.has(P(e))||o.has(P(e));"sticker"===e.kind?r=r.filter(c):n=n.filter(c);continue}const t=new Set(e.resourceIds);o=o.filter(e=>"game"===e.kind||!t.has(e.resourceId)||c.has(e.stableKey))}return{sticker:Object.freeze(r),gif:Object.freeze(n),emoji:Object.freeze(o),pendingSticker:i,pendingGif:s,pendingEmoji:c}}(u,p);if(function(e){L.value={sticker:e.sticker,gif:e.gif,emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=e.emoji,ze.sticker.clear(),ze.gif.clear(),Ee.clear();for(const[t,r]of e.pendingSticker)ze.sticker.set(t,r);for(const[t,r]of e.pendingGif)ze.gif.set(t,r);for(const[t,r]of e.pendingEmoji)Ee.set(t,r);for(const e of["sticker","gif","emoji"])Object.assign($[e],{loading:!1,loaded:!0,error:null})}(v),ve=s,n){if(je=null,he.clear(),ye.length=0,be=null,we=null,null!==i){i.revision+=1;for(const e of["sticker","gif","emoji"])i.kindRevisions[e]+=1;i.status="saved",i.latestSnapshot=l,i.error=null,ve=i.revision}return ge=e,Ce(),Object.freeze({ok:!0,operation:o})}if(null!==f&&void 0!==c&&""!==e.accountId){const n=Ae();be=n,we=f;const i=Fe(e,me,n,[...d]),s=await i.settled;if(t!==fe||!Re(e)||pe!==r||i.coordinator.revision!==i.revision)return Me(o);if(!s)return Ge(o,$.emoji);je===f&&(je=null,he.clear(),ye.length=0,be=null,we=null)}return ge=e,Object.freeze({ok:!0,operation:o})}catch(r){return t===fe&&Re(e)?_e(o,r,$.emoji):Me(o)}}function Ue(e,t){return e.client===t.client&&e.generation===t.generation&&e.stateEpoch===t.stateEpoch&&e.accountId===t.accountId}function qe(e={}){const t="hydrate-recent";if(oe)return Promise.resolve(Me(t));let r;try{r=Pe()}catch(e){const r=_e(t,e,$.emoji);return r.ok||"failed"!==r.reason||(ke=r.error??$.emoji.error),Promise.resolve(r)}const n=void 0===c||""===r.accountId?null:m(c,r.accountId);if(!e.force&&Ne(r)&&null===je&&(null===n||("idle"===n.status||"saved"===n.status)&&n.revision===ve))return ke=null,Promise.resolve(Object.freeze({ok:!0,operation:t}));if(!e.force&&null!==Ie&&!Ie.force&&Ie.stateRevision===pe&&Ue(Ie.context,r))return Ie.promise;const o=++fe,i=pe,s=Xe(r,o,i,!0===e.force).then(e=>(e.ok?ke=null:"failed"===e.reason&&(ke=e.error??$.emoji.error),e)),a={context:r,stateRevision:i,force:!0===e.force,promise:s};Ie=a;const l=()=>{Ie===a&&(Ie=null)};return s.then(l,l),s}function Qe(e,t){for(const r of t)Se[e].delete(P(r));const r=[],n=/* @__PURE__ */new Set;for(const o of[...Se[e].values(),...t]){const e=P(o);n.has(e)||(n.add(e),r.push(Object.freeze({...o})))}N.value={...N.value,[e]:Object.freeze(r)};const o=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));D.value={...D.value,[e]:Object.freeze(D.value[e].filter(e=>o.has(e)))}}async function Ve(e,t,r){const n=H[t];try{const o=await e.client.expressions.favorites.list(t);if(ae[t]!==r||!Re(e))return;Qe(t,o),n.loaded=!0}catch(o){ae[t]===r&&Re(e)&&(n.error=z(o,"load-favorites"))}}function Be(e,t){const r="set-favorite";if(oe)return Promise.resolve(Me(r));const n=P(e),o=xe.get(n);if(o?.desired===t)return o.promise;let i;try{i=Pe()}catch(t){return Promise.resolve(_e(r,t,H[e.kind]))}const s=o?.promise.catch(()=>{})??Promise.resolve(),c=Te[e.kind].catch(()=>{}),a=Promise.all([s,c]).then(async()=>{if(!Re(i))return Me(r);const o=e.kind,s=H[o];s.error=null;const c=N.value[o].find(e=>P(e)===n);if(t&&void 0!==c)return Object.freeze({ok:!0,operation:r});if(!t&&void 0===c?.recordId){const e=S({code:"IM_CHAT_KIT_EXPRESSION_FAVORITE_RECORD_REQUIRED",operation:"expressions.favorites.unset",retryable:!0});return s.error=e,Object.freeze({ok:!1,operation:r,reason:"failed",error:e})}let a=++ae[o];try{if(t?await i.client.expressions.favorites.add(e):await i.client.expressions.favorites.delete([c.recordId]),!Re(i))return Me(r);t?(Se[o].set(n,Object.freeze({...e})),N.value={...N.value,[o]:M(N.value[o],e)}):(Se[o].delete(n),N.value={...N.value,[o]:Object.freeze(N.value[o].filter(e=>e.recordId!==c.recordId))});const s=++ae[o];return a=s,await Ve(i,o,s),Re(i)&&ae[o]===s?Object.freeze({ok:!0,operation:r}):Me(r)}catch(e){return Re(i)&&ae[o]===a?_e(r,e,s):Me(r)}finally{ae[o]===a&&Re(i)&&(s.loading=!1)}});return xe.set(n,{desired:t,promise:a}),Te[e.kind]=a.then(()=>{},()=>{}),a.finally(()=>{xe.get(n)?.promise===a&&xe.delete(n)}),a}function Je(e,t,r){if(We(r),"emoji"===e){for(const e of t)if("emoji"===e.kind)for(const[t,r]of Ee)r.resourceId===e.resourceId&&Ee.delete(t);L.value={...L.value,emoji:Object.freeze([...t])},X.value=C(t,X.value,new Set(Ee.keys()))}else{for(const r of t)r.kind===e&&ze[e].delete(P(r));L.value={...L.value,[e]:_(e,t,ze[e])}}const n=new Set(t.flatMap(e=>void 0===e.recordId?[]:[e.recordId]));W.value={...W.value,[e]:Object.freeze(W.value[e].filter(e=>n.has(e)))},$[e].loaded=!0,He(r,e,Object.freeze({type:"authoritative",kind:e,items:Object.freeze([...t])}))}function Ye(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=t.kind,n=Object.freeze({...t});return ze[r].set(P(n),n),L.value={...L.value,[r]:R(L.value[r],n)},$[r].loaded=!0,He(e,r,Object.freeze({type:"prepend-asset",kind:r,asset:n})),!0}function Ze(e,t){if(!Re(e))return!1;We(e),fe+=1;const r=Object.freeze(t.map(e=>Object.freeze({...e})));let n=X.value;for(const e of r)Ee.set(e.stableKey,e),n=a(n,e);return X.value=n,$.emoji.loaded=!0,He(e,"emoji",Object.freeze({type:"prepend-emojis",entries:r})),!0}async function et(e,t,r=!0){const n="report-recent";if(!Re(e))return Me(n);const o=t.kind,i=++le[o],s=$[o];s.error=null;try{if(await e.client.expressions.recent.report(t),le[o]!==i||!Re(e))return Me(n);if(!r)return Object.freeze({ok:!0,operation:n});try{We(e);const t=$e(e,o),r=await e.client.expressions.recent.list(o);if(le[o]!==i||!Re(e))return Me(n);if($e(e,o)!==t)return We(e),Me(n);Je(o,r,e)}catch(t){le[o]===i&&Re(e)&&(s.error=z(t,"load-recent"))}return Object.freeze({ok:!0,operation:n})}catch(t){return le[o]===i&&Re(e)?_e(n,t,s):Me(n)}}async function tt(e,t,r){const n="favorites"===e?"delete-favorites":"delete-recent";if(oe)return Me(n);const o="favorites"===e?D:W,i="favorites"===e?ae:le,s="favorites"===e?H:$,c=r?.selected??o.value[t];if(0===c.length)return Object.freeze({ok:!1,operation:n,reason:"empty"});const a=s[t];if(a.loading)return Object.freeze({ok:!1,operation:n,reason:"busy"});const l=++i[t];let u;try{u=r?.context??Pe()}catch(e){return _e(n,e,a)}"recent"===e&&We(u);const f="recent"===e?$e(u,t):0,d=new Set(c),p="recent"===e?L.value[t].filter(e=>{const t=x(e);return void 0!==t&&d.has(t)}):[];a.loading=!0,a.error=null;const v=[],g=/* @__PURE__ */new Set;let k,j,m=!1;for(const r of function(e){const t=[];for(let r=0;r<e.length;r+=30)t.push(e.slice(r,r+30));return t}(c)){if(!Re(u))return Me(n);if("recent"===e&&i[t]!==l){m=!0;break}try{"favorites"===e?await u.client.expressions.favorites.delete(r):await u.client.expressions.recent.delete(r);for(const e of r)g.add(e)}catch(e){const t=z(e,n);k??(k=t),v.push(...r)}}if(!Re(u))return Me(n);"recent"===e&&i[t]!==l&&(m=!0);if("recent"===e&&$e(u,t)!==f&&(m=!0),"favorites"===e){const e=t;N.value={...N.value,[e]:Object.freeze(N.value[e].filter(e=>void 0===e.recordId||!g.has(e.recordId)))};const r=new Set(c),o=D.value[e].filter(e=>!r.has(e));if(D.value={...D.value,[e]:Object.freeze([.../* @__PURE__ */new Set([...o,...v])])},j=++ae[e],await Ve(u,e,j),!Re(u))return Me(n)}else{const e=t;We(u);const r=p.filter(e=>{const t=x(e);return void 0!==t&&g.has(t)}),o=new Set(r.filter(e=>"emoji"===e.kind).map(e=>e.resourceId)),i=new Set(r.filter(e=>"emoji"!==e.kind).map(P));"emoji"===e&&(X.value=Object.freeze(X.value.filter(e=>"game"===e.kind||!o.has(e.resourceId)||Ee.has(e.stableKey)))),L.value={...L.value,[e]:Object.freeze(L.value[e].filter(e=>{const t=x(e);return void 0===t||!g.has(t)}))};const s=new Set(c),a=m?W.value[e].filter(e=>!g.has(e)):W.value[e].filter(e=>!s.has(e));if(W.value={...W.value,[e]:Object.freeze(m?a:[.../* @__PURE__ */new Set([...a,...v])])},"emoji"===e){const e=L.value.emoji.filter(e=>"emoji"===e.kind);X.value=C(e,X.value,new Set(Ee.keys()))}if(He(u,e,"emoji"===e?Object.freeze({type:"delete-emojis",resourceIds:Object.freeze([...o])}):Object.freeze({type:"delete-assets",kind:e,identities:Object.freeze([...i])})),m&&g.size>0&&await async function(e,t){if(!Re(e))return;const r=++le[t],n=$[t];n.loading=!0,n.error=null;try{We(e);const n=$e(e,t),o=await e.client.expressions.recent.list(t);if(le[t]!==r||!Re(e))return;if($e(e,t)!==n)return void We(e);Je(t,o,e)}catch(o){le[t]===r&&Re(e)&&(n.error=z(o,"load-recent"))}finally{le[t]===r&&Re(e)&&(n.loading=!1)}}(u,e),!Re(u))return Me(n)}return("recent"===e?le[t]===l:ae[t]===j)&&(a.loaded=!0,void 0===k&&"recent"!==e||(a.error=k??null),a.loading=!1),m?Me(n):0===v.length?Object.freeze({ok:!0,operation:n}):Object.freeze({ok:!1,operation:n,reason:0===g.size?"failed":"partial",error:k,failedRecordIds:Object.freeze(v)})}function rt(e,t){const r=++ue;return U.value=e,q.value=t,Q.value=[],V.value=0,J.value=void 0,B.loading=!0,B.loaded=!1,B.error=null,r}async function nt(e,t){const r="load-giphy";if(oe)return Me(r);const n={mode:U.value,query:q.value,items:Q.value,totalCount:V.value,nextOffset:J.value,loaded:B.loaded},o=rt(e,t),i=()=>{U.value=n.mode,q.value=n.query,Q.value=n.items,V.value=n.totalCount,J.value=n.nextOffset,B.loaded=n.loaded};let s;try{s=Pe()}catch(e){return i(),B.loading=!1,_e(r,e,B)}try{const n="trending"===e?await s.client.expressions.giphy.trending():await s.client.expressions.giphy.search(t);return o===ue&&Re(s)?(Q.value=K(n.items),V.value=n.totalCount,J.value=n.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:r})):Me(r)}catch(e){return o===ue&&Re(s)?(i(),_e(r,e,B)):Me(r)}finally{o===ue&&Re(s)&&(B.loading=!1)}}async function ot(e,t={}){const r="report-recent";if(oe)return Me(r);if(0===e.length)return Object.freeze({ok:!0,operation:r});let n;try{n=Pe()}catch(e){return _e(r,e,$.emoji)}const o=Object.freeze(e.map(e=>Object.freeze({...e,stableKey:A(e)})));if(!Ze(n,o))return Me(r);let i=Object.freeze({ok:!0,operation:r});for(const[e,r]of o.entries())if(i=await et(n,{kind:"emoji",token:r.token,resourceId:r.resourceId},!1!==t.refreshAfterReport&&e===o.length-1),!i.ok&&"stale"===i.reason)return i;return i}function it(e,t){et(e,t).then(r=>{l.record(r.ok?"debug":"warn","pinia","message","expression-recent-report-settled",()=>({generation:e.generation,data:{kind:t.kind,ok:r.ok}}))})}function st(e={}){if(oe)return;const t=!0===e.preserveRecentHydrationFailure?ke:null;ie+=1,se+=1,ue+=1,fe+=1,de+=1,pe=0,ve=0,ge=null,je=null,he.clear(),ye.length=0,be=null,we=null,Oe=null,Ie=null,ke=t,xe.clear(),Te=w(()=>Promise.resolve()),u.value="",d.value=[],p.value={},Object.assign(k,{loading:!1,loaded:!1,error:null});for(const e of Object.keys(F))delete F[e];for(const e of Object.keys(ce))ce[e]=(ce[e]??0)+1;N.value={sticker:[],gif:[]},D.value={sticker:[],gif:[]};for(const e of["sticker","gif"])ae[e]+=1,Object.assign(H[e],{loading:!1,loaded:!1,error:null});L.value={sticker:[],gif:[],emoji:[]},W.value={sticker:[],gif:[],emoji:[]},X.value=[],ze.sticker.clear(),ze.gif.clear(),Se.sticker.clear(),Se.gif.clear(),Ee.clear();for(const e of["sticker","gif","emoji"])le[e]+=1,Object.assign($[e],{loading:!1,loaded:!1,error:null});null!==t&&($.emoji.error=t),U.value="idle",q.value="",Q.value=[],V.value=0,J.value=void 0,Object.assign(B,{loading:!1,loaded:!1,error:null})}return y.set(o,Object.freeze({dispose:function(){oe||(st(),oe=!0)}})),{packVersion:u,packs:d,packItemsByPackage:p,packStatus:Y,packItemStatus:Z,favorites:N,favoriteStatus:ee,favoriteSelection:D,recent:L,recentStatus:te,recentSelection:W,emojiRecent:X,giphyMode:U,giphyQuery:q,giphyItems:Q,giphyTotalCount:V,giphyHasMore:ne,giphyStatus:re,hydrateRecent:qe,loadPacks:async function(e){const t="load-packs";if(oe)return Me(t);const r=++se;let n;try{n=Pe()}catch(e){return _e(t,e,k)}k.loading=!0,k.error=null;try{const o=await n.client.expressions.packs.list(e);return r===se&&Re(n)?(u.value=o.version,d.value=Object.freeze([...o.items]),k.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return r===se&&Re(n)?_e(t,e,k):Me(t)}finally{r===se&&Re(n)&&(k.loading=!1)}},loadPackItems:async function(e){const t="load-pack-items";if(oe)return Me(t);const r=e.trim();if(""===r){const e=z(new TypeError("packageId 必须是非空字符串"),t);return Object.freeze({ok:!1,operation:t,reason:"failed",error:e})}const n=F[r]??(F[r]=b()),o=(ce[r]??0)+1;let i;ce[r]=o;try{i=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const e=await i.client.expressions.packs.listItems(r);return ce[r]===o&&Re(i)?(p.value={...p.value,[r]:Object.freeze([...e])},n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(e){return ce[r]===o&&Re(i)?_e(t,e,n):Me(t)}finally{ce[r]===o&&Re(i)&&(n.loading=!1)}},loadFavorites:async function(e){const t="load-favorites";if(oe)return Me(t);const r=++ae[e],n=H[e];let o;try{o=Pe()}catch(e){return _e(t,e,n)}n.loading=!0,n.error=null;try{const i=await o.client.expressions.favorites.list(e);return ae[e]===r&&Re(o)?(Qe(e,i),n.loaded=!0,Object.freeze({ok:!0,operation:t})):Me(t)}catch(i){return ae[e]===r&&Re(o)?_e(t,i,n):Me(t)}finally{ae[e]===r&&Re(o)&&(n.loading=!1)}},addFavorite:async function(e){const t=await Be(e,!0);return Object.freeze({...t,operation:"add-favorite"})},setFavorite:Be,unsetFavorite:function(e){return Be(e,!1)},toggleFavoriteSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(D.value[e]);r??!o.has(n)?o.add(n):o.delete(n),D.value={...D.value,[e]:Object.freeze([...o])}},deleteSelectedFavorites:function(e){const t="delete-favorites";if(oe)return Promise.resolve(Me(t));const r=Object.freeze([...D.value[e]]);if(0===r.length)return Promise.resolve(Object.freeze({ok:!1,operation:t,reason:"empty"}));let n;try{n=Pe()}catch(r){return Promise.resolve(_e(t,r,H[e]))}const o=Te[e].catch(()=>{}).then(()=>Re(n)?tt("favorites",e,{context:n,selected:r}):Me(t));return Te[e]=o.then(()=>{},()=>{}),o},loadRecent:async function(e){const t="load-recent";if(oe)return Me(t);const r=$[e],n=await qe();if(!n.ok)return"stale"===n.reason?Me(t):(r.error=n.error??$.emoji.error,Object.freeze({...n,operation:t}));const o=++le[e];let i;try{i=Pe()}catch(e){return _e(t,e,r)}r.loading=!0,r.error=null;try{const r=$e(i,e),n=await i.client.expressions.recent.list(e);return le[e]===o&&Re(i)?$e(i,e)!==r?(We(i),Me(t)):(Je(e,n,i),Object.freeze({ok:!0,operation:t})):Me(t)}catch(n){return le[e]===o&&Re(i)?_e(t,n,r):Me(t)}finally{le[e]===o&&Re(i)&&(r.loading=!1)}},reportRecent:async function(e){const t="report-recent";if(oe)return Me(t);let r;try{r=Pe()}catch(r){return _e(t,r,$[e.kind])}return"emoji"===e.kind?function(e,t){Ze(e,[t])}(r,Object.freeze({...e,stableKey:A(e)})):Ye(r,e),et(r,e)},rememberEmoji:async function(e){return ot([e])},rememberEmojis:ot,toggleRecentSelection:function(e,t,r){if(oe)return;const n=E(t),o=new Set(W.value[e]);r??!o.has(n)?o.add(n):o.delete(n),W.value={...W.value,[e]:Object.freeze([...o])}},deleteSelectedRecent:function(e){return tt("recent",e)},loadGiphyTrending:function(){return nt("trending","")},searchGiphy:function(e){if(oe)return Promise.resolve(Me("load-giphy"));const t=e.trim();return""===t?(rt("search",""),B.loading=!1,B.loaded=!0,Promise.resolve(Object.freeze({ok:!1,operation:"load-giphy",reason:"empty"}))):nt("search",t)},loadMoreGiphy:async function(){const e="load-more-giphy";if(oe)return Me(e);if(B.loading)return Object.freeze({ok:!1,operation:e,reason:"busy"});if("idle"===U.value||void 0===J.value)return Object.freeze({ok:!1,operation:e,reason:"exhausted"});const t=++ue,r=U.value,n=q.value,o=J.value;let i;try{i=Pe()}catch(t){return _e(e,t,B)}B.loading=!0,B.error=null;try{const s="trending"===r?await i.client.expressions.giphy.trending({offset:o}):await i.client.expressions.giphy.search(n,{offset:o});return t===ue&&Re(i)?(Q.value=K([...Q.value,...s.items]),V.value=s.totalCount,J.value=s.nextOffset,B.loaded=!0,Object.freeze({ok:!0,operation:e})):Me(e)}catch(r){return t===ue&&Re(i)?_e(e,r,B):Me(e)}finally{t===ue&&Re(i)&&(B.loading=!1)}},sendSticker:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendSticker(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGif:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGifAsset(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&Ye(r,t)&&it(r,t),n):Ke()},sendGame:async function(e,t){if(oe)return Ke();let r,n;try{r=Pe()}catch{return Ke()}try{n=await e.messages.sendGame(t)}catch(e){if(!Re(r))return Ke();throw e}return Re(r)?(n.ok&&(We(r),fe+=1,X.value=a(X.value,G(t)),$.emoji.loaded=!0,He(r,"emoji",Object.freeze({type:"prepend-emoji",entry:G(t)}))),n):Ke()},reset:st}})}const N=/* @__PURE__ */new WeakMap,H=/* @__PURE__ */new WeakMap;function D(e=c()){i(e);let t=N.get(e);void 0===t&&(t=F(e),N.set(e,t));const r=t(e),n=y.get(e);if(void 0===n)throw new Error("当前 Pinia 尚未创建 ImExpressionStore");return H.get(e)!==r&&(H.set(e,r),s(e,()=>{n.dispose(),r.$dispose(),H.get(e)===r&&(H.delete(e),y.get(e)===n&&y.delete(e))})),r}export{D as useImExpressionStore};
@@ -1 +1 @@
1
- import{encodeConversationKey as e}from"../conversation-identity.js";import{mergeMessageReactions as t}from"../state/message-reactions.js";import{resolveMessageServerTime as i,computeMessageSortKey as o}from"./sort.js";const n={unread:0,delivered:1,read:2};function r(e,t){return n[t]>n[e]?t:e}function d(e,t){return"sent"===e||"sent"===t?"sent":t}function a(e,n,a=""){const s=i(e)??0,c=i(n)??0,y=c>=s,u=y?{...e,...n}:{...n,...e},l=!0===e.readBySelf||!0===n.readBySelf,v=Math.max(s,c),f=Math.min(e.createdAt,n.createdAt),p=void 0===e.extensions&&void 0===n.extensions?void 0:y?{...e.extensions,...n.extensions}:{...n.extensions,...e.extensions},b=o({...u,createdAt:f,serverTime:v,extensions:p}),g="failed"===e.status&&!1===e.failure?.retryable&&"sent"===n.status?"failed":d(e.status,n.status),h="failed"===g?n.failure??e.failure:void 0,T=t(e.reactions,n.reactions,a),N=!0===e.encryption.decryptFailed,U=!0===n.encryption.decryptFailed;let w=u.contentType,I=u.body,A=u.encryption,x=u.mention;N&&!U?(w=n.contentType,I=n.body,A=n.encryption,x=n.mention):!N&&U&&(w=e.contentType,I=e.body,A=e.encryption,x=e.mention),!0!==n.edited||U||(w=n.contentType,I=n.body,A=n.encryption,x=n.mention);const z=e.body.voice?.waveform??n.body.voice?.waveform;if(void 0!==I.voice&&void 0===I.voice.waveform&&void 0!==z&&(I={...I,voice:{...I.voice,waveform:z}}),void 0!==I.video&&void 0===I.video.size){const t=I.video,i=[e.body.video,n.body.video].find(e=>"bytes"===e?.sizeUnit&&void 0!==e.size&&e.url===t.url&&e.fileEncryptType===t.fileEncryptType&&e.md5===t.md5&&m(e.teaKey,t.teaKey)&&(void 0===t.unverifiedFileLength||t.unverifiedFileLength===String(e.size)));void 0!==i&&(I={...I,video:{...t,size:i.size,sizeUnit:"bytes"}})}const E=!0===e.edited||!0===n.edited,S=e.deletedForEveryone??n.deletedForEveryone;if(void 0!==S){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,recalled:void 0,deletedForEveryone:S,body:{},encryption:u.encryption};return delete t.reactions,t}const k=e.recalled??n.recalled;if(void 0!==k){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,recalled:k,body:{},encryption:u.encryption};return delete t.reactions,t}const K={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:f,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,n.receipt),sortKey:b,extensions:p,contentType:w,body:I,encryption:A,...void 0===T?{}:{reactions:T},...E?{edited:!0}:{}};return void 0!==x?K.mention=x:delete K.mention,K}function s(t,i=""){const o=/* @__PURE__ */new Map;for(const n of t){const t=JSON.stringify([e(n),n.id]),r=o.get(t);o.set(t,void 0===r?n:a(r,n,i))}return[...o.values()]}function c(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.fileName===t.fileName&&e.size===t.size&&e.extension===t.extension&&e.fileType===t.fileType&&e.mimeType===t.mimeType&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}function y(e,t){return e===t||void 0!==e&&void 0!==t&&JSON.stringify(e)===JSON.stringify(t)}function u(e,t){return void 0===e||void 0===t?e===t:e.atAll===t.atAll&&e.atUserIds.length===t.atUserIds.length&&(!e.atUserIds.some((e,i)=>e!==t.atUserIds[i])&&function(e,t){if(void 0===e||void 0===t)return e===t;const i=Object.keys(e);return i.length===Object.keys(t).length&&i.every(i=>e[i]===t[i])}(e.atUsersName,t.atUsersName))}function m(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}function l(e,t){return void 0===e||void 0===t?e===t:e.caption===t.caption&&e.items.length===t.items.length&&e.items.every((e,i)=>function(e,t){return e.kind===t.kind&&e.url===t.url&&e.width===t.width&&e.height===t.height&&e.durationMs===t.durationMs&&e.thumbUrl===t.thumbUrl&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&e.hd===t.hd}(e,t.items[i]))}function v(e,t){return e.id===t.id&&e.conversationId===t.conversationId&&e.conversationType===t.conversationType&&e.senderId===t.senderId&&e.contentType===t.contentType&&JSON.stringify(e.body.customerService)===JSON.stringify(t.body.customerService)&&e.body.text===t.body.text&&function(e,t){return void 0===e||void 0===t?e===t:e.eventType===t.eventType&&e.timelineVisibility===t.timelineVisibility&&e.operatorId===t.operatorId&&e.rawNotifyType===t.rawNotifyType&&e.errcode===t.errcode&&e.fallbackText===t.fallbackText&&function(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}(e.targetUserIds,t.targetUserIds)&&y(e.payload,t.payload)&&y(e.action,t.action)&&y(e.pinnedMessageAction,t.pinnedMessageAction)}(e.body.system,t.body.system)&&e.createdAt===t.createdAt&&e.sortKey===t.sortKey&&e.status===t.status&&e.serverTime===t.serverTime&&e.receipt===t.receipt&&e.readBySelf===t.readBySelf&&e.refMessageId===t.refMessageId&&e.edited===t.edited&&(e.recalled?.by??"")===(t.recalled?.by??"")&&(e.recalled?.at??0)===(t.recalled?.at??0)&&(e.deletedForEveryone?.by??"")===(t.deletedForEveryone?.by??"")&&(e.deletedForEveryone?.at??0)===(t.deletedForEveryone?.at??0)&&(e.deletedForEveryone?.reason??"")===(t.deletedForEveryone?.reason??"")&&function(e,t){return void 0===e||void 0===t?e===t:e.version===t.version&&e.total===t.total&&e.currentUserEmoji===t.currentUserEmoji&&e.events.length===t.events.length&&e.events.every((e,i)=>{const o=t.events[i];return void 0!==o&&e.id===o.id&&e.senderId===o.senderId&&e.emoji===o.emoji&&e.action===o.action&&e.createdAt===o.createdAt})}(e.reactions,t.reactions)&&e.encryption.encrypted===t.encryption.encrypted&&e.encryption.scheme===t.encryption.scheme&&e.encryption.decryptFailed===t.encryption.decryptFailed&&u(e.mention,t.mention)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.imageType===t.imageType&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.image,t.body.image)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.duration===t.duration&&e.durationUnit===t.durationUnit&&e.sizeUnit===t.sizeUnit&&e.unverifiedFileLength===t.unverifiedFileLength&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.describe===t.describe&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.video,t.body.video)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.durationMs===t.durationMs&&e.size===t.size&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&(e.waveform?.length??0)===(t.waveform?.length??0)}(e.body.voice,t.body.voice)&&c(e.body.file,t.body.file)&&(void 0===e.body.filesAlbum||void 0===t.body.filesAlbum?e.body.filesAlbum===t.body.filesAlbum:e.body.filesAlbum.caption===t.body.filesAlbum.caption&&e.body.filesAlbum.items.length===t.body.filesAlbum.items.length&&e.body.filesAlbum.items.every((e,i)=>c(e,t.body.filesAlbum.items[i])))&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.exprType===t.exprType&&e.imageType===t.imageType&&e.size===t.size&&e.describe===t.describe&&e.contentId===t.contentId&&e.packageName===t.packageName&&m(e.thumbData,t.thumbData)}(e.body.sticker,t.body.sticker)&&function(e,t){return void 0===e||void 0===t?e===t:e.targetId===t.targetId&&e.avatar===t.avatar&&e.displayName===t.displayName&&e.username===t.username&&e.gender===t.gender&&e.kind===t.kind&&e.rawKind===t.rawKind}(e.body.contact,t.body.contact)&&function(e,t){return void 0===e||void 0===t?e===t:e.appId===t.appId&&e.host===t.host&&e.developerId===t.developerId&&e.name===t.name&&e.icon===t.icon&&e.productId===t.productId&&e.isDynamicHost===t.isDynamicHost&&e.suffixAddress===t.suffixAddress&&e.showType===t.showType&&e.rawShowType===t.rawShowType&&e.description===t.description&&e.currencySource===t.currencySource&&e.currencyType===t.currencyType&&e.gamePath===t.gamePath&&e.subGameName===t.subGameName&&e.gamePreviewUrl===t.gamePreviewUrl&&e.gamePreviewWidth===t.gamePreviewWidth&&e.gamePreviewHeight===t.gamePreviewHeight}(e.body.miniProgram,t.body.miniProgram)&&function(e,t){return void 0===e||void 0===t?e===t:JSON.stringify(e.modules)===JSON.stringify(t.modules)&&JSON.stringify(e.commands)===JSON.stringify(t.commands)}(e.body.robot,t.body.robot)&&function(e,t){return void 0===e||void 0===t?e===t:e.gameType===t.gameType&&e.value===t.value}(e.body.game,t.body.game)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.amount===t.amount&&e.currencyType===t.currencyType&&e.status===t.status&&e.serialNumber===t.serialNumber&&e.remark===t.remark&&e.sessionType===t.sessionType&&e.transferTime===t.transferTime&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.transferMsgId===t.transferMsgId&&e.coinName===t.coinName&&e.coinIcon===t.coinIcon}(e.body.transfer,t.body.transfer)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.giftType===t.giftType&&e.giftName===t.giftName&&e.giftIcon===t.giftIcon&&e.explain===t.explain&&e.state===t.state&&e.serialNumber===t.serialNumber&&e.sessionType===t.sessionType&&e.initiateTime===t.initiateTime&&e.amount===t.amount&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.zhangCount===t.zhangCount&&e.benCount===t.benCount&&e.fissionNumber===t.fissionNumber}(e.body.gift,t.body.gift)&&function(e,t){return void 0===e||void 0===t?e===t:e.callKind===t.callKind&&e.outcome===t.outcome&&e.durationMs===t.durationMs&&e.outgoing===t.outgoing}(e.body.call,t.body.call)&&function(e,t){return void 0===e||void 0===t?e===t:e.packetId===t.packetId&&e.packetType===t.packetType&&e.amount===t.amount&&e.count===t.count&&e.showAmount===t.showAmount&&e.thunderRate===t.thunderRate&&e.isThunder===t.isThunder&&e.thunderNumber===t.thunderNumber&&e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.currencyType===t.currencyType&&e.coinName===t.coinName}(e.body.redPacket,t.body.redPacket)&&l(e.body.mediaAlbum,t.body.mediaAlbum)&&function(e,t){return void 0===e||void 0===t?e===t:e.reason===t.reason}(e.body.unknown,t.body.unknown)&&function(e,t){return void 0===e||void 0===t?e===t:e.code===t.code&&e.reason===t.reason}(e.failure,t.failure)}export{s as dedupeById,v as isMessageEqual,a as mergeMessage,r as mergeReceipt,d as mergeSendStatus};
1
+ import{encodeConversationKey as e}from"../conversation-identity.js";import{mergeMessageReactions as t}from"../state/message-reactions.js";import{resolveMessageServerTime as i,computeMessageSortKey as n}from"./sort.js";const o={unread:0,delivered:1,read:2};function r(e,t){return o[t]>o[e]?t:e}function d(e,t){return"sent"===e||"sent"===t?"sent":t}function a(e,o,a=""){const s=i(e)??0,c=i(o)??0,y=c>=s,u=y?{...e,...o}:{...o,...e},l=!0===e.readBySelf||!0===o.readBySelf,v=Math.max(s,c),p=Math.min(e.createdAt,o.createdAt),f=void 0===e.extensions&&void 0===o.extensions?void 0:y?{...e.extensions,...o.extensions}:{...o.extensions,...e.extensions},b=n({...u,createdAt:p,serverTime:v,extensions:f}),g="failed"===e.status&&!1===e.failure?.retryable&&"sent"===o.status?"failed":d(e.status,o.status),h="failed"===g?o.failure??e.failure:void 0,T=t(e.reactions,o.reactions,a),N=!0===e.encryption.decryptFailed,U=!0===o.encryption.decryptFailed;let w=u.contentType,I=u.body,A=u.encryption,x=u.mention;N&&!U?(w=o.contentType,I=o.body,A=o.encryption,x=o.mention):!N&&U&&(w=e.contentType,I=e.body,A=e.encryption,x=e.mention),!0!==o.edited||U||(w=o.contentType,I=o.body,A=o.encryption,x=o.mention);const z=e.body.voice?.waveform??o.body.voice?.waveform;if(void 0!==I.voice&&void 0===I.voice.waveform&&void 0!==z&&(I={...I,voice:{...I.voice,waveform:z}}),void 0!==I.video&&void 0===I.video.size){const t=I.video,i=[e.body.video,o.body.video].find(e=>"bytes"===e?.sizeUnit&&void 0!==e.size&&e.url===t.url&&e.fileEncryptType===t.fileEncryptType&&e.md5===t.md5&&m(e.teaKey,t.teaKey)&&(void 0===t.unverifiedFileLength||t.unverifiedFileLength===String(e.size)));void 0!==i&&(I={...I,video:{...t,size:i.size,sizeUnit:"bytes"}})}const E=!0===e.edited||!0===o.edited,S=e.deletedForEveryone??o.deletedForEveryone;if(void 0!==S){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:p,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,o.receipt),sortKey:b,extensions:f,recalled:void 0,deletedForEveryone:S,body:{},encryption:u.encryption};return delete t.reactions,t}const k=e.recalled??o.recalled;if(void 0!==k){const t={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:p,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,o.receipt),sortKey:b,extensions:f,recalled:k,body:{},encryption:u.encryption};return delete t.reactions,t}const K={...u,...l?{readBySelf:!0}:{},id:e.id,createdAt:p,serverTime:v>0?v:void 0,status:g,failure:h,receipt:r(e.receipt,o.receipt),sortKey:b,extensions:f,contentType:w,body:I,encryption:A,...void 0===T?{}:{reactions:T},...E?{edited:!0}:{}};return void 0!==x?K.mention=x:delete K.mention,K}function s(t,i=""){const n=/* @__PURE__ */new Map;for(const o of t){const t=JSON.stringify([e(o),o.id]),r=n.get(t);n.set(t,void 0===r?o:a(r,o,i))}return[...n.values()]}function c(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.fileName===t.fileName&&e.size===t.size&&e.extension===t.extension&&e.fileType===t.fileType&&e.mimeType===t.mimeType&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}function y(e,t){return e===t||void 0!==e&&void 0!==t&&JSON.stringify(e)===JSON.stringify(t)}function u(e,t){return void 0===e||void 0===t?e===t:e.atAll===t.atAll&&e.atUserIds.length===t.atUserIds.length&&(!e.atUserIds.some((e,i)=>e!==t.atUserIds[i])&&function(e,t){if(void 0===e||void 0===t)return e===t;const i=Object.keys(e);return i.length===Object.keys(t).length&&i.every(i=>e[i]===t[i])}(e.atUsersName,t.atUsersName))}function m(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}function l(e,t){return void 0===e||void 0===t?e===t:e.caption===t.caption&&e.items.length===t.items.length&&e.items.every((e,i)=>function(e,t){return e.kind===t.kind&&e.url===t.url&&e.width===t.width&&e.height===t.height&&e.durationMs===t.durationMs&&e.thumbUrl===t.thumbUrl&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&e.hd===t.hd}(e,t.items[i]))}function v(e,t){return e.id===t.id&&e.conversationId===t.conversationId&&e.conversationType===t.conversationType&&e.senderId===t.senderId&&e.contentType===t.contentType&&JSON.stringify(e.body.customerService)===JSON.stringify(t.body.customerService)&&e.body.text===t.body.text&&function(e,t){return void 0===e||void 0===t?e===t:e.eventType===t.eventType&&e.timelineVisibility===t.timelineVisibility&&e.operatorId===t.operatorId&&e.rawNotifyType===t.rawNotifyType&&e.errcode===t.errcode&&e.fallbackText===t.fallbackText&&function(e,t){return void 0===e||void 0===t?e===t:e.length===t.length&&e.every((e,i)=>e===t[i])}(e.targetUserIds,t.targetUserIds)&&y(e.payload,t.payload)&&y(e.action,t.action)&&y(e.pinnedMessageAction,t.pinnedMessageAction)}(e.body.system,t.body.system)&&e.createdAt===t.createdAt&&e.sortKey===t.sortKey&&e.status===t.status&&e.serverTime===t.serverTime&&e.receipt===t.receipt&&e.readBySelf===t.readBySelf&&e.refMessageId===t.refMessageId&&e.edited===t.edited&&(e.recalled?.by??"")===(t.recalled?.by??"")&&(e.recalled?.at??0)===(t.recalled?.at??0)&&(e.deletedForEveryone?.by??"")===(t.deletedForEveryone?.by??"")&&(e.deletedForEveryone?.at??0)===(t.deletedForEveryone?.at??0)&&(e.deletedForEveryone?.reason??"")===(t.deletedForEveryone?.reason??"")&&function(e,t){return void 0===e||void 0===t?e===t:e.version===t.version&&e.total===t.total&&e.currentUserEmoji===t.currentUserEmoji&&e.events.length===t.events.length&&e.events.every((e,i)=>{const n=t.events[i];return void 0!==n&&e.id===n.id&&e.senderId===n.senderId&&e.emoji===n.emoji&&e.action===n.action&&e.createdAt===n.createdAt})}(e.reactions,t.reactions)&&e.encryption.encrypted===t.encryption.encrypted&&e.encryption.scheme===t.encryption.scheme&&e.encryption.decryptFailed===t.encryption.decryptFailed&&u(e.mention,t.mention)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.imageType===t.imageType&&e.size===t.size&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.image,t.body.image)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.duration===t.duration&&e.durationUnit===t.durationUnit&&e.sizeUnit===t.sizeUnit&&e.unverifiedFileLength===t.unverifiedFileLength&&m(e.thumbData,t.thumbData)&&e.md5===t.md5&&e.size===t.size&&e.describe===t.describe&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)}(e.body.video,t.body.video)&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.durationMs===t.durationMs&&e.size===t.size&&e.md5===t.md5&&e.fileEncryptType===t.fileEncryptType&&m(e.teaKey,t.teaKey)&&(e.waveform?.length??0)===(t.waveform?.length??0)}(e.body.voice,t.body.voice)&&c(e.body.file,t.body.file)&&(void 0===e.body.filesAlbum||void 0===t.body.filesAlbum?e.body.filesAlbum===t.body.filesAlbum:e.body.filesAlbum.caption===t.body.filesAlbum.caption&&e.body.filesAlbum.items.length===t.body.filesAlbum.items.length&&e.body.filesAlbum.items.every((e,i)=>c(e,t.body.filesAlbum.items[i])))&&function(e,t){return void 0===e||void 0===t?e===t:e.url===t.url&&e.width===t.width&&e.height===t.height&&e.exprType===t.exprType&&e.imageType===t.imageType&&e.size===t.size&&e.describe===t.describe&&e.contentId===t.contentId&&e.packageName===t.packageName&&m(e.thumbData,t.thumbData)}(e.body.sticker,t.body.sticker)&&function(e,t){return void 0===e||void 0===t?e===t:e.targetId===t.targetId&&e.avatar===t.avatar&&e.displayName===t.displayName&&e.username===t.username&&e.gender===t.gender&&e.kind===t.kind&&e.rawKind===t.rawKind}(e.body.contact,t.body.contact)&&function(e,t){return void 0===e||void 0===t?e===t:e.appId===t.appId&&e.host===t.host&&e.developerId===t.developerId&&e.name===t.name&&e.icon===t.icon&&e.productId===t.productId&&e.isDynamicHost===t.isDynamicHost&&e.suffixAddress===t.suffixAddress&&e.showType===t.showType&&e.rawShowType===t.rawShowType&&e.description===t.description&&e.currencySource===t.currencySource&&e.currencyType===t.currencyType&&e.gamePath===t.gamePath&&e.subGameName===t.subGameName&&e.gamePreviewUrl===t.gamePreviewUrl&&e.gamePreviewWidth===t.gamePreviewWidth&&e.gamePreviewHeight===t.gamePreviewHeight}(e.body.miniProgram,t.body.miniProgram)&&function(e,t){return void 0===e||void 0===t?e===t:JSON.stringify(e.modules)===JSON.stringify(t.modules)&&JSON.stringify(e.commands)===JSON.stringify(t.commands)}(e.body.robot,t.body.robot)&&function(e,t){return void 0===e||void 0===t?e===t:e.gameType===t.gameType&&e.value===t.value}(e.body.game,t.body.game)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.amount===t.amount&&e.currencyType===t.currencyType&&e.status===t.status&&e.serialNumber===t.serialNumber&&e.remark===t.remark&&e.sessionType===t.sessionType&&e.transferTime===t.transferTime&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.transferMsgId===t.transferMsgId&&e.coinName===t.coinName&&e.coinIcon===t.coinIcon}(e.body.transfer,t.body.transfer)&&function(e,t){return void 0===e||void 0===t?e===t:e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.fromUserName===t.fromUserName&&e.toUserName===t.toUserName&&e.giftType===t.giftType&&e.giftName===t.giftName&&e.giftIcon===t.giftIcon&&e.explain===t.explain&&e.state===t.state&&e.serialNumber===t.serialNumber&&e.sessionType===t.sessionType&&e.initiateTime===t.initiateTime&&e.amount===t.amount&&e.receiveTime===t.receiveTime&&e.returnTime===t.returnTime&&e.isRead===t.isRead&&e.zhangCount===t.zhangCount&&e.benCount===t.benCount&&e.fissionNumber===t.fissionNumber}(e.body.gift,t.body.gift)&&function(e,t){return void 0===e||void 0===t?e===t:e.callKind===t.callKind&&e.outcome===t.outcome&&e.durationMs===t.durationMs&&e.outgoing===t.outgoing}(e.body.call,t.body.call)&&function(e,t){return void 0===e||void 0===t?e===t:e.packetId===t.packetId&&e.packetType===t.packetType&&e.amount===t.amount&&e.count===t.count&&e.showAmount===t.showAmount&&e.thunderRate===t.thunderRate&&e.isThunder===t.isThunder&&e.thunderNumber===t.thunderNumber&&e.fromUid===t.fromUid&&e.toUid===t.toUid&&e.currencyType===t.currencyType&&e.coinName===t.coinName}(e.body.redPacket,t.body.redPacket)&&l(e.body.mediaAlbum,t.body.mediaAlbum)&&function(e,t){return void 0===e||void 0===t?e===t:e.reason===t.reason}(e.body.unknown,t.body.unknown)&&function(e,t){return void 0===e||void 0===t?e===t:e.code===t.code&&e.reason===t.reason}(e.failure,t.failure)}function p(e,t){return v(e,{...e,body:t.body,contentType:t.contentType,encryption:t.encryption,edited:t.edited,recalled:t.recalled})}export{s as dedupeById,v as isMessageEqual,p as isMessageRecoveryBodyEqual,a as mergeMessage,r as mergeReceipt,d as mergeSendStatus};
@@ -0,0 +1 @@
1
+ import{resolveMessageServerTime as e}from"../mapping/sort.js";function n(n,o,r){const s=n.conversationType;if("direct"!==s&&"group"!==s&&"channel"!==s)return;let i=r?.serverTime??0;const t=new Set(r?.messageIds);for(const n of o){const o=e(n);void 0===o||o<i||(o>i&&(i=o,t.clear()),t.add(n.id))}return 0===i?void 0:{kind:"conversation-deletion-boundary",conversation:{conversationType:s,conversationId:n.conversationId},serverTime:i,messageIds:[...t]}}function o(n,o){const r=e(n);return void 0!==r&&(r>o.serverTime||r===o.serverTime&&!o.messageIds.includes(n.id))}function r(n){if("object"!=typeof n||null===n)throw new Error("会话删除位置格式无效");const o=n,r=n,s="group-deletion-boundary"===r.kind?{conversationType:"group",conversationId:r.conversationId}:"conversation-deletion-boundary"===o.kind?o.conversation:void 0;if("object"!=typeof s||null===s||!["direct","group","channel"].includes(s.conversationType)||"string"!=typeof s.conversationId||""===s.conversationId||void 0===e(o)||!Array.isArray(o.messageIds)||0===o.messageIds.length||o.messageIds.some(e=>"string"!=typeof e||""===e))throw new Error("会话删除位置格式无效");return{kind:"conversation-deletion-boundary",conversation:{conversationType:s.conversationType,conversationId:s.conversationId},serverTime:o.serverTime,messageIds:[...o.messageIds]}}export{n as captureConversationDeletionBoundary,o as isAfterConversationDeletion,r as parseConversationDeletionBoundary};
@@ -1 +1 @@
1
- import{encodeConversationKey as e,conversationRefFromMessage as t,conversationRefFromPinnedMessage as n,conversationRefFromSession as o}from"../conversation-identity.js";import{compareChannelReadPosition as r,getChannelReadOrder as s}from"../mapping/channel-read-position.js";import{collectTransferStatusBySerialNumber as i,synchronizeTransferStatusMessages as a,applyTransferStatusToBody as c}from"../mapping/transfer-status.js";import{parseChannelSyncCheckpoint as d,channelSyncCheckpointKey as u}from"../sync/channel-sync-checkpoint.js";import{createDraftStore as l}from"./draft-store.js";import{rollbackMessageReaction as v,applyMessageReaction as f}from"./message-reactions.js";import{createMessageStore as p}from"./message-store.js";import{createMessageWindowStore as y}from"./message-window-store.js";import{createPinnedMessageStore as m}from"./pinned-message-store.js";import{createReadStore as g}from"./read-store.js";import{sortSessions as h}from"./session-sort.js";import{createSessionStore as C}from"./session-store.js";import{createImTextSearchMatcher as w,extractSearchText as I}from"../mapping/search-text.js";import{normalizeStoredMessageContent as T,LOCAL_MEDIA_ERROR_CODE as M,failInterruptedUpload as S}from"../mapping/stored-message.js";import{isMessageVisibleInTimeline as b,lastMessageSummaryEqual as U,sessionFromMessage as K}from"../mapping/session-mapper.js";import{isMessageEqual as E,dedupeById as A,mergeMessage as R}from"../mapping/merge.js";import{newClientMessageId as P}from"../mapping/message-id.js";import{computeSortKey as N,resolveMessageTimestamp as x,computeMessageSortKey as $}from"../mapping/sort.js";import{backfillGroupMention as D}from"../mapping/group-message-mapper.js";import{isConversationUnreadMessage as B}from"../mapping/unread-divider.js";function j(e){return"direct"===e||"robot"===e||"customerService"===e?"local":"server"}function F(e,t){const n=t?.includeMuted??!1;let o=0;for(const t of e)!n&&t.muted||(o+=t.unreadCount>0?t.unreadCount:!0===t.manuallyUnread?1:0);return o}const L="im:deleted-conversations",_="im:terminated-conversations",k="im:membership-reset-sort-keys",O="im:pending-message-reactions",H="im:transfer-status-records",z=["sendMessages","mentionAll","editProfile","manageMembers","manageAdmins","moderateMessages","manageMute","dismissChannel","transferOwnership"];function q(e,t){return e===t||void 0!==e&&void 0!==t&&z.every(n=>e[n]===t[n])}function G(e,t){return e===t||void 0!==e&&void 0!==t&&e.role===t.role&&e.baseState===t.baseState&&e.resolvedState===t.resolvedState&&e.allMembersMuted===t.allMembersMuted&&e.currentUserMuted===t.currentUserMuted&&e.mutePeriod===t.mutePeriod}function W(e,t){return e.id===t.id&&e.type===t.type&&e.title===t.title&&e.avatar===t.avatar&&U(e.lastMessageSummary,t.lastMessageSummary)&&e.timestamp===t.timestamp&&e.unreadCount===t.unreadCount&&(e.manuallyUnread??!1)===(t.manuallyUnread??!1)&&(e.mentionUnreadCount??0)===(t.mentionUnreadCount??0)&&e.pinned===t.pinned&&e.muted===t.muted&&e.topTime===t.topTime&&e.lastMessageSendState===t.lastMessageSendState&&e.lastMessageReceipt===t.lastMessageReceipt&&e.readCursor===t.readCursor&&e.groupState===t.groupState&&e.channelState===t.channelState&&q(e.channelPermissions,t.channelPermissions)&&G(e.channelAccessSnapshot,t.channelAccessSnapshot)&&e.sendDisabledReason===t.sendDisabledReason}function J(U){const z=p({getSelfId:U.getSelfId}),J=/* @__PURE__ */new Map,Q=/* @__PURE__ */new Map,V=C(),X=C(),Y=g(),Z=l(),ee=m(),te=/* @__PURE__ */new Map,ne=/* @__PURE__ */new Map;let oe=0;function re(e){ne.set(e,++oe)}let se=1;const ie=/* @__PURE__ */new Set,ae=/* @__PURE__ */new Set,ce=/* @__PURE__ */new Map,{storage:de}=U;let ue=Promise.resolve();const le=/* @__PURE__ */new Map,ve=/* @__PURE__ */new Map,fe=/* @__PURE__ */new Map;let pe=0;const ye=U.unreadMode??j,me=/* @__PURE__ */new Set;function ge(e={}){const t=y({storage:de,loadOlderFromRemote:U.loadOlderFromRemote,loadNewerFromRemote:U.loadNewerFromRemote,shouldIncludeMessage:qe,normalizeStoredUpload:qt,...e});return me.add(t),t}const he=ge();function Ce(e,t){let n;for(const o of me){const r=o.list().find(n=>n.id===e&&n.conversationId===t);if(void 0!==r){if(void 0!==n&&n.conversationType!==r.conversationType)throw new Error(`裸 conversationId 存在多类型消息歧义:${t}`);n=r}}return n}function we(e,t){const n=z.get(t,e);if(n?.conversationId===e.conversationId&&n.conversationType===e.conversationType)return n;for(const n of me){const o=n.list().find(n=>n.id===t&&n.conversationId===e.conversationId&&n.conversationType===e.conversationType);if(void 0!==o)return o}}function Ie(e,n){const o=we(t(e),e.id);void 0===o||z.has(e.id,e)||z.upsert(o);const r=z.upsert(e,n);return{...r,previous:o,changed:void 0===o?r.changed:!E(o,r.message)}}function Te(e){const t=new Map(z.getByConversation(e).map(e=>[e.id,e]));for(const n of me)if(Me(n,e))for(const o of n.list())o.conversationType!==e.conversationType||o.conversationId!==e.conversationId||t.has(o.id)||t.set(o.id,o);return[...t.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))}function Me(t,n){const o=t.info();return void 0===o.conversation?o.conversationId===n.conversationId:e(o.conversation)===e(n)}let Se=!1;function be(t){return`${e(t.conversation)}\0${t.parentMessageId}`}function Ue(){if(void 0===de||Se)return;const e=[...J.values()].flat();ft(()=>de.setMeta(O,e)).catch(e=>Je("保存待处理 Reaction 失败",e))}function Ke(e){const t=e.body.transfer;if("transfer"!==e.contentType||void 0===t)return e;const n=Q.get(t.serialNumber);if(void 0===n||0!==t.status&&0===n.status)return e;const o={...t,status:n.status,...1===n.status&&void 0!==n.occurredTime?{receiveTime:n.occurredTime}:{},...2===n.status||3===n.status?{returnTime:n.occurredTime??t.returnTime}:{}};return t.status===o.status&&t.receiveTime===o.receiveTime&&t.returnTime===o.returnTime&&t.isRead===o.isRead?e:{...e,body:{transfer:c(t,o)}}}function Ee(t,n){const o=`${e(t)}\0${n}`;return!!J.delete(o)&&(Ue(),!0)}function Ae(t){const n=`${e(t)}\0`;let o=!1;for(const e of J.keys())e.startsWith(n)&&(J.delete(e),o=!0);return o&&Ue(),o}function Re(e,t){const n=we(e.conversation,e.parentMessageId);if(void 0===n){const t=be(e),n=J.get(t)??[];return n.some(t=>t.id===e.id)?"duplicate":(J.set(t,[...n,e]),Ue(),"pending")}if(at(n),void 0!==n.recalled||void 0!==n.deletedForEveryone)return"duplicate";const o=f(n.reactions,e,U.getSelfId?.()??"");return o===n.reactions?"duplicate":(Jt([{...n,reactions:o}],t),"applied")}function Pe(n,o){const r=t(n),s=`${e(r)}\0${n.id}`,i=J.get(s);if(void 0!==i){J.delete(s),Ue();for(const e of i)Re(e,o)}}function Ne(e){for(const t of[...J.values()]){const n=t[0];if(void 0===n)continue;const o=we(n.conversation,n.parentMessageId);void 0!==o&&(void 0!==o.recalled||void 0!==o.deletedForEveryone?Ee(n.conversation,n.parentMessageId):Pe(o,e))}}let xe=0;const $e=/* @__PURE__ */new Map,De=/* @__PURE__ */new Map,Be=/* @__PURE__ */new Map,je=/* @__PURE__ */new Map,Fe=/* @__PURE__ */new Map;function Le(t){return e(t)}function _e(e){return ke(e)||ie.has(Le(e))||ie.has(e.conversationId)}function ke(e){return ae.has(Le(e))||ae.has(e.conversationId)}function Oe(e){const t=ie.delete(Le(e)),n=ie.delete(e.conversationId);return t||n}function He(e){const t=Oe(e),n=ae.delete(Le(e)),o=ae.delete(e.conversationId);return{deleted:t,terminal:n||o}}function ze(e,t){if(""===t||"system"!==e.contentType)return!1;const n=e.body.system;return!0===n?.targetUserIds?.includes(t)&&("group"===e.conversationType?"group_member_joined"===n.eventType||"group_member_invited"===n.eventType:"channel"===e.conversationType&&("channel_member_joined"===n.eventType||"channel_member_invited"===n.eventType||"channel_created"===n.eventType))}function qe(n){const o=t(n);if(ke(o)||_e(o)&&void 0===X.get(o))return!1;if("group"!==o.conversationType)return!0;const r=ce.get(e(o));return void 0===r||n.sortKey>=r}function Ge(t){const n=e(t),o=(De.get(n)??0)+1;return De.set(n,o),o}function We(t){const n=e(t),o=($e.get(n)??0)+1;return $e.set(n,o),o}function Je(e,t){U.emitter.emit({type:"error",error:{scope:"storage",message:e,cause:t}})}function Qe(e){U.emitter.emit({type:"session:updated",session:e,conversation:o(e)})}const Ve=/* @__PURE__ */new Set,Xe=/* @__PURE__ */new Set,Ye=/* @__PURE__ */new Map,Ze=/* @__PURE__ */new Map;let et=0,tt=Promise.resolve(),nt=0,ot=Promise.resolve(),rt=0;const st=/* @__PURE__ */new Map;let it;function at(n){const o=e(t(n));it?.keys.has(o)&&it.messages.set(`${o}\0${n.id}`,n)}function ct(t){const n=e(t);st.set(n,(st.get(n)??0)+1)}function dt(e){return it?.writes.push(e),void 0!==it&&e.catch(()=>{}),e}async function ut(e){const t=(await Promise.allSettled(e)).find(e=>"rejected"===e.status);if(void 0!==t)throw t.reason}function lt(e){const t=ot.then(e);return ot=t.then(()=>{},()=>{}),t}function vt(t,n){const o=rt,r=t.map(t=>[e(t),st.get(e(t))??0]);return()=>o===rt&&n()&&r.every(([e,t])=>(st.get(e)??0)===t)}function ft(e){const t=0===nt?(()=>{try{return e()}catch(e){return Promise.reject(e)}})():tt.then(e),n=t.then(()=>{},()=>{});Ve.add(n),n.finally(()=>Ve.delete(n));for(const e of Xe)e.writes.push(t);return dt(t)}function pt(e){nt+=1;const t=Promise.all([...Ve]),n=tt.then(()=>t).then(e);return tt=n.then(()=>{},()=>{}),tt.finally(()=>{nt-=1}),dt(n)}function yt(e){const t=e.body.system;if(void 0===t?.pinnedMessageAction)return e;const{pinnedMessageAction:n,...o}=t;return{...e,body:{...e.body,system:o}}}function mt(n){if(void 0!==de&&!Se&&0!==n.length){for(const o of Xe)for(const r of n)o.messages.add(`${e(t(r))}\0${r.id}`);ft(()=>de.saveMessages(n.map(yt))).catch(e=>Je("消息落盘失败",e))}}function gt(e){const{lastMessageSendState:t,manuallyUnread:n,...o}=e;return o}function ht(t){if(void 0!==de&&!Se){for(const n of Xe)n.sessions.add(e(o(t)));ft(()=>de.saveSessions([gt(t)])).catch(e=>Je("会话落盘失败",e))}}function Ct(e,t,n){if(void 0===de||Se)return;const o=++et;Ye.set(e,{version:o,persist:()=>Ct(e,t,n)});for(const t of Xe)t.metadata.add(e);const r=Ze.get(e),s=ft(()=>void 0===r?de.setMeta(e,t()):r.then(()=>de.setMeta(e,t()))),i=s.then(()=>{},()=>{});Ze.set(e,i),i.then(()=>{Ze.get(e)===i&&Ze.delete(e)}),s.then(()=>{Ye.get(e)?.version===o&&Ye.delete(e)},e=>Je(n,e))}function wt(){Ct(L,()=>[...ie],"删除会话标记保存失败")}function It(){Ct(_,()=>[...ae],"成员资格终止标记保存失败")}function Tt(){Ct(k,()=>[...ce.entries()],"重新入群的历史起点保存失败")}function Mt(t){if(void 0!==de&&!Se){for(const n of Xe)void 0!==t.conversationType&&n.reads.add(e({conversationType:t.conversationType,conversationId:t.conversationId}));ft(()=>de.saveReadState(t)).catch(e=>Je("已读态落盘失败",e))}}function St(t){if(e(t),"supergroup"===t.conversationType)throw new Error("supergroup 草稿未实现,不得 fallback 到其他会话类型")}function bt(e){return St(e),Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function Ut(e,t,n){if(St(e),"string"!=typeof t.text)throw new TypeError("草稿 text 必须是字符串");if(void 0!==t.attachments&&t.attachments.length>0)throw new Error("草稿附件尚未支持:attachments 只接受空集合");if(void 0!==t.mentions&&!Array.isArray(t.mentions))throw new TypeError("草稿 mentions 必须是数组");const o=(t.mentions??[]).map(e=>{if("string"!=typeof e.userId||""===e.userId.trim()||"string"!=typeof e.displayName)throw new TypeError("草稿 mention 必须包含非空 userId 与字符串 displayName");return Object.freeze({userId:e.userId,displayName:e.displayName})}),r=Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId});return Object.freeze({ref:r,text:t.text,mentions:Object.freeze(o),...void 0===t.replyToMessageId?{}:{replyToMessageId:t.replyToMessageId},attachments:Object.freeze([]),updatedAt:n})}function Kt(e,t){return e.text===t.text&&e.replyToMessageId===t.replyToMessageId&&e.mentions.length===t.mentions.length&&e.mentions.every((e,n)=>{const o=t.mentions[n];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function Et(t,n){St(t);const o=e(t),r=(le.get(o)??Promise.resolve()).catch(()=>{}).then(n),s=r.then(()=>{},()=>{});return le.set(o,s),s.finally(()=>{le.get(o)===s&&le.delete(o)}),r}async function At(t,n){const o=bt(t),r=e(o);if(void 0!==n&&(!Number.isFinite(n)||n<0))throw new Error(`草稿 expectedUpdatedAt 非法:${n}`);const s=pe,i=fe.get(r)??0;return await Et(o,async()=>{const e=Z.get(o);if(null===e||void 0!==n&&e.updatedAt!==n)return!1;if(void 0!==de&&await de.deleteDraft(o),s!==pe||i!==(fe.get(r)??0))throw new Error("草稿状态已失效,拒绝过期清理回灌内存");return Z.delete(o),U.emitter.emit({type:"draft:cleared",conversation:o}),!0})}function Rt(t,n,o,r,s){const i=cn(t);if(void 0===i)return;const a={...i,...void 0===s||s===De.get(e(t))?{title:n,avatar:o??i.avatar}:{},...void 0!==r?{muted:r}:{}};W(i,a)||dn(a)}function Pt(t,n){const o=U.profile;if(void 0===o)return Promise.resolve(null);const r={conversationType:"direct",conversationId:t},s=e(r),i=Fe.get(t);if(!0!==n?.forceRefresh&&void 0!==i&&i.revision===$e.get(s))return i.promise;const a=xe,c=We(r),d=Ge(r),u=(async()=>{const e=await o.getUserProfile(t,n);if(null!==e&&e.id===t&&a===xe&&c===$e.get(s)){const n=e.remark?.trim()?e.remark:e.nickname||t;Rt(r,n,e.avatar??"",e.muted,d)}return e})().finally(()=>{Fe.get(t)?.promise===u&&Fe.delete(t)});return Fe.set(t,{revision:c,promise:u}),u}async function Nt(t,n){const{conversationId:o,conversationType:r}=t;if("direct"===r){try{await Pt(o,!0===n?.force?{forceRefresh:!0}:void 0)}catch(e){U.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}})}return!1}const s=e(t),i=!0===n?.force;if(!i&&(je.has(s)||Be.has(s)))return!1;const a=xe,c=We(t),d=Ge(t);i&&je.set(s,c);const{profile:u,channelProfile:l}=U,v=i?{forceRefresh:!0}:void 0;try{if("group"===r){if(void 0===u)return!1;const e=await u.getGroupProfile(o,v);if(a!==xe||c!==$e.get(s))return!1;null!==e&&(Rt(t,e.name,e.avatar??"",e.muted,d),3===e.status&&an({conversationType:"group",conversationId:o},"group_dismissed"),i&&U.emitter.emit({type:"profile:updated",profileType:"group",id:o}))}else if("channel"===r){if(void 0===l)return!1;const e=await l.getProfile(o,v);if(a!==xe||c!==$e.get(s))return!1;if(null!==e){Rt(t,e.name,e.avatar??"",e.muted,d);const r=cn(t)?.channelState,s="left"===r||"removed"===r||"dismissed"===r,a="left"===e.channelState||"removed"===e.channelState||"dismissed"===e.channelState;if(!0===n?.allowChannelRecovery&&s&&"dismissed"!==r&&"active"===e.channelState)return on(o,"active",void 0,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!0;const c=s&&(!a||"dismissed"===r||"dismissed"!==e.channelState);if(a&&!c)return an({conversationType:"channel",conversationId:o},`channel_${e.channelState}`),i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!1;if(!c){const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;on(o,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}})}i&&U.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}})}}return!1}catch(e){return U.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}}),!1}finally{i&&a===xe&&je.get(s)===c&&je.delete(s)}}function xt(e){return B(e,U.getSelfId?.()??"")}function $t(e){const t=Y.get(e);if(void 0===t||""===t.readCursor)return;const n="string"==typeof e?t.conversationType:e.conversationType;if("channel"===n){const o={conversationType:n,conversationId:"string"==typeof e?e:e.conversationId};return Te(o).find(e=>e.extensions?.historyCursor===t.readCursor)?.sortKey??t.readCursorSortKey}const o="string"==typeof e?z.getByConversation(e).find(e=>e.id===t.readCursor):we(e,t.readCursor);return o?.sortKey??t.readCursorSortKey}function Dt(e,t){let n=0;for(const o of z.getByConversation(e))b(o)&&xt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Bt(e){const t=U.getSelfId?.();if(void 0===t||""===t||e.senderId===t)return!1;const{mention:n}=e;return void 0!==n&&(n.atAll||n.atUserIds.includes(t))}function jt(e,t){let n=0;for(const o of z.getByConversation(e))!0!==o.readBySelf&&Bt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Ft(e,t=!0){const n=void 0===e.conversationType?V.get(e.conversationId):void 0,o=void 0===e.conversationType&&void 0!==n?{...e,conversationType:n.type}:e,r=void 0===o.conversationType?o.conversationId:{conversationType:o.conversationType,conversationId:o.conversationId},s=Y.get(r);if("channel"===o.conversationType&&re(o.conversationId),Y.set(o),t&&Mt(o),void 0===s||s.readCursor!==o.readCursor||s.readCursorSortKey!==o.readCursorSortKey||s.unreadCount!==o.unreadCount||(s.manuallyUnread??!1)!==(o.manuallyUnread??!1)){if(void 0===o.conversationType)return void U.emitter.emit({type:"error",error:{scope:"storage",message:`已读状态缺少复合身份,拒绝发布 read:updated(conversationId=${o.conversationId})`}});U.emitter.emit({type:"read:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},readCursor:o.readCursor,unreadCount:o.unreadCount,...!0===o.manuallyUnread?{manuallyUnread:!0}:{}})}}function Lt(n,o){if(void 0===n||n.sortKey===o.sortKey)return;const r=t(o),s=Y.get(r),i="channel"===o.conversationType?o.extensions?.historyCursor:void 0,a="direct"===o.conversationType||"group"===o.conversationType||"robot"===o.conversationType||"customerService"===o.conversationType;void 0!==s&&(a&&s.readCursor===o.id||"string"==typeof i&&""!==i&&s.readCursor===i||s.readCursorSortKey===n.sortKey)&&Ft({...s,readCursorSortKey:o.sortKey});const c=e(r);"group"===o.conversationType&&ce.get(c)===n.sortKey&&(ce.set(c,o.sortKey),Tt())}function _t(e){const t=e?.channelAccessSnapshot?.role;return"owner"===t||"admin"===t}function kt(e,t,n,o,r=cn(e)){const s=o??Y.get(e);if(void 0===t){if(void 0===r){if("string"==typeof e||void 0===s||s.unreadCount<=0)return;return{id:e.conversationId,type:e.conversationType,title:"",lastMessagePreview:"",timestamp:0,unreadCount:s.unreadCount,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor,pinned:!1,muted:!1}}const t={...r,..."clear"===n?{lastMessagePreview:"",timestamp:0}:{},...void 0===s?{}:{unreadCount:s.unreadCount,manuallyUnread:s.manuallyUnread,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor||r.readCursor}};return"clear"===n&&(delete t.lastMessageSummary,delete t.lastMessageSenderId,delete t.lastMessageSystemEvent,delete t.lastMessageSystemTargetsSelf,delete t.lastMessageMention,delete t.lastMessageRecalled,delete t.lastMessageDeletedForEveryone,delete t.lastMessageSendState,delete t.lastMessageReceipt),t}const i=s?.unreadCount??r?.unreadCount??0,a=void 0===s?r?.manuallyUnread:s.manuallyUnread,c=K(t,{unreadCount:i,mentionUnreadCount:s?.mentionUnreadCount??r?.mentionUnreadCount??0,selfId:U.getSelfId?.(),showChannelModerationDeleted:_t(r)});return void 0===r?{...c,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||c.readCursor}:{...c,title:r.title||c.title,avatar:r.avatar??c.avatar,pinned:r.pinned,muted:r.muted,topTime:r.topTime,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||r.readCursor,groupState:r.groupState,channelState:r.channelState,channelPermissions:r.channelPermissions,channelAccessSnapshot:r.channelAccessSnapshot,sendDisabledReason:r.sendDisabledReason}}function Ot(e,t){if(void 0===e)return;const n=V.get({conversationType:e.type,conversationId:e.id});void 0!==n&&W(n,e)||(V.set(e),X.delete({conversationType:e.type,conversationId:e.id}),Qe(e),t&&ht(e),""===e.title&&Nt({conversationType:e.type,conversationId:e.id}))}function Ht(e,t,n="preserve",o=cn(e)){const r=t.findLast(e=>function(e,t){return!!b(e)&&("channel"!==e.conversationType||void 0===e.deletedForEveryone||_t(t))}(e,o)),s="string"==typeof e?o?.type:e.conversationType;return kt(e,r,void 0===r&&"channel"===s&&!_t(o)&&(t.some(e=>void 0!==e.deletedForEveryone)||"channel-moderation-deleted"===o?.lastMessageSummary?.kind||void 0!==o?.lastMessageDeletedForEveryone)?"clear":n,void 0,o)}function zt(e,t=!1){(t||void 0!==V.get(e))&&Ot(Ht(e,z.getByConversation(e)),!0)}function qt(e){if("uploading"!==e.status&&("failed"!==e.status||e.failure?.code!==M))return e;const t=z.get(e.id,e);return void 0!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId?t:S(T(e))}function Gt(n,o=()=>!0){const r=[],s=A(n,U.getSelfId?.()??"").map(e=>{const t=qt(e);let n={...t,sortKey:$(t)};if(n=T(n),"group"===n.conversationType&&"text"===n.contentType){const e=D(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return Ke(n)}),i=/* @__PURE__ */new Map;for(const n of s){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);i.set(e(o),o)}const c=[...i.values()].flatMap(e=>Te(e)),d=a(c,s),u=new Set(s.map(e=>e.id));for(const e of d){if(!o())break;const{previous:n,message:s,isNew:i,changed:a}=Ie(e);if(Lt(n,s),void 0!==n&&a)for(const e of me){if(!o())return r;e.list().some(e=>e.id===s.id&&e.conversationType===s.conversationType&&e.conversationId===s.conversationId)&&e.applyIncoming([s])}if(!o())return r;i?U.emitter.emit({type:"message:received",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}):a&&U.emitter.emit({type:"message:updated",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}),u.has(s.id)&&r.push(s)}return r}function Wt(e){const t=qt(e);let n={...t,sortKey:$(t)};if(n=T(n),"group"===n.conversationType&&"text"===n.contentType){const e=D(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return Ke(n)}function Jt(n,o,r={}){const s=U.getSelfId?.()??"";if("live"===o){let i=!1,a=!1;for(const c of n){const n=t(c);if(ze(c,s)){const t=He(n);t.deleted&&(i=!0),t.terminal&&("group"===n.conversationType?(ce.set(e(n),c.sortKey),Tt()):"channel"===n.conversationType&&ce.delete(e(n)),U.diagnostics?.record("info","core","conversation","membership-termination-cleared",()=>({conversation:n,data:{source:o,eventType:c.body.system?.eventType,groupHistoryLowerBoundApplied:"group"===n.conversationType}})),a=!0)}else""!==s&&c.senderId===s&&!0!==r.newOutgoing||ke(n)||!Oe(n)||(i=!0)}i&&wt(),a&&It()}const i=!0===U.diagnostics?.isEnabled("debug","conversation")?/* @__PURE__ */new Map:void 0,c=(n,o)=>{if(void 0===i)return;const r=t(n),s=e(r),a=i.get(s)??{ref:r,tombstone:0,groupLowerBound:0};"tombstone"===o?a.tombstone+=1:a.groupLowerBound+=1,i.set(s,a)},d=ie.size>0||ae.size>0?n.filter(e=>{const n=t(e),o=!_e(n)||!0===r.backfillOnly&&void 0!==X.get(n)&&!ke(n);return o||c(e,"tombstone"),o}):n,u=function(n){const o=/* @__PURE__ */new Map;if(0===ce.size)return o;for(const r of A(n,U.getSelfId?.()??"")){if("group"!==r.conversationType)continue;const n=t(r),s=e(n),i=ce.get(s);if(void 0===i)continue;const a=we(n,r.id);if(void 0===a||a.sortKey!==i)continue;const c=R(a,r,U.getSelfId?.()??"");c.sortKey!==i&&(ce.set(s,c.sortKey),o.set(s,c.id))}return o.size>0&&Tt(),o}(d),l=n=>u.get(e(t(n)))===n.id,v=ce.size>0?d.filter(e=>{const t=l(e)||qe(e);return t||c(e,"groupLowerBound"),t}):d,f=0===u.size?v:[...v.filter(l),...v.filter(e=>!l(e))];for(const e of i?.values()??[])U.diagnostics?.record("debug","core","conversation","membership-filter-dropped",()=>({conversation:e.ref,data:{source:o,tombstoneDroppedCount:e.tombstone,groupHistoryLowerBoundDroppedCount:e.groupLowerBound}}));const p=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,m=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map,h=/* @__PURE__ */new Map,C=/* @__PURE__ */new Set,w=A(f,s).map(Ke),I=/* @__PURE__ */new Map;for(const n of w){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);I.set(e(o),o)}const T=[...I.values()].flatMap(e=>Te(e)),M=a(T,w),S=[],K=[];for(const n of M){if("channel"===n.conversationType&&it?.keys.has(e(t(n)))&&!it.current())continue;const{previous:s,message:i,isNew:a,changed:c}=Ie(n,{authoritativeFailure:!0===r.authoritativeOutboxFailure});if(at(i),!0===r.backfillOnly&&!0===r.refreshSessionSummary){const n=t(i);p.set(e(n),n)}if(!a&&!c)continue;Lt(s,i);for(const e of me)e.applyIncoming([i]);a?U.emitter.emit({type:"message:received",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects}):U.emitter.emit({type:"message:updated",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects});const d=t(i);if(!a&&void 0!==s&&!0!==s.readBySelf&&!0===i.readBySelf){const t=$t(d),n=void 0===t||s.sortKey>t,o=e(d);n&&b(s)&&xt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&m.set(o,(m.get(o)??0)-1),n&&Bt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&h.set(o,(h.get(o)??0)-1)}ke(d)||(S.push(i),p.set(e(d),d),a&&!0!==r.backfillOnly&&K.push(i))}const E=/* @__PURE__ */new Map;for(const n of K){const r=t(n),s=e(r);xt(n)&&C.add(s),E.has(s)||E.set(s,$t(r));const i=E.get(s),a=void 0===i||n.sortKey>i;if(b(n)&&a&&xt(n)&&!0!==n.readBySelf&&void 0===n.recalled&&void 0===n.deletedForEveryone){const e=ye(n.conversationType);("local"===e||"server"===e&&"live"===o)&&y.set(s,(y.get(s)??0)+1)}a&&!0!==n.readBySelf&&Bt(n)&&void 0===n.recalled&&void 0===n.deletedForEveryone&&g.set(s,(g.get(s)??0)+1)}for(const t of p.values()){if(!0===r.backfillOnly){!0===r.refreshSessionSummary&&zt(t);continue}const n=e(t),o=y.get(n)??0,s=g.get(n)??0,i=m.get(n)??0,a=h.get(n)??0,c=C.has(n),d=Y.get(t);if(o>0||s>0||c||void 0!==d&&(0!==i||0!==a)){const e=d??{...t,readCursor:"",unreadCount:0},n={...e,unreadCount:Math.max(0,e.unreadCount+o+i),mentionUnreadCount:Math.max(0,(e.mentionUnreadCount??0)+s+a)};c&&delete n.manuallyUnread,Ft(n)}zt(t,K.some(e=>e.conversationType===t.conversationType&&e.conversationId===t.conversationId&&b(e)))}mt(S.filter(e=>void 0!==we(t(e),e.id)));for(const e of S)void 0===e.recalled&&void 0===e.deletedForEveryone?Pe(e,o):Ee(t(e),e.id)}function Qt(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=we(o,t),s=z.getByConversation(o).findLast(e=>"direct_contact_established"===e.body.system?.eventType);if(void 0!==r&&void 0!==s&&x(s)>=x(r))return;const i=`${t}:contact-required`;if(void 0!==z.get(i,o))return;Jt([{id:i,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_required",targetUserIds:[e],action:{type:"request-contact",userId:e}}},createdAt:n,sortKey:N(n,i),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")}const Vt=/* @__PURE__ */new Map;let Xt=0;function Yt(e){const t=Y.get(e);if(!0!==t?.manuallyUnread)return!1;const n={...t};return delete n.manuallyUnread,Ft(n),zt(e),!0}function Zt(e,t,n,r,s){const i="string"==typeof e?e:e.conversationId,a=cn(e),c="string"==typeof e?void 0===a?void 0:o(a):e;if(void 0!==a&&"server"!==ye(a.type))return void U.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 不应用于本地未读会话(conversationId=${i}, type=${a.type}),已忽略`}});if(!Number.isFinite(t))return void U.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 收到非法未读数(conversationId=${i}, count=${t}),已忽略`}});"channel"===c?.conversationType&&te.delete(i);const d=Y.get(e);let u=d?.readCursor??"",l=d?.readCursorSortKey;const v=void 0===n||""===n?void 0:void 0===c?z.getByConversation(i).find(e=>e.id===n)??Ce(n,i):we(c,n);void 0!==v&&v.conversationId===i&&(void 0===l||v.sortKey>l)&&(u=v.id,l=v.sortKey),void 0!==r&&(u=r),Ft({...void 0===c?{conversationId:i}:c,readCursor:u,readCursorSortKey:l,unreadCount:Math.max(0,Math.floor(t)),...t>0?{}:{manuallyUnread:d?.manuallyUnread},mentionUnreadCount:0===t||!1===s?0:!0===s?Math.max(1,d?.mentionUnreadCount??0):d?.mentionUnreadCount}),zt(e,t>0&&void 0!==c&&!_e(c))}function en(e){const t=te.get(e.conversation.conversationId);return t?.handle.transactionId===e.transactionId?t:void 0}function tn(e,t,n,o=!1){const r=cn(e),s=we(e,t);if("channel"!==r?.type||"channel"!==s?.conversationType||s.conversationId!==e.conversationId||s.extensions?.historyCursor!==n)throw new Error(`CHANNEL 已读位置不可信(channelId=${e.conversationId}, messageId=${t})`);o||te.delete(e.conversationId);const i=Y.get(e),a=void 0===i?r.mentionUnreadCount:i.mentionUnreadCount;Ft({...e,readCursor:n,readCursorSortKey:s.sortKey,unreadCount:i?.unreadCount??r.unreadCount,...void 0===a?{}:{mentionUnreadCount:a}}),zt(e)}function nn(e,t,n){const o=e.conversation,r=o.conversationId,i=en(e);if(void 0===i)throw new Error(`CHANNEL 乐观已读事务已失效(channelId=${r})`);const a=we(o,t);if(void 0===a||a.conversationId!==r||"channel"!==a.conversationType)throw new Error(`CHANNEL 乐观已读消息不可信(channelId=${r}, messageId=${t})`);if(a.extensions?.historyCursor!==n)throw new Error(`CHANNEL 乐观已读 cursor 与消息不一致(channelId=${r}, messageId=${t})`);i.steps.at(-1)?.readCursor!==n&&(i.steps.push({readCursor:n,messageId:t,...s(a)}),tn(o,t,n,!0))}function on(t,n,o,r){const s={conversationType:"channel",conversationId:t},i=e(s);if(_e(s)&&void 0===X.get(s))return;const a=cn(s);if(void 0===a){We(s),je.delete(i);return void dn({id:t,type:"channel",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,channelState:n,channelPermissions:r?.permissions,channelAccessSnapshot:r?.snapshot,sendDisabledReason:o})}if("channel"!==a.type)throw new Error(`setChannelRestriction: 会话 ${t} 类型为 ${a.type},拒绝写入 CHANNEL 状态`);We(s),je.delete(i);const c=r?.permissions,d=r?.snapshot;if(a.channelState===n&&a.sendDisabledReason===o&&q(a.channelPermissions,c)&&G(a.channelAccessSnapshot,d))return void(void 0!==V.get(s)&&zt(s));const u={...a,channelState:n,channelPermissions:c,channelAccessSnapshot:d,sendDisabledReason:o};void 0!==V.get(s)?dn(Ht(s,z.getByConversation(s),"preserve",u)):dn(u)}async function rn(e,t){if(""===t.trim())throw new Error("本机删除消息需要非空 messageId");const n=()=>{if(ee.isPinnedMessage(e,t))throw Object.assign(new Error("置顶消息必须先取消置顶才能删除"),{code:"IM_MESSAGE_PINNED"})};n();const o=we(e,t),r=z.get(t,e),s=void 0!==r&&r.conversationType===e.conversationType&&r.conversationId===e.conversationId,i=z.getByConversation(e).filter(e=>e.id!==t),a=void 0===V.get(e)?void 0:Ht(e,i,"clear"),c=void 0===a?void 0:gt(a);function d(e){return void 0!==e&&(void 0===r||!E(r,e))}const u=void 0===de?{deleted:!1,superseded:!1}:await pt(async()=>{n();const r=we(e,t)??o??await de.getMessage(e,t)??void 0;if(n(),d(z.get(t,e)))return{deleted:!1,superseded:!0};const s=await de.deleteMessage(e,t,c);if(ee.isPinnedMessage(e,t)){const o=we(e,t)??r;void 0!==o&&await de.saveMessages([yt(o)]);const s=V.get(e);return void 0!==s&&await de.saveSessions([gt(s)]),n(),{deleted:!1,superseded:!0}}return{deleted:s,superseded:!1}});if(u.superseded||d(z.get(t,e)))return!1;const l=s&&z.delete(e,t);let v=!1;for(const n of me)v=n.removeMessage(e,t)||v;if(!u.deleted&&!l&&!v)return!1;const f=void 0===V.get(e)?void 0:Ht(e,z.getByConversation(e),"clear");return Ot(f,!1),void 0===f||void 0!==a&&W(a,f)||ht(f),Ee(e,t),U.emitter.emit({type:"message:removed",conversation:{...e},messageId:t,scope:"local-only"}),!0}function sn(t,o={}){const r="string"==typeof t?t:t.conversationId,s=V.get(t),i=ee.get(t),a="string"==typeof t?void 0!==s?{conversationType:s.type,conversationId:r}:void 0===i?void 0:n(i):t;if(void 0===a)throw new Error(`裸 conversationId 无法确定删除类型:${r}`);Ge(a),Be.delete(e(a)),"direct"===a.conversationType&&(We(a),Fe.delete(a.conversationId)),ct(a);const c=z.getByConversation(a).length;!function(t){const n=bt(t),o=e(n);fe.set(o,(fe.get(o)??0)+1),null!==Z.get(n)&&(Z.delete(n),U.emitter.emit({type:"draft:cleared",conversation:n})),Et(n,async()=>{void 0!==de&&await de.deleteDraft(n)}).catch(e=>Je("删会话草稿失败",e))}(a),Ae(a),V.delete(t),X.delete(t),"channel"===a.conversationType&&(re(a.conversationId),te.delete(a.conversationId)),Y.delete(t),z.deleteByConversation(t),ee.clear(t);const d=Le(a);if(!0===o.terminal){ae.add(d);const e=ce.delete(d);ie.delete(d),ie.delete(r),e&&Tt(),U.diagnostics?.record("info","core","conversation","membership-terminated",()=>({conversation:a,data:{reason:o.terminalReason??"membership-terminated",removedMessageCount:c}}))}else ie.add(d);for(const e of me)Me(e,a)&&e.reset();U.emitter.emit({type:"session:removed",conversationId:r,conversation:a}),wt(),!0===o.terminal&&It(),void 0!==de&&pt(async()=>{await ut([de.deleteConversationMessages(a),de.deleteSession(a),de.deleteReadState(a),de.removePinnedMessage(a)])}).catch(e=>Je("删除会话持久数据失败",e))}function an(e,t){sn(e,{terminal:!0,terminalReason:t})}function cn(e){if("string"==typeof e){const t=[...V.getAll(),...X.getAll()].filter(t=>t.id===e);if(t.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`);return t[0]}return V.get(e)??X.get(e)}function dn(e){const t=o(e);void 0!==V.get(t)?(V.set(e),Qe(e),ht(e)):(X.set(e),U.emitter.emit({type:"conversation-context:updated",conversation:t}))}return{upsertMessages:Jt,commitReceivedMessages:function(n,o,r,s){if(void 0===de){for(const e of s?.events??[])s.apply(e);return void Jt(n,o,r)}const i={writes:[],messages:/* @__PURE__ */new Set,sessions:/* @__PURE__ */new Set,reads:/* @__PURE__ */new Set,metadata:/* @__PURE__ */new Set};Xe.add(i);try{const a=(s?.events??[]).filter(e=>"ignored"!==s.apply(e));Jt(n,o,r);const c=a.flatMap(e=>{const t=we(e.conversation,e.parentMessageId);return void 0===t?[]:[t]});a.length>0&&Ue();const d=/* @__PURE__ */new Map,u=[];for(const o of[...n,...c]){const n=t(o),r=e(n),s=we(n,o.id);void 0!==s&&(d.set(r,n),i.messages.has(`${r}\0${s.id}`)||u.push(s))}mt(u);for(const[e,t]of d){const n=V.get(t),o=Y.get(t);void 0===n||i.sessions.has(e)||ht(n),void 0===o||i.reads.has(e)||Mt(o)}for(const[e,t]of Ye)i.metadata.has(e)||t.persist()}finally{Xe.delete(i)}return ut(i.writes)},applyReaction:Re,rollbackReaction:function(t,n,o){const r=we(t,n);if(void 0===r){const r=`${e(t)}\0${n}`,s=J.get(r);if(void 0===s)return!1;const i=s.filter(e=>e.id!==o);return i.length!==s.length&&(0===i.length?J.delete(r):J.set(r,i),Ue(),!0)}const s=v(r.reactions,o,U.getSelfId?.()??"");if(s===r.reactions)return!1;const i={...r};return void 0===s?delete i.reactions:i.reactions=s,Jt([i],"live"),!0},appendDirectContactRequiredNotice:Qt,appendDirectMessageRefusedNotice:function(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=`${t}:message-refused`;if(void 0!==z.get(r,o))return;const s=z.get(t,o),i="direct"===s?.conversationType&&s.conversationId===e?x(s):n;Jt([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_message_refused",targetUserIds:[e]}},createdAt:i,sortKey:N(i,r),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")},appendDirectContactRequiredTextFailure:function(e,t=Date.now()){const n=P(),o={id:n,conversationId:e.conversationId,conversationType:"direct",senderId:e.senderId,contentType:"text",body:{text:e.text},createdAt:t,sortKey:N(t,n),status:"failed",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1},failure:{code:33281,reason:"rejected",displayCode:"contactRequired",retryable:!1},...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}};return Jt([o],"live"),Qt(e.conversationId,n,t+1),o},reconcileDirectContactEstablishedNotice:function(e,t,n=Date.now()){const o=Vt.get(e);if(void 0!==o)return o;const r={conversationType:"direct",conversationId:e},s=Xt,i=(async()=>{const o=z.getByConversation(r).filter(e=>{const t=e.body.system?.eventType;return"direct_contact_required"===t||"direct_contact_established"===t}),i=o.filter(e=>"direct_contact_required"===e.body.system?.eventType),a=i.at(-1)?.createdAt??0,c=o.findLast(e=>"direct_contact_established"===e.body.system?.eventType)?.createdAt??0,d=c>=a&&c>0;if(0===i.length&&d)return;const u=$t(r);for(const e of i)try{const t=await rn(r,e.id),n=we(r,e.id);t||"direct_contact_required"!==n?.body.system?.eventType||U.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但旧的申请添加提示未能删除",cause:{conversation:r,messageId:e.id}}})}catch(t){U.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但删除旧的申请添加提示失败",cause:{conversation:r,messageId:e.id,error:t}}})}if(s!==Xt)return;const l=Y.get(r);if(void 0!==l&&(Ft({...l,...void 0===l.readCursorSortKey&&void 0!==u?{readCursorSortKey:u}:{},unreadCount:Dt(r,u)}),zt(r)),d)return;const v=Number.isFinite(n)&&n>0?n:Date.now(),f=Math.max(v,a+1);!function(e,t,n=Date.now(),o=n){const r=function(e,t){return`${""===e.trim()?`contact-established:${t}`:e}:contact-established`}(t,o);if(void 0!==z.get(r,{conversationType:"direct",conversationId:e}))return;Jt([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_established",targetUserIds:[e]}},createdAt:n,sortKey:N(n,r),status:"sent",receipt:"unread",encryption:{encrypted:!1}}],"live")}(e,t,f,v)})().finally(()=>{Vt.get(e)===i&&Vt.delete(e)});return Vt.set(e,i),i},recallMessage:function(e,t,n){const o=we(e,t);void 0!==o&&Jt([{...o,recalled:n,body:{}}],"live")},deleteChannelMessageForEveryone:function(e,t,n){const o=we(e,t);void 0!==o&&"channel"===o.conversationType&&Jt([{...o,recalled:void 0,deletedForEveryone:n,body:{}}],"live")},editMessage:function(e,t,n,o){const r=we(e,t);if(void 0===r)return;const s={...r,body:n,edited:!0};void 0!==o?s.mention=o:delete s.mention,Jt([s],"live")},applyTransferStatusBySerialNumber:async function(e,t,n){const o=function(e,t){if(void 0===e)return t;if(0===e.status&&0!==t.status)return t;if(0===t.status&&0!==e.status)return e;const n=e.occurredTime??0,o=t.occurredTime??0;return n!==o?o>n?t:e:t.status>e.status?t:e}(Q.get(e),{serialNumber:e,status:t,...void 0===n?{}:{occurredTime:n}});Q.set(o.serialNumber,o),await async function(){if(void 0===de)return;const e=[...Q.values()],t=ue.then(()=>de.setMeta(H,e));dt(t),ue=t.catch(()=>{});try{await t}catch(e){throw Je("保存转账状态记录失败",e),e}}();const r=/* @__PURE__ */new Map;for(const t of i(z.getAll(),e,o.status,o.occurredTime))r.set(t.id,t);for(const t of V.getAll()){const n=Te({conversationType:t.type,conversationId:t.id});for(const t of i(n,e,o.status,o.occurredTime))r.set(t.id,t)}0!==r.size&&Jt([...r.values()],"live")},getMessage:e=>z.get(e),getMessagesById:e=>z.getById(e),getConversationMessage:we,getLoadedMessagesByConversation:Te,resolveConversationMessage:async function(n,o,r={}){const s=we(n,o);if(void 0!==s||void 0===de)return s;try{const r=await de.getMessage(n,o);if(null===r||e(t(r))!==e(n))return;return Wt(r)}catch(e){if(Je("按消息 ID 读取本地历史失败",e),!0===r.throwOnStorageError)throw e;return}},getMessages:()=>z.getAll(),getMessagesByConversation:e=>z.getByConversation(e),deleteLocalMessage:rn,clearLocalConversationHistory:async function(e){ct(e);const t={...e},n=new Map(z.getByConversation(t).map(e=>[e.id,e])),o=V.get(t),r=Y.get(t),s=void 0===r&&void 0===o?void 0:{...t,readCursor:r?.readCursor??o?.readCursor??"",...void 0===r?.readCursorSortKey?{}:{readCursorSortKey:r.readCursorSortKey},unreadCount:0,mentionUnreadCount:0},i=void 0===o?void 0:kt(t,void 0,"clear",s);if(void 0!==de){if(void 0===de.clearConversationHistory)throw new Error("当前 storage 未实现 clearConversationHistory,拒绝非原子清空本机会话历史");await pt(()=>de.clearConversationHistory(t,void 0===i?void 0:gt(i),s))}const a=Y.get(t);void 0!==s&&(a?.conversationType===r?.conversationType&&a?.conversationId===r?.conversationId&&a?.readCursor===r?.readCursor&&a?.readCursorSortKey===r?.readCursorSortKey&&a?.unreadCount===r?.unreadCount&&a?.mentionUnreadCount===r?.mentionUnreadCount)&&Ft(s,!1);for(const[e,o]of n){const n=z.get(e,t);void 0!==n&&E(o,n)&&z.delete(t,e)}const c=z.getByConversation(t);for(const e of me)e.clearConversation(t)&&e.applyIncoming(c);Ae(t),void 0!==V.get(t)&&Ot(Ht(t,c,"clear"),!1),U.emitter.emit({type:"conversation-history:cleared",conversation:t,scope:"local-only"})},commitChannelSyncPage:function(n,o,r,s){const i=vt(n,r);return lt(async()=>{if(!i())return!1;if(void 0===de)throw new Error("CHANNEL 严格同步提交需要 storage");const r={writes:[],messages:/* @__PURE__ */new Map,keys:new Set(n.map(e)),current:i};let a;it=r;try{const e=o();if(e instanceof Promise)throw e.catch(()=>{}),new Error("CHANNEL 页 mutation 必须同步执行")}catch(e){a={cause:e}}finally{it=void 0}if(await ut(r.writes),void 0!==a)throw a.cause;if(!i())return!1;const c=[...r.messages.values()].flatMap(e=>{const n=we(t(e),e.id);return void 0===n?[]:[yt(n)]}),d=[];c.length>0&&d.push(ft(()=>de.saveMessages(c)));for(const e of n){const t=V.get(e),n=Y.get(e),o=ee.get(e);void 0!==t&&d.push(ft(()=>de.saveSessions([gt(t)]))),void 0!==n&&d.push(ft(()=>de.saveReadState(n))),d.push(ft(()=>void 0===o?de.removePinnedMessage(e):de.savePinnedMessage(o)))}const u=[[O,[...J.values()].flat()],[H,[...Q.values()]],[L,[...ie]],[_,[...ae]],[k,[...ce.entries()]]];for(const[e,t]of u)d.push(ft(()=>de.setMeta(e,t)));return void 0!==s&&d.push(ft(async()=>{i()&&await s()})),await ut(d),i()})},saveChannelSyncCheckpoint:function(e,t){const n=d(e,e.conversation);if(void 0===n)return Promise.reject(new Error("CHANNEL 同步位置无效"));const o=vt([n.conversation],t);return lt(async()=>{if(!o())return!1;if(void 0===de)throw new Error("CHANNEL 同步位置保存需要 storage");let e=!1;return await ft(async()=>{o()&&(await de.setMeta(u(n.conversation),n),e=!0)}),e&&o()})},waitForChannelSyncPersistence:async function(){for(;;){const e=ot,t=tt;if(await Promise.all([e,t,...Ve]),e===ot&&t===tt&&0===Ve.size)return}},getSession:e=>V.get(e),getConversationContext:cn,isMembershipTerminated:ke,prepareConversation:function(e,t={}){const n=o(e);if("supergroup"===n.conversationType)throw new Error("prepareConversation:supergroup 未实现");const r=cn(n);if(void 0!==r){const t=r.title||e.title,n=r.avatar??e.avatar;return void(t===r.title&&n===r.avatar||dn({...r,title:t,avatar:n}))}if(ke(n)){if(!0!==t.membershipConfirmed)throw new Error("准备聊天失败:需要重新确认成员资格");ae.delete(Le(n)),ae.delete(n.conversationId),It()}dn({...e,...void 0===e.channelPermissions?{}:{channelPermissions:{...e.channelPermissions}},...void 0===e.channelAccessSnapshot?{}:{channelAccessSnapshot:{...e.channelAccessSnapshot}}}),(Y.get(n)?.unreadCount??0)>0&&!_e(n)&&zt(n,!0)},ensureConversation:function(t){const n=o(t);if(e(n),"supergroup"===n.conversationType)throw new Error("ensureConversation:supergroup 未实现");const r=V.get(n);if(void 0!==r)return r;const s={...t,id:n.conversationId,type:n.conversationType,...void 0===t.channelPermissions?{}:{channelPermissions:{...t.channelPermissions}},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:{...t.channelAccessSnapshot}},...void 0===t.extensions?{}:{extensions:{...t.extensions}}},i=He(n);return i.deleted&&wt(),i.terminal&&It(),V.set(s),X.delete(n),Qe(s),ht(s),s},getSessions:()=>V.getAll(),getConversationList:function(){const e=[];for(const t of V.getAll()){const n=o(t);e.push({...t,draft:Z.get(n)})}return h(e)},getReadState:e=>Y.get(e),getPinnedMessage:e=>ee.get(e),setPinnedMessage:function(e,t){const o=function(e){const t=we(n(e),e.messageId);return void 0===t?e:{...e,preview:{state:"ready",message:t}}}(e);ee.set(o)&&(U.emitter.emit({type:"pinned-message:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},pinnedMessage:o,reason:t}),function(e){void 0===de||Se||ft(()=>de.savePinnedMessage(e)).catch(e=>Je("置顶消息落盘失败",e))}(o))},clearPinnedMessage:function(e,t){const o="string"==typeof e?e:e.conversationId,r=ee.get(e);if(!ee.clear(e))return;const s="string"==typeof e?void 0===r?void 0:n(r):e;if(void 0===s)throw new Error(`置顶消息清理缺少复合身份:${o}`);U.emitter.emit({type:"pinned-message:updated",conversationId:o,conversation:s,pinnedMessage:null,reason:t}),function(e){void 0===de||Se||ft(()=>de.removePinnedMessage(e)).catch(e=>Je("置顶消息删除失败",e))}(e)},isPinnedMessage:(e,t)=>ee.isPinnedMessage(e,t),setReadState:e=>{const t=void 0===e.conversationType?V.get(e.conversationId):void 0,n=void 0===e.conversationType&&void 0!==t?{...e,conversationType:t.type}:e;"channel"===n.conversationType&&re(n.conversationId),Y.set(n),Mt(n)},markConversationUnread:function(e){const t=V.get(e);if(void 0===t)return!1;const n=Y.get(e)??{...e,readCursor:t.readCursor??"",unreadCount:t.unreadCount,mentionUnreadCount:t.mentionUnreadCount};return!(n.unreadCount>0||!0===n.manuallyUnread)&&(Ft({...n,manuallyUnread:!0}),zt(e),!0)},clearConversationManualUnread:Yt,advanceRead:function(e,n){const o="string"==typeof e?z.getByConversation(e).find(e=>e.id===n)??Ce(n,e):we(e,n);if(void 0===o)return;const r="string"==typeof e?t(o):e,s="string"==typeof e?e:e.conversationId;if(o.conversationId!==s||o.conversationType!==r.conversationType)return;const i=$t(r);if(void 0!==i&&i>=o.sortKey)return void("string"!=typeof e&&Yt(e));const a={...r,readCursor:n,readCursorSortKey:o.sortKey,unreadCount:Dt(r,o.sortKey),mentionUnreadCount:jt(r,o.sortKey)};return Ft(a),zt(r),a},applyServerUnread:Zt,applyChannelReadPosition:tn,getChannelReadRevision:e=>ne.get(e.conversationId)??oe,hasPendingChannelRead:e=>te.has(e.conversationId),applyChannelReadSummary:(e,t)=>Zt(e,t.unreadCount,void 0,t.readCursor,t.hasUnreadMention),beginChannelReadTransaction:function(e){const t=e.conversationId,n=cn(e);if(void 0===n||"channel"!==n.type)throw new Error(`CHANNEL 乐观已读事务要求 channel 会话(conversationId=${t}, type=${n?.type??"missing"})`);if(te.has(t))throw new Error(`CHANNEL 乐观已读事务已存在(channelId=${t})`);const o={conversation:e,transactionId:se++},r=Y.get(e)??{conversationId:t,readCursor:n.readCursor??"",unreadCount:n.unreadCount,...void 0===n.mentionUnreadCount?{}:{mentionUnreadCount:n.mentionUnreadCount}};return te.set(t,{handle:o,baseReadState:{...r},steps:[],committedThrough:-1}),re(t),o},applyChannelReadOptimistically:nn,applyChannelConversationReadOptimistically:function(e,t,n){nn(e,t,n);const o=en(e).steps.at(-1);if(void 0!==o.clearedCounts)return;const i=Y.get(e.conversation),a=Te(e.conversation).filter(e=>r(s(e),o)>0&&xt(e)&&b(e)&&!0!==e.readBySelf&&void 0===e.recalled&&void 0===e.deletedForEveryone),c=Math.min(i.unreadCount,a.length),d=Math.min(i.mentionUnreadCount??0,a.filter(Bt).length);o.clearedCounts={unread:i.unreadCount-c,mention:(i.mentionUnreadCount??0)-d},Ft({...i,unreadCount:c,mentionUnreadCount:d}),zt(e.conversation)},commitChannelReadTransaction:function(e,t){const n=en(e);if(void 0===n)return!1;const o=n.steps.findLastIndex(e=>e.readCursor===t);if(o<0)throw new Error(`CHANNEL 已确认 cursor 不属于乐观事务(channelId=${e.conversation.conversationId}, cursor=${t})`);return n.committedThrough=Math.max(n.committedThrough,o),re(e.conversation.conversationId),n.committedThrough===n.steps.length-1&&te.delete(e.conversation.conversationId),!0},rollbackChannelReadTransaction:function(e){const t=en(e);if(void 0===t)return!1;const n=e.conversation,o=n.conversationId,r=Y.get(n),s=t.committedThrough>=0?t.steps[t.committedThrough]:void 0,i=void 0===s?t.baseReadState:void 0;let a=r?.unreadCount??i?.unreadCount??0,c=r?.mentionUnreadCount??i?.mentionUnreadCount??0;for(const e of t.steps.slice(t.committedThrough+1))a+=e.clearedCounts?.unread??0,c+=e.clearedCounts?.mention??0;const d=void 0!==i?.mentionUnreadCount||void 0!==r?.mentionUnreadCount,u={conversationId:o,conversationType:"channel",readCursor:s?.readCursor??i?.readCursor??"",readCursorSortKey:s?.sortKey??i?.readCursorSortKey,unreadCount:a,...d?{mentionUnreadCount:c}:{}};return te.delete(o),Ft(u),zt(n),!0},setGroupRestriction:function(e,t,n){const o=cn({conversationType:"group",conversationId:e});if(void 0===o){return void dn({id:e,type:"group",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,groupState:t,sendDisabledReason:n})}if(o.groupState===t&&o.sendDisabledReason===n)return;dn({...o,groupState:t,sendDisabledReason:n})},setChannelRestriction:on,setPinned:function(e,t){const n=V.get(e);if(void 0===n||n.pinned===t)return;const o={...n,pinned:t,topTime:t?Date.now():void 0};V.set(o),Qe(o),ht(o)},setMuted:function(e,t){const n=cn(e);if(void 0===n||n.muted===t)return;dn({...n,muted:t})},removeConversation:function(e){sn(e)},removeConversationForMembershipTermination:an,refreshConversationProfile:function(e,t){Nt({conversationType:t,conversationId:e},{force:!0})},readDirectProfile:Pt,beginConversationProfileRead:function(t,n){const o={...t},r=e(o),s=xe,i=!0!==n?.forceRefresh&&(je.has(r)||Be.has(r))?void 0:Ge(o);void 0!==i&&!0===n?.forceRefresh&&Be.set(r,i);const a=()=>{s===xe&&void 0!==i&&Be.get(r)===i&&Be.delete(r)};return Object.assign(e=>{try{if(void 0===i||e.id!==o.conversationId||s!==xe)return;Rt(o,e.title,e.avatar??"",void 0,i)}finally{a()}},{finish:a})},recoverChannelFromProfile:function(e){return Nt({conversationType:"channel",conversationId:e},{force:!0,allowChannelRecovery:!0})},updateConversationProfile:function(e,t){const n=cn(e);if(void 0===n)return;Ge(o(n));const r={...n,...void 0!==t.title?{title:t.title}:{},...void 0!==t.avatar?{avatar:t.avatar}:{}};W(n,r)||dn(r)},getTotalUnread:function(e){return F(V.getAll(),e)},getDraft:function(e){return Z.get(bt(e))},saveDraft:async function(t,n){const o=bt(t),r=e(o),s=Ut(o,n,0),i=pe,a=fe.get(r)??0;return await Et(o,async()=>{const e=Z.get(o),t=Math.max(Date.now(),(ve.get(r)??e?.updatedAt??0)+1),n=Ut(o,s,t);if(null!==e&&Kt(e,n))return e;if(void 0!==de&&await de.saveDraft(n),i!==pe||a!==(fe.get(r)??0))throw new Error("草稿状态已失效,拒绝过期写入回灌内存");return Z.set(n),ve.set(r,t),U.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}),n})},clearDraft:async function(e){await At(e)},clearDraftIfUnchanged:async function(e,t){return await At(e,t)},invalidateAndDrainDraftOperations:async function(){for(pe+=1;le.size>0;)await Promise.all([...le.values()])},clearSession(){rt+=1,xe+=1,pe+=1,Xt+=1,Vt.clear(),$e.clear(),De.clear(),Be.clear(),je.clear(),Fe.clear(),z.clear(),V.clear(),X.clear(),Y.clear(),Z.clear(),le.clear(),ve.clear(),fe.clear(),te.clear(),ne.clear(),oe+=1,ee.clearAll(),ie.clear(),ae.clear(),ce.clear(),Ye.clear(),J.clear();for(const e of me)e.reset()},hydrate:async function(r=()=>!0){if(void 0!==de&&r()){Se=!0;try{const s=await de.getMeta(L);if(!r())return;if(null!==s)for(const e of s)ie.add(e);const i=await de.getMeta(_);if(!r())return;if(null!==i)for(const e of i)ae.add(e);const a=await de.getMeta(k);if(!r())return;if(null!==a)for(const[e,t]of a)"string"==typeof e&&"string"==typeof t&&ce.set(e,t);const c=await de.getMeta(O);if(!r())return;if(null!==c)for(const e of c){const t=be(e);J.set(t,[...J.get(t)??[],e])}const d=await de.getMeta(H);if(!r())return;if(Array.isArray(d))for(const e of d){if("object"!=typeof e||null===e)continue;const t=Reflect.get(e,"serialNumber"),n=Reflect.get(e,"status"),o=Reflect.get(e,"occurredTime");"string"!=typeof t||""===t.trim()||0!==n&&1!==n&&2!==n&&3!==n||void 0!==o&&("number"!=typeof o||!Number.isFinite(o)||o<=0)||Q.set(t,{serialNumber:t,status:n,...void 0===o?{}:{occurredTime:o}})}const u=await de.getPinnedMessages();if(!r())return;for(const e of u){if(!r())return;_e({conversationType:e.conversationType,conversationId:e.conversationId})||ee.set(e)&&U.emitter.emit({type:"pinned-message:updated",conversationId:e.conversationId,conversation:n(e),pinnedMessage:e,reason:"hydrate"})}const l=(await de.getSessions()).filter(e=>!_e({conversationType:e.type,conversationId:e.id}));if(!r())return;for(const e of l){if(!r())return;const t=Ht(o(e),[],"preserve",e),n=o(t),s=V.get(n);V.set(t),X.delete(n),void 0!==s&&W(s,t)||Qe(t)}const v=await de.getReadStates();if(!r())return;for(const e of v)"channel"===e.conversationType&&re(e.conversationId),Y.set(e);const f=pe,p=await de.getDrafts();if(!r())return;if(f!==pe)return;for(const t of p){if(!r())return;if(!Number.isFinite(t.updatedAt)||t.updatedAt<0)throw new Error(`草稿 updatedAt 非法:${t.updatedAt}`);const n=Ut(t.ref,t,t.updatedAt);if(_e(n.ref)){try{if(await de.deleteDraft(n.ref),!r())return}catch(e){if(!r())return;Je("清理已删会话残留草稿失败",e)}continue}const o=e(n.ref);ve.set(o,Math.max(ve.get(o)??0,n.updatedAt));const s=Z.get(n.ref);null!==s&&s.updatedAt===n.updatedAt&&Kt(s,n)||(Z.set(n),U.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}))}for(const n of l){if(!r())return;const s=o(n),i=(await de.getMessages(s,{limit:50})).filter(n=>e(t(n))===e(s)).filter(qe);if(!r())return;const a=[];if(Gt(i.map(e=>{const t=qt(T(e));return t!==e&&a.push(t),t}),r),!r())return;if(a.length>0)try{if(await de.saveMessages(a),!r())return}catch(e){if(!r())return;Je("本地消息修复态落盘失败",e)}if(!r())return;zt(s)}}catch(e){r()&&Je("本地历史回读失败",e)}finally{Se=!1,r()&&Ne("offline")}}},loadOlderMessages:async function(n,o){if(void 0===de)return[];try{const r=await de.getMessages(n,o),s="string"==typeof n?r.filter(qe):r.filter(o=>e(t(o))===e(n)).filter(qe),i=Se;let a;Se=!0;try{a=Gt(s)}finally{Se=i}return Se||Ne("offline"),a.map(e=>we(t(e),e.id)??e)}catch(e){return Je("加载更早消息失败",e),[]}},searchMessages:async function(n,o){const r=o.keyword?.trim()??"",s=o.contentTypes;if(""===r&&(void 0===s||0===s.length))return{results:[],exhausted:!0};const i=""===r?void 0:await w(r),a=e=>{const t=void 0===s||s.includes(e.contentType),n=void 0===i||null!==i.match(I(e));return t&&n},c=(e,t)=>e.sortKey<t.sortKey?1:e.sortKey>t.sortKey?-1:0,d=e=>function(e,t){const n=t?.match(I(e));return{message:e,ranges:n?.ranges.map(({start:e,end:t})=>[e,t])??[]}}(e,i);if(void 0===de)return(()=>{const e=z.getByConversation(n).filter(a).sort(c),t=(void 0===o.beforeSortKey?e:e.filter(e=>e.sortKey<o.beforeSortKey)).slice(0,o.limit),r=t.length<o.limit;return{results:t.map(d),exhausted:r,...r?{}:{nextBeforeSortKey:t.at(-1)?.sortKey}}})();let u;try{u=await de.searchMessages(n,{...void 0!==o.keyword?{keyword:o.keyword}:{},...void 0!==s?{contentTypes:s}:{},limit:o.limit,...void 0!==o.beforeSortKey?{beforeSortKey:o.beforeSortKey}:{}})}catch(e){throw Je("会话内搜索失败",e),e}const l=u.exhausted?void 0:u.nextBeforeSortKey,v=new Map(z.getByConversation(n).map(e=>[e.id,e])),f=/* @__PURE__ */new Map;for(const o of u.items){const r=Wt(o);e(t(r))===e(n)&&f.set(r.id,v.get(r.id)??r)}for(const e of v.values()){const t=void 0===o.beforeSortKey||e.sortKey<o.beforeSortKey,n=void 0===l||e.sortKey>=l;t&&n&&a(e)&&f.set(e.id,e)}return{results:[...f.values()].filter(a).sort(c).map(d),exhausted:u.exhausted,...u.exhausted?{}:{nextBeforeSortKey:u.nextBeforeSortKey}}},messageWindow:he,createMessageWindow:function(e={}){const t=ge(e);let n=!1;return{window:t,dispose(){n||(n=!0,t.reset(),me.delete(t))}}}}}export{J as createDomainState,j as defaultConversationUnreadMode,F as sumSessionsUnread};
1
+ import{encodeConversationKey as e,conversationRefFromMessage as t,conversationRefFromPinnedMessage as n,conversationRefFromSession as o}from"../conversation-identity.js";import{compareChannelReadPosition as r,getChannelReadOrder as s}from"../mapping/channel-read-position.js";import{computeSortKey as i,resolveMessageTimestamp as a,computeMessageSortKey as c,resolveMessageServerTime as d}from"../mapping/sort.js";import{collectTransferStatusBySerialNumber as u,synchronizeTransferStatusMessages as l,applyTransferStatusToBody as v}from"../mapping/transfer-status.js";import{parseChannelSyncCheckpoint as f,channelSyncCheckpointKey as p}from"../sync/channel-sync-checkpoint.js";import{parseConversationDeletionBoundary as y,isAfterConversationDeletion as m,captureConversationDeletionBoundary as g}from"./conversation-deletion-boundary.js";import{createDraftStore as h}from"./draft-store.js";import{rollbackMessageReaction as C,applyMessageReaction as w}from"./message-reactions.js";import{createMessageStore as I}from"./message-store.js";import{createMessageWindowStore as T}from"./message-window-store.js";import{createPinnedMessageStore as M}from"./pinned-message-store.js";import{createReadStore as S}from"./read-store.js";import{sortSessions as b}from"./session-sort.js";import{createSessionStore as E}from"./session-store.js";import{createImTextSearchMatcher as K,extractSearchText as U}from"../mapping/search-text.js";import{normalizeStoredMessageContent as A,LOCAL_MEDIA_ERROR_CODE as R,failInterruptedUpload as P}from"../mapping/stored-message.js";import{isMessageVisibleInTimeline as N,lastMessageSummaryEqual as x,sessionFromMessage as $}from"../mapping/session-mapper.js";import{isMessageEqual as D,isMessageRecoveryBodyEqual as B,dedupeById as j,mergeMessage as F}from"../mapping/merge.js";import{newClientMessageId as L}from"../mapping/message-id.js";import{backfillGroupMention as _}from"../mapping/group-message-mapper.js";import{isConversationUnreadMessage as k}from"../mapping/unread-divider.js";function O(e){return"direct"===e||"robot"===e||"customerService"===e?"local":"server"}function H(e,t){const n=t?.includeMuted??!1;let o=0;for(const t of e)!n&&t.muted||(o+=t.unreadCount>0?t.unreadCount:!0===t.manuallyUnread?1:0);return o}const z="im:deleted-conversations",q="im:terminated-conversations",G="im:membership-reset-sort-keys",W="im:pending-message-reactions",J="im:transfer-status-records",Q=["sendMessages","mentionAll","editProfile","manageMembers","manageAdmins","moderateMessages","manageMute","dismissChannel","transferOwnership"];function V(e,t){return e===t||void 0!==e&&void 0!==t&&Q.every(n=>e[n]===t[n])}function X(e,t){return e===t||void 0!==e&&void 0!==t&&e.role===t.role&&e.baseState===t.baseState&&e.resolvedState===t.resolvedState&&e.allMembersMuted===t.allMembersMuted&&e.currentUserMuted===t.currentUserMuted&&e.mutePeriod===t.mutePeriod}function Y(e,t){return e.id===t.id&&e.type===t.type&&e.title===t.title&&e.avatar===t.avatar&&x(e.lastMessageSummary,t.lastMessageSummary)&&e.timestamp===t.timestamp&&e.unreadCount===t.unreadCount&&(e.manuallyUnread??!1)===(t.manuallyUnread??!1)&&(e.mentionUnreadCount??0)===(t.mentionUnreadCount??0)&&e.pinned===t.pinned&&e.muted===t.muted&&e.topTime===t.topTime&&e.lastMessageSendState===t.lastMessageSendState&&e.lastMessageReceipt===t.lastMessageReceipt&&e.readCursor===t.readCursor&&e.groupState===t.groupState&&e.channelState===t.channelState&&V(e.channelPermissions,t.channelPermissions)&&X(e.channelAccessSnapshot,t.channelAccessSnapshot)&&e.sendDisabledReason===t.sendDisabledReason}function Z(x){const Q=I({getSelfId:x.getSelfId}),Z=/* @__PURE__ */new Map,ee=/* @__PURE__ */new Map,te=E(),ne=E(),oe=S(),re=h(),se=M(),ie=/* @__PURE__ */new Map,ae=/* @__PURE__ */new Map;let ce=0;function de(e){ae.set(e,++ce)}let ue=1;const le=/* @__PURE__ */new Set,ve=/* @__PURE__ */new Map,fe=/* @__PURE__ */new Set,pe=/* @__PURE__ */new Map,{storage:ye}=x;let me=Promise.resolve();const ge=/* @__PURE__ */new Map,he=/* @__PURE__ */new Map,Ce=/* @__PURE__ */new Map;let we=0;const Ie=x.unreadMode??O,Te=/* @__PURE__ */new Set;function Me(e={}){const t=T({storage:ye,loadOlderFromRemote:x.loadOlderFromRemote,loadNewerFromRemote:x.loadNewerFromRemote,shouldIncludeMessage:Ze,normalizeStoredUpload:Zt,...e});return Te.add(t),t}const Se=Me();function be(e,t){let n;for(const o of Te){const r=o.list().find(n=>n.id===e&&n.conversationId===t);if(void 0!==r){if(void 0!==n&&n.conversationType!==r.conversationType)throw new Error(`裸 conversationId 存在多类型消息歧义:${t}`);n=r}}return n}function Ee(e,t){const n=Q.get(t,e);if(n?.conversationId===e.conversationId&&n.conversationType===e.conversationType)return n;for(const n of Te){const o=n.list().find(n=>n.id===t&&n.conversationId===e.conversationId&&n.conversationType===e.conversationType);if(void 0!==o)return o}}function Ke(e,n){const o=Ee(t(e),e.id);void 0===o||Q.has(e.id,e)||Q.upsert(o);const r=Q.upsert(e,n);return{...r,previous:o,changed:void 0===o?r.changed:!D(o,r.message)}}function Ue(e){const t=new Map(Q.getByConversation(e).map(e=>[e.id,e]));for(const n of Te)if(Ae(n,e))for(const o of n.list())o.conversationType!==e.conversationType||o.conversationId!==e.conversationId||t.has(o.id)||t.set(o.id,o);return[...t.values()].sort((e,t)=>e.sortKey.localeCompare(t.sortKey))}function Ae(t,n){const o=t.info();return void 0===o.conversation?o.conversationId===n.conversationId:e(o.conversation)===e(n)}let Re=!1;function Pe(t){return`${e(t.conversation)}\0${t.parentMessageId}`}function Ne(){if(void 0===ye||Re)return;const e=[...Z.values()].flat();It(()=>ye.setMeta(W,e)).catch(e=>nt("保存待处理 Reaction 失败",e))}function xe(e){const t=e.body.transfer;if("transfer"!==e.contentType||void 0===t)return e;const n=ee.get(t.serialNumber);if(void 0===n||0!==t.status&&0===n.status)return e;const o={...t,status:n.status,...1===n.status&&void 0!==n.occurredTime?{receiveTime:n.occurredTime}:{},...2===n.status||3===n.status?{returnTime:n.occurredTime??t.returnTime}:{}};return t.status===o.status&&t.receiveTime===o.receiveTime&&t.returnTime===o.returnTime&&t.isRead===o.isRead?e:{...e,body:{transfer:v(t,o)}}}function $e(t,n){const o=`${e(t)}\0${n}`;return!!Z.delete(o)&&(Ne(),!0)}function De(t){const n=`${e(t)}\0`;let o=!1;for(const e of Z.keys())e.startsWith(n)&&(Z.delete(e),o=!0);return o&&Ne(),o}function Be(e,t){const n=Ee(e.conversation,e.parentMessageId);if(void 0===n){const t=Pe(e),n=Z.get(t)??[];return n.some(t=>t.id===e.id)?"duplicate":(Z.set(t,[...n,e]),Ne(),"pending")}if(yt(n),void 0!==n.recalled||void 0!==n.deletedForEveryone)return"duplicate";const o=w(n.reactions,e,x.getSelfId?.()??"");return o===n.reactions?"duplicate":(nn([{...n,reactions:o}],t),"applied")}function je(n,o){const r=t(n),s=`${e(r)}\0${n.id}`,i=Z.get(s);if(void 0!==i){Z.delete(s),Ne();for(const e of i)Be(e,o)}}function Fe(e){for(const t of[...Z.values()]){const n=t[0];if(void 0===n)continue;const o=Ee(n.conversation,n.parentMessageId);void 0!==o&&(void 0!==o.recalled||void 0!==o.deletedForEveryone?$e(n.conversation,n.parentMessageId):je(o,e))}}let Le=0;const _e=/* @__PURE__ */new Map,ke=/* @__PURE__ */new Map,Oe=/* @__PURE__ */new Map,He=/* @__PURE__ */new Map,ze=/* @__PURE__ */new Map;function qe(t){return e(t)}function Ge(e){return We(e)||le.has(qe(e))||le.has(e.conversationId)}function We(e){return fe.has(qe(e))||fe.has(e.conversationId)}function Je(t,n={}){return(!0===n.includeRestored||Ge(t))&&!We(t)&&ve.has(e(t))}function Qe(){return[...le,...ve.values()]}function Ve(e){const t=le.delete(qe(e)),n=le.delete(e.conversationId);return t||n}function Xe(e){const t=Ve(e),n=fe.delete(qe(e)),o=fe.delete(e.conversationId);return{deleted:t,terminal:n||o}}function Ye(e,t){if(""===t||"system"!==e.contentType)return!1;const n=e.body.system;return!0===n?.targetUserIds?.includes(t)&&("group"===e.conversationType?"group_member_joined"===n.eventType||"group_member_invited"===n.eventType:"channel"===e.conversationType&&("channel_member_joined"===n.eventType||"channel_member_invited"===n.eventType||"channel_created"===n.eventType))}function Ze(n){const o=t(n);if(We(o)||Ge(o)&&void 0===ne.get(o))return!1;if("group"!==o.conversationType)return!0;const r=pe.get(e(o));return void 0===r||n.sortKey>=r}function et(t){const n=e(t),o=(ke.get(n)??0)+1;return ke.set(n,o),o}function tt(t){const n=e(t),o=(_e.get(n)??0)+1;return _e.set(n,o),o}function nt(e,t){x.emitter.emit({type:"error",error:{scope:"storage",message:e,cause:t}})}function ot(e){x.emitter.emit({type:"session:updated",session:e,conversation:o(e)})}const rt=/* @__PURE__ */new Set,st=/* @__PURE__ */new Set,it=/* @__PURE__ */new Map,at=/* @__PURE__ */new Map;let ct=0,dt=Promise.resolve(),ut=0,lt=Promise.resolve(),vt=0;const ft=/* @__PURE__ */new Map;let pt;function yt(n){const o=e(t(n));pt?.keys.has(o)&&pt.messages.set(`${o}\0${n.id}`,n)}function mt(t){const n=e(t);ft.set(n,(ft.get(n)??0)+1)}function gt(e){return pt?.writes.push(e),void 0!==pt&&e.catch(()=>{}),e}async function ht(e){const t=(await Promise.allSettled(e)).find(e=>"rejected"===e.status);if(void 0!==t)throw t.reason}function Ct(e){const t=lt.then(e);return lt=t.then(()=>{},()=>{}),t}function wt(t,n){const o=vt,r=t.map(t=>[e(t),ft.get(e(t))??0]);return()=>o===vt&&n()&&r.every(([e,t])=>(ft.get(e)??0)===t)}function It(e){const t=0===ut?(()=>{try{return e()}catch(e){return Promise.reject(e)}})():dt.then(e),n=t.then(()=>{},()=>{});rt.add(n),n.finally(()=>rt.delete(n));for(const e of st)e.writes.push(t);return gt(t)}function Tt(e){ut+=1;const t=Promise.all([...rt]),n=dt.then(()=>t).then(e);return dt=n.then(()=>{},()=>{}),dt.finally(()=>{ut-=1}),gt(n)}function Mt(e){const t=e.body.system;if(void 0===t?.pinnedMessageAction)return e;const{pinnedMessageAction:n,...o}=t;return{...e,body:{...e.body,system:o}}}function St(n){if(void 0!==ye&&!Re&&0!==n.length){for(const o of st)for(const r of n)o.messages.add(`${e(t(r))}\0${r.id}`);It(()=>ye.saveMessages(n.map(Mt))).catch(e=>nt("消息落盘失败",e))}}function bt(e){const{lastMessageSendState:t,manuallyUnread:n,...o}=e;return o}function Et(t){if(void 0!==ye&&!Re){for(const n of st)n.sessions.add(e(o(t)));It(()=>ye.saveSessions([bt(t)])).catch(e=>nt("会话落盘失败",e))}}function Kt(e,t,n){if(void 0===ye||Re)return;const o=++ct;it.set(e,{version:o,persist:()=>Kt(e,t,n)});for(const t of st)t.metadata.add(e);const r=at.get(e),s=It(()=>void 0===r?ye.setMeta(e,t()):r.then(()=>ye.setMeta(e,t()))),i=s.then(()=>{},()=>{});at.set(e,i),i.then(()=>{at.get(e)===i&&at.delete(e)}),s.then(()=>{it.get(e)?.version===o&&it.delete(e)},e=>nt(n,e))}function Ut(){Kt(z,Qe,"删除会话标记保存失败")}function At(){Kt(q,()=>[...fe],"成员资格终止标记保存失败")}function Rt(){Kt(G,()=>[...pe.entries()],"重新入群的历史起点保存失败")}function Pt(t){if(void 0!==ye&&!Re){for(const n of st)void 0!==t.conversationType&&n.reads.add(e({conversationType:t.conversationType,conversationId:t.conversationId}));It(()=>ye.saveReadState(t)).catch(e=>nt("已读态落盘失败",e))}}function Nt(t){if(e(t),"supergroup"===t.conversationType)throw new Error("supergroup 草稿未实现,不得 fallback 到其他会话类型")}function xt(e){return Nt(e),Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId})}function $t(e,t,n){if(Nt(e),"string"!=typeof t.text)throw new TypeError("草稿 text 必须是字符串");if(void 0!==t.attachments&&t.attachments.length>0)throw new Error("草稿附件尚未支持:attachments 只接受空集合");if(void 0!==t.mentions&&!Array.isArray(t.mentions))throw new TypeError("草稿 mentions 必须是数组");const o=(t.mentions??[]).map(e=>{if("string"!=typeof e.userId||""===e.userId.trim()||"string"!=typeof e.displayName)throw new TypeError("草稿 mention 必须包含非空 userId 与字符串 displayName");return Object.freeze({userId:e.userId,displayName:e.displayName})}),r=Object.freeze({conversationType:e.conversationType,conversationId:e.conversationId});return Object.freeze({ref:r,text:t.text,mentions:Object.freeze(o),...void 0===t.replyToMessageId?{}:{replyToMessageId:t.replyToMessageId},attachments:Object.freeze([]),updatedAt:n})}function Dt(e,t){return e.text===t.text&&e.replyToMessageId===t.replyToMessageId&&e.mentions.length===t.mentions.length&&e.mentions.every((e,n)=>{const o=t.mentions[n];return void 0!==o&&e.userId===o.userId&&e.displayName===o.displayName})}function Bt(t,n){Nt(t);const o=e(t),r=(ge.get(o)??Promise.resolve()).catch(()=>{}).then(n),s=r.then(()=>{},()=>{});return ge.set(o,s),s.finally(()=>{ge.get(o)===s&&ge.delete(o)}),r}async function jt(t,n){const o=xt(t),r=e(o);if(void 0!==n&&(!Number.isFinite(n)||n<0))throw new Error(`草稿 expectedUpdatedAt 非法:${n}`);const s=we,i=Ce.get(r)??0;return await Bt(o,async()=>{const e=re.get(o);if(null===e||void 0!==n&&e.updatedAt!==n)return!1;if(void 0!==ye&&await ye.deleteDraft(o),s!==we||i!==(Ce.get(r)??0))throw new Error("草稿状态已失效,拒绝过期清理回灌内存");return re.delete(o),x.emitter.emit({type:"draft:cleared",conversation:o}),!0})}function Ft(t,n,o,r,s){const i=mn(t);if(void 0===i)return;const a={...i,...void 0===s||s===ke.get(e(t))?{title:n,avatar:o??i.avatar}:{},...void 0!==r?{muted:r}:{}};Y(i,a)||gn(a)}function Lt(t,n){const o=x.profile;if(void 0===o)return Promise.resolve(null);const r={conversationType:"direct",conversationId:t},s=e(r),i=ze.get(t);if(!0!==n?.forceRefresh&&void 0!==i&&i.revision===_e.get(s))return i.promise;const a=Le,c=tt(r),d=et(r),u=(async()=>{const e=await o.getUserProfile(t,n);if(null!==e&&e.id===t&&a===Le&&c===_e.get(s)){const n=e.remark?.trim()?e.remark:e.nickname||t;Ft(r,n,e.avatar??"",e.muted,d)}return e})().finally(()=>{ze.get(t)?.promise===u&&ze.delete(t)});return ze.set(t,{revision:c,promise:u}),u}async function _t(t,n){const{conversationId:o,conversationType:r}=t;if("direct"===r){try{await Lt(o,!0===n?.force?{forceRefresh:!0}:void 0)}catch(e){x.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}})}return!1}const s=e(t),i=!0===n?.force;if(!i&&(He.has(s)||Oe.has(s)))return!1;const a=Le,c=tt(t),d=et(t);i&&He.set(s,c);const{profile:u,channelProfile:l}=x,v=i?{forceRefresh:!0}:void 0;try{if("group"===r){if(void 0===u)return!1;const e=await u.getGroupProfile(o,v);if(a!==Le||c!==_e.get(s))return!1;null!==e&&(Ft(t,e.name,e.avatar??"",e.muted,d),3===e.status&&yn({conversationType:"group",conversationId:o},"group_dismissed"),i&&x.emitter.emit({type:"profile:updated",profileType:"group",id:o}))}else if("channel"===r){if(void 0===l)return!1;const e=await l.getProfile(o,v);if(a!==Le||c!==_e.get(s))return!1;if(null!==e){Ft(t,e.name,e.avatar??"",e.muted,d);const r=mn(t)?.channelState,s="left"===r||"removed"===r||"dismissed"===r,a="left"===e.channelState||"removed"===e.channelState||"dismissed"===e.channelState;if(!0===n?.allowChannelRecovery&&s&&"dismissed"!==r&&"active"===e.channelState)return vn(o,"active",void 0,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}}),i&&x.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!0;const c=s&&(!a||"dismissed"===r||"dismissed"!==e.channelState);if(a&&!c)return yn({conversationType:"channel",conversationId:o},`channel_${e.channelState}`),i&&x.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}}),!1;if(!c){const t=e.permissions.sendMessages?void 0:`channel_${e.channelState}`;vn(o,e.channelState,t,{permissions:e.permissions,...void 0===e.accessSnapshot?{}:{snapshot:e.accessSnapshot}})}i&&x.emitter.emit({type:"channel-profile:updated",channelId:o,conversation:{conversationType:"channel",conversationId:o}})}}return!1}catch(e){return x.emitter.emit({type:"error",error:{scope:"http",message:"会话资料补齐失败",cause:e}}),!1}finally{i&&a===Le&&He.get(s)===c&&He.delete(s)}}function kt(e){return k(e,x.getSelfId?.()??"")}function Ot(e){const t=oe.get(e);if(void 0===t||""===t.readCursor)return;const n="string"==typeof e?t.conversationType:e.conversationType;if("channel"===n){const o={conversationType:n,conversationId:"string"==typeof e?e:e.conversationId};return Ue(o).find(e=>e.extensions?.historyCursor===t.readCursor)?.sortKey??t.readCursorSortKey}const o="string"==typeof e?Q.getByConversation(e).find(e=>e.id===t.readCursor):Ee(e,t.readCursor);return o?.sortKey??t.readCursorSortKey}function Ht(e,t){let n=0;for(const o of Q.getByConversation(e))N(o)&&kt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function zt(e){const t=x.getSelfId?.();if(void 0===t||""===t||e.senderId===t)return!1;const{mention:n}=e;return void 0!==n&&(n.atAll||n.atUserIds.includes(t))}function qt(e,t){let n=0;for(const o of Q.getByConversation(e))!0!==o.readBySelf&&zt(o)&&(void 0===t||o.sortKey>t)&&(n+=1);return n}function Gt(e,t=!0){const n=void 0===e.conversationType?te.get(e.conversationId):void 0,o=void 0===e.conversationType&&void 0!==n?{...e,conversationType:n.type}:e,r=void 0===o.conversationType?o.conversationId:{conversationType:o.conversationType,conversationId:o.conversationId},s=oe.get(r);if("channel"===o.conversationType&&de(o.conversationId),oe.set(o),t&&Pt(o),void 0===s||s.readCursor!==o.readCursor||s.readCursorSortKey!==o.readCursorSortKey||s.unreadCount!==o.unreadCount||(s.manuallyUnread??!1)!==(o.manuallyUnread??!1)){if(void 0===o.conversationType)return void x.emitter.emit({type:"error",error:{scope:"storage",message:`已读状态缺少复合身份,拒绝发布 read:updated(conversationId=${o.conversationId})`}});x.emitter.emit({type:"read:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},readCursor:o.readCursor,unreadCount:o.unreadCount,...!0===o.manuallyUnread?{manuallyUnread:!0}:{}})}}function Wt(n,o){if(void 0===n||n.sortKey===o.sortKey)return;const r=t(o),s=oe.get(r),i="channel"===o.conversationType?o.extensions?.historyCursor:void 0,a="direct"===o.conversationType||"group"===o.conversationType||"robot"===o.conversationType||"customerService"===o.conversationType;void 0!==s&&(a&&s.readCursor===o.id||"string"==typeof i&&""!==i&&s.readCursor===i||s.readCursorSortKey===n.sortKey)&&Gt({...s,readCursorSortKey:o.sortKey});const c=e(r);"group"===o.conversationType&&pe.get(c)===n.sortKey&&(pe.set(c,o.sortKey),Rt())}function Jt(e){const t=e?.channelAccessSnapshot?.role;return"owner"===t||"admin"===t}function Qt(e,t,n,o,r=mn(e)){const s=o??oe.get(e);if(void 0===t){if(void 0===r){if("string"==typeof e||void 0===s||s.unreadCount<=0)return;return{id:e.conversationId,type:e.conversationType,title:"",lastMessagePreview:"",timestamp:0,unreadCount:s.unreadCount,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor,pinned:!1,muted:!1}}const t={...r,..."clear"===n?{lastMessagePreview:"",timestamp:0}:{},...void 0===s?{}:{unreadCount:s.unreadCount,manuallyUnread:s.manuallyUnread,mentionUnreadCount:s.mentionUnreadCount,readCursor:s.readCursor||r.readCursor}};return"clear"===n&&(delete t.lastMessageSummary,delete t.lastMessageSenderId,delete t.lastMessageSystemEvent,delete t.lastMessageSystemTargetsSelf,delete t.lastMessageMention,delete t.lastMessageRecalled,delete t.lastMessageDeletedForEveryone,delete t.lastMessageSendState,delete t.lastMessageReceipt),t}const i=s?.unreadCount??r?.unreadCount??0,a=void 0===s?r?.manuallyUnread:s.manuallyUnread,c=$(t,{unreadCount:i,mentionUnreadCount:s?.mentionUnreadCount??r?.mentionUnreadCount??0,selfId:x.getSelfId?.(),showChannelModerationDeleted:Jt(r)});return void 0===r?{...c,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||c.readCursor}:{...c,title:r.title||c.title,avatar:r.avatar??c.avatar,pinned:r.pinned,muted:r.muted,topTime:r.topTime,...void 0===a?{}:{manuallyUnread:a},readCursor:(s?.readCursor??"")||r.readCursor,groupState:r.groupState,channelState:r.channelState,channelPermissions:r.channelPermissions,channelAccessSnapshot:r.channelAccessSnapshot,sendDisabledReason:r.sendDisabledReason}}function Vt(e,t){if(void 0===e)return;const n=te.get({conversationType:e.type,conversationId:e.id});void 0!==n&&Y(n,e)||(te.set(e),ne.delete({conversationType:e.type,conversationId:e.id}),ot(e),t&&Et(e),""===e.title&&_t({conversationType:e.type,conversationId:e.id}))}function Xt(e,t,n="preserve",o=mn(e)){const r=t.findLast(e=>function(e,t){return!!N(e)&&("channel"!==e.conversationType||void 0===e.deletedForEveryone||Jt(t))}(e,o)),s="string"==typeof e?o?.type:e.conversationType;return Qt(e,r,void 0===r&&"channel"===s&&!Jt(o)&&(t.some(e=>void 0!==e.deletedForEveryone)||"channel-moderation-deleted"===o?.lastMessageSummary?.kind||void 0!==o?.lastMessageDeletedForEveryone)?"clear":n,void 0,o)}function Yt(e,t=!1){(t||void 0!==te.get(e))&&Vt(Xt(e,Q.getByConversation(e)),!0)}function Zt(e){if("uploading"!==e.status&&("failed"!==e.status||e.failure?.code!==R))return e;const t=Q.get(e.id,e);return void 0!==t&&t.conversationType===e.conversationType&&t.conversationId===e.conversationId?t:P(A(e))}function en(n,o=()=>!0){const r=[],s=j(n,x.getSelfId?.()??"").map(e=>{const t=Zt(e);let n={...t,sortKey:c(t)};if(n=A(n),"group"===n.conversationType&&"text"===n.contentType){const e=_(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return xe(n)}),i=/* @__PURE__ */new Map;for(const n of s){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);i.set(e(o),o)}const a=[...i.values()].flatMap(e=>Ue(e)),d=l(a,s),u=new Set(s.map(e=>e.id));for(const e of d){if(!o())break;const{previous:n,message:s,isNew:i,changed:a}=Ke(e);if(Wt(n,s),void 0!==n&&a)for(const e of Te){if(!o())return r;e.list().some(e=>e.id===s.id&&e.conversationType===s.conversationType&&e.conversationId===s.conversationId)&&e.applyIncoming([s])}if(!o())return r;i?x.emitter.emit({type:"message:received",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}):a&&x.emitter.emit({type:"message:updated",message:s,conversation:t(s),source:"offline",channelLifecycleEffects:!1}),u.has(s.id)&&r.push(s)}return r}function tn(e){const t=Zt(e);let n={...t,sortKey:c(t)};if(n=A(n),"group"===n.conversationType&&"text"===n.contentType){const e=_(n.body.text??"",n.mention);void 0!==e&&(n.mention=e)}return xe(n)}function nn(n,o,r={}){const s=x.getSelfId?.()??"";if("offline"===o&&!0!==r.backfillOnly){let o=!1;for(const r of n){if(r.senderId===s||!N(r)||void 0!==r.recalled||void 0!==r.deletedForEveryone)continue;const n=t(r),i=ve.get(e(n));void 0!==i&&!We(n)&&m(r,i)&&Ve(n)&&(o=!0)}o&&Ut(),n=n.filter(n=>{const o=ve.get(e(t(n)));return void 0===o||m(n,o)||void 0!==Ee(t(n),n.id)})}if("live"===o){let i=!1,a=!1;for(const c of n){const n=t(c);if(Ye(c,s)){const t=Xe(n);t.deleted&&(i=!0),t.terminal&&("group"===n.conversationType?(pe.set(e(n),c.sortKey),Rt()):"channel"===n.conversationType&&pe.delete(e(n)),x.diagnostics?.record("info","core","conversation","membership-termination-cleared",()=>({conversation:n,data:{source:o,eventType:c.body.system?.eventType,groupHistoryLowerBoundApplied:"group"===n.conversationType}})),a=!0)}else""!==s&&c.senderId===s&&!0!==r.newOutgoing||We(n)||!Ve(n)||(i=!0)}i&&Ut(),a&&At()}const i=!0===x.diagnostics?.isEnabled("debug","conversation")?/* @__PURE__ */new Map:void 0,a=(n,o)=>{if(void 0===i)return;const r=t(n),s=e(r),a=i.get(s)??{ref:r,tombstone:0,groupLowerBound:0};"tombstone"===o?a.tombstone+=1:a.groupLowerBound+=1,i.set(s,a)},c=le.size>0||fe.size>0?n.filter(e=>{const n=t(e),o=!Ge(n)||!0===r.backfillOnly&&void 0!==ne.get(n)&&!We(n);return o||a(e,"tombstone"),o}):n,d=function(n){const o=/* @__PURE__ */new Map;if(0===pe.size)return o;for(const r of j(n,x.getSelfId?.()??"")){if("group"!==r.conversationType)continue;const n=t(r),s=e(n),i=pe.get(s);if(void 0===i)continue;const a=Ee(n,r.id);if(void 0===a||a.sortKey!==i)continue;const c=F(a,r,x.getSelfId?.()??"");c.sortKey!==i&&(pe.set(s,c.sortKey),o.set(s,c.id))}return o.size>0&&Rt(),o}(c),u=n=>d.get(e(t(n)))===n.id,v=pe.size>0?c.filter(e=>{const t=u(e)||Ze(e);return t||a(e,"groupLowerBound"),t}):c,f=0===d.size?v:[...v.filter(u),...v.filter(e=>!u(e))];for(const e of i?.values()??[])x.diagnostics?.record("debug","core","conversation","membership-filter-dropped",()=>({conversation:e.ref,data:{source:o,tombstoneDroppedCount:e.tombstone,groupHistoryLowerBoundDroppedCount:e.groupLowerBound}}));const p=/* @__PURE__ */new Map,y=/* @__PURE__ */new Map,g=/* @__PURE__ */new Map,h=/* @__PURE__ */new Map,C=/* @__PURE__ */new Map,w=/* @__PURE__ */new Set,I=j(f,s).map(xe),T=/* @__PURE__ */new Map;for(const n of I){if("transfer"!==n.contentType||void 0===n.body.transfer)continue;const o=t(n);T.set(e(o),o)}const M=[...T.values()].flatMap(e=>Ue(e)),S=l(M,I),b=[],E=[];for(const n of S){if("channel"===n.conversationType&&pt?.keys.has(e(t(n)))&&!pt.current())continue;const{previous:s,message:i,isNew:a,changed:c}=Ke(n,{authoritativeFailure:!0===r.authoritativeOutboxFailure});if(yt(i),!0===r.backfillOnly&&!0===r.refreshSessionSummary){const n=t(i);p.set(e(n),n)}if(!a&&!c)continue;Wt(s,i);for(const e of Te)e.applyIncoming([i]);a?x.emitter.emit({type:"message:received",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects}):x.emitter.emit({type:"message:updated",message:i,conversation:t(i),source:o,channelLifecycleEffects:!0===r.applyChannelLifecycleEffects});const d=t(i);if(!a&&void 0!==s&&!0!==s.readBySelf&&!0===i.readBySelf){const t=Ot(d),n=void 0===t||s.sortKey>t,o=e(d);n&&N(s)&&kt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&g.set(o,(g.get(o)??0)-1),n&&zt(s)&&void 0===s.recalled&&void 0===s.deletedForEveryone&&C.set(o,(C.get(o)??0)-1)}We(d)||(b.push(i),p.set(e(d),d),a&&!0!==r.backfillOnly&&E.push(i))}const K=/* @__PURE__ */new Map;for(const n of E){const r=t(n),s=e(r);kt(n)&&w.add(s),K.has(s)||K.set(s,Ot(r));const i=K.get(s),a=void 0===i||n.sortKey>i;if(N(n)&&a&&kt(n)&&!0!==n.readBySelf&&void 0===n.recalled&&void 0===n.deletedForEveryone){const e=Ie(n.conversationType);("local"===e||"server"===e&&"live"===o)&&y.set(s,(y.get(s)??0)+1)}a&&!0!==n.readBySelf&&zt(n)&&void 0===n.recalled&&void 0===n.deletedForEveryone&&h.set(s,(h.get(s)??0)+1)}for(const t of p.values()){if(!0===r.backfillOnly){!0===r.refreshSessionSummary&&Yt(t);continue}const n=e(t),o=y.get(n)??0,s=h.get(n)??0,i=g.get(n)??0,a=C.get(n)??0,c=w.has(n),d=oe.get(t);if(o>0||s>0||c||void 0!==d&&(0!==i||0!==a)){const e=d??{...t,readCursor:"",unreadCount:0},n={...e,unreadCount:Math.max(0,e.unreadCount+o+i),mentionUnreadCount:Math.max(0,(e.mentionUnreadCount??0)+s+a)};c&&delete n.manuallyUnread,Gt(n)}Yt(t,E.some(e=>e.conversationType===t.conversationType&&e.conversationId===t.conversationId&&N(e)))}St(b.filter(e=>void 0!==Ee(t(e),e.id)));for(const e of b)void 0===e.recalled&&void 0===e.deletedForEveryone?je(e,o):$e(t(e),e.id)}function on(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=Ee(o,t),s=Q.getByConversation(o).findLast(e=>"direct_contact_established"===e.body.system?.eventType);if(void 0!==r&&void 0!==s&&a(s)>=a(r))return;const c=`${t}:contact-required`;if(void 0!==Q.get(c,o))return;nn([{id:c,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_required",targetUserIds:[e],action:{type:"request-contact",userId:e}}},createdAt:n,sortKey:i(n,c),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")}const rn=/* @__PURE__ */new Map;let sn=0;function an(e){const t=oe.get(e);if(!0!==t?.manuallyUnread)return!1;const n={...t};return delete n.manuallyUnread,Gt(n),Yt(e),!0}function cn(e,t,n,r,s){const i="string"==typeof e?e:e.conversationId,a=mn(e),c="string"==typeof e?void 0===a?void 0:o(a):e;if(void 0!==a&&"server"!==Ie(a.type))return void x.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 不应用于本地未读会话(conversationId=${i}, type=${a.type}),已忽略`}});if(!Number.isFinite(t))return void x.emitter.emit({type:"error",error:{scope:"unknown",message:`applyServerUnread 收到非法未读数(conversationId=${i}, count=${t}),已忽略`}});"channel"===c?.conversationType&&ie.delete(i);const d=oe.get(e);let u=d?.readCursor??"",l=d?.readCursorSortKey;const v=void 0===n||""===n?void 0:void 0===c?Q.getByConversation(i).find(e=>e.id===n)??be(n,i):Ee(c,n);void 0!==v&&v.conversationId===i&&(void 0===l||v.sortKey>l)&&(u=v.id,l=v.sortKey),void 0!==r&&(u=r),Gt({...void 0===c?{conversationId:i}:c,readCursor:u,readCursorSortKey:l,unreadCount:Math.max(0,Math.floor(t)),...t>0?{}:{manuallyUnread:d?.manuallyUnread},mentionUnreadCount:0===t||!1===s?0:!0===s?Math.max(1,d?.mentionUnreadCount??0):d?.mentionUnreadCount}),Yt(e,t>0&&void 0!==c&&!Ge(c))}function dn(e){const t=ie.get(e.conversation.conversationId);return t?.handle.transactionId===e.transactionId?t:void 0}function un(e,t,n,o=!1){const r=mn(e),s=Ee(e,t);if("channel"!==r?.type||"channel"!==s?.conversationType||s.conversationId!==e.conversationId||s.extensions?.historyCursor!==n)throw new Error(`CHANNEL 已读位置不可信(channelId=${e.conversationId}, messageId=${t})`);o||ie.delete(e.conversationId);const i=oe.get(e),a=void 0===i?r.mentionUnreadCount:i.mentionUnreadCount;Gt({...e,readCursor:n,readCursorSortKey:s.sortKey,unreadCount:i?.unreadCount??r.unreadCount,...void 0===a?{}:{mentionUnreadCount:a}}),Yt(e)}function ln(e,t,n){const o=e.conversation,r=o.conversationId,i=dn(e);if(void 0===i)throw new Error(`CHANNEL 乐观已读事务已失效(channelId=${r})`);const a=Ee(o,t);if(void 0===a||a.conversationId!==r||"channel"!==a.conversationType)throw new Error(`CHANNEL 乐观已读消息不可信(channelId=${r}, messageId=${t})`);if(a.extensions?.historyCursor!==n)throw new Error(`CHANNEL 乐观已读 cursor 与消息不一致(channelId=${r}, messageId=${t})`);i.steps.at(-1)?.readCursor!==n&&(i.steps.push({readCursor:n,messageId:t,...s(a)}),un(o,t,n,!0))}function vn(t,n,o,r){const s={conversationType:"channel",conversationId:t},i=e(s);if(Ge(s)&&void 0===ne.get(s)&&!Je(s))return;const a=mn(s);if(void 0===a){tt(s),He.delete(i);return void gn({id:t,type:"channel",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,channelState:n,channelPermissions:r?.permissions,channelAccessSnapshot:r?.snapshot,sendDisabledReason:o})}if("channel"!==a.type)throw new Error(`setChannelRestriction: 会话 ${t} 类型为 ${a.type},拒绝写入 CHANNEL 状态`);tt(s),He.delete(i);const c=r?.permissions,d=r?.snapshot;if(a.channelState===n&&a.sendDisabledReason===o&&V(a.channelPermissions,c)&&X(a.channelAccessSnapshot,d))return void(void 0!==te.get(s)&&Yt(s));const u={...a,channelState:n,channelPermissions:c,channelAccessSnapshot:d,sendDisabledReason:o};void 0!==te.get(s)?gn(Xt(s,Q.getByConversation(s),"preserve",u)):gn(u)}async function fn(e,t){if(""===t.trim())throw new Error("本机删除消息需要非空 messageId");const n=()=>{if(se.isPinnedMessage(e,t))throw Object.assign(new Error("置顶消息必须先取消置顶才能删除"),{code:"IM_MESSAGE_PINNED"})};n();const o=Ee(e,t),r=Q.get(t,e),s=void 0!==r&&r.conversationType===e.conversationType&&r.conversationId===e.conversationId,i=Q.getByConversation(e).filter(e=>e.id!==t),a=void 0===te.get(e)?void 0:Xt(e,i,"clear"),c=void 0===a?void 0:bt(a);function d(e){return void 0!==e&&(void 0===r||!D(r,e))}const u=void 0===ye?{deleted:!1,superseded:!1}:await Tt(async()=>{n();const r=Ee(e,t)??o??await ye.getMessage(e,t)??void 0;if(n(),d(Q.get(t,e)))return{deleted:!1,superseded:!0};const s=await ye.deleteMessage(e,t,c);if(se.isPinnedMessage(e,t)){const o=Ee(e,t)??r;void 0!==o&&await ye.saveMessages([Mt(o)]);const s=te.get(e);return void 0!==s&&await ye.saveSessions([bt(s)]),n(),{deleted:!1,superseded:!0}}return{deleted:s,superseded:!1}});if(u.superseded||d(Q.get(t,e)))return!1;const l=s&&Q.delete(e,t);let v=!1;for(const n of Te)v=n.removeMessage(e,t)||v;if(!u.deleted&&!l&&!v)return!1;const f=void 0===te.get(e)?void 0:Xt(e,Q.getByConversation(e),"clear");return Vt(f,!1),void 0===f||void 0!==a&&Y(a,f)||Et(f),$e(e,t),x.emitter.emit({type:"message:removed",conversation:{...e},messageId:t,scope:"local-only"}),!0}function pn(t,o={}){const r="string"==typeof t?t:t.conversationId,s=te.get(t),i=se.get(t),a="string"==typeof t?void 0!==s?{conversationType:s.type,conversationId:r}:void 0===i?void 0:n(i):t;if(void 0===a)throw new Error(`裸 conversationId 无法确定删除类型:${r}`);if(et(a),Oe.delete(e(a)),"direct"===a.conversationType&&(tt(a),ze.delete(a.conversationId)),mt(a),"direct"===a.conversationType||"group"===a.conversationType||"channel"===a.conversationType)if(!0===o.terminal)ve.delete(e(a));else{const t=g(a,Ue(a),ve.get(e(a)));void 0!==t&&ve.set(e(a),t)}const c=Q.getByConversation(a).length;!function(t){const n=xt(t),o=e(n);Ce.set(o,(Ce.get(o)??0)+1),null!==re.get(n)&&(re.delete(n),x.emitter.emit({type:"draft:cleared",conversation:n})),Bt(n,async()=>{void 0!==ye&&await ye.deleteDraft(n)}).catch(e=>nt("删会话草稿失败",e))}(a),De(a),te.delete(t),ne.delete(t),"channel"===a.conversationType&&(de(a.conversationId),ie.delete(a.conversationId)),oe.delete(t),Q.deleteByConversation(t),se.clear(t);const d=qe(a);if(!0===o.terminal){fe.add(d);const e=pe.delete(d);le.delete(d),le.delete(r),e&&Rt(),x.diagnostics?.record("info","core","conversation","membership-terminated",()=>({conversation:a,data:{reason:o.terminalReason??"membership-terminated",removedMessageCount:c}}))}else le.add(d);for(const e of Te)Ae(e,a)&&e.reset();x.emitter.emit({type:"session:removed",conversationId:r,conversation:a}),Ut(),!0===o.terminal&&At(),void 0!==ye&&Tt(async()=>{await ht([ye.deleteConversationMessages(a),ye.deleteSession(a),ye.deleteReadState(a),ye.removePinnedMessage(a)])}).catch(e=>nt("删除会话持久数据失败",e))}function yn(e,t){pn(e,{terminal:!0,terminalReason:t})}function mn(e){if("string"==typeof e){const t=[...te.getAll(),...ne.getAll()].filter(t=>t.id===e);if(t.length>1)throw new Error(`裸 conversationId 存在多类型歧义:${e}`);return t[0]}return te.get(e)??ne.get(e)}function gn(e){const t=o(e);void 0!==te.get(t)?(te.set(e),ot(e),Et(e)):(ne.set(e),x.emitter.emit({type:"conversation-context:updated",conversation:t}))}async function hn(n,o){let r=await ye.getMessages(n,{limit:50});const s=o=>o.filter(o=>e(t(o))===e(n)&&Ze(o)),a=s(r);if(!["direct","group","channel"].includes(n.conversationType)||!o())return a;let c=g(n,a);for(;o()&&50===r.length;){const e=r[0].sortKey;if(void 0!==c&&e<i(c.serverTime,""))break;if(r=await ye.getMessages(n,{beforeSortKey:e,limit:50}),!o())return[];if(r.some(t=>t.sortKey>=e))throw new Error("会话本地历史游标没有向前推进");const t=s(r);c=g(n,t,c),a.push(...t.filter(e=>void 0!==c&&d(e)===c.serverTime))}return a}return{upsertMessages:nn,commitReceivedMessages:function(n,o,r,s){if(void 0===ye){for(const e of s?.events??[])s.apply(e);return void nn(n,o,r)}const i={writes:[],messages:/* @__PURE__ */new Set,sessions:/* @__PURE__ */new Set,reads:/* @__PURE__ */new Set,metadata:/* @__PURE__ */new Set};st.add(i);try{const a=(s?.events??[]).filter(e=>"ignored"!==s.apply(e));nn(n,o,r);const c=a.flatMap(e=>{const t=Ee(e.conversation,e.parentMessageId);return void 0===t?[]:[t]});a.length>0&&Ne();const d=/* @__PURE__ */new Map,u=[];for(const o of[...n,...c]){const n=t(o),r=e(n),s=Ee(n,o.id);void 0!==s&&(d.set(r,n),i.messages.has(`${r}\0${s.id}`)||u.push(s))}St(u);for(const[e,t]of d){const n=te.get(t),o=oe.get(t);void 0===n||i.sessions.has(e)||Et(n),void 0===o||i.reads.has(e)||Pt(o)}for(const[e,t]of it)i.metadata.has(e)||t.persist()}finally{st.delete(i)}return ht(i.writes)},prepareOfflineMessageUpdate:function(n,o){if(void 0===ye)return!0;const r=t(n),s=ve.get(e(r));if(void 0===s||Ge(r)||m(n,s)||void 0!==Ee(r,n.id))return!0;const i=vt,a=e(r),c=ft.get(a)??0;o();let d=!1,u=Ee(r,n.id);const l=x.emitter.subscribe(o=>{"message:received"!==o.type&&"message:updated"!==o.type||o.message.id!==n.id||e(t(o.message))!==a||("live"!==o.source||void 0!==u&&B(u,o.message)||(d=!0),u=o.message)});return ye.getMessage(r,n.id).then(s=>{if(o(),i!==vt||(ft.get(a)??0)!==c)throw new DOMException("消息提交前的本地历史读取已失效","AbortError");return!d&&(void 0===Ee(r,n.id)&&null!==s&&s.id===n.id&&e(t(s))===a&&Ze(s)&&Q.upsert(s),!0)}).finally(l)},applyReaction:Be,rollbackReaction:function(t,n,o){const r=Ee(t,n);if(void 0===r){const r=`${e(t)}\0${n}`,s=Z.get(r);if(void 0===s)return!1;const i=s.filter(e=>e.id!==o);return i.length!==s.length&&(0===i.length?Z.delete(r):Z.set(r,i),Ne(),!0)}const s=C(r.reactions,o,x.getSelfId?.()??"");if(s===r.reactions)return!1;const i={...r};return void 0===s?delete i.reactions:i.reactions=s,nn([i],"live"),!0},appendDirectContactRequiredNotice:on,appendDirectMessageRefusedNotice:function(e,t,n=Date.now()){const o={conversationType:"direct",conversationId:e},r=`${t}:message-refused`;if(void 0!==Q.get(r,o))return;const s=Q.get(t,o),c="direct"===s?.conversationType&&s.conversationId===e?a(s):n;nn([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_message_refused",targetUserIds:[e]}},createdAt:c,sortKey:i(c,r),status:"sent",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1}}],"live")},appendDirectContactRequiredTextFailure:function(e,t=Date.now()){const n=L(),o={id:n,conversationId:e.conversationId,conversationType:"direct",senderId:e.senderId,contentType:"text",body:{text:e.text},createdAt:t,sortKey:i(t,n),status:"failed",receipt:"unread",encryption:{encrypted:!1,decryptFailed:!1},failure:{code:33281,reason:"rejected",displayCode:"contactRequired",retryable:!1},...void 0===e.refMessageId?{}:{refMessageId:e.refMessageId}};return nn([o],"live"),on(e.conversationId,n,t+1),o},reconcileDirectContactEstablishedNotice:function(e,t,n=Date.now()){const o=rn.get(e);if(void 0!==o)return o;const r={conversationType:"direct",conversationId:e},s=sn,a=(async()=>{const o=Q.getByConversation(r).filter(e=>{const t=e.body.system?.eventType;return"direct_contact_required"===t||"direct_contact_established"===t}),a=o.filter(e=>"direct_contact_required"===e.body.system?.eventType),c=a.at(-1)?.createdAt??0,d=o.findLast(e=>"direct_contact_established"===e.body.system?.eventType)?.createdAt??0,u=d>=c&&d>0;if(0===a.length&&u)return;const l=Ot(r);for(const e of a)try{const t=await fn(r,e.id),n=Ee(r,e.id);t||"direct_contact_required"!==n?.body.system?.eventType||x.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但旧的申请添加提示未能删除",cause:{conversation:r,messageId:e.id}}})}catch(t){x.emitter.emit({type:"error",error:{scope:"storage",message:"联系人关系已建立,但删除旧的申请添加提示失败",cause:{conversation:r,messageId:e.id,error:t}}})}if(s!==sn)return;const v=oe.get(r);if(void 0!==v&&(Gt({...v,...void 0===v.readCursorSortKey&&void 0!==l?{readCursorSortKey:l}:{},unreadCount:Ht(r,l)}),Yt(r)),u)return;const f=Number.isFinite(n)&&n>0?n:Date.now(),p=Math.max(f,c+1);!function(e,t,n=Date.now(),o=n){const r=function(e,t){return`${""===e.trim()?`contact-established:${t}`:e}:contact-established`}(t,o);if(void 0!==Q.get(r,{conversationType:"direct",conversationId:e}))return;nn([{id:r,conversationId:e,conversationType:"direct",senderId:e,contentType:"system",body:{system:{eventType:"direct_contact_established",targetUserIds:[e]}},createdAt:n,sortKey:i(n,r),status:"sent",receipt:"unread",encryption:{encrypted:!1}}],"live")}(e,t,p,f)})().finally(()=>{rn.get(e)===a&&rn.delete(e)});return rn.set(e,a),a},recallMessage:function(e,t,n){const o=Ee(e,t);void 0!==o&&nn([{...o,recalled:n,body:{}}],"live")},deleteChannelMessageForEveryone:function(e,t,n){const o=Ee(e,t);void 0!==o&&"channel"===o.conversationType&&nn([{...o,recalled:void 0,deletedForEveryone:n,body:{}}],"live")},editMessage:function(e,t,n,o){const r=Ee(e,t);if(void 0===r)return;const s={...r,body:n,edited:!0};void 0!==o?s.mention=o:delete s.mention,nn([s],"live")},applyTransferStatusBySerialNumber:async function(e,t,n){const o=function(e,t){if(void 0===e)return t;if(0===e.status&&0!==t.status)return t;if(0===t.status&&0!==e.status)return e;const n=e.occurredTime??0,o=t.occurredTime??0;return n!==o?o>n?t:e:t.status>e.status?t:e}(ee.get(e),{serialNumber:e,status:t,...void 0===n?{}:{occurredTime:n}});ee.set(o.serialNumber,o),await async function(){if(void 0===ye)return;const e=[...ee.values()],t=me.then(()=>ye.setMeta(J,e));gt(t),me=t.catch(()=>{});try{await t}catch(e){throw nt("保存转账状态记录失败",e),e}}();const r=/* @__PURE__ */new Map;for(const t of u(Q.getAll(),e,o.status,o.occurredTime))r.set(t.id,t);for(const t of te.getAll()){const n=Ue({conversationType:t.type,conversationId:t.id});for(const t of u(n,e,o.status,o.occurredTime))r.set(t.id,t)}0!==r.size&&nn([...r.values()],"live")},getMessage:e=>Q.get(e),getMessagesById:e=>Q.getById(e),getConversationMessage:Ee,getLoadedMessagesByConversation:Ue,hasRecoverableConversationDeletion:Je,resolveConversationMessage:async function(n,o,r={}){const s=Ee(n,o);if(void 0!==s||void 0===ye)return s;try{const r=await ye.getMessage(n,o);if(null===r||e(t(r))!==e(n))return;return tn(r)}catch(e){if(nt("按消息 ID 读取本地历史失败",e),!0===r.throwOnStorageError)throw e;return}},getMessages:()=>Q.getAll(),getMessagesByConversation:e=>Q.getByConversation(e),deleteLocalMessage:fn,clearLocalConversationHistory:async function(e){mt(e);const t={...e},n=new Map(Q.getByConversation(t).map(e=>[e.id,e])),o=te.get(t),r=oe.get(t),s=void 0===r&&void 0===o?void 0:{...t,readCursor:r?.readCursor??o?.readCursor??"",...void 0===r?.readCursorSortKey?{}:{readCursorSortKey:r.readCursorSortKey},unreadCount:0,mentionUnreadCount:0},i=void 0===o?void 0:Qt(t,void 0,"clear",s);if(void 0!==ye){if(void 0===ye.clearConversationHistory)throw new Error("当前 storage 未实现 clearConversationHistory,拒绝非原子清空本机会话历史");await Tt(()=>ye.clearConversationHistory(t,void 0===i?void 0:bt(i),s))}const a=oe.get(t);void 0!==s&&(a?.conversationType===r?.conversationType&&a?.conversationId===r?.conversationId&&a?.readCursor===r?.readCursor&&a?.readCursorSortKey===r?.readCursorSortKey&&a?.unreadCount===r?.unreadCount&&a?.mentionUnreadCount===r?.mentionUnreadCount)&&Gt(s,!1);for(const[e,o]of n){const n=Q.get(e,t);void 0!==n&&D(o,n)&&Q.delete(t,e)}const c=Q.getByConversation(t);for(const e of Te)e.clearConversation(t)&&e.applyIncoming(c);De(t),void 0!==te.get(t)&&Vt(Xt(t,c,"clear"),!1),x.emitter.emit({type:"conversation-history:cleared",conversation:t,scope:"local-only"})},commitChannelSyncPage:function(n,o,r,s){const i=wt(n,r);return Ct(async()=>{if(!i())return!1;if(void 0===ye)throw new Error("CHANNEL 严格同步提交需要 storage");const r={writes:[],messages:/* @__PURE__ */new Map,keys:new Set(n.map(e)),current:i};let a;pt=r;try{const e=o();if(e instanceof Promise)throw e.catch(()=>{}),new Error("CHANNEL 页 mutation 必须同步执行")}catch(e){a={cause:e}}finally{pt=void 0}if(await ht(r.writes),void 0!==a)throw a.cause;if(!i())return!1;const c=[...r.messages.values()].flatMap(e=>{const n=Ee(t(e),e.id);return void 0===n?[]:[Mt(n)]}),d=[];c.length>0&&d.push(It(()=>ye.saveMessages(c)));for(const e of n){const t=te.get(e),n=oe.get(e),o=se.get(e);void 0!==t&&d.push(It(()=>ye.saveSessions([bt(t)]))),void 0!==n&&d.push(It(()=>ye.saveReadState(n))),d.push(It(()=>void 0===o?ye.removePinnedMessage(e):ye.savePinnedMessage(o)))}const u=[[W,[...Z.values()].flat()],[J,[...ee.values()]],[z,Qe()],[q,[...fe]],[G,[...pe.entries()]]];for(const[e,t]of u)d.push(It(()=>ye.setMeta(e,t)));return void 0!==s&&d.push(It(async()=>{i()&&await s()})),await ht(d),i()})},saveChannelSyncCheckpoint:function(e,t){const n=f(e,e.conversation);if(void 0===n)return Promise.reject(new Error("CHANNEL 同步位置无效"));const o=wt([n.conversation],t);return Ct(async()=>{if(!o())return!1;if(void 0===ye)throw new Error("CHANNEL 同步位置保存需要 storage");let e=!1;return await It(async()=>{o()&&(await ye.setMeta(p(n.conversation),n),e=!0)}),e&&o()})},waitForChannelSyncPersistence:async function(){for(;;){const e=lt,t=dt;if(await Promise.all([e,t,...rt]),e===lt&&t===dt&&0===rt.size)return}},getSession:e=>te.get(e),getConversationContext:mn,isMembershipTerminated:We,prepareConversation:function(e,t={}){const n=o(e);if("supergroup"===n.conversationType)throw new Error("prepareConversation:supergroup 未实现");const r=mn(n);if(void 0!==r){const t=r.title||e.title,n=r.avatar??e.avatar;return void(t===r.title&&n===r.avatar||gn({...r,title:t,avatar:n}))}if(We(n)){if(!0!==t.membershipConfirmed)throw new Error("准备聊天失败:需要重新确认成员资格");fe.delete(qe(n)),fe.delete(n.conversationId),At()}gn({...e,...void 0===e.channelPermissions?{}:{channelPermissions:{...e.channelPermissions}},...void 0===e.channelAccessSnapshot?{}:{channelAccessSnapshot:{...e.channelAccessSnapshot}}}),(oe.get(n)?.unreadCount??0)>0&&!Ge(n)&&Yt(n,!0)},ensureConversation:function(t){const n=o(t);if(e(n),"supergroup"===n.conversationType)throw new Error("ensureConversation:supergroup 未实现");const r=te.get(n);if(void 0!==r)return r;const s={...t,id:n.conversationId,type:n.conversationType,...void 0===t.channelPermissions?{}:{channelPermissions:{...t.channelPermissions}},...void 0===t.channelAccessSnapshot?{}:{channelAccessSnapshot:{...t.channelAccessSnapshot}},...void 0===t.extensions?{}:{extensions:{...t.extensions}}},i=Xe(n);return i.deleted&&Ut(),i.terminal&&At(),te.set(s),ne.delete(n),ot(s),Et(s),s},getSessions:()=>te.getAll(),getConversationList:function(){const e=[];for(const t of te.getAll()){const n=o(t);e.push({...t,draft:re.get(n)})}return b(e)},getReadState:e=>oe.get(e),getPinnedMessage:e=>se.get(e),setPinnedMessage:function(e,t){const o=function(e){const t=Ee(n(e),e.messageId);return void 0===t?e:{...e,preview:{state:"ready",message:t}}}(e);se.set(o)&&(x.emitter.emit({type:"pinned-message:updated",conversationId:o.conversationId,conversation:{conversationType:o.conversationType,conversationId:o.conversationId},pinnedMessage:o,reason:t}),function(e){void 0===ye||Re||It(()=>ye.savePinnedMessage(e)).catch(e=>nt("置顶消息落盘失败",e))}(o))},clearPinnedMessage:function(e,t){const o="string"==typeof e?e:e.conversationId,r=se.get(e);if(!se.clear(e))return;const s="string"==typeof e?void 0===r?void 0:n(r):e;if(void 0===s)throw new Error(`置顶消息清理缺少复合身份:${o}`);x.emitter.emit({type:"pinned-message:updated",conversationId:o,conversation:s,pinnedMessage:null,reason:t}),function(e){void 0===ye||Re||It(()=>ye.removePinnedMessage(e)).catch(e=>nt("置顶消息删除失败",e))}(e)},isPinnedMessage:(e,t)=>se.isPinnedMessage(e,t),setReadState:e=>{const t=void 0===e.conversationType?te.get(e.conversationId):void 0,n=void 0===e.conversationType&&void 0!==t?{...e,conversationType:t.type}:e;"channel"===n.conversationType&&de(n.conversationId),oe.set(n),Pt(n)},markConversationUnread:function(e){const t=te.get(e);if(void 0===t)return!1;const n=oe.get(e)??{...e,readCursor:t.readCursor??"",unreadCount:t.unreadCount,mentionUnreadCount:t.mentionUnreadCount};return!(n.unreadCount>0||!0===n.manuallyUnread)&&(Gt({...n,manuallyUnread:!0}),Yt(e),!0)},clearConversationManualUnread:an,advanceRead:function(e,n){const o="string"==typeof e?Q.getByConversation(e).find(e=>e.id===n)??be(n,e):Ee(e,n);if(void 0===o)return;const r="string"==typeof e?t(o):e,s="string"==typeof e?e:e.conversationId;if(o.conversationId!==s||o.conversationType!==r.conversationType)return;const i=Ot(r);if(void 0!==i&&i>=o.sortKey)return void("string"!=typeof e&&an(e));const a={...r,readCursor:n,readCursorSortKey:o.sortKey,unreadCount:Ht(r,o.sortKey),mentionUnreadCount:qt(r,o.sortKey)};return Gt(a),Yt(r),a},applyServerUnread:cn,applyChannelReadPosition:un,getChannelReadRevision:e=>ae.get(e.conversationId)??ce,hasPendingChannelRead:e=>ie.has(e.conversationId),applyChannelReadSummary:(e,t)=>cn(e,t.unreadCount,void 0,t.readCursor,t.hasUnreadMention),beginChannelReadTransaction:function(e){const t=e.conversationId,n=mn(e);if(void 0===n||"channel"!==n.type)throw new Error(`CHANNEL 乐观已读事务要求 channel 会话(conversationId=${t}, type=${n?.type??"missing"})`);if(ie.has(t))throw new Error(`CHANNEL 乐观已读事务已存在(channelId=${t})`);const o={conversation:e,transactionId:ue++},r=oe.get(e)??{conversationId:t,readCursor:n.readCursor??"",unreadCount:n.unreadCount,...void 0===n.mentionUnreadCount?{}:{mentionUnreadCount:n.mentionUnreadCount}};return ie.set(t,{handle:o,baseReadState:{...r},steps:[],committedThrough:-1}),de(t),o},applyChannelReadOptimistically:ln,applyChannelConversationReadOptimistically:function(e,t,n){ln(e,t,n);const o=dn(e).steps.at(-1);if(void 0!==o.clearedCounts)return;const i=oe.get(e.conversation),a=Ue(e.conversation).filter(e=>r(s(e),o)>0&&kt(e)&&N(e)&&!0!==e.readBySelf&&void 0===e.recalled&&void 0===e.deletedForEveryone),c=Math.min(i.unreadCount,a.length),d=Math.min(i.mentionUnreadCount??0,a.filter(zt).length);o.clearedCounts={unread:i.unreadCount-c,mention:(i.mentionUnreadCount??0)-d},Gt({...i,unreadCount:c,mentionUnreadCount:d}),Yt(e.conversation)},commitChannelReadTransaction:function(e,t){const n=dn(e);if(void 0===n)return!1;const o=n.steps.findLastIndex(e=>e.readCursor===t);if(o<0)throw new Error(`CHANNEL 已确认 cursor 不属于乐观事务(channelId=${e.conversation.conversationId}, cursor=${t})`);return n.committedThrough=Math.max(n.committedThrough,o),de(e.conversation.conversationId),n.committedThrough===n.steps.length-1&&ie.delete(e.conversation.conversationId),!0},rollbackChannelReadTransaction:function(e){const t=dn(e);if(void 0===t)return!1;const n=e.conversation,o=n.conversationId,r=oe.get(n),s=t.committedThrough>=0?t.steps[t.committedThrough]:void 0,i=void 0===s?t.baseReadState:void 0;let a=r?.unreadCount??i?.unreadCount??0,c=r?.mentionUnreadCount??i?.mentionUnreadCount??0;for(const e of t.steps.slice(t.committedThrough+1))a+=e.clearedCounts?.unread??0,c+=e.clearedCounts?.mention??0;const d=void 0!==i?.mentionUnreadCount||void 0!==r?.mentionUnreadCount,u={conversationId:o,conversationType:"channel",readCursor:s?.readCursor??i?.readCursor??"",readCursorSortKey:s?.sortKey??i?.readCursorSortKey,unreadCount:a,...d?{mentionUnreadCount:c}:{}};return ie.delete(o),Gt(u),Yt(n),!0},setGroupRestriction:function(e,t,n){const o=mn({conversationType:"group",conversationId:e});if(void 0===o){return void gn({id:e,type:"group",title:"",lastMessagePreview:"",timestamp:0,unreadCount:0,pinned:!1,muted:!1,groupState:t,sendDisabledReason:n})}if(o.groupState===t&&o.sendDisabledReason===n)return;gn({...o,groupState:t,sendDisabledReason:n})},setChannelRestriction:vn,setPinned:function(e,t){const n=te.get(e);if(void 0===n||n.pinned===t)return;const o={...n,pinned:t,topTime:t?Date.now():void 0};te.set(o),ot(o),Et(o)},setMuted:function(e,t){const n=mn(e);if(void 0===n||n.muted===t)return;gn({...n,muted:t})},removeConversation:function(e){pn(e)},removeConversationForMembershipTermination:yn,refreshConversationProfile:function(e,t){_t({conversationType:t,conversationId:e},{force:!0})},readDirectProfile:Lt,beginConversationProfileRead:function(t,n){const o={...t},r=e(o),s=Le,i=!0!==n?.forceRefresh&&(He.has(r)||Oe.has(r))?void 0:et(o);void 0!==i&&!0===n?.forceRefresh&&Oe.set(r,i);const a=()=>{s===Le&&void 0!==i&&Oe.get(r)===i&&Oe.delete(r)};return Object.assign(e=>{try{if(void 0===i||e.id!==o.conversationId||s!==Le)return;Ft(o,e.title,e.avatar??"",void 0,i)}finally{a()}},{finish:a})},recoverChannelFromProfile:function(e){return _t({conversationType:"channel",conversationId:e},{force:!0,allowChannelRecovery:!0})},updateConversationProfile:function(e,t){const n=mn(e);if(void 0===n)return;et(o(n));const r={...n,...void 0!==t.title?{title:t.title}:{},...void 0!==t.avatar?{avatar:t.avatar}:{}};Y(n,r)||gn(r)},getTotalUnread:function(e){return H(te.getAll(),e)},getDraft:function(e){return re.get(xt(e))},saveDraft:async function(t,n){const o=xt(t),r=e(o),s=$t(o,n,0),i=we,a=Ce.get(r)??0;return await Bt(o,async()=>{const e=re.get(o),t=Math.max(Date.now(),(he.get(r)??e?.updatedAt??0)+1),n=$t(o,s,t);if(null!==e&&Dt(e,n))return e;if(void 0!==ye&&await ye.saveDraft(n),i!==we||a!==(Ce.get(r)??0))throw new Error("草稿状态已失效,拒绝过期写入回灌内存");return re.set(n),he.set(r,t),x.emitter.emit({type:"draft:updated",conversation:n.ref,draft:n}),n})},clearDraft:async function(e){await jt(e)},clearDraftIfUnchanged:async function(e,t){return await jt(e,t)},invalidateAndDrainDraftOperations:async function(){for(we+=1;ge.size>0;)await Promise.all([...ge.values()])},clearSession(){vt+=1,Le+=1,we+=1,sn+=1,rn.clear(),_e.clear(),ke.clear(),Oe.clear(),He.clear(),ze.clear(),Q.clear(),te.clear(),ne.clear(),oe.clear(),re.clear(),ge.clear(),he.clear(),Ce.clear(),ie.clear(),ae.clear(),ce+=1,se.clearAll(),le.clear(),ve.clear(),fe.clear(),pe.clear(),it.clear(),Z.clear();for(const e of Te)e.reset()},hydrate:async function(t=()=>!0){if(void 0!==ye&&t()){Re=!0;try{const r=await ye.getMeta(z);if(!t())return;if(null!==r)for(const t of r)if("string"==typeof t)le.add(t);else{const n=y(t);ve.set(e(n.conversation),n)}const s=await ye.getMeta(q);if(!t())return;if(null!==s)for(const e of s)fe.add(e);const i=await ye.getMeta(G);if(!t())return;if(null!==i)for(const[e,t]of i)"string"==typeof e&&"string"==typeof t&&pe.set(e,t);const a=await ye.getMeta(W);if(!t())return;if(null!==a)for(const e of a){const t=Pe(e);Z.set(t,[...Z.get(t)??[],e])}const c=await ye.getMeta(J);if(!t())return;if(Array.isArray(c))for(const e of c){if("object"!=typeof e||null===e)continue;const t=Reflect.get(e,"serialNumber"),n=Reflect.get(e,"status"),o=Reflect.get(e,"occurredTime");"string"!=typeof t||""===t.trim()||0!==n&&1!==n&&2!==n&&3!==n||void 0!==o&&("number"!=typeof o||!Number.isFinite(o)||o<=0)||ee.set(t,{serialNumber:t,status:n,...void 0===o?{}:{occurredTime:o}})}const d=await ye.getPinnedMessages();if(!t())return;for(const e of d){if(!t())return;Ge({conversationType:e.conversationType,conversationId:e.conversationId})||se.set(e)&&x.emitter.emit({type:"pinned-message:updated",conversationId:e.conversationId,conversation:n(e),pinnedMessage:e,reason:"hydrate"})}const u=(await ye.getSessions()).filter(e=>!Ge({conversationType:e.type,conversationId:e.id}));if(!t())return;for(const e of u){if(!t())return;const n=Xt(o(e),[],"preserve",e),r=o(n),s=te.get(r);te.set(n),ne.delete(r),void 0!==s&&Y(s,n)||ot(n)}const l=await ye.getReadStates();if(!t())return;for(const e of l)"channel"===e.conversationType&&de(e.conversationId),oe.set(e);const v=we,f=await ye.getDrafts();if(!t())return;if(v!==we)return;for(const n of f){if(!t())return;if(!Number.isFinite(n.updatedAt)||n.updatedAt<0)throw new Error(`草稿 updatedAt 非法:${n.updatedAt}`);const o=$t(n.ref,n,n.updatedAt);if(Ge(o.ref)){try{if(await ye.deleteDraft(o.ref),!t())return}catch(e){if(!t())return;nt("清理已删会话残留草稿失败",e)}continue}const r=e(o.ref);he.set(r,Math.max(he.get(r)??0,o.updatedAt));const s=re.get(o.ref);null!==s&&s.updatedAt===o.updatedAt&&Dt(s,o)||(re.set(o),x.emitter.emit({type:"draft:updated",conversation:o.ref,draft:o}))}for(const e of u){if(!t())return;const n=o(e),r=await hn(n,t);if(!t())return;const s=[];if(en(r.map(e=>{const t=Zt(A(e));return t!==e&&s.push(t),t}),t),!t())return;if(s.length>0)try{if(await ye.saveMessages(s),!t())return}catch(e){if(!t())return;nt("本地消息修复态落盘失败",e)}if(!t())return;Yt(n)}}catch(e){t()&&nt("本地历史回读失败",e)}finally{Re=!1,t()&&Fe("offline")}}},loadOlderMessages:async function(n,o){if(void 0===ye)return[];try{const r=await ye.getMessages(n,o),s="string"==typeof n?r.filter(Ze):r.filter(o=>e(t(o))===e(n)).filter(Ze),i=Re;let a;Re=!0;try{a=en(s)}finally{Re=i}return Re||Fe("offline"),a.map(e=>Ee(t(e),e.id)??e)}catch(e){return nt("加载更早消息失败",e),[]}},searchMessages:async function(n,o){const r=o.keyword?.trim()??"",s=o.contentTypes;if(""===r&&(void 0===s||0===s.length))return{results:[],exhausted:!0};const i=""===r?void 0:await K(r),a=e=>{const t=void 0===s||s.includes(e.contentType),n=void 0===i||null!==i.match(U(e));return t&&n},c=(e,t)=>e.sortKey<t.sortKey?1:e.sortKey>t.sortKey?-1:0,d=e=>function(e,t){const n=t?.match(U(e));return{message:e,ranges:n?.ranges.map(({start:e,end:t})=>[e,t])??[]}}(e,i);if(void 0===ye)return(()=>{const e=Q.getByConversation(n).filter(a).sort(c),t=(void 0===o.beforeSortKey?e:e.filter(e=>e.sortKey<o.beforeSortKey)).slice(0,o.limit),r=t.length<o.limit;return{results:t.map(d),exhausted:r,...r?{}:{nextBeforeSortKey:t.at(-1)?.sortKey}}})();let u;try{u=await ye.searchMessages(n,{...void 0!==o.keyword?{keyword:o.keyword}:{},...void 0!==s?{contentTypes:s}:{},limit:o.limit,...void 0!==o.beforeSortKey?{beforeSortKey:o.beforeSortKey}:{}})}catch(e){throw nt("会话内搜索失败",e),e}const l=u.exhausted?void 0:u.nextBeforeSortKey,v=new Map(Q.getByConversation(n).map(e=>[e.id,e])),f=/* @__PURE__ */new Map;for(const o of u.items){const r=tn(o);e(t(r))===e(n)&&f.set(r.id,v.get(r.id)??r)}for(const e of v.values()){const t=void 0===o.beforeSortKey||e.sortKey<o.beforeSortKey,n=void 0===l||e.sortKey>=l;t&&n&&a(e)&&f.set(e.id,e)}return{results:[...f.values()].filter(a).sort(c).map(d),exhausted:u.exhausted,...u.exhausted?{}:{nextBeforeSortKey:u.nextBeforeSortKey}}},messageWindow:Se,createMessageWindow:function(e={}){const t=Me(e);let n=!1;return{window:t,dispose(){n||(n=!0,t.reset(),Te.delete(t))}}}}}export{Z as createDomainState,O as defaultConversationUnreadMode,H as sumSessionsUnread};
@@ -1 +1 @@
1
- import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{pullGroupHistory as o}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{pullChannelLatestPage as t}from"../../../im-browser/src/http/requests/pull-offline-channel.js";import{yieldToBrowser as s}from"../../../im-browser/src/scheduling/yield-to-browser.js";function n(n){return async(i,p)=>{r(p);const a="group"===i.conversationType?n.groupAsyncDecrypt?.({conversationType:"group",conversationId:i.conversationId},p):void 0;a?.assertCurrent?.();const c=await n.authProvider.getLoginContext();if(r(p),null===c)throw new Error("最近历史请求缺少当前账号");n.assertLoginContext?.(c.userId),a?.assertCurrent?.();const u=[],y=[],d=e=>{y.push({...e,source:"history"})},l=e=>{u.push(e)};if("group"===i.conversationType){const t={...n.groupDecrypt(),onDecryptRecovery:d},m=Date.now(),g=await o({asyncDecrypt:a,http:n.http,userId:c.userId,clientType:n.clientType,groupId:i.conversationId,baseTime:m,direct:1,limit:30,decryptDeps:t,prepareKeys:e=>n.prepareGroupKeys(e,{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:s});r(p),a?.assertCurrent?.();const h=e({conversationId:i.conversationId,direction:"older",baseTime:m,batchSize:g.batchSize,boundaryTime:g.oldestEntryTime,limit:30});return{messages:g.messages,reactions:u,recoveries:y,...h}}const m={...n.channelDecrypt(),onDecryptRecovery:d},g=await t({http:n.http,userId:c.userId,clientType:n.clientType,channelId:i.conversationId,count:30,decryptDeps:m,prepareKey:e=>n.prepareChannelKeys([e],{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:s});return r(p),{messages:g.messages,reactions:u,recoveries:y,exhausted:!g.hasOlder,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}}export{n as createRecentHistoryFetcher};
1
+ import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{throwIfAborted as r}from"../../../im-core/src/abort.js";import{pullGroupHistory as o}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{yieldToBrowser as t}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{pullChannelLatestPage as s}from"../../../im-browser/src/http/requests/pull-offline-channel.js";function n(n){return async(i,p)=>{r(p);const a="group"===i.conversationType?n.groupAsyncDecrypt?.({conversationType:"group",conversationId:i.conversationId},p):void 0;a?.assertCurrent?.();const c=await n.authProvider.getLoginContext();if(r(p),null===c)throw new Error("最近历史请求缺少当前账号");n.assertLoginContext?.(c.userId),a?.assertCurrent?.();const u=[],y=[],d=e=>{y.push({...e,source:"history"})},l=e=>{u.push(e)};if("group"===i.conversationType){const s={...n.groupDecrypt(),onDecryptRecovery:d},m=Date.now(),g=await o({asyncDecrypt:a,http:n.http,userId:c.userId,clientType:n.clientType,groupId:i.conversationId,baseTime:m,direct:1,limit:30,decryptDeps:s,prepareKeys:e=>n.prepareGroupKeys(e,{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:t});r(p),a?.assertCurrent?.();const h=e({conversationId:i.conversationId,direction:"older",baseTime:m,batchSize:g.batchSize,boundaryTime:g.oldestEntryTime,limit:30});return{messages:g.messages,reactions:u,recoveries:y,...h}}const m={...n.channelDecrypt(),onDecryptRecovery:d},g=await s({http:n.http,userId:c.userId,clientType:n.clientType,channelId:i.conversationId,count:30,decryptDeps:m,prepareKey:e=>n.prepareChannelKeys([e],{signal:p,priority:n.keyPriority?.(i)??"foreground"}),onReaction:l,signal:p,keepRaw:!1,yieldToEventLoop:t});return r(p),{messages:g.messages,reactions:u,recoveries:y,exhausted:!g.hasOlder,...void 0===g.nextCursor?{}:{nextCursor:g.nextCursor}}}}export{n as createRecentHistoryFetcher};