k2-im 0.1.0

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/README.md ADDED
@@ -0,0 +1,81 @@
1
+ # `@k2/im`
2
+
3
+ IM SDK 聚合包的 workspace 源码。发布到 npm 官方源时,公共包名为 `k2-im`;workspace 内部名称仍为 `@k2/im`,当前提供一个组合根入口和五个按职责拆分的 subpath:
4
+
5
+ - `@k2/im/sdk`:框架无关的产品 SDK。
6
+ - `@k2/im/i18n`:语义文案和 formatter。
7
+ - `@k2/im/chat-kit`:Core-only Chat Runtime、command service 和纯工具。
8
+ - `@k2/im/chat-kit/pinia`:按 Pinia 实例隔离的 Context,以及 Session、Conversation List、Thread、Composer、Message Operations、Search、Profile/Directory、Media 八个共享领域 Store。
9
+ - `@k2/im/chat-kit/vue`:轻量 Vue composable、宿主环境类型、i18n 桥,以及无产品样式的 Managed Headless Thread Surface/renderer registry。
10
+
11
+ `@k2/im` 根入口只组合 `sdk`、`i18n` 与 Core-only `chat-kit` 的导出,不把 Pinia/Vue 框架入口隐式带入默认依赖图;普通宿主应按职责从 subpath 导入。
12
+
13
+ Chat Kit Core 与 Core-only 入口不依赖 Vue/Pinia/路由,也不自行获取、查询、修改、监听或持有页面 DOM/Canvas 等环境资源。真实跨宿主复用的浏览器能力可以在合同稳定后进入明确的 Browser/Vue 子层,不要求整个 Chat Kit Worker-safe。`chat-kit/pinia` 按领域提供 PC/H5 直接消费的共享 Stores,但不读取宿主认证、路由或反馈,不拥有页面节点/Observer 生命周期、不在 `$state` 中持有 DOM/Canvas 对象,不持有模块级全局 Runtime,也不提供完整产品页面。Web PC 与 H5 各自维护平台 Store 和最终 UI;Pinia/Vue 作为 peer dependency 由宿主提供,避免发布产物打包第二份框架运行时。
14
+
15
+ 当前只共享已经由 PC/H5 消费的无产品样式 Thread Surface、viewport、结构 slots 和 renderer registry,不建设带品牌视觉或平台交互的公共 UI Kit。其它 Vue 组件仍需两个真实消费者证明合同一致后再独立评估。当前也不预建 Worker 入口或要求整个 Chat Kit Worker-safe;未来只有真实 Worker 切片的专用入口和依赖闭包需要排除 Vue/Pinia,并继续由 SDK/Core 对应能力 owner 提供执行 adapter。
16
+
17
+ 当前版本 `0.1.0` 仅用于预稳定发布组织验证,不代表稳定版。开发期 Web PC 通过 `workspace:*` 使用 source mode;发布候选通过 [`docs/im-sdk/public-release-runbook.md`](../../docs/im-sdk/public-release-runbook.md) 生成 `k2-im` 的 dist-only tarball 并上传 npm 官方源,H5 在包可查询后通过 alias 使用精确版本和 lockfile integrity。
18
+
19
+ 当前 ESM 与声明构建均已内联 workspace 依赖,crypto WASM 和 Speex 运行时资产也随包提供。开发期本地同步保留 JavaScript source map、不压缩且每个入口保持独立,便于调试;公共 npm 发布使用压缩后的 JavaScript、共享 chunk 和压缩后的 Speex 运行时,并且 tarball 不包含 `.map` 文件。这仍是 `0.1.0` 预稳定候选,不代表 registry 稳定发布。
20
+
21
+ 发布候选已通过独立 Rspack clean-consumer Gate:AWS 仅在首次上传时加载,crypto WASM 与 Speex 由 dist 自持,fixture 不需要 Node shim、WASM loader、asset copy 或 postinstall。该证据只证明普通 Rspack 消费者可以编译,不等于 H5 已同步当前 tarball 或真实媒体链路已验收;H5 开发期通过本地同步脚本完成自身 typecheck/Rspack 验证,上线准备阶段再使用内部 Registry 精确版本完成 Docker/Jenkins 验证。
22
+
23
+ ## 国际化(i18n)
24
+
25
+ SDK 内置领域文案,开箱即用,宿主渲染层无需自建系统消息 / 失败气泡 / 会话预览的文案表。
26
+
27
+ - **内置 5 个 locale 全量译文**:`zh-CN`(主源)、`en-US`、`zh-TW`、`vi-VN`、`th-TH`。普通展示文案按「宿主 override → SDK 内置译文 → `zh-CN` 基线」逐层回退;override 注册时会校验非空值和模板占位符,formatter 不产生空串。
28
+ - **框架无关**:`@k2/im/i18n` 不依赖 Vue/Pinia/Nuxt,可在 Web PC、H5、SSR、Worker 与测试中复用。
29
+ - **领域层只产语义码**:Core / Chat Kit 对外吐 `displayCode` / `ImServiceTextKey` / 系统事件码,由渲染层按当前 locale 调 `formatXxx` 生成文本。宿主布局文案(按钮、菜单、页面标题)仍归宿主自己的 i18n,不进本层。
30
+
31
+ ### 渲染层用法
32
+
33
+ `formatXxx` 是无状态纯函数,每次传入当前 `locale` 即可,切语言直接重渲染:
34
+
35
+ ```ts
36
+ import type { ImLocale } from '@k2/im/i18n';
37
+ import { formatFailure, formatLastMessageSummary, formatMentionAll, formatSystemMessage, normalizeImLocale } from '@k2/im/i18n';
38
+
39
+ // 宿主更宽的 locale 联合 → 窄化到 5 个 ImLocale(非法值回退 zh-CN)
40
+ const locale: ImLocale = normalizeImLocale(hostLocale); // 如 useI18n().locale.value
41
+
42
+ formatSystemMessage(message.body.system, { locale, resolveName, selfId }); // 入群 / 退群 / 撤回等系统消息
43
+ formatLastMessageSummary(session.lastMessageSummary, { locale, resolveName, selfId }); // 会话列表预览
44
+ formatFailure(failure.displayCode, { locale, mediaKind: failure.mediaKind }); // 发送失败气泡
45
+ formatMentionAll(locale); // @所有人 展示文案('@All' / '@所有人' …)
46
+ ```
47
+
48
+ Vue 宿主可用 `@k2/im/chat-kit/vue` 的 `useImText` 桥接,一次注入 `locale()` / `resolveName` / `selfId` 后直接拿到消息级文案函数。
49
+
50
+ > `@提及全体成员`:**识别**(解析对端各语言正文)与**展示**(按接收端语言渲染)分离。渲染 `resolveTextSegments` 时把 `atAllDisplay: formatMentionAll(locale)` 传入即可;未传时降级为发送端原文,SDK 不塞任何单一语言默认。
51
+
52
+ ### 宿主运行时覆盖(override 逃生舱)
53
+
54
+ 内置译文是默认;宿主可在启动时用 `registerImCatalogOverrides` 覆盖 SDK 已内置 locale 的普通展示文案,无需等 SDK 发版。典型用途是热修措辞或调整品牌术语。优先级 **宿主 override > SDK 内置译文 > `zh-CN` 基线**。
55
+
56
+ ```ts
57
+ import { registerImCatalogOverrides } from '@k2/im/i18n';
58
+
59
+ // 只需提供要改的键(ImCatalogOverrides);未覆盖的键仍走内置译文 / 回退。
60
+ // 同一 locale 多次调用会累积合并;注入后对应缓存自动失效,下次 formatXxx 即生效。
61
+ registerImCatalogOverrides('en-US', {
62
+ failure: { network: 'Network error. Please try again.' },
63
+ service: { 'forward.done': 'Forwarded' },
64
+ });
65
+ ```
66
+
67
+ 在应用启动阶段(如插件初始化)注册一次即可,全局生效。注册会拒绝空白文案、未知键以及与主源不一致的 `{reason}` / `{label}` 等模板占位符。
68
+
69
+ > 注意:`registerImCatalogOverrides` 是进程级模块状态,会影响所有调用方;不要在组件渲染期反复注册。`mention.all` 会进入消息正文并参与跨端识别,因此不允许 override。新增 locale 也必须在 SDK 中同时补齐 catalog、类型和 `@全体成员` 识别合同,不能复用现有 locale 槽位伪装。`resetImCatalogOverrides()` 仅用于测试隔离或应用整体重载文案管线,不应在单个账号登出时调用。
70
+ >
71
+ > 动态原始报错(如 `error.message`)作为 `{reason}` 等参数在调用 `formatXxx` 时传入,属诊断信息,不进 catalog、不翻译。
72
+
73
+ ## License
74
+
75
+ workspace manifest 当前仍保留 `UNLICENSED`,因为它是内部 source mode 的法律状态;当前 workspace 候选未上传 registry。公共 `k2-im` tarball 默认使用 MIT,且强制 `publishConfig.access=public`。
76
+
77
+ ```ts
78
+ import { createImClient } from '@k2/im/sdk';
79
+ import { createImI18n } from '@k2/im/i18n';
80
+ import { createChatRuntime } from '@k2/im/chat-kit';
81
+ ```
@@ -0,0 +1,2 @@
1
+ import {a as a$1}from'./chunk-WOT6VMZA.js';import {parse,isInteger,isSafeNumber}from'lossless-json';import Ce from'axios';function ot(t){return {cryptMd5:t.crypt_md5,generateSign:t.generate_sign,encryptAes:t.encrypt_aes,decryptAes:t.decrypt_aes}}var $={};a$1($,{__wbg_get_67b2ba62fc30de12:()=>Yt,__wbg_get_b9b93047fe3cf45b:()=>Gt,__wbg_length_e2d2a49132c1b256:()=>Kt,__wbg_ownKeys_3930041068756f1f:()=>Xt,__wbg_set_wasm:()=>G,__wbindgen_debug_string:()=>Qt,__wbindgen_init_externref_table:()=>Zt,__wbindgen_is_object:()=>te,__wbindgen_string_get:()=>ee,__wbindgen_string_new:()=>re,__wbindgen_throw:()=>ne,crypt_md5:()=>qt,decrypt_aes:()=>Jt,encrypt_aes:()=>zt,generate_sign:()=>Vt});var a;function G(t){a=t;}function $t(t){let e=a.__externref_table_alloc();return a.__wbindgen_export_2.set(e,t),e}function st(t,e){try{return t.apply(this,e)}catch(r){let n=$t(r);a.__wbindgen_exn_store(n);}}function Y(t){let e=typeof t;if(e=="number"||e=="boolean"||t==null)return `${t}`;if(e=="string")return `"${t}"`;if(e=="symbol"){let o=t.description;return o==null?"Symbol":`Symbol(${o})`}if(e=="function"){let o=t.name;return typeof o=="string"&&o.length>0?`Function(${o})`:"Function"}if(Array.isArray(t)){let o=t.length,s="[";o>0&&(s+=Y(t[0]));for(let i=1;i<o;i++)s+=`, ${Y(t[i])}`;return s+="]",s}let r=/\[object ([^\]]+)\]/.exec(toString.call(t)),n;if(r&&r.length>1)n=r[1];else return toString.call(t);if(n=="Object")try{return `Object(${JSON.stringify(t)})`}catch{return "Object"}return t instanceof Error?`${t.name}: ${t.message}
2
+ ${t.stack}`:n}var m=0,U=null;function O(){return (U===null||U.byteLength===0)&&(U=new Uint8Array(a.memory.buffer)),U}var jt=typeof TextEncoder>"u"?(0, module.require)("util").TextEncoder:TextEncoder,L=new jt("utf-8"),vt=typeof L.encodeInto=="function"?function(t,e){return L.encodeInto(t,e)}:function(t,e){let r=L.encode(t);return e.set(r),{read:t.length,written:r.length}};function E(t,e,r){if(r===void 0){let u=L.encode(t),c=e(u.length,1)>>>0;return O().subarray(c,c+u.length).set(u),m=u.length,c}let n=t.length,o=e(n,1)>>>0,s=O(),i=0;for(;i<n;i++){let u=t.charCodeAt(i);if(u>127)break;s[o+i]=u;}if(i!==n){i!==0&&(t=t.slice(i)),o=r(o,n,n=i+t.length*3,1)>>>0;let u=O().subarray(o+i,o+n),c=vt(t,u);i+=c.written,o=r(o,n,i,1)>>>0;}return m=i,o}var I=null;function N(){return (I===null||I.buffer.detached===true||I.buffer.detached===void 0&&I.buffer!==a.memory.buffer)&&(I=new DataView(a.memory.buffer)),I}function it(t){return t==null}var Ft=typeof TextDecoder>"u"?(0, module.require)("util").TextDecoder:TextDecoder,at=new Ft("utf-8",{ignoreBOM:true,fatal:true});at.decode();function H(t,e){return t=t>>>0,at.decode(O().subarray(t,t+e))}function qt(t){let e,r;try{let n=E(t,a.__wbindgen_malloc,a.__wbindgen_realloc),o=m,s=a.crypt_md5(n,o);return e=s[0],r=s[1],H(s[0],s[1])}finally{a.__wbindgen_free(e,r,1);}}function Wt(t){let e=a.__wbindgen_export_2.get(t);return a.__externref_table_dealloc(t),e}function Vt(t,e,r,n){let o,s;try{let i=E(t,a.__wbindgen_malloc,a.__wbindgen_realloc),u=m,c=E(e,a.__wbindgen_malloc,a.__wbindgen_realloc),f=m,l=it(n)?0:E(n,a.__wbindgen_malloc,a.__wbindgen_realloc),p=m,g=a.generate_sign(i,u,c,f,r,l,p),_=g[0],d=g[1];if(g[3])throw _=0,d=0,Wt(g[2]);return o=_,s=d,H(_,d)}finally{a.__wbindgen_free(o,s,1);}}function ct(t,e){let r=e(t.length*1,1)>>>0;return O().set(t,r/1),m=t.length,r}function ut(t,e){return t=t>>>0,O().subarray(t/1,t/1+e)}function zt(t){let e=ct(t,a.__wbindgen_malloc),r=m,n=a.encrypt_aes(e,r),o=ut(n[0],n[1]).slice();return a.__wbindgen_free(n[0],n[1]*1,1),o}function Jt(t){let e=ct(t,a.__wbindgen_malloc),r=m,n=a.decrypt_aes(e,r),o=ut(n[0],n[1]).slice();return a.__wbindgen_free(n[0],n[1]*1,1),o}function Yt(){return st((t,e)=>Reflect.get(t,e),arguments)}function Gt(t,e){return t[e>>>0]}function Kt(t){return t.length}function Xt(){return st(t=>Reflect.ownKeys(t),arguments)}function Qt(t,e){let r=Y(e),n=E(r,a.__wbindgen_malloc,a.__wbindgen_realloc),o=m;N().setInt32(t+4,o,true),N().setInt32(t+0,n,true);}function Zt(){let t=a.__wbindgen_export_2,e=t.grow(4);t.set(0,void 0),t.set(e+0,void 0),t.set(e+1,null),t.set(e+2,true),t.set(e+3,false);}function te(t){let e=t;return typeof e=="object"&&e!==null}function ee(t,e){let r=e,n=typeof r=="string"?r:void 0,o=it(n)?0:E(n,a.__wbindgen_malloc,a.__wbindgen_realloc),s=m;N().setInt32(t+4,s,true),N().setInt32(t+0,o,true);}function re(t,e){return H(t,e)}function ne(t,e){throw new Error(H(t,e))}var lt=null,j=null;async function oe(){let t=await fetch(new URL("./vendor/crypto/index_bg.wasm",import.meta.url));if(!t.ok)throw new Error(`crypto wasm \u52A0\u8F7D\u5931\u8D25\uFF1AHTTP ${t.status}`);let e={"./index_bg.js":$},r;if(typeof WebAssembly.instantiateStreaming=="function")try{r=await WebAssembly.instantiateStreaming(t.clone(),e);}catch{r=await WebAssembly.instantiate(await t.arrayBuffer(),e);}else r=await WebAssembly.instantiate(await t.arrayBuffer(),e);return G(r.instance.exports),r.instance.exports.__wbindgen_start(),ot($)}async function K(){return j||(j=oe().catch(t=>{throw j=null,t})),lt=await j,lt}await K();var pt="b097f885e9577cdb04d9faf91aa08329";function se(t){return Object.keys(t).sort((r,n)=>r.localeCompare(n,void 0,{numeric:true})).map(r=>r+t[r]).join("")}function ft(t,e){let r=se(e);return t.cryptMd5(pt+r+pt).toUpperCase()}var gt="123456789";var dt={core:"/api/h5",wallet:"/api/h5",bi:"/bi/h5",im:""};function ue(t){return isInteger(t)?isSafeNumber(t)?Number.parseInt(t,10):t:Number.parseFloat(t)}function v(t){return parse(t,void 0,{parseNumber:ue})}var mt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function _t(t){return t?t instanceof Headers?Object.fromEntries(t.entries()):Array.isArray(t)?Object.fromEntries(t):{...t}:{}}function yt(t){return t?t instanceof Headers?Object.fromEntries(t.entries()):Object.fromEntries(Object.entries(t).map(([e,r])=>[e,Array.isArray(r)?r.join(", "):String(r)])):{}}function bt(t,e){let r=e.toLowerCase();return Object.entries(t).find(([o])=>o.toLowerCase()===r)?.[1]??null}function M(t,e=2){return t.toString().padStart(e,"0")}function Pt(t){return `${t.getFullYear()}-${M(t.getMonth()+1)}-${M(t.getDate())} ${M(t.getHours())}:${M(t.getMinutes())}:${M(t.getSeconds())}`}function pe(t){if(t!=null)return typeof t=="string"?t:typeof t=="number"||typeof t=="boolean"||typeof t=="bigint"?String(t):t&&typeof t=="object"?JSON.stringify(t):String(t)}function wt(t){let e={};for(let[r,n]of Object.entries(t)){let o=pe(n);o!==void 0&&(e[r]=o);}return e}function Tt(t=16){let e="";for(let r=0;r<t;r+=1){let n=Math.floor(Math.random()*mt.length);e+=mt.charAt(n);}return e}function At(t){let e={deviceBrand:"web",deviceInfo:"web",deviceNumber:"",deviceToken:"web"},r=t||(typeof navigator<"u"?navigator.userAgent:"");if(!r)return e;let n=r.match(/(Chrome|Firefox|Safari|Edg)\/([\d.]+)/i);return n?{deviceBrand:"web",deviceInfo:`${n[1]}/${n[2]}`,deviceNumber:n[2]??"",deviceToken:"web"}:{...e,deviceInfo:r}}function xt(t){let e=String(t||"").trim().toLowerCase();return e==="cn"||e.startsWith("zh-cn")?"cn":e==="tc"||e.startsWith("zh-tw")||e.startsWith("zh-hk")?"tc":e==="vn"||e.startsWith("vi")?"vn":e==="th"||e.startsWith("th")?"th":e==="en"||e.startsWith("en")?"en":"cn"}function x(t,e){return {baseUrl:e?.baseUrl??"",prefix:e?.prefix??dt[t]}}function fe(t){return t.replace(/^\/+|\/+$/g,"")}function ht(t,e,r){let n=t.replace(/\/+$/g,""),o=fe(e),s=r.startsWith("/")?r:`/${r}`,i=o?`/${o}`:"";return `${n}${i}${s}`}function Rt(t,e){let r=new URLSearchParams(Object.entries(e).map(([u,c])=>[u,String(c)])).toString();if(!r)return t;let n=t.indexOf("#"),o=n>=0?t.slice(0,n):t,s=n>=0?t.slice(n):"",i=o.includes("?")?o.endsWith("?")||o.endsWith("&")?"":"&":"?";return `${o}${i}${r}${s}`}function X(t){return !!t&&t.toLowerCase().includes("application/json")}function Q(t){return !!t&&t.toLowerCase().startsWith("text/")}function k(t){return t==null?new Uint8Array:typeof t=="string"?new TextEncoder().encode(t):t instanceof ArrayBuffer?new Uint8Array(t):ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new TextEncoder().encode(JSON.stringify(t))}function F(t){return typeof t=="string"?t:new TextDecoder().decode(k(t))}function Ct(t){return typeof FormData<"u"&&t instanceof FormData}var ye=new Set(["content-etag","token","req-id"]);function be(t){return Number.isInteger(t)&&t>=400&&t<=599?t:502}function Pe(t,e){return {code:t.status,msg:t.statusText,data:null,time:Math.floor(e/1e3)}}function we(t,e){return {code:502,msg:t instanceof Error?t.message:String(t),data:null,time:Math.floor(e/1e3)}}function Te(t){if(!t||typeof t!="object")return false;let e=t;return Number.isFinite(e.code)&&"data"in e}function Ot(t,e,r,n){if(X(r))return v(F(e.data));if(Q(r))return F(e.data);let o=k(e.data),s=n?t.crypto.decryptAes(o):o,i=new TextDecoder().decode(s);return v(i)}async function Et(t,e,r){if(!t.onDebugRecord)return;let n={...e.meta,response:e.response,...r?{error:{name:r instanceof Error?r.name:void 0,message:r instanceof Error?r.message:String(r)}}:{}};try{await t.onDebugRecord(n);}catch{}}function Ae(t,e,r,n,o){if(r.customUrl)return t;let s=x(n,e.config.targets[n]),i=r.baseUrl??s.baseUrl;return ht(i,o,t)}function xe(t,e){let r=new AbortController,n=setTimeout(()=>r.abort(),t),o=()=>r.abort();return e&&(e.aborted?r.abort():e.addEventListener("abort",o,{once:true})),{signal:r.signal,dispose:()=>{clearTimeout(n),e?.removeEventListener("abort",o);}}}async function he(t,e,r,n,o,s,i){let u=yt(e.headers),c=bt(u,"content-type");if(e.status<200||e.status>=300){let l;if(n)l=void 0;else try{l=Ot(t,e,c,r);}catch{l=void 0;}return {response:Te(l)?l:Pe(e,i),meta:{...o,transportStatus:"http_error",httpStatus:e.status,contentType:c,responseHeaders:u,...l!==void 0?{rawBody:l}:{},timings:{totalMs:i-s,upstreamMs:i-s}}}}let f=Date.now();if(n){let l=k(e.data),p=Date.now();return {response:{code:e.status,data:l,time:Math.floor(p/1e3)},meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:c,responseHeaders:u,rawBody:l,timings:{totalMs:p-s,upstreamMs:i-s,parseMs:p-f}}}}try{if(X(c)){let T=Ot(t,e,c,!1),y=Date.now();return {response:T,meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:c,responseHeaders:u,rawBody:T,timings:{totalMs:y-s,upstreamMs:i-s,parseMs:y-f}}}}if(Q(c)){let T=F(e.data),y=Date.now();return {response:{code:e.status,msg:e.statusText,data:T,time:Math.floor(y/1e3)},meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:c,responseHeaders:u,rawBody:T,timings:{totalMs:y-s,upstreamMs:i-s,parseMs:y-f}}}}let l=k(e.data),p=Date.now(),g=r?t.crypto.decryptAes(l):l,_=Date.now(),d=new TextDecoder().decode(g),D=v(d),B=Date.now();return {response:D,meta:{...o,transportStatus:"success",httpStatus:e.status,contentType:c,responseHeaders:u,rawBody:D,timings:{totalMs:B-s,upstreamMs:i-s,parseMs:B-f,...r?{decryptMs:_-p}:{}}}}}catch(l){let p=Date.now();return {response:{code:be(e.status),msg:l instanceof Error?l.message:String(l),data:null,time:Math.floor(p/1e3)},meta:{...o,transportStatus:"invalid_response",httpStatus:e.status,contentType:c,responseHeaders:u,timings:{totalMs:p-s,upstreamMs:i-s,parseMs:p-f}}}}}function Re(t){return async function(r,n={}){let o=t.now??(()=>new Date),s=t.randomNonce??(()=>gt),i=t.randomRequestId??(()=>`req-${crypto.randomUUID().replaceAll("-","")}`),u=t.randomETag??(()=>Tt()),c=(n.method??"POST").toUpperCase(),f=n.target??"core",l=x(f,t.config.targets[f]),p=n.prefix??l.prefix??"",g=n.body!=null,_=wt(n.data??{}),d=r==="/v1/feedback"&&p==="/bi/h5",D=d?false:n.encrypt??!g,B=d?false:n.sign??!g,T=o(),y=u(),Z=i(),kt=n.token??await t.getToken?.()??"",Bt=xt(n.locale??t.getLocale?.()),S=t.getBrowserInfo?.()??At(n.userAgent),q={app_id:"5",os_type:"4",app_version:t.config.appVersion,sign_method:"md5",timestamp:Pt(T),nonce:s()},b={...q,..._},W=q,tt=_,h=b;!d&&B&&(b.sign=t.crypto.generateSign("api",t.config.envType,b,y),q.sign=b.sign);let Ut={app_version:t.config.appVersion,"X-ENC-VERSION":t.config.appVersion,"X-APP-TYPE":"h5","Client-type":"2","Content-ETag":y,"brand-id":t.config.brandId,"channel-id":n.channelId||t.config.channelId,device_brand:S.deviceBrand,device_info:S.deviceInfo,device_number:S.deviceNumber,device_token:S.deviceToken,lang:Bt,"mch-id":t.config.merchantId,"req-id":Z,token:kt},Lt=_t(n.headers),Nt=Object.fromEntries(Object.entries(Lt).filter(([A])=>!ye.has(A.toLowerCase()))),V=r,R,P={...Ut,...Nt};if(g)R=n.body??void 0,W=null,tt=n.data??null,h=n.data??null;else if(d){let A=String(T.getTime()),w={"app-id":"1","app-version":t.config.appVersion,"sys-type":"h5","sys-version":S.deviceNumber,time:A};W=w,P={...P,...w,sign:ft(t.crypto,w),"Content-Type":"application/json"},R=JSON.stringify(_),h=_;}else c==="GET"?(V=Rt(V,b),h=b):D?(R=t.crypto.encryptAes(new TextEncoder().encode(JSON.stringify(b))),P["Content-Type"]=P["Content-Type"]||"application/octet-stream",h=b):(R=JSON.stringify(b),P["Content-Type"]=P["Content-Type"]||"application/json",h=b);Ct(R)&&delete P["Content-Type"];let z=Ae(V,t,n,f,p),J=Date.now(),et=n.timeoutMs??6e4,rt=xe(et,n.signal),nt={requestId:Z,eTag:y,method:c,upstreamUrl:z,requestHeaders:P,requestCommonParams:W,requestBusinessParams:tt,requestParams:h};try{let A=await t.transport({url:z,method:c,headers:P,body:R,signal:rt.signal,timeoutMs:et,onUploadProgress:n.onUploadProgress}),w=Date.now(),C=await he(t,A,D&&!d,n.responseMode==="raw",nt,J,w);return await Et(t,C),t.onBusinessResponse&&await t.onBusinessResponse(C.response,{request:{path:r,method:c,target:f,url:z},options:n}),C}catch(A){let w=Date.now(),C={response:we(A,w),meta:{...nt,transportStatus:"network_error",timings:{totalMs:w-J,upstreamMs:w-J}}};return await Et(t,C,A),C}finally{rt.dispose();}}}function Dt(t){let e=Re(t);return async function(n,o={}){return (await e(n,o)).response}}function St(t={}){let e={core:x("core",{baseUrl:t.coreBaseUrl||"",...t.targets?.core}),wallet:x("wallet",{baseUrl:t.walletBaseUrl||"",...t.targets?.wallet}),bi:x("bi",{baseUrl:t.biBaseUrl||"",...t.targets?.bi}),im:x("im",{baseUrl:t.imBaseUrl||"",...t.targets?.im})};return {appVersion:t.appVersion||"",brandId:t.brandId||"",merchantId:t.merchantId||"",channelId:t.channelId||"",envType:t.envType||"prod",targets:e}}function Mt(t={}){let e=t.axios??Ce.create();return async r=>{let n=await e.request({url:r.url,method:r.method,headers:r.headers,data:r.body,signal:r.signal,timeout:r.timeoutMs,onUploadProgress:r.onUploadProgress?o=>{let s=typeof o.progress=="number"?o.progress:typeof o.total=="number"&&o.total>0?o.loaded/o.total:void 0;r.onUploadProgress?.({loaded:o.loaded,...typeof o.total=="number"?{total:o.total}:{},...typeof s=="number"?{progress:s}:{},event:o});}:void 0,responseType:"arraybuffer",transformResponse:o=>o,validateStatus:()=>true});return {status:n.status,statusText:n.statusText,headers:n.headers,data:n.data}}}async function Ge(t={}){let e=await K(),r=St(t.config);return Dt({...t,config:r,crypto:e,transport:t.transport??Mt()})}export{Ge as createBrowserApiProtocolClient};