k2-im 0.1.33 → 0.1.34

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.
@@ -1 +1 @@
1
- import {c as c$1}from'./chunk-7CJFY6CU.js';import {u as u$1}from'./chunk-F6DQBWJW.js';var w=864e5,P=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];function u(e){return e!=null&&Number.isFinite(e)&&e>0&&!Number.isNaN(new Date(e).getTime())}function v(e,r){if(u(e))return e;if(u(r))return r}function y(e,r){return v(r,e)}function m(e){if(!u(e))return "";let r=new Date(e);return `${r.getFullYear()}-${r.getMonth()+1}-${r.getDate()}`}function h(e,r){return u(e)?u(r)?m(e)!==m(r):true:false}function F(e,r){return T(e,r,"conversation")}function L(e,r){return T(e,r,"separator")}function T(e,r,t){if(!u(e))return "";let n=r.now??new Date;if(Number.isNaN(n.getTime()))return "";let o=new Date(e),a=b(n)-b(o),i=c$1(r.locale);return o.getFullYear()!==n.getFullYear()?A(o):a===0?t==="conversation"?k(o):i.today:a===1?i.yesterday:a>=2&&a<=6?x(o,i):D(o)}function b(e){return Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())/w}function x(e,r){return r.weekdays[P[e.getDay()]]}function k(e){return `${c(e.getHours())}:${c(e.getMinutes())}`}function A(e){return `${e.getFullYear()}/${c(e.getMonth()+1)}/${c(e.getDate())}`}function D(e){return `${c(e.getMonth()+1)}/${c(e.getDate())}`}function c(e){return String(e).padStart(2,"0")}function O(e){if(e.markers.length===0)return null;let r=e.viewportTop+e.overlayTop;if(e.markers[0].top>r+1)return null;let t=0;for(let d=0;d<e.markers.length&&!(e.markers[d].top>r+1);d+=1)t=d;let n=e.markers[t],o=r+e.overlayHeight,a=e.markers.filter(d=>d.top<o+1&&d.top+d.height>r-1).at(-1),i=a===void 0?0:Math.max(0,Math.min(a.top+a.height,o)-Math.max(a.top,r)),s=a===void 0?1:Math.max(1,Math.min(a.height,e.overlayHeight)),l=Math.min(1,i/s);return {key:n.key,label:n.label,inlineOpacity:1-l,...a===void 0?{}:{inlineDateKey:a.key}}}var C={text:"text",image:"image",video:"video",voice:"voice",file:"file",filesAlbum:"filesAlbum",sticker:"sticker",contact:"contact",miniProgram:"miniProgram",robot:"robot",game:"game",transfer:"transfer",gift:"gift",redPacket:"redPacket",call:"call",mediaAlbum:"mediaAlbum",system:"system",unknown:"unknown"};function S(e){switch(e.contentType){case "text":return typeof e.body.text=="string";case "image":return e.body.image!==void 0&&typeof e.body.image.url=="string";case "video":return e.body.video!==void 0&&typeof e.body.video.url=="string";case "voice":return e.body.voice!==void 0;case "filesAlbum":return (e.body.filesAlbum?.items.length??0)>0;case "file":return e.body.file!==void 0;case "sticker":return e.body.sticker!==void 0;case "contact":return e.body.contact!==void 0;case "miniProgram":return e.body.miniProgram!==void 0&&typeof e.body.miniProgram.appId=="string";case "robot":return e.body.robot!==void 0&&Array.isArray(e.body.robot.modules)&&Array.isArray(e.body.robot.commands);case "transfer":return e.body.transfer!==void 0&&typeof e.body.transfer.serialNumber=="string";case "gift":{let r=e.body.gift;return r!==void 0&&typeof r.serialNumber=="string"&&typeof r.giftName=="string"&&(r.giftType===0||r.giftType===1||r.giftType===2)}case "redPacket":{let r=e.body.redPacket;return r!==void 0&&r.packetId.trim()!==""&&(r.packetType===1||r.packetType===2||r.packetType===3||r.packetType===4)}case "call":return e.body.call!==void 0&&(e.body.call.callKind==="audio"||e.body.call.callKind==="video")&&typeof e.body.call.durationMs=="number";case "game":{let r=e.body.game;return r?.gameType==="dice"?Number.isInteger(r.value)&&r.value>=1&&r.value<=6:r?.gameType==="rock-paper-scissors"&&Number.isInteger(r.value)&&r.value>=1&&r.value<=3}case "mediaAlbum":{let r=e.body.mediaAlbum;return r!==void 0&&r.items.length>0&&r.items.every(t=>typeof t.url=="string"&&t.url!=="")}case "system":return e.body.system!==void 0;case "unknown":return e.body.unknown!==void 0}}function I(e){return e.encryption.decryptFailed===true?"decrypt-failed":S(e)?e.contentType==="sticker"?u$1(e.body.sticker.imageType):C[e.contentType]:"unknown"}function _(e){let r=[...e.leadingItems??[]],t=e.entryUnread.state==="located"?e.entryUnread:null,n,o=null,a=false;for(let i of e.messages){let s=y(i.createdAt,i.serverTime),l=s!==void 0&&h(s,n);s!==void 0&&l&&r.push({kind:"date-separator",key:`date-${m(s)}-${i.id}`,label:e.formatDate(s)}),n=s,!a&&t!==null&&i.id===t.firstMessageId&&(r.push({kind:"entry-unread",key:`entry-unread-${i.id}`,...t.count===void 0?{}:{count:t.count}}),a=true);let d=e.beforeMessageItems?.(i)??[];if(r.push(...d),I(i)==="system"){r.push({kind:"system",key:i.id,message:i}),o=null;continue}r.push({kind:"message",key:`message-${i.id}`,message:i,firstOfRun:l||i.senderId!==o}),o=i.senderId;}return r}function U(e){let r=e.targetTop-e.viewportTop,t=e.currentScrollTop+r-(e.viewportHeight-e.targetHeight)/2,n=Math.max(0,e.scrollHeight-e.viewportHeight);return Math.min(n,Math.max(0,t))}function j(e){return e!==null&&e.clientWidth>0&&e.clientHeight>0}function G(e){return e.locatedAt<=0||e.duration<0||e.now<e.locatedAt?false:e.now-e.locatedAt<=e.duration}function q(e){return !Number.isFinite(e.topThreshold)||e.topThreshold<0?false:e.currentScrollTop<e.previousScrollTop&&e.currentScrollTop<=e.topThreshold}function H(e,r){return e.find(t=>t.bottom>r.top&&t.top<r.bottom)??e[0]}function f(e){return e.anchorTop??e.top}function B(e,r){let t=H(e,r);return t===void 0?void 0:{id:t.id,offset:f(t)-r.top}}function J(e,r,t){if(e===void 0)return;let n=r.find(o=>o.id===e.id);return n!==void 0&&n.bottom>t.top&&n.top<t.bottom?{id:e.id,offset:f(n)-t.top}:B(r,t)??e}function V(e,r,t){if(e===void 0)return;let n=r.find(o=>o.id===e.id);return n===void 0?void 0:f(n)-t.top-e.offset}function Q(e,r,t=3){return !Number.isFinite(t)||t<=0?[]:e.filter(n=>n.bottom>r.top&&n.top<r.bottom).slice(0,Math.floor(t)).map(n=>({id:n.id,offset:f(n)-r.top}))}function X(e,r,t){for(let n of e){let o=V(n,r,t);if(o!==void 0)return o}}function Z(e){return e.sameConversation&&!e.isHistoryWindow&&!e.isLocating&&!e.isLocateProtected&&e.userKeptLatestIntent}function ee(e){return e.isPageVisible&&!e.isHistoryWindow&&!e.isLocating&&!e.isLocateProtected&&(e.isOwnMessage||e.isAtBottom)}function re(e){return e.isLoadingOlder&&e.previousTailId!==void 0&&e.previousTailId!==e.currentTailId&&e.previousMessageIds.includes(e.currentTailId)}function te(e,r){return e!==void 0&&!r.has(e)}async function ne(e,r){let t=0;for(;e()&&!(await r()<=0);)t+=1;return t}function oe(e){return e.hasMoreHistory&&Number.isFinite(e.scrollHeight)&&Number.isFinite(e.clientHeight)&&e.scrollHeight>0&&e.clientHeight>0&&e.scrollHeight<=e.clientHeight}function ie(e){return e.isHistoryWindow&&!e.isPageSettling&&e.isAtBottom&&(e.currentScrollTop>e.previousScrollTop||e.allowStationaryBoundary===true)}function M(e){return !e.isPageVisible||!e.isAtBottom||e.isHistoryWindow}function ae(e){let r=Math.max(0,e.margin);return e.messageTop<e.viewportBottom-r&&e.messageBottom>e.viewportTop+r}function le(e){let r=new Set;function t(s){return s===r.size?false:(e?.(r.size),true)}function n(s){let l=r.size;for(let d of s)d!==""&&r.add(d);return t(l)}function o(s,l){return M(l)&&n(s)}function a(s){let l=r.size;for(let d of s)r.delete(d);return t(l)}function i(){let s=r.size;return r.clear(),t(s)}return {get count(){return r.size},add:n,trackRemote:o,acknowledgeVisible:a,clear:i}}export{M as A,ae as B,le as C,v as a,y as b,m as c,h as d,F as e,L as f,O as g,I as h,_ as i,U as j,j as k,G as l,q as m,H as n,B as o,J as p,V as q,Q as r,X as s,Z as t,ee as u,re as v,te as w,ne as x,oe as y,ie as z};
1
+ import {c as c$1}from'./chunk-4HJR3NAM.js';import {u as u$1}from'./chunk-PJ2PW42T.js';var w=864e5,P=["sunday","monday","tuesday","wednesday","thursday","friday","saturday"];function u(e){return e!=null&&Number.isFinite(e)&&e>0&&!Number.isNaN(new Date(e).getTime())}function v(e,r){if(u(e))return e;if(u(r))return r}function y(e,r){return v(r,e)}function m(e){if(!u(e))return "";let r=new Date(e);return `${r.getFullYear()}-${r.getMonth()+1}-${r.getDate()}`}function h(e,r){return u(e)?u(r)?m(e)!==m(r):true:false}function F(e,r){return T(e,r,"conversation")}function L(e,r){return T(e,r,"separator")}function T(e,r,t){if(!u(e))return "";let n=r.now??new Date;if(Number.isNaN(n.getTime()))return "";let o=new Date(e),a=b(n)-b(o),i=c$1(r.locale);return o.getFullYear()!==n.getFullYear()?A(o):a===0?t==="conversation"?k(o):i.today:a===1?i.yesterday:a>=2&&a<=6?x(o,i):D(o)}function b(e){return Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())/w}function x(e,r){return r.weekdays[P[e.getDay()]]}function k(e){return `${c(e.getHours())}:${c(e.getMinutes())}`}function A(e){return `${e.getFullYear()}/${c(e.getMonth()+1)}/${c(e.getDate())}`}function D(e){return `${c(e.getMonth()+1)}/${c(e.getDate())}`}function c(e){return String(e).padStart(2,"0")}function O(e){if(e.markers.length===0)return null;let r=e.viewportTop+e.overlayTop;if(e.markers[0].top>r+1)return null;let t=0;for(let d=0;d<e.markers.length&&!(e.markers[d].top>r+1);d+=1)t=d;let n=e.markers[t],o=r+e.overlayHeight,a=e.markers.filter(d=>d.top<o+1&&d.top+d.height>r-1).at(-1),i=a===void 0?0:Math.max(0,Math.min(a.top+a.height,o)-Math.max(a.top,r)),s=a===void 0?1:Math.max(1,Math.min(a.height,e.overlayHeight)),l=Math.min(1,i/s);return {key:n.key,label:n.label,inlineOpacity:1-l,...a===void 0?{}:{inlineDateKey:a.key}}}var C={text:"text",image:"image",video:"video",voice:"voice",file:"file",filesAlbum:"filesAlbum",sticker:"sticker",contact:"contact",miniProgram:"miniProgram",robot:"robot",game:"game",transfer:"transfer",gift:"gift",redPacket:"redPacket",call:"call",mediaAlbum:"mediaAlbum",system:"system",unknown:"unknown"};function S(e){switch(e.contentType){case "text":return typeof e.body.text=="string";case "image":return e.body.image!==void 0&&typeof e.body.image.url=="string";case "video":return e.body.video!==void 0&&typeof e.body.video.url=="string";case "voice":return e.body.voice!==void 0;case "filesAlbum":return (e.body.filesAlbum?.items.length??0)>0;case "file":return e.body.file!==void 0;case "sticker":return e.body.sticker!==void 0;case "contact":return e.body.contact!==void 0;case "miniProgram":return e.body.miniProgram!==void 0&&typeof e.body.miniProgram.appId=="string";case "robot":return e.body.robot!==void 0&&Array.isArray(e.body.robot.modules)&&Array.isArray(e.body.robot.commands);case "transfer":return e.body.transfer!==void 0&&typeof e.body.transfer.serialNumber=="string";case "gift":{let r=e.body.gift;return r!==void 0&&typeof r.serialNumber=="string"&&typeof r.giftName=="string"&&(r.giftType===0||r.giftType===1||r.giftType===2)}case "redPacket":{let r=e.body.redPacket;return r!==void 0&&r.packetId.trim()!==""&&(r.packetType===1||r.packetType===2||r.packetType===3||r.packetType===4)}case "call":return e.body.call!==void 0&&(e.body.call.callKind==="audio"||e.body.call.callKind==="video")&&typeof e.body.call.durationMs=="number";case "game":{let r=e.body.game;return r?.gameType==="dice"?Number.isInteger(r.value)&&r.value>=1&&r.value<=6:r?.gameType==="rock-paper-scissors"&&Number.isInteger(r.value)&&r.value>=1&&r.value<=3}case "mediaAlbum":{let r=e.body.mediaAlbum;return r!==void 0&&r.items.length>0&&r.items.every(t=>typeof t.url=="string"&&t.url!=="")}case "system":return e.body.system!==void 0;case "unknown":return e.body.unknown!==void 0}}function I(e){return e.encryption.decryptFailed===true?"decrypt-failed":S(e)?e.contentType==="sticker"?u$1(e.body.sticker.imageType):C[e.contentType]:"unknown"}function _(e){let r=[...e.leadingItems??[]],t=e.entryUnread.state==="located"?e.entryUnread:null,n,o=null,a=false;for(let i of e.messages){let s=y(i.createdAt,i.serverTime),l=s!==void 0&&h(s,n);s!==void 0&&l&&r.push({kind:"date-separator",key:`date-${m(s)}-${i.id}`,label:e.formatDate(s)}),n=s,!a&&t!==null&&i.id===t.firstMessageId&&(r.push({kind:"entry-unread",key:`entry-unread-${i.id}`,...t.count===void 0?{}:{count:t.count}}),a=true);let d=e.beforeMessageItems?.(i)??[];if(r.push(...d),I(i)==="system"){r.push({kind:"system",key:i.id,message:i}),o=null;continue}r.push({kind:"message",key:`message-${i.id}`,message:i,firstOfRun:l||i.senderId!==o}),o=i.senderId;}return r}function U(e){let r=e.targetTop-e.viewportTop,t=e.currentScrollTop+r-(e.viewportHeight-e.targetHeight)/2,n=Math.max(0,e.scrollHeight-e.viewportHeight);return Math.min(n,Math.max(0,t))}function j(e){return e!==null&&e.clientWidth>0&&e.clientHeight>0}function G(e){return e.locatedAt<=0||e.duration<0||e.now<e.locatedAt?false:e.now-e.locatedAt<=e.duration}function q(e){return !Number.isFinite(e.topThreshold)||e.topThreshold<0?false:e.currentScrollTop<e.previousScrollTop&&e.currentScrollTop<=e.topThreshold}function H(e,r){return e.find(t=>t.bottom>r.top&&t.top<r.bottom)??e[0]}function f(e){return e.anchorTop??e.top}function B(e,r){let t=H(e,r);return t===void 0?void 0:{id:t.id,offset:f(t)-r.top}}function J(e,r,t){if(e===void 0)return;let n=r.find(o=>o.id===e.id);return n!==void 0&&n.bottom>t.top&&n.top<t.bottom?{id:e.id,offset:f(n)-t.top}:B(r,t)??e}function V(e,r,t){if(e===void 0)return;let n=r.find(o=>o.id===e.id);return n===void 0?void 0:f(n)-t.top-e.offset}function Q(e,r,t=3){return !Number.isFinite(t)||t<=0?[]:e.filter(n=>n.bottom>r.top&&n.top<r.bottom).slice(0,Math.floor(t)).map(n=>({id:n.id,offset:f(n)-r.top}))}function X(e,r,t){for(let n of e){let o=V(n,r,t);if(o!==void 0)return o}}function Z(e){return e.sameConversation&&!e.isHistoryWindow&&!e.isLocating&&!e.isLocateProtected&&e.userKeptLatestIntent}function ee(e){return e.isPageVisible&&!e.isHistoryWindow&&!e.isLocating&&!e.isLocateProtected&&(e.isOwnMessage||e.isAtBottom)}function re(e){return e.isLoadingOlder&&e.previousTailId!==void 0&&e.previousTailId!==e.currentTailId&&e.previousMessageIds.includes(e.currentTailId)}function te(e,r){return e!==void 0&&!r.has(e)}async function ne(e,r){let t=0;for(;e()&&!(await r()<=0);)t+=1;return t}function oe(e){return e.hasMoreHistory&&Number.isFinite(e.scrollHeight)&&Number.isFinite(e.clientHeight)&&e.scrollHeight>0&&e.clientHeight>0&&e.scrollHeight<=e.clientHeight}function ie(e){return e.isHistoryWindow&&!e.isPageSettling&&e.isAtBottom&&(e.currentScrollTop>e.previousScrollTop||e.allowStationaryBoundary===true)}function M(e){return !e.isPageVisible||!e.isAtBottom||e.isHistoryWindow}function ae(e){let r=Math.max(0,e.margin);return e.messageTop<e.viewportBottom-r&&e.messageBottom>e.viewportTop+r}function le(e){let r=new Set;function t(s){return s===r.size?false:(e?.(r.size),true)}function n(s){let l=r.size;for(let d of s)d!==""&&r.add(d);return t(l)}function o(s,l){return M(l)&&n(s)}function a(s){let l=r.size;for(let d of s)r.delete(d);return t(l)}function i(){let s=r.size;return r.clear(),t(s)}return {get count(){return r.size},add:n,trackRemote:o,acknowledgeVisible:a,clear:i}}export{M as A,ae as B,le as C,v as a,y as b,m as c,h as d,F as e,L as f,O as g,I as h,_ as i,U as j,j as k,G as l,q as m,H as n,B as o,J as p,V as q,Q as r,X as s,Z as t,ee as u,re as v,te as w,ne as x,oe as y,ie as z};
package/dist/i18n.d.ts CHANGED
@@ -662,7 +662,7 @@ type ImMessageFailureReason = 'timeout' | 'rejected' | 'encrypt_failed' | 'netwo
662
662
  * 失败**展示语义**码(强类型枚举,非裸串):供 im-i18n 按 locale 渲染失败气泡文案。
