k2-im 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat-kit-pinia.d.ts +77 -18
- package/dist/chat-kit-vue.d.ts +7 -5
- package/dist/chat-kit.d.ts +138 -23
- package/dist/index.d.ts +142 -26
- package/dist/modules/api-protocol-client/src/client.js +1 -1
- package/dist/modules/api-protocol-client/src/nonce.js +1 -1
- package/dist/modules/crypto/browser.js +1 -1
- package/dist/modules/crypto/driver.js +1 -1
- package/dist/modules/crypto/vendor/crypto/index_bg.js +1 -1
- package/dist/modules/im-browser/src/http/cm-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/http/request-timeout.js +1 -0
- package/dist/modules/im-browser/src/http/requests/core-json-request.js +1 -1
- package/dist/modules/im-browser/src/http/requests/get-conversation-background-presets.js +1 -1
- package/dist/modules/im-browser/src/http/requests/pull-offline-channel.js +1 -1
- package/dist/modules/im-browser/src/http/session-favorite-http-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-download-request.js +1 -0
- package/dist/modules/im-browser/src/media/media-downloader.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-preview-preparation-executor.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-adapter.js +1 -1
- package/dist/modules/im-browser/src/media/media-transfer-policy.js +1 -1
- package/dist/modules/im-browser/src/media/webp-encoder.js +1 -0
- package/dist/modules/im-browser/src/media/webp-worker-factory.js +1 -0
- package/dist/modules/im-browser/src/network/browser-connection-ownership.js +1 -1
- package/dist/modules/im-browser/src/storage/indexed-db-storage-adapter.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/composer.store.js +1 -1
- package/dist/modules/im-chat-kit/src/pinia/expression.store.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/chat-runtime.js +1 -1
- package/dist/modules/im-chat-kit/src/runtime/media-object-url-registry.js +1 -1
- package/dist/modules/im-chat-kit/src/services/media.service.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/emoji/unicode.js +1 -1
- package/dist/modules/im-chat-kit/src/utils/media-transfer-presentation.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-target-group.js +1 -1
- package/dist/modules/im-chat-kit/src/vue/thread/thread-visibility-targets.js +1 -1
- package/dist/modules/im-core/src/abort.js +1 -1
- package/dist/modules/im-core/src/mapping/group-offline-mapper.js +1 -1
- package/dist/modules/im-core/src/mapping/message-id.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail-policy.js +1 -1
- package/dist/modules/im-core/src/media-thumbnail.js +1 -1
- package/dist/modules/im-core/src/message-flow/media/media-sender.js +1 -1
- package/dist/modules/im-core/src/state/domain-state.js +1 -1
- package/dist/modules/im-sdk/src/create-im-client.js +1 -1
- package/dist/modules/im-sdk/src/product/conversation-handle.js +1 -1
- package/dist/modules/im-sdk/src/product/diagnostic-memory-buffer.js +1 -1
- package/dist/modules/im-sdk/src/product/media.js +1 -1
- package/dist/modules/im-sdk/src/runtime/history-page-size.js +1 -0
- package/dist/modules/im-sdk/src/runtime/local-media-preview.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-fetcher.js +1 -1
- package/dist/modules/im-sdk/src/runtime/recent-history-prefetch.js +1 -1
- package/dist/modules/im-sdk/src/runtime/session-runtime.js +1 -1
- package/dist/request-crypto.d.ts +3 -2
- package/dist/sdk.d.ts +75 -21
- package/dist/vendor/crypto/index_bg.wasm +0 -0
- package/dist/vendor/webp/LICENSE.jsquash +201 -0
- package/dist/vendor/webp/LICENSE.libwebp +29 -0
- package/dist/vendor/webp/NOTICE +3 -0
- package/dist/webp.worker.js +3 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{
|
|
1
|
+
import{resolveGroupHistoryPageBoundary as e}from"./group-history-page-boundary.js";import{DEFAULT_HISTORY_PAGE_SIZE as r}from"./history-page-size.js";import{throwIfAborted as o}from"../../../im-core/src/abort.js";import{pullGroupHistory as t}from"../../../im-browser/src/http/requests/pull-offline-group.js";import{yieldToBrowser as s}from"../../../im-browser/src/scheduling/yield-to-browser.js";import{pullChannelLatestPage as n}from"../../../im-browser/src/http/requests/pull-offline-channel.js";function i(i){return async(p,a)=>{o(a);const c="group"===p.conversationType?i.groupAsyncDecrypt?.({conversationType:"group",conversationId:p.conversationId},a):void 0;c?.assertCurrent?.();const u=await i.authProvider.getLoginContext();if(o(a),null===u)throw new Error("最近历史请求缺少当前账号");i.assertLoginContext?.(u.userId),c?.assertCurrent?.();const y=[],d=[],l=e=>{d.push({...e,source:"history"})},m=e=>{y.push(e)};if("group"===p.conversationType){const n={...i.groupDecrypt(),onDecryptRecovery:l},g=Date.now(),h=await t({asyncDecrypt:c,http:i.http,userId:u.userId,clientType:i.clientType,groupId:p.conversationId,baseTime:g,direct:1,limit:r,decryptDeps:n,prepareKeys:e=>i.prepareGroupKeys(e,{signal:a,priority:i.keyPriority?.(p)??"foreground"}),onReaction:m,signal:a,keepRaw:!1,yieldToEventLoop:s});o(a),c?.assertCurrent?.();const v=e({conversationId:p.conversationId,direction:"older",baseTime:g,batchSize:h.batchSize,boundaryTime:h.oldestEntryTime,limit:r});return{messages:h.messages,reactions:y,recoveries:d,...v}}const g={...i.channelDecrypt(),onDecryptRecovery:l},h=await n({http:i.http,userId:u.userId,clientType:i.clientType,channelId:p.conversationId,count:r,decryptDeps:g,prepareKey:e=>i.prepareChannelKeys([e],{signal:a,priority:i.keyPriority?.(p)??"foreground"}),onReaction:m,signal:a,keepRaw:!1,yieldToEventLoop:s});return o(a),{messages:h.messages,reactions:y,recoveries:d,exhausted:!h.hasOlder,...void 0===h.nextCursor?{}:{nextCursor:h.nextCursor}}}}export{i as createRecentHistoryFetcher};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=Object.defineProperty,t=(t,r,n)=>((t,r,n)=>r in t?e(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n)(t,"symbol"!=typeof r?r+"":r,n);import{createImSdkError as r}from"../product/message.js";import{encodeConversationKey as n}from"../../../im-core/src/conversation-identity.js";const o=2097152;class a extends Error{constructor(e){super(e),t(this,"reason"),this.reason=e}}function s(){return Object.assign(new Error("最近历史请求已取消"),{name:"AbortError"})}function i(e){const t=e.now??Date.now,i=/* @__PURE__ */new Map,c=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map;let l,f=!0,g=0;const p=/* @__PURE__ */new WeakMap,h=/* @__PURE__ */new WeakSet,v=/* @__PURE__ */new WeakMap;let y=0,b=Promise.resolve();function w(t,r,n){try{e.report(t,{...r},{remainingNetworkPages:Math.max(0,20-y),...n})}catch{}}function m(e,r=t()){return void 0===e?0:Math.max(0,r-e)}function k(e,t,r,n){const o=n?.diagnostics;w("recent-history-prefetch-result",e,{status:t,reason:r,queueDurationMs:m(o?.queuedAt,o?.startedAt),requestDurationMs:o?.requestDurationMs??m(o?.requestStartedAt),persistenceDurationMs:o?.persistenceDurationMs??m(o?.persistenceStartedAt)})}function E(e){const t=b.then(e,e);return b=t.catch(()=>{}),t}function A(t){if(!f||t.generation!==g||t.controller.signal.aborted||t.epoch!==(i.get(t.key)??0))return!1;const r=e.fingerprint(t.ref);return void 0!==r&&(r===t.fingerprint||!M(t)&&[...t.consumers.values()].includes("foreground"))}function M(e){return e.cacheRevision===(c.get(e.key)??0)}function T(e){if(!A(e))throw s()}async function j(r,o=!1){const a=n(r),s=i.get(a)??0,d={key:a,epoch:s,generation:g,cacheRevision:c.get(a)??0},u=g,l=e.fingerprint(r),h=e=>(w("recent-history-cache-miss",r,{reason:e,allowStale:o}),null);if(!f||void 0===l||void 0===e.cache)return h(f?void 0===l?"unavailable":"storage-unavailable":"disposed");if(await b,!f||u!==g||s!==(i.get(a)??0)||!M(d)||e.fingerprint(r)!==l)return h("invalidated");const v=await e.cache.get(r);return f&&u===g&&s===(i.get(a)??0)&&M(d)&&e.fingerprint(r)===l?null===v?h("empty"):2!==v.version?h("version-mismatch"):n(v.conversation)!==a?h("identity-mismatch"):v.fingerprint!==l?h("fingerprint-mismatch"):v.fetchedAt>t()?h("future-timestamp"):t()-v.fetchedAt>(o?864e5:3e5)?h("expired"):(p.set(v,d),v):h("invalidated")}async function q(r){T(r);try{const e=await j(r.ref);if(T(r),null!==e&&M(r))return r.diagnostics.source="cache",w("recent-history-cache-hit",r.ref),{page:e,durable:!0}}catch(e){if(T(r),r.diagnostics.failureReason="cache-read-failed",w("recent-history-cache-read-failed",r.ref,{reason:"cache-read-failed"}),![...r.consumers.values()].includes("foreground"))throw e}if(![...r.consumers.values()].includes("foreground")){if(y>=20)throw new a("budget");y+=1}const n=t();let s;r.diagnostics.source="network",r.diagnostics.requestStartedAt=n;try{s=await e.fetchPage(r.ref,r.controller.signal)}catch(e){throw r.diagnostics.failureReason="request-failed",e}finally{r.diagnostics.requestDurationMs=m(n)}T(r),await e.yieldToEventLoop(),T(r);const i={version:2,conversation:{...r.ref},fetchedAt:t(),fingerprint:r.fingerprint,messages:s.messages,reactions:s.reactions,exhausted:s.exhausted,...void 0===s.nextCursor?{}:{nextCursor:s.nextCursor},byteLength:0};if(p.set(i,{key:r.key,epoch:r.epoch,generation:r.generation,cacheRevision:r.cacheRevision}),void 0!==s.recoveries&&s.recoveries.length>0&&v.set(i,s.recoveries),v.has(i)||i.messages.some(e=>!0===e.encryption.decryptFailed))return h.add(i),{page:i,durable:!1,reason:"decrypt-failed"};if(i.byteLength=await async function(e,t){const r=new TextEncoder,n=/* @__PURE__ */new WeakSet;let a=0,s=0,i=performance.now();async function c(){++s%64==0&&performance.now()-i>=4&&(await t(),i=performance.now())}return await async function e(t){if(!(a>o))if(await c(),"string"==typeof t){a+=8;for(let e=0;e<t.length&&a<=o;e+=16384)a+=r.encode(t.slice(e,e+16384)).byteLength,await c()}else if(null!==t&&"object"==typeof t){if(n.has(t))return;if(n.add(t),a+=32,ArrayBuffer.isView(t)||t instanceof ArrayBuffer)return void(a+=t.byteLength);for(const r in t)if(Object.hasOwn(t,r)&&(await e(r),await e(t[r]),a>o))break}else a+=8}(e),a}(i,e.yieldToEventLoop),T(r),w("recent-history-page-loaded",r.ref,{durationMs:t()-n,messageCount:i.messages.length,byteLength:i.byteLength}),i.byteLength>o)return{page:i,durable:!1,reason:"page-too-large"};if(void 0===e.cache)return{page:i,durable:!1,reason:"storage-unavailable"};if(!M(r))return{page:i,durable:!1,reason:"invalidated"};r.diagnostics.persistenceStartedAt=t();try{const t=await E(async()=>(T(r),!!M(r)&&e.cache.put(i)));return T(r),M(r)?{page:i,durable:t,...t?{}:{reason:"page-too-large"}}:{page:i,durable:!1,reason:"invalidated"}}catch(e){return T(r),r.diagnostics.failureReason="cache-write-failed",w("recent-history-cache-write-failed",r.ref,{reason:"cache-write-failed"}),{page:i,durable:!1,storageError:e}}finally{r.diagnostics.persistenceDurationMs=m(r.diagnostics.persistenceStartedAt)}}function L(r,n){r.started||(r.started=!0,r.diagnostics.startedAt=t(),w("recent-history-prefetch-start",r.ref,{kind:n?"background":"foreground",queueDurationMs:m(r.diagnostics.queuedAt,r.diagnostics.startedAt)}),n&&(l=r),q(r).then(r.resolve,r.reject).finally(async()=>{d.get(r.key)===r&&d.delete(r.key),l===r&&(l=void 0),await e.yieldToEventLoop(),R()}).catch(e=>{if(!(e instanceof Error&&"AbortError"===e.name))throw e}))}function R(){if(!f||void 0!==l||u.size>0||!e.canRunBackground())return;const t=[...d.values()].find(e=>!e.started&&e.consumers.size>0);void 0!==t&&L(t,!0)}function S(r,o,u){if(!f||!0===u?.aborted)return"background"===o&&k(r,"cancelled","cancelled"),Promise.reject(s());const l=n(r),p=e.fingerprint(r);if(void 0===p)return"background"===o&&k(r,"skipped","unavailable"),Promise.reject(new a("unavailable"));let h=d.get(l);void 0===h||A(h)||(h.controller.abort(),h.reject(s()),d.delete(l),h=void 0);const v=void 0!==h;if(void 0===h){let e,n;const o=new Promise((t,r)=>{e=t,n=r});h={ref:{...r},key:l,fingerprint:p,generation:g,epoch:i.get(l)??0,cacheRevision:c.get(l)??0,controller:new AbortController,consumers:/* @__PURE__ */new Map,started:!1,promise:o,resolve:e,reject:n,diagnostics:{queuedAt:t()}},d.set(l,h)}const y=h,b=Symbol(o);y.consumers.set(b,o),"background"===o&&w("recent-history-prefetch-queued",r,{reason:v?"shared-request":"new-request"});const m=new Promise((e,t)=>{let n=!1;const i=(i,l)=>{n||(n=!0,i?.durable&&!M(y)&&(i={...i,durable:!1,reason:"invalidated"}),u?.removeEventListener("abort",c),y.consumers.delete(b),0===y.consumers.size&&(y.controller.abort(),y.started||(d.get(y.key)===y&&d.delete(y.key),y.reject(s()))),"background"===o&&(l instanceof a?k(r,"skipped",l.reason,y):l instanceof Error&&"AbortError"===l.name?k(r,"cancelled","cancelled",y):void 0!==l||void 0!==i?.storageError?k(r,"failed",y.diagnostics.failureReason??"request-failed",y):!0===i?.durable?k(r,"ready","cache"===y.diagnostics.source?"cache-hit":"persisted",y):k(r,"skipped",i?.reason??"not-persisted",y)),void 0!==l?t(l):e(i))};function c(){i(void 0,s())}u?.addEventListener("abort",c,{once:!0}),y.promise.then(e=>i(e),e=>i(void 0,e))});return"foreground"===o?L(y,!1):R(),m}function x(t,r={}){if(!f||"group"!==t.conversationType&&"channel"!==t.conversationType)return;const o={...t,conversationType:t.conversationType},a=n(t);c.set(a,(c.get(a)??0)+1),r.preserveForeground||i.set(a,(i.get(a)??0)+1);const u=d.get(a);r.preserveForeground&&u&&[...u.consumers.values()].includes("foreground")||(u?.reject(r.reason??s()),u?.controller.abort(r.reason),d.delete(a)),w("recent-history-cache-invalidated",o,{reason:r.preserveForeground?"cache-only-invalidation":"explicit-invalidation"}),E(async()=>e.cache?.delete(o)).catch(()=>w("recent-history-cache-delete-failed",o,{reason:"cache-delete-failed"}))}function D(e){const t=p.get(e);return f&&void 0!==t&&t.generation===g&&t.epoch===(i.get(t.key)??0)}return{readCached:j,isPageCurrent:D,enterForeground:function(t){const r=n(t);u.set(r,(u.get(r)??0)+1),e.onForeground?.(t),void 0===l||l.key===r||[...l.consumers.values()].includes("foreground")||(l.controller.abort(),l.reject(s()));let o=!1;return()=>{if(o)return;o=!0;const e=(u.get(r)??1)-1;e>0?u.set(r,e):u.delete(r),R()}},hasForeground:e=>(u.get(n(e))??0)>0,invalidate:x,notifySchedulingChanged:R,takeRecoveries(e){if(!D(e))return[];const t=v.get(e)??[];return v.delete(e),t},async confirmConsumed(t){const r=e.fingerprint(t.conversation),a=p.get(t);if(!D(t)||void 0===a||!M(a)||h.has(t)||void 0===r||void 0===e.cache||r===t.fingerprint||t.byteLength>o||t.messages.some(e=>!0===e.encryption.decryptFailed))return;const s=n(t.conversation),c=i.get(s)??0;await E(async()=>{D(t)&&M(a)&&c===(i.get(s)??0)&&e.fingerprint(t.conversation)===r&&await e.cache.put({...t,fingerprint:r})}).catch(()=>w("recent-history-cache-write-failed",t.conversation,{reason:"cache-write-failed"}))},latest:async(e,t)=>(await S(e,"foreground",t)).page,async prefetchRecent(t,n={}){const o=[];for(const[s,i]of t.entries())if(s>0&&s%16==0&&await e.yieldToEventLoop(),!0!==n.signal?.aborted&&f)if("direct"!==i.conversationType&&"robot"!==i.conversationType&&"customerService"!==i.conversationType)if(void 0!==e.cache)try{const e=await S({...i,conversationType:i.conversationType},"background",n.signal);if(void 0!==e.storageError)throw e.storageError;o.push({ref:i,status:e.durable?"ready":"skipped",...void 0===e.reason?{}:{reason:e.reason}})}catch(e){e instanceof a?o.push({ref:i,status:"skipped",reason:e.reason}):e instanceof Error&&"AbortError"===e.name?o.push({ref:i,status:"cancelled",reason:"cancelled"}):(w("recent-history-prefetch-failed",i,{reason:"prefetch-failed"}),o.push({ref:i,status:"failed",error:r({code:"IM_SDK_HISTORY_PREFETCH_FAILED",category:"state",operation:"conversations.prefetchRecent",retryable:!0,conversation:i,cause:e})}))}else k(i,"skipped","storage-unavailable"),o.push({ref:i,status:"skipped",reason:"storage-unavailable"});else k(i,"skipped","unsupported"),o.push({ref:i,status:"skipped",reason:"unsupported"});else k(i,"cancelled","cancelled"),o.push({ref:i,status:"cancelled",reason:"cancelled"});return o},dispose(){f=!1;for(const e of d.values())e.controller.abort(),e.reject(s());return d.clear(),b.then(()=>{})},async clear(){if(f){g+=1;for(const e of[...d.values()])x(e.ref);await E(async()=>e.cache?.clear())}}}}export{i as createRecentHistoryPrefetch};
|
|
1
|
+
var e=Object.defineProperty,r=(r,t,n)=>((r,t,n)=>t in r?e(r,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[t]=n)(r,"symbol"!=typeof t?t+"":t,n);import{createImSdkError as t}from"../product/message.js";import{encodeConversationKey as n}from"../../../im-core/src/conversation-identity.js";import{abortWithReason as o}from"../../../im-core/src/abort.js";const a=2097152;class s extends Error{constructor(e){super(e),r(this,"reason"),this.reason=e}}function i(){return Object.assign(new Error("最近历史请求已取消"),{name:"AbortError"})}function c(e){const r=e.now??Date.now,c=/* @__PURE__ */new Map,d=/* @__PURE__ */new Map,u=/* @__PURE__ */new Map,l=/* @__PURE__ */new Map;let f,g=!0,p=0;const h=/* @__PURE__ */new WeakMap,v=/* @__PURE__ */new WeakSet,y=/* @__PURE__ */new WeakMap;let b=0,m=Promise.resolve();function w(r,t,n){try{e.report(r,{...t},{remainingNetworkPages:Math.max(0,20-b),...n})}catch{}}function k(e,t=r()){return void 0===e?0:Math.max(0,t-e)}function E(e,r,t,n){const o=n?.diagnostics;w("recent-history-prefetch-result",e,{status:r,reason:t,queueDurationMs:k(o?.queuedAt,o?.startedAt),requestDurationMs:o?.requestDurationMs??k(o?.requestStartedAt),persistenceDurationMs:o?.persistenceDurationMs??k(o?.persistenceStartedAt)})}function A(e){const r=m.then(e,e);return m=r.catch(()=>{}),r}function M(r){if(!g||r.generation!==p||r.controller.signal.aborted||r.epoch!==(c.get(r.key)??0))return!1;const t=e.fingerprint(r.ref);return void 0!==t&&(t===r.fingerprint||!j(r)&&[...r.consumers.values()].includes("foreground"))}function j(e){return e.cacheRevision===(d.get(e.key)??0)}function T(e){if(!M(e))throw i()}async function q(t,o=!1){const a=n(t),s=c.get(a)??0,i={key:a,epoch:s,generation:p,cacheRevision:d.get(a)??0},u=p,l=e.fingerprint(t),f=e=>(w("recent-history-cache-miss",t,{reason:e,allowStale:o}),null);if(!g||void 0===l||void 0===e.cache)return f(g?void 0===l?"unavailable":"storage-unavailable":"disposed");if(await m,!g||u!==p||s!==(c.get(a)??0)||!j(i)||e.fingerprint(t)!==l)return f("invalidated");const v=await e.cache.get(t);return g&&u===p&&s===(c.get(a)??0)&&j(i)&&e.fingerprint(t)===l?null===v?f("empty"):2!==v.version?f("version-mismatch"):n(v.conversation)!==a?f("identity-mismatch"):v.fingerprint!==l?f("fingerprint-mismatch"):v.fetchedAt>r()?f("future-timestamp"):r()-v.fetchedAt>(o?864e5:3e5)?f("expired"):(h.set(v,i),v):f("invalidated")}async function L(t){T(t);try{const e=await q(t.ref);if(T(t),null!==e&&j(t))return t.diagnostics.source="cache",w("recent-history-cache-hit",t.ref),{page:e,durable:!0}}catch(e){if(T(t),t.diagnostics.failureReason="cache-read-failed",w("recent-history-cache-read-failed",t.ref,{reason:"cache-read-failed"}),![...t.consumers.values()].includes("foreground"))throw e}if(![...t.consumers.values()].includes("foreground")){if(b>=20)throw new s("budget");b+=1}const n=r();let o;t.diagnostics.source="network",t.diagnostics.requestStartedAt=n;try{o=await e.fetchPage(t.ref,t.controller.signal)}catch(e){throw t.diagnostics.failureReason="request-failed",e}finally{t.diagnostics.requestDurationMs=k(n)}T(t),await e.yieldToEventLoop(),T(t);const i={version:2,conversation:{...t.ref},fetchedAt:r(),fingerprint:t.fingerprint,messages:o.messages,reactions:o.reactions,exhausted:o.exhausted,...void 0===o.nextCursor?{}:{nextCursor:o.nextCursor},byteLength:0};if(h.set(i,{key:t.key,epoch:t.epoch,generation:t.generation,cacheRevision:t.cacheRevision}),void 0!==o.recoveries&&o.recoveries.length>0&&y.set(i,o.recoveries),y.has(i)||i.messages.some(e=>!0===e.encryption.decryptFailed))return v.add(i),{page:i,durable:!1,reason:"decrypt-failed"};if(i.byteLength=await async function(e,r){const t=new TextEncoder,n=/* @__PURE__ */new WeakSet;let o=0,s=0,i=performance.now();async function c(){++s%64==0&&performance.now()-i>=4&&(await r(),i=performance.now())}return await async function e(r){if(!(o>a))if(await c(),"string"==typeof r){o+=8;for(let e=0;e<r.length&&o<=a;e+=16384)o+=t.encode(r.slice(e,e+16384)).byteLength,await c()}else if(null!==r&&"object"==typeof r){if(n.has(r))return;if(n.add(r),o+=32,ArrayBuffer.isView(r)||r instanceof ArrayBuffer)return void(o+=r.byteLength);for(const t in r)if(Object.prototype.hasOwnProperty.call(r,t)&&(await e(t),await e(r[t]),o>a))break}else o+=8}(e),o}(i,e.yieldToEventLoop),T(t),w("recent-history-page-loaded",t.ref,{durationMs:r()-n,messageCount:i.messages.length,byteLength:i.byteLength}),i.byteLength>a)return{page:i,durable:!1,reason:"page-too-large"};if(void 0===e.cache)return{page:i,durable:!1,reason:"storage-unavailable"};if(!j(t))return{page:i,durable:!1,reason:"invalidated"};t.diagnostics.persistenceStartedAt=r();try{const r=await A(async()=>(T(t),!!j(t)&&e.cache.put(i)));return T(t),j(t)?{page:i,durable:r,...r?{}:{reason:"page-too-large"}}:{page:i,durable:!1,reason:"invalidated"}}catch(e){return T(t),t.diagnostics.failureReason="cache-write-failed",w("recent-history-cache-write-failed",t.ref,{reason:"cache-write-failed"}),{page:i,durable:!1,storageError:e}}finally{t.diagnostics.persistenceDurationMs=k(t.diagnostics.persistenceStartedAt)}}function R(t,n){t.started||(t.started=!0,t.diagnostics.startedAt=r(),w("recent-history-prefetch-start",t.ref,{kind:n?"background":"foreground",queueDurationMs:k(t.diagnostics.queuedAt,t.diagnostics.startedAt)}),n&&(f=t),L(t).then(t.resolve,t.reject).finally(async()=>{u.get(t.key)===t&&u.delete(t.key),f===t&&(f=void 0),await e.yieldToEventLoop(),S()}).catch(e=>{if(!(e instanceof Error&&"AbortError"===e.name))throw e}))}function S(){if(!g||void 0!==f||l.size>0||!e.canRunBackground())return;const r=[...u.values()].find(e=>!e.started&&e.consumers.size>0);void 0!==r&&R(r,!0)}function x(t,o,a){if(!g||!0===a?.aborted)return"background"===o&&E(t,"cancelled","cancelled"),Promise.reject(i());const l=n(t),f=e.fingerprint(t);if(void 0===f)return"background"===o&&E(t,"skipped","unavailable"),Promise.reject(new s("unavailable"));let h=u.get(l);void 0===h||M(h)||(h.controller.abort(),h.reject(i()),u.delete(l),h=void 0);const v=void 0!==h;if(void 0===h){let e,n;const o=new Promise((r,t)=>{e=r,n=t});h={ref:{...t},key:l,fingerprint:f,generation:p,epoch:c.get(l)??0,cacheRevision:d.get(l)??0,controller:new AbortController,consumers:/* @__PURE__ */new Map,started:!1,promise:o,resolve:e,reject:n,diagnostics:{queuedAt:r()}},u.set(l,h)}const y=h,b=Symbol(o);y.consumers.set(b,o),"background"===o&&w("recent-history-prefetch-queued",t,{reason:v?"shared-request":"new-request"});const m=new Promise((e,r)=>{let n=!1;const c=(c,l)=>{n||(n=!0,c?.durable&&!j(y)&&(c={...c,durable:!1,reason:"invalidated"}),a?.removeEventListener("abort",d),y.consumers.delete(b),0===y.consumers.size&&(y.controller.abort(),y.started||(u.get(y.key)===y&&u.delete(y.key),y.reject(i()))),"background"===o&&(l instanceof s?E(t,"skipped",l.reason,y):l instanceof Error&&"AbortError"===l.name?E(t,"cancelled","cancelled",y):void 0!==l||void 0!==c?.storageError?E(t,"failed",y.diagnostics.failureReason??"request-failed",y):!0===c?.durable?E(t,"ready","cache"===y.diagnostics.source?"cache-hit":"persisted",y):E(t,"skipped",c?.reason??"not-persisted",y)),void 0!==l?r(l):e(c))};function d(){c(void 0,i())}a?.addEventListener("abort",d,{once:!0}),y.promise.then(e=>c(e),e=>c(void 0,e))});return"foreground"===o?R(y,!1):S(),m}function D(r,t={}){if(!g||"group"!==r.conversationType&&"channel"!==r.conversationType)return;const a={...r,conversationType:r.conversationType},s=n(r);d.set(s,(d.get(s)??0)+1),t.preserveForeground||c.set(s,(c.get(s)??0)+1);const l=u.get(s);t.preserveForeground&&l&&[...l.consumers.values()].includes("foreground")||(l?.reject(t.reason??i()),void 0!==l&&o(l.controller,t.reason),u.delete(s)),w("recent-history-cache-invalidated",a,{reason:t.preserveForeground?"cache-only-invalidation":"explicit-invalidation"}),A(async()=>e.cache?.delete(a)).catch(()=>w("recent-history-cache-delete-failed",a,{reason:"cache-delete-failed"}))}function P(e){const r=h.get(e);return g&&void 0!==r&&r.generation===p&&r.epoch===(c.get(r.key)??0)}return{readCached:q,isPageCurrent:P,enterForeground:function(r){const t=n(r);l.set(t,(l.get(t)??0)+1),e.onForeground?.(r),void 0===f||f.key===t||[...f.consumers.values()].includes("foreground")||(f.controller.abort(),f.reject(i()));let o=!1;return()=>{if(o)return;o=!0;const e=(l.get(t)??1)-1;e>0?l.set(t,e):l.delete(t),S()}},hasForeground:e=>(l.get(n(e))??0)>0,invalidate:D,notifySchedulingChanged:S,takeRecoveries(e){if(!P(e))return[];const r=y.get(e)??[];return y.delete(e),r},async confirmConsumed(r){const t=e.fingerprint(r.conversation),o=h.get(r);if(!P(r)||void 0===o||!j(o)||v.has(r)||void 0===t||void 0===e.cache||t===r.fingerprint||r.byteLength>a||r.messages.some(e=>!0===e.encryption.decryptFailed))return;const s=n(r.conversation),i=c.get(s)??0;await A(async()=>{P(r)&&j(o)&&i===(c.get(s)??0)&&e.fingerprint(r.conversation)===t&&await e.cache.put({...r,fingerprint:t})}).catch(()=>w("recent-history-cache-write-failed",r.conversation,{reason:"cache-write-failed"}))},latest:async(e,r)=>(await x(e,"foreground",r)).page,async prefetchRecent(r,n={}){const o=[];for(const[a,i]of r.entries())if(a>0&&a%16==0&&await e.yieldToEventLoop(),!0!==n.signal?.aborted&&g)if("direct"!==i.conversationType&&"robot"!==i.conversationType&&"customerService"!==i.conversationType)if(void 0!==e.cache)try{const e=await x({...i,conversationType:i.conversationType},"background",n.signal);if(void 0!==e.storageError)throw e.storageError;o.push({ref:i,status:e.durable?"ready":"skipped",...void 0===e.reason?{}:{reason:e.reason}})}catch(e){e instanceof s?o.push({ref:i,status:"skipped",reason:e.reason}):e instanceof Error&&"AbortError"===e.name?o.push({ref:i,status:"cancelled",reason:"cancelled"}):(w("recent-history-prefetch-failed",i,{reason:"prefetch-failed"}),o.push({ref:i,status:"failed",error:t({code:"IM_SDK_HISTORY_PREFETCH_FAILED",category:"state",operation:"conversations.prefetchRecent",retryable:!0,conversation:i,cause:e})}))}else E(i,"skipped","storage-unavailable"),o.push({ref:i,status:"skipped",reason:"storage-unavailable"});else E(i,"skipped","unsupported"),o.push({ref:i,status:"skipped",reason:"unsupported"});else E(i,"cancelled","cancelled"),o.push({ref:i,status:"cancelled",reason:"cancelled"});return o},dispose(){g=!1;for(const e of u.values())e.controller.abort(),e.reject(i());return u.clear(),m.then(()=>{})},async clear(){if(g){p+=1;for(const e of[...u.values()])D(e.ref);await A(async()=>e.cache?.clear())}}}}export{c as createRecentHistoryPrefetch};
|