663
663
  * 由 `reason` / `SendMediaFailReason` / ACK errcode 穷尽映射而来,与 im-i18n failure catalog 键一一对应(media.* 带 mediaKind 参数)。
664
664
  */
665
- type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
665
+ type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.uploadTimeout' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
666
666
  interface ImMessageFailure {
667
667
  /** 归一后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
668
668
  code: number;
@@ -1040,6 +1040,8 @@ interface ImFailureCatalog {
1040
1040
  mediaEncryptFailed: string;
1041
1041
  /** media.uploadFailed,参数 {label}。 */
1042
1042
  mediaUploadFailed: string;
1043
+ /** 网络请求连续无推进,自动恢复预算已耗尽。 */
1044
+ mediaUploadTimeout: string;
1043
1045
  /** 续传记录不可用,必须确认重新完整上传。 */
1044
1046
  mediaResumeUnavailable: string;
1045
1047
  /** 发送已停止,但远端临时上传数据的清理尚未确认。 */
package/dist/i18n.js CHANGED
@@ -1 +1 @@
1
- import'./chunk-SXY56EVC.js';export{a as DEFAULT_LOCALE,k as createImI18n,f as formatFailure,h as formatLastMessageSummary,i as formatMediaPlaceholder,j as formatMentionAll,l as formatServiceText,g as formatSystemMessage,c as getImTimeCatalog,b as normalizeImLocale,d as registerImCatalogOverrides,e as resetImCatalogOverrides}from'./chunk-7CJFY6CU.js';import'./chunk-F6DQBWJW.js';import'./chunk-WOT6VMZA.js';
1
+ import'./chunk-SXY56EVC.js';export{a as DEFAULT_LOCALE,k as createImI18n,f as formatFailure,h as formatLastMessageSummary,i as formatMediaPlaceholder,j as formatMentionAll,l as formatServiceText,g as formatSystemMessage,c as getImTimeCatalog,b as normalizeImLocale,d as registerImCatalogOverrides,e as resetImCatalogOverrides}from'./chunk-4HJR3NAM.js';import'./chunk-PJ2PW42T.js';import'./chunk-WOT6VMZA.js';
package/dist/index.d.ts CHANGED
@@ -684,7 +684,7 @@ type ImMessageFailureReason = 'timeout' | 'rejected' | 'encrypt_failed' | 'netwo
684
684
  * 失败**展示语义**码(强类型枚举,非裸串):供 im-i18n 按 locale 渲染失败气泡文案。
685
685
  * 由 `reason` / `SendMediaFailReason` / ACK errcode 穷尽映射而来,与 im-i18n failure catalog 键一一对应(media.* 带 mediaKind 参数)。
686
686
  */
687
- type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
687
+ type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.uploadTimeout' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
688
688
  interface ImMessageFailure {
689
689
  /** 归一后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
690
690
  code: number;
@@ -710,7 +710,7 @@ interface MediaTaskUpdate {
710
710
  messageId: string;
711
711
  ref: ConversationRef;
712
712
  direction: 'upload' | 'download';
713
- state: 'queued' | 'running' | 'completed' | 'failed' | 'canceled';
713
+ state: 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'canceled';
714
714
  percent: number;
715
715
  /**
716
716
  * upload 任务子阶段。
@@ -718,7 +718,16 @@ interface MediaTaskUpdate {
718
718
  * `waiting-upload-slot` 与 `state: 'queued'` 同时出现,表示还没开始传字节(在生成缩略图或在等上传槽位),
719
719
  * 此时 percent 恒为 0;`transferring` 正在传字节;`finalizing` 是等待远端 URL 最终确认。
720
720
  */
721
- phase?: 'waiting-upload-slot' | 'transferring' | 'finalizing';
721
+ phase?: 'waiting-upload-slot' | 'waiting-retry' | 'transferring' | 'finalizing';
722
+ /** 当前发送意图的尝试序号与总上限。 */
723
+ attempt?: number;
724
+ maxAttempts?: number;
725
+ /** 已传与总字节数,供共享展示层估算速度。 */
726
+ bytesTransferred?: number;
727
+ bytesTotal?: number;
728
+ /** 跨刷新恢复可用性;缺省尚未建立恢复记录。 */
729
+ recovery?: 'available' | 'session-only';
730
+ recoveryReason?: string;
722
731
  failure?: ImMessageFailure;
723
732
  }
724
733
  interface ImMessageEncryption {
@@ -3329,6 +3338,7 @@ interface MediaTransferAdapterConfig {
3329
3338
 
3330
3339
  /**
3331
3340
  * 媒体传输错误码(稳定业务码,宿主据此给提示或排查):
3341
+ * - `upload-timeout`:实际网络请求连续 30 秒没有推进,已中止该请求;控制请求结果可能未确认。
3332
3342
  * - `bucket-unconfigured`:该媒体类型或头像没有配置逻辑桶名(宿主 env 缺该资源类型)。
3333
3343
  * - `credentials-provider-missing`:宿主没有注入 `getUploadCredentials`,无法申请临时凭证。
3334
3344
  * - `credentials-request-failed`:宿主取凭证失败(网络、鉴权或业务码非成功);`cause` 保留宿主原始错误。
@@ -3343,7 +3353,7 @@ interface MediaTransferAdapterConfig {
3343
3353
  * - `download-object-changed`:分段之间的强 ETag 或总长度改变,拒绝混合不同文件版本。
3344
3354
  * - `download-range-failed`:下载返回非成功 HTTP 状态。
3345
3355
  */
3346
- type MediaTransferErrorCode = 'bucket-unconfigured' | 'credentials-provider-missing' | 'credentials-request-failed' | 'credentials-invalid' | 'upload-source-invalid' | 'upload-size-exceeded' | 'upload-resume-unavailable' | 'multipart-etag-missing' | 'multipart-abort-failed' | 'multipart-upload-failed' | 'download-range-invalid' | 'download-object-changed' | 'download-range-failed';
3356
+ type MediaTransferErrorCode = 'upload-timeout' | 'bucket-unconfigured' | 'credentials-provider-missing' | 'credentials-request-failed' | 'credentials-invalid' | 'upload-source-invalid' | 'upload-size-exceeded' | 'upload-resume-unavailable' | 'multipart-etag-missing' | 'multipart-abort-failed' | 'multipart-upload-failed' | 'download-range-invalid' | 'download-object-changed' | 'download-range-failed';
3347
3357
  /** 媒体传输统一错误:携带稳定业务码 + 可选底层 cause(诊断用,永不携带凭证明文)。 */
3348
3358
  declare class MediaTransferError extends Error {
3349
3359
  readonly code: MediaTransferErrorCode;
@@ -5468,9 +5478,9 @@ interface ConversationMessageApi {
5468
5478
  /** 显式添加/替换或移除,供参与者详情等不能用 toggle 猜动作的产品交互。 */
5469
5479
  setReaction: (messageId: string, emoji: string, action: ImReactionChangeAction) => Promise<ImReactionChangeResult>;
5470
5480
  /**
5471
- * 为刷新后上传中断的视频重新选择源文件,并原地替换同一条消息。
5481
+ * 为源文件已释放的视频重新选择源文件,并原地替换同一条消息。
5472
5482
  *
5473
- * @remarks 只接受当前 handle 中 `media.uploadInterrupted` 的失败视频。SDK 复用原消息 id 与排序时间,
5483
+ * @remarks 只接受上传中断、已取消或超时耗尽后的失败视频;必须重新选择文件。SDK 复用原消息 id 与排序时间,
5474
5484
  * 不清理当前 Composer 草稿;重新上传失败仍更新同一条消息。
5475
5485
  * @example
5476
5486
  * ```ts
@@ -5479,9 +5489,9 @@ interface ConversationMessageApi {
5479
5489
  */
5480
5490
  replaceInterruptedVideo: (messageId: string, file: File | Blob, options?: VideoMessageOptions) => Promise<SendMessageResult>;
5481
5491
  /**
5482
- * 为刷新后上传中断的文件重新选择源文件,并原地替换同一条消息。
5492
+ * 为源文件已释放的文件重新选择源文件,并原地替换同一条消息。
5483
5493
  *
5484
- * @remarks 只接受当前 handle 中 `media.uploadInterrupted` 的失败文件。SDK 复用原消息 id 与排序时间,
5494
+ * @remarks 只接受上传中断、已取消或超时耗尽后的失败文件或单项 filesAlbum;保留原配文。SDK 复用原消息 id 与排序时间,
5485
5495
  * 不清理当前 Composer 草稿;Blob 没有 name 时仍必须传 `fileName`。
5486
5496
  * @example
5487
5497
  * ```ts
@@ -5818,7 +5828,7 @@ interface ImMediaTask {
5818
5828
  /** upload 来自发送链路,download 来自本产品 API。 */
5819
5829
  direction: 'upload' | 'download';
5820
5830
  /** 终态 completed/failed/canceled 不会被同一尝试的迟到 progress 回退。 */
5821
- state: 'queued' | 'running' | 'completed' | 'failed' | 'canceled';
5831
+ state: 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'canceled';
5822
5832
  /** 0-100 的归一化整数。 */
5823
5833
  percent: number;
5824
5834
  /**
@@ -5828,7 +5838,16 @@ interface ImMediaTask {
5828
5838
  * 等上传槽位),此时 `percent` 恒为 0——宿主应显示「等待中」而不是把 0 当成停住的进度。
5829
5839
  * `transferring` 是正在传字节,`finalizing` 是字节已传完、在等对象存储确认。
5830
5840
  */
5831
- phase?: 'waiting-upload-slot' | 'transferring' | 'finalizing';
5841
+ phase?: 'waiting-upload-slot' | 'waiting-retry' | 'transferring' | 'finalizing';
5842
+ /** 当前发送意图的尝试序号与总上限。 */
5843
+ attempt?: number;
5844
+ maxAttempts?: number;
5845
+ /** 已传与总字节数,供共享展示层估算速度。 */
5846
+ bytesTransferred?: number;
5847
+ bytesTotal?: number;
5848
+ /** 跨刷新恢复可用性;缺省尚未建立恢复记录。 */
5849
+ recovery?: 'available' | 'session-only';
5850
+ recoveryReason?: string;
5832
5851
  /** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
5833
5852
  error?: ImSdkErrorShape;
5834
5853
  }
@@ -5866,6 +5885,20 @@ interface ImMediaTasksApi {
5866
5885
  * @throws 未知任务、非法状态或底层未受理时以稳定 `IM_SDK_MEDIA_TASK_*` 错误拒绝。
5867
5886
  */
5868
5887
  cancel: (taskId: string) => Promise<void>;
5888
+ /** 暂停上传,等待请求收尾后返回;下载不支持暂停。 */
5889
+ pause: (taskId: string) => Promise<void>;
5890
+ /** 恢复已暂停上传,复用同一原文件与消息。 */
5891
+ resume: (taskId: string) => Promise<void>;
5892
+ /** 只暴露恢复可用性,不返回文件密钥或远端分片凭据。 */
5893
+ getUploadRecovery: (message: ImMessageRef) => Promise<{
5894
+ available: boolean;
5895
+ reason?: string;
5896
+ expiresAt?: number;
5897
+ }>;
5898
+ /** 用户重选原文件并通过完整内容校验后恢复原消息。 */
5899
+ resumeUpload: (message: ImMessageRef, input: {
5900
+ file: Blob;
5901
+ }) => Promise<void>;
5869
5902
  /**
5870
5903
  * 重试 failed/canceled 任务;上传复用保留原文件,下载重新解析同一精确消息引用。
5871
5904
  * 续传不可用或清理未确认时,必须先征得用户同意重新上传,再传 restartUpload:true。
@@ -6692,6 +6725,10 @@ interface ImClientOptions {
6692
6725
  * 缺省则**不装配媒体传输端口** → `sendImage`/`sendVideo`/`loadImage`/`loadVideo` 显式不可用(connection 层 reject,非静默);预览(Canvas 缩略图/封面)不依赖此配置、恒可用。
6693
6726
  */
6694
6727
  media?: ImMediaConfig;
6728
+ /** 显式开启视频/文件跨刷新续传。最多 3 条、24 小时,保存加密密钥但不保存文件副本;注销清除。 */
6729
+ uploadRecovery?: {
6730
+ enabled: boolean;
6731
+ };
6695
6732
  }
6696
6733
  /**
6697
6734
  * 官方 UI Kit、调试工具与高级宿主的装配参数。
@@ -7547,6 +7584,8 @@ interface ImFailureCatalog {
7547
7584
  mediaEncryptFailed: string;
7548
7585
  /** media.uploadFailed,参数 {label}。 */
7549
7586
  mediaUploadFailed: string;
7587
+ /** 网络请求连续无推进,自动恢复预算已耗尽。 */
7588
+ mediaUploadTimeout: string;
7550
7589
  /** 续传记录不可用,必须确认重新完整上传。 */
7551
7590
  mediaResumeUnavailable: string;
7552
7591
  /** 发送已停止,但远端临时上传数据的清理尚未确认。 */
@@ -8245,6 +8284,10 @@ interface ChatRuntimeHostDeps {
8245
8284
  clientType: number;
8246
8285
  /** 获取当前环境的媒体上传下载配置;未启用媒体能力时返回 `undefined`。 */
8247
8286
  getMediaConfig: () => ImMediaConfig | undefined;
8287
+ /** 显式启用账号隔离的跨刷新恢复记录;保存密钥、不保存原文件,注销清除。 */
8288
+ uploadRecovery?: {
8289
+ enabled: boolean;
8290
+ };
8248
8291
  /** 获取 GIF provider 配置;API key 只留在宿主闭包与 SDK adapter,不进入共享 Store。 */
8249
8292
  getExpressionOptions?: () => ImExpressionOptions | undefined;
8250
8293
  }
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import'./chunk-IDECJJXC.js';import'./chunk-SXY56EVC.js';export{q as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,p as DEFAULT_LOADING_SHOW_DELAY_MS,v as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_HEIGHT,u as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_WIDTH,e as MINI_PROGRAM_LANG_NUMBERS,Q as SPIKE_STEP,M as calculateMediaBox,C as canCopyMessageImage,t as canPromoteMediaPresentationSource,z as captureRuntimeClientOperation,y as captureRuntimeOperation,n as channelMiniProgramRelKey,x as createConversationPrefetchController,r as createDelayedLoadingIndicator,K as createLinkMatcher,D as createMessageImageCopySource,f as csvIncludes,d as decideChannelMiniProgramRelOpen,O as formatFileSize,N as formatMediaDuration,P as getFileExtension,B as getMessageCopyImageUrl,A as getMessageCopyText,J as hasLinkCandidate,H as highlightSegments,a as isMiniProgramShowTypeOpenable,E as mediaService,I as normalizeLinkHref,T as placeholderWaveform,F as readService,S as resampleWaveform,s as resolveBestMediaPresentationSource,h as resolveChannelMiniProgramRelIcon,g as resolveChannelMiniProgramRelName,j as resolveChannelMiniProgramRelOpenSurface,i as resolveChannelMiniProgramRelUrl,k as resolveChannelPinnedGameCopy,o as resolveConversationListPresentation,L as resolveMediaPresentation,c as resolveMiniProgramFloatLinkUrl,w as resolveMiniProgramGamePreviewLayout,b as resolveMiniProgramOpenUrl,G as resolveQuotedMessagePresentation,m as resolveVisibleChannelMiniProgramRels,l as sortChannelMiniProgramFloatingItems,R as spikeCountForDuration}from'./chunk-3MMM3UU6.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,N as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,M as blockReasonForChannelSession,L as blockReasonForChannelState,T as blockReasonForGroupState,W as blockReasonForSession,G as canEditMessage,w as canPinChannelMessage,v as canPinGroupMessage,x as canPinMessage,F as canRecallMessage,da as cancelMediaUpload,R as classifyGifFile,Q as classifyMediaFile,s as countUnreadConversations,u as createChatRuntime,p as createEmojiMatcher,I as decideConversationAction,K as decideMemberTargetAction,J as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Da as fetchConversationFileBatch,Ea as fetchConversationImageBatch,Ba as fetchConversationMessageBatch,Fa as fetchConversationVideoBatch,Ga as fetchConversationVoiceBatch,Ha as fetchNextConversationSearchBatch,r as formatConversationUnreadBadge,ga as forwardService,o as hasEmojiCandidate,S as isGifFile,y as isPinnedMessageProtected,_ as isVoiceStorageConfigured,O as mediaBatchBudgetBytes,la as messageService,e as parseUnicodeEmojiCode,qa as pinnedMessageService,d as prependRecentEmoji,Aa as profileService,Z as replaceInterruptedMediaFile,U as requiresConversationEncryption,B as resolveChannelMemberAvatarUrl,A as resolveChannelMemberDisplayName,k as resolveEmojiToken,E as resolveFriendDisplayName,ra as resolveImProfileAccessDestination,z as resolveMemberDisplayName,t as resolveMessageNotificationDecision,D as resolvePublicNickname,C as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ea as retryMessage,P as runMediaSendBatch,ca as sendAsFilesBatch,H as sendBlockReasonForDecision,aa as sendMediaAlbum,Y as sendMediaFile,ba as sendMediaFilesBatch,X as sendText,$ as sendVoice,V as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-OSWUOGBS.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-2ODEJA5X.js';export{a as DEFAULT_LOCALE,k as createImI18n,f as formatFailure,h as formatLastMessageSummary,i as formatMediaPlaceholder,j as formatMentionAll,l as formatServiceText,g as formatSystemMessage,c as getImTimeCatalog,b as normalizeImLocale,d as registerImCatalogOverrides,e as resetImCatalogOverrides}from'./chunk-7CJFY6CU.js';export{e as IMAGE_MESSAGE_ACCEPT,n as IM_CHAT_FONT_SCALES,g as IM_DIAGNOSTIC_CATEGORIES,j as IM_EMOJI_CATALOG,c as ImPinnedMessageOperationError,m as buildSessionFavoritePlainBody,d as createFaceToFaceGroupQrPayload,o as createImClient,h as createImConsoleDiagnosticSink,r as createImDiagnosticMemoryBuffer,s as createImResourceUploader,i as createSdkDiagnosticWriter,f as isSupportedImageFile,a as migrateImCachePrefix,k as resolveImEmojiToken,l as resolveSessionFavoriteKindFromMessage}from'./chunk-DBWAR2FB.js';export{Xa as MediaTransferError,gb as createVoicePlayer,hb as createVoiceRecordingSession,eb as detectVoiceCapabilities,Ya as mediaTransferErrorCodeOf,Za as normalizeMediaUploadCredentials,fb as voiceErrorCodeOf}from'./chunk-OFXCH5DZ.js';export{ra as EDIT_WINDOW_MS,p as MEDIA_ALBUM_CAPTION_MAX_LENGTH,q as MEDIA_ALBUM_MAX_ITEMS,za as REACTION_SUPPORTED_CONTENT_TYPES,Aa as canReactToMessage,va as canTransmit,ta as canTransmitByType,ua as canTransmitContent,u as classifyStickerImageType,ga as createImTextSearchMatcher,ea as extractSearchText,fa as getImTextSearchInitial,vb as parseSessionFavoriteAlbumItems,sa as requiresForwardTypeConfirmation,Ca as resolveChannelAccess,r as resolveMediaAlbumSendContentType,wb as resolveSessionFavoriteAlbumCaption,ub as resolveSessionFavoriteAlbumItemPreviewUrl,la as resolveTextSegments,Ja as sortSessions,Ka as sumSessionsUnread}from'./chunk-F6DQBWJW.js';import'./chunk-WOT6VMZA.js';
1
+ import'./chunk-IDECJJXC.js';import'./chunk-SXY56EVC.js';export{q as DEFAULT_LOADING_MINIMUM_VISIBLE_MS,p as DEFAULT_LOADING_SHOW_DELAY_MS,v as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_HEIGHT,u as MINI_PROGRAM_GAME_PREVIEW_FALLBACK_WIDTH,e as MINI_PROGRAM_LANG_NUMBERS,Q as SPIKE_STEP,M as calculateMediaBox,C as canCopyMessageImage,t as canPromoteMediaPresentationSource,z as captureRuntimeClientOperation,y as captureRuntimeOperation,n as channelMiniProgramRelKey,x as createConversationPrefetchController,r as createDelayedLoadingIndicator,K as createLinkMatcher,D as createMessageImageCopySource,f as csvIncludes,d as decideChannelMiniProgramRelOpen,O as formatFileSize,N as formatMediaDuration,P as getFileExtension,B as getMessageCopyImageUrl,A as getMessageCopyText,J as hasLinkCandidate,H as highlightSegments,a as isMiniProgramShowTypeOpenable,E as mediaService,I as normalizeLinkHref,T as placeholderWaveform,F as readService,S as resampleWaveform,s as resolveBestMediaPresentationSource,h as resolveChannelMiniProgramRelIcon,g as resolveChannelMiniProgramRelName,j as resolveChannelMiniProgramRelOpenSurface,i as resolveChannelMiniProgramRelUrl,k as resolveChannelPinnedGameCopy,o as resolveConversationListPresentation,L as resolveMediaPresentation,c as resolveMiniProgramFloatLinkUrl,w as resolveMiniProgramGamePreviewLayout,b as resolveMiniProgramOpenUrl,G as resolveQuotedMessagePresentation,m as resolveVisibleChannelMiniProgramRels,l as sortChannelMiniProgramFloatingItems,R as spikeCountForDuration}from'./chunk-QK3UXZKZ.js';export{j as DEFAULT_EMOJI_ASSET_BASE,i as EMOJI_CATALOG,c as EMOJI_GAME_DICE_STABLE_KEY,b as EMOJI_GAME_RPS_STABLE_KEY,m as EMOJI_TOKEN_RE,N as MAX_BATCH_FILES,a as MAX_RECENT_EMOJI_COUNT,g as UNICODE_EMOJI_CATALOG,M as blockReasonForChannelSession,L as blockReasonForChannelState,T as blockReasonForGroupState,W as blockReasonForSession,G as canEditMessage,w as canPinChannelMessage,v as canPinGroupMessage,x as canPinMessage,F as canRecallMessage,da as cancelMediaUpload,R as classifyGifFile,Q as classifyMediaFile,s as countUnreadConversations,u as createChatRuntime,p as createEmojiMatcher,I as decideConversationAction,K as decideMemberTargetAction,J as decideMessageAction,l as emojiAssetUrl,n as emojiUrlByCode,Da as fetchConversationFileBatch,Ea as fetchConversationImageBatch,Ba as fetchConversationMessageBatch,Fa as fetchConversationVideoBatch,Ga as fetchConversationVoiceBatch,Ha as fetchNextConversationSearchBatch,r as formatConversationUnreadBadge,ga as forwardService,o as hasEmojiCandidate,S as isGifFile,y as isPinnedMessageProtected,_ as isVoiceStorageConfigured,O as mediaBatchBudgetBytes,la as messageService,e as parseUnicodeEmojiCode,qa as pinnedMessageService,d as prependRecentEmoji,Aa as profileService,Z as replaceInterruptedMediaFile,U as requiresConversationEncryption,B as resolveChannelMemberAvatarUrl,A as resolveChannelMemberDisplayName,k as resolveEmojiToken,E as resolveFriendDisplayName,ra as resolveImProfileAccessDestination,z as resolveMemberDisplayName,t as resolveMessageNotificationDecision,D as resolvePublicNickname,C as resolveSenderAvatarUrl,q as resolveStandaloneEmojiMessage,h as resolveUnicodeEmoji,ea as retryMessage,P as runMediaSendBatch,ca as sendAsFilesBatch,H as sendBlockReasonForDecision,aa as sendMediaAlbum,Y as sendMediaFile,ba as sendMediaFilesBatch,X as sendText,$ as sendVoice,V as supportsConversationMention,f as unicodeEmojiTextFromCode}from'./chunk-QDQNYCIH.js';export{C as createNewMessageBadgeController,i as createThreadItems,f as formatChatDateSeparator,e as formatConversationDisplayTime,c as getLocalDayKey,l as isMessageLocateScrollProtected,v as isMessageTailChangeFromOlderWindowTrim,k as isMessageViewportMeasurable,B as isMessageVisibleForNewMessageBadge,x as loadOlderUntilBoundary,p as refreshPrependMessageAnchorPosition,j as resolveCenteredMessageScrollTop,a as resolveDisplayTimestamp,g as resolveImThreadActiveDate,h as resolveMessageBodyKind,b as resolveMessageTimelineTimestamp,n as resolvePrependMessageAnchor,q as resolvePrependMessageAnchorAdjustment,o as resolvePrependMessageAnchorPosition,s as resolveSurvivingMessageAnchorAdjustment,r as resolveVisibleMessageAnchorPositions,t as shouldCompleteInitialViewport,y as shouldFillInitialHistoryViewport,u as shouldFollowIncomingMessage,z as shouldLoadNewerHistoryPage,m as shouldPrefetchOlderHistory,w as shouldRestoreMessageViewportFocus,d as shouldShowChatDateSeparator,A as shouldTrackRemoteMessageForBadge}from'./chunk-YEXLMW5J.js';export{a as DEFAULT_LOCALE,k as createImI18n,f as formatFailure,h as formatLastMessageSummary,i as formatMediaPlaceholder,j as formatMentionAll,l as formatServiceText,g as formatSystemMessage,c as getImTimeCatalog,b as normalizeImLocale,d as registerImCatalogOverrides,e as resetImCatalogOverrides}from'./chunk-4HJR3NAM.js';export{e as IMAGE_MESSAGE_ACCEPT,n as IM_CHAT_FONT_SCALES,g as IM_DIAGNOSTIC_CATEGORIES,j as IM_EMOJI_CATALOG,c as ImPinnedMessageOperationError,m as buildSessionFavoritePlainBody,d as createFaceToFaceGroupQrPayload,o as createImClient,h as createImConsoleDiagnosticSink,r as createImDiagnosticMemoryBuffer,s as createImResourceUploader,i as createSdkDiagnosticWriter,f as isSupportedImageFile,a as migrateImCachePrefix,k as resolveImEmojiToken,l as resolveSessionFavoriteKindFromMessage}from'./chunk-WQBCUQ6Q.js';export{Xa as MediaTransferError,jb as createVoicePlayer,kb as createVoiceRecordingSession,hb as detectVoiceCapabilities,Ya as mediaTransferErrorCodeOf,_a as normalizeMediaUploadCredentials,ib as voiceErrorCodeOf}from'./chunk-IEFK5A7T.js';export{ra as EDIT_WINDOW_MS,p as MEDIA_ALBUM_CAPTION_MAX_LENGTH,q as MEDIA_ALBUM_MAX_ITEMS,za as REACTION_SUPPORTED_CONTENT_TYPES,Aa as canReactToMessage,va as canTransmit,ta as canTransmitByType,ua as canTransmitContent,u as classifyStickerImageType,ga as createImTextSearchMatcher,ea as extractSearchText,fa as getImTextSearchInitial,vb as parseSessionFavoriteAlbumItems,sa as requiresForwardTypeConfirmation,Ca as resolveChannelAccess,r as resolveMediaAlbumSendContentType,wb as resolveSessionFavoriteAlbumCaption,ub as resolveSessionFavoriteAlbumItemPreviewUrl,la as resolveTextSegments,Ja as sortSessions,Ka as sumSessionsUnread}from'./chunk-PJ2PW42T.js';import'./chunk-WOT6VMZA.js';
package/dist/sdk.d.ts CHANGED
@@ -684,7 +684,7 @@ type ImMessageFailureReason = 'timeout' | 'rejected' | 'encrypt_failed' | 'netwo
684
684
  * 失败**展示语义**码(强类型枚举,非裸串):供 im-i18n 按 locale 渲染失败气泡文案。
685
685
  * 由 `reason` / `SendMediaFailReason` / ACK errcode 穷尽映射而来,与 im-i18n failure catalog 键一一对应(media.* 带 mediaKind 参数)。
686
686
  */
687
- type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
687
+ type ImFailureDisplayCode = 'media.empty' | 'media.noCrypto' | 'media.previewFailed' | 'media.encryptFailed' | 'media.resumeUnavailable' | 'media.cleanupUnconfirmed' | 'media.uploadFailed' | 'media.uploadTimeout' | 'media.cancelled' | 'media.invalidDuration' | 'media.uploadInterrupted' | 'media.contentTooLarge' | 'contactRequired' | 'messageRefused' | 'forbiddenOrLeft' | 'contentRejected' | 'groupDismissed' | 'groupUnavailable' | 'channelDismissed' | 'channelMuted' | 'channelNotMember' | 'channelAdminRequired' | 'conversationUnsupported' | 'sendCanceled' | 'sessionLoggedOut' | 'timeout' | 'network' | 'unknown';
688
688
  interface ImMessageFailure {
689
689
  /** 归一后的错误码(来自 MESChatAck.errcode 或本地失败码,本地码用负值)。 */
690
690
  code: number;
@@ -710,7 +710,7 @@ interface MediaTaskUpdate {
710
710
  messageId: string;
711
711
  ref: ConversationRef;
712
712
  direction: 'upload' | 'download';
713
- state: 'queued' | 'running' | 'completed' | 'failed' | 'canceled';
713
+ state: 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'canceled';
714
714
  percent: number;
715
715
  /**
716
716
  * upload 任务子阶段。
@@ -718,7 +718,16 @@ interface MediaTaskUpdate {
718
718
  * `waiting-upload-slot` 与 `state: 'queued'` 同时出现,表示还没开始传字节(在生成缩略图或在等上传槽位),
719
719
  * 此时 percent 恒为 0;`transferring` 正在传字节;`finalizing` 是等待远端 URL 最终确认。
720
720
  */
721
- phase?: 'waiting-upload-slot' | 'transferring' | 'finalizing';
721
+ phase?: 'waiting-upload-slot' | 'waiting-retry' | 'transferring' | 'finalizing';
722
+ /** 当前发送意图的尝试序号与总上限。 */
723
+ attempt?: number;
724
+ maxAttempts?: number;
725
+ /** 已传与总字节数,供共享展示层估算速度。 */
726
+ bytesTransferred?: number;
727
+ bytesTotal?: number;
728
+ /** 跨刷新恢复可用性;缺省尚未建立恢复记录。 */
729
+ recovery?: 'available' | 'session-only';
730
+ recoveryReason?: string;
722
731
  failure?: ImMessageFailure;
723
732
  }
724
733
  interface ImMessageEncryption {
@@ -2417,6 +2426,7 @@ interface MediaTransferAdapterConfig {
2417
2426
 
2418
2427
  /**
2419
2428
  * 媒体传输错误码(稳定业务码,宿主据此给提示或排查):
2429
+ * - `upload-timeout`:实际网络请求连续 30 秒没有推进,已中止该请求;控制请求结果可能未确认。
2420
2430
  * - `bucket-unconfigured`:该媒体类型或头像没有配置逻辑桶名(宿主 env 缺该资源类型)。
2421
2431
  * - `credentials-provider-missing`:宿主没有注入 `getUploadCredentials`,无法申请临时凭证。
2422
2432
  * - `credentials-request-failed`:宿主取凭证失败(网络、鉴权或业务码非成功);`cause` 保留宿主原始错误。
@@ -2431,7 +2441,7 @@ interface MediaTransferAdapterConfig {
2431
2441
  * - `download-object-changed`:分段之间的强 ETag 或总长度改变,拒绝混合不同文件版本。
2432
2442
  * - `download-range-failed`:下载返回非成功 HTTP 状态。
2433
2443
  */
2434
- type MediaTransferErrorCode = 'bucket-unconfigured' | 'credentials-provider-missing' | 'credentials-request-failed' | 'credentials-invalid' | 'upload-source-invalid' | 'upload-size-exceeded' | 'upload-resume-unavailable' | 'multipart-etag-missing' | 'multipart-abort-failed' | 'multipart-upload-failed' | 'download-range-invalid' | 'download-object-changed' | 'download-range-failed';
2444
+ type MediaTransferErrorCode = 'upload-timeout' | 'bucket-unconfigured' | 'credentials-provider-missing' | 'credentials-request-failed' | 'credentials-invalid' | 'upload-source-invalid' | 'upload-size-exceeded' | 'upload-resume-unavailable' | 'multipart-etag-missing' | 'multipart-abort-failed' | 'multipart-upload-failed' | 'download-range-invalid' | 'download-object-changed' | 'download-range-failed';
2435
2445
  /** 媒体传输统一错误:携带稳定业务码 + 可选底层 cause(诊断用,永不携带凭证明文)。 */
2436
2446
  declare class MediaTransferError extends Error {
2437
2447
  readonly code: MediaTransferErrorCode;
@@ -4505,9 +4515,9 @@ interface ConversationMessageApi {
4505
4515
  /** 显式添加/替换或移除,供参与者详情等不能用 toggle 猜动作的产品交互。 */
4506
4516
  setReaction: (messageId: string, emoji: string, action: ImReactionChangeAction) => Promise<ImReactionChangeResult>;
4507
4517
  /**
4508
- * 为刷新后上传中断的视频重新选择源文件,并原地替换同一条消息。
4518
+ * 为源文件已释放的视频重新选择源文件,并原地替换同一条消息。
4509
4519
  *
4510
- * @remarks 只接受当前 handle 中 `media.uploadInterrupted` 的失败视频。SDK 复用原消息 id 与排序时间,
4520
+ * @remarks 只接受上传中断、已取消或超时耗尽后的失败视频;必须重新选择文件。SDK 复用原消息 id 与排序时间,
4511
4521
  * 不清理当前 Composer 草稿;重新上传失败仍更新同一条消息。
4512
4522
  * @example
4513
4523
  * ```ts
@@ -4516,9 +4526,9 @@ interface ConversationMessageApi {
4516
4526
  */
4517
4527
  replaceInterruptedVideo: (messageId: string, file: File | Blob, options?: VideoMessageOptions) => Promise<SendMessageResult>;
4518
4528
  /**
4519
- * 为刷新后上传中断的文件重新选择源文件,并原地替换同一条消息。
4529
+ * 为源文件已释放的文件重新选择源文件,并原地替换同一条消息。
4520
4530
  *
4521
- * @remarks 只接受当前 handle 中 `media.uploadInterrupted` 的失败文件。SDK 复用原消息 id 与排序时间,
4531
+ * @remarks 只接受上传中断、已取消或超时耗尽后的失败文件或单项 filesAlbum;保留原配文。SDK 复用原消息 id 与排序时间,
4522
4532
  * 不清理当前 Composer 草稿;Blob 没有 name 时仍必须传 `fileName`。
4523
4533
  * @example
4524
4534
  * ```ts
@@ -4855,7 +4865,7 @@ interface ImMediaTask {
4855
4865
  /** upload 来自发送链路,download 来自本产品 API。 */
4856
4866
  direction: 'upload' | 'download';
4857
4867
  /** 终态 completed/failed/canceled 不会被同一尝试的迟到 progress 回退。 */
4858
- state: 'queued' | 'running' | 'completed' | 'failed' | 'canceled';
4868
+ state: 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'canceled';
4859
4869
  /** 0-100 的归一化整数。 */
4860
4870
  percent: number;
4861
4871
  /**
@@ -4865,7 +4875,16 @@ interface ImMediaTask {
4865
4875
  * 等上传槽位),此时 `percent` 恒为 0——宿主应显示「等待中」而不是把 0 当成停住的进度。
4866
4876
  * `transferring` 是正在传字节,`finalizing` 是字节已传完、在等对象存储确认。
4867
4877
  */
4868
- phase?: 'waiting-upload-slot' | 'transferring' | 'finalizing';
4878
+ phase?: 'waiting-upload-slot' | 'waiting-retry' | 'transferring' | 'finalizing';
4879
+ /** 当前发送意图的尝试序号与总上限。 */
4880
+ attempt?: number;
4881
+ maxAttempts?: number;
4882
+ /** 已传与总字节数,供共享展示层估算速度。 */
4883
+ bytesTransferred?: number;
4884
+ bytesTotal?: number;
4885
+ /** 跨刷新恢复可用性;缺省尚未建立恢复记录。 */
4886
+ recovery?: 'available' | 'session-only';
4887
+ recoveryReason?: string;
4869
4888
  /** 可供产品按 code/category 决策的稳定错误;不含底层 URL、密钥或响应正文。 */
4870
4889
  error?: ImSdkErrorShape;
4871
4890
  }
@@ -4903,6 +4922,20 @@ interface ImMediaTasksApi {
4903
4922
  * @throws 未知任务、非法状态或底层未受理时以稳定 `IM_SDK_MEDIA_TASK_*` 错误拒绝。
4904
4923
  */
4905
4924
  cancel: (taskId: string) => Promise<void>;
4925
+ /** 暂停上传,等待请求收尾后返回;下载不支持暂停。 */
4926
+ pause: (taskId: string) => Promise<void>;
4927
+ /** 恢复已暂停上传,复用同一原文件与消息。 */
4928
+ resume: (taskId: string) => Promise<void>;
4929
+ /** 只暴露恢复可用性,不返回文件密钥或远端分片凭据。 */
4930
+ getUploadRecovery: (message: ImMessageRef) => Promise<{
4931
+ available: boolean;
4932
+ reason?: string;
4933
+ expiresAt?: number;
4934
+ }>;
4935
+ /** 用户重选原文件并通过完整内容校验后恢复原消息。 */
4936
+ resumeUpload: (message: ImMessageRef, input: {
4937
+ file: Blob;
4938
+ }) => Promise<void>;
4906
4939
  /**
4907
4940
  * 重试 failed/canceled 任务;上传复用保留原文件,下载重新解析同一精确消息引用。
4908
4941
  * 续传不可用或清理未确认时,必须先征得用户同意重新上传,再传 restartUpload:true。
@@ -5706,6 +5739,10 @@ interface ImClientOptions {
5706
5739
  * 缺省则**不装配媒体传输端口** → `sendImage`/`sendVideo`/`loadImage`/`loadVideo` 显式不可用(connection 层 reject,非静默);预览(Canvas 缩略图/封面)不依赖此配置、恒可用。
5707
5740
  */
5708
5741
  media?: ImMediaConfig;
5742
+ /** 显式开启视频/文件跨刷新续传。最多 3 条、24 小时,保存加密密钥但不保存文件副本;注销清除。 */
5743
+ uploadRecovery?: {
5744
+ enabled: boolean;
5745
+ };
5709
5746
  }
5710
5747
  /** 产品级账号与连接生命周期;adapter、transport 和连接状态机原子不进入该接口。 */
5711
5748
  interface ImSessionApi {
package/dist/sdk.js CHANGED
@@ -1 +1 @@
1
- import'./chunk-IDECJJXC.js';export{e as IMAGE_MESSAGE_ACCEPT,n as IM_CHAT_FONT_SCALES,g as IM_DIAGNOSTIC_CATEGORIES,j as IM_EMOJI_CATALOG,c as ImPinnedMessageOperationError,m as buildSessionFavoritePlainBody,d as createFaceToFaceGroupQrPayload,o as createImClient,h as createImConsoleDiagnosticSink,r as createImDiagnosticMemoryBuffer,s as createImResourceUploader,i as createSdkDiagnosticWriter,f as isSupportedImageFile,a as migrateImCachePrefix,k as resolveImEmojiToken,l as resolveSessionFavoriteKindFromMessage}from'./chunk-DBWAR2FB.js';export{Xa as MediaTransferError,gb as createVoicePlayer,hb as createVoiceRecordingSession,eb as detectVoiceCapabilities,Ya as mediaTransferErrorCodeOf,Za as normalizeMediaUploadCredentials,fb as voiceErrorCodeOf}from'./chunk-OFXCH5DZ.js';export{ra as EDIT_WINDOW_MS,p as MEDIA_ALBUM_CAPTION_MAX_LENGTH,q as MEDIA_ALBUM_MAX_ITEMS,za as REACTION_SUPPORTED_CONTENT_TYPES,Aa as canReactToMessage,va as canTransmit,ta as canTransmitByType,ua as canTransmitContent,u as classifyStickerImageType,ga as createImTextSearchMatcher,ea as extractSearchText,fa as getImTextSearchInitial,vb as parseSessionFavoriteAlbumItems,sa as requiresForwardTypeConfirmation,Ca as resolveChannelAccess,r as resolveMediaAlbumSendContentType,wb as resolveSessionFavoriteAlbumCaption,ub as resolveSessionFavoriteAlbumItemPreviewUrl,la as resolveTextSegments,Ja as sortSessions,Ka as sumSessionsUnread}from'./chunk-F6DQBWJW.js';import'./chunk-WOT6VMZA.js';
1
+ import'./chunk-IDECJJXC.js';export{e as IMAGE_MESSAGE_ACCEPT,n as IM_CHAT_FONT_SCALES,g as IM_DIAGNOSTIC_CATEGORIES,j as IM_EMOJI_CATALOG,c as ImPinnedMessageOperationError,m as buildSessionFavoritePlainBody,d as createFaceToFaceGroupQrPayload,o as createImClient,h as createImConsoleDiagnosticSink,r as createImDiagnosticMemoryBuffer,s as createImResourceUploader,i as createSdkDiagnosticWriter,f as isSupportedImageFile,a as migrateImCachePrefix,k as resolveImEmojiToken,l as resolveSessionFavoriteKindFromMessage}from'./chunk-WQBCUQ6Q.js';export{Xa as MediaTransferError,jb as createVoicePlayer,kb as createVoiceRecordingSession,hb as detectVoiceCapabilities,Ya as mediaTransferErrorCodeOf,_a as normalizeMediaUploadCredentials,ib as voiceErrorCodeOf}from'./chunk-IEFK5A7T.js';export{ra as EDIT_WINDOW_MS,p as MEDIA_ALBUM_CAPTION_MAX_LENGTH,q as MEDIA_ALBUM_MAX_ITEMS,za as REACTION_SUPPORTED_CONTENT_TYPES,Aa as canReactToMessage,va as canTransmit,ta as canTransmitByType,ua as canTransmitContent,u as classifyStickerImageType,ga as createImTextSearchMatcher,ea as extractSearchText,fa as getImTextSearchInitial,vb as parseSessionFavoriteAlbumItems,sa as requiresForwardTypeConfirmation,Ca as resolveChannelAccess,r as resolveMediaAlbumSendContentType,wb as resolveSessionFavoriteAlbumCaption,ub as resolveSessionFavoriteAlbumItemPreviewUrl,la as resolveTextSegments,Ja as sortSessions,Ka as sumSessionsUnread}from'./chunk-PJ2PW42T.js';import'./chunk-WOT6VMZA.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "k2-im",
3
3
  "type": "module",
4
- "version": "0.1.33",
4
+ "version": "0.1.34",
5
5
  "private": false,
6
6
  "license": "MIT",
7
7
  "publishConfig": {
@@ -63,6 +63,7 @@
63
63
  "@aws-sdk/xhr-http-handler": "^3.1079.0",
64
64
  "@bufbuild/protobuf": "^2.12.1",
65
65
  "axios": "^1.16.1",
66
+ "hash-wasm": "4.12.0",
66
67
  "idb": "^8.0.3",
67
68
  "lossless-json": "^4.3.0",
68
69
  "node-forge": "^1.4.0",