sse-stream-plugin-sdk 1.0.2 → 1.0.3
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/CHANGELOG.md +8 -0
- package/dist/index.js +1 -1
- package/package.json +1 -2
- package/dist/index.mp.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
6
6
|
|
|
7
|
+
## [1.0.3] - 2026-10-04
|
|
8
|
+
|
|
9
|
+
### 修复
|
|
10
|
+
|
|
11
|
+
- 修复 1.0.2 在微信小程序中仍报 `SyntaxError: Unexpected token` 的问题:微信开发者工具「构建 npm」对普通 npm 包**只按 `main` 字段取入口**,1.0.2 新增的 `miniprogram` 字段仅对「小程序 npm 包(自定义组件包)」生效,不会改变普通包入口,工具实际仍读取 ES2020 的 CJS 产物。
|
|
12
|
+
- 将 `main` / `exports.require` 指向的 `dist/index.js` 直接改为 ES5 兼容产物(async/await、迭代器、对象展开等经 tslib helpers 降级),Node.js 与微信小程序共用此 CJS 入口;浏览器与打包工具仍通过 ESM 入口 `dist/index.mjs` 使用 ES2020 版本。
|
|
13
|
+
- 移除无效的 `miniprogram` 字段与 `dist/index.mp.js` 产物。
|
|
14
|
+
|
|
7
15
|
## [1.0.2] - 2026-10-04
|
|
8
16
|
|
|
9
17
|
### 修复
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";class e{constructor(){Object.defineProperty(this,"listeners",{enumerable:!0,configurable:!0,writable:!0,value:new Map})}on(e,t){let r=this.listeners.get(e);return r||(r=new Set,this.listeners.set(e,r)),r.add(t),()=>this.off(e,t)}once(e,t){const r=this.on(e,(...e)=>{r(),t(...e)});return r}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,...t){const r=this.listeners.get(e);if(r)for(const e of[...r])e(...t)}clear(){this.listeners.clear()}}function t(){let e="";return{write:(t,s)=>{e+=t;const n=e.replace(/\r\n?/g,"\n").split("\n\n");e=n.pop()??"";for(const e of n){if(!e.trim())continue;const t=r(e);t&&s(t)}},flush:t=>{const s=e.replace(/\r\n?/g,"\n").trim();if(e="",!s)return;const n=r(s);n&&t(n)}}}function r(e){let t="message";const r=[];let s,n=!1;for(const i of e.split("\n")){if(!i||i.startsWith(":"))continue;const e=i.indexOf(":");let o,a;switch(-1===e?(o=i,a=""):(o=i.slice(0,e),a=i.slice(e+1)," "===a.charAt(0)&&(a=a.slice(1))),o){case"event":t=a;break;case"data":r.push(a);break;case"id":a.includes("\0")||(s=a,n=!0)}}return 0===r.length?null:{name:t,data:r.join("\n"),...n?{id:s}:{}}}const s=()=>{let e=null,t=!1;return{name:"web-fetch",async connect(r,s){try{const i=await fetch(r.url,{method:r.method,headers:{"Content-Type":"application/json",...r.headers},body:"POST"===r.method?r.body:void 0});if(s.response?.({status:i.status,headers:n(i.headers)}),!i.ok||!i.body)throw new Error(`HTTP ${i.status} 流不可用`);e=i.body.getReader();const o=new TextDecoder("utf-8");for(;;){const{done:r,value:n}=await e.read();if(t)break;if(r){s.end();break}s.data(o.decode(n,{stream:!0}))}}catch(e){t||s.error(e)}},abort(){t=!0,e?.cancel().catch(()=>{}),e=null}}};function n(e){const t={};return e.forEach((e,r)=>{t[r]=e}),t}function i(){return[{id:"m1",data:"开始解释:\n"},{id:"m2",data:"输入内容:你好\n"},{name:"ping",data:"",gap:200},{id:"m3",data:"\n1. 语法解析完成"},{id:"m4",data:"\n2. 语义分析完成"},{id:"m5",data:"\n3. 生成解释结果"},{id:"m6",data:"\n✅ 解释完毕"}]}function o(e){const t=e?.events??[{id:"m1",data:"开始解释:\n"},{id:"m2",data:"输入内容:你好\n"},{name:"ping",data:"",gap:200},{id:"m3",data:"\n1. 语法解析完成"},{id:"m4",data:"\n2. 语义分析完成"},{id:"m5",data:"\n3. 生成解释结果"},{id:"m6",data:"\n✅ 解释完毕"}],r=e?.failAfter??0,s=e?.errorMessage??"模拟网络中断(连接被重置)";let n=!1;return({request:e})=>{const i=[];let o=!1,a=0;const l=e.headers["Last-Event-ID"]??e.headers["last-event-id"];if(l){const e=t.findIndex(e=>e.id===l);e>=0&&(a=e+1)}return{name:"mock",connect(e,l){const c=()=>{if(o)return;if(r>0&&a===r&&!n){n=!0;const e=setTimeout(()=>{o||l.error(new Error(s))},500);return void i.push(e)}if(a>=t.length){const e=setTimeout(()=>{o||l.end()},200);return void i.push(e)}const e=t[a],d=setTimeout(()=>{o||(l.data(function(e){const t=[];e.id&&t.push(`id:${e.id}`);t.push(`event:${e.name??"message"}`);for(const r of(e.data??"").split("\n"))t.push(`data:${r}`);return t.join("\n")+"\n\n"}(e)),a++,c())},e.gap??350);i.push(d)};c()},abort(){o=!0;for(const e of i)clearTimeout(e);i.length=0}}}}function a(){if("function"==typeof globalThis.fetch)return s;throw new Error("未检测到可用传输层,请通过 options.transport 显式指定,或用 createMpTransport 注册小程序传输层")}function l(e){const t=e?.maxRetries??3,r=e?.delay??1500;let s="",n=0,i=null;return{name:"reconnect",install(e){e.addRequestMiddleware(async(e,t)=>(s&&(e.headers["Last-Event-ID"]=s),t(e))),e.emitter.on("event",e=>{e.id&&(s=e.id)}),e.emitter.on("error",s=>{e.isDead()||(n>=t?e.emitter.emit("reconnect-failed",s):(n++,e.emitter.emit("reconnect",{attempt:n,inMs:r}),i=setTimeout(()=>{i=null,e.start()},r)))}),e.emitter.on("end",()=>{n=0,s=""}),e.onDispose(()=>{i&&clearTimeout(i),i=null})}}}function c(e){const t=e?.interval??1e4;let r=null;return{name:"heartbeat",install(e){const s=()=>{r&&(clearTimeout(r),r=null)},n=()=>{s(),r=setTimeout(()=>{e.emitter.emit("heartbeat-lost"),e.fail(new Error(`心跳丢失:${t}ms 内未收到任何数据`))},t)};e.emitter.on("connecting",n),e.emitter.on("data",n),e.emitter.on("end",s),e.emitter.on("error",s),e.onDispose(s)}}}function d(e){const t=e?.windowMs??100;let r,s="",n=null,i=null;return{name:"throttle",install(e){const o=()=>{if(n&&(clearTimeout(n),n=null),s&&i){const e=s,t=r;s="",r=void 0;const n=i;i=null,n({name:"message",data:e,...t?{id:t}:{}})}};e.addEventMiddleware((e,a)=>{if("message"!==e.name)return a(e);s+=e.data,e.id&&(r=e.id),i=a,n||(n=setTimeout(o,t))}),e.emitter.on("end",o),e.emitter.on("error",o),e.onDispose(o)}}}exports.Emitter=e,exports.PluginSSE=class{constructor(r){Object.defineProperty(this,"emitter",{enumerable:!0,configurable:!0,writable:!0,value:new e}),Object.defineProperty(this,"plugins",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"installed",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"context",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"transportRegistry",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"requestMiddleware",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"eventMiddleware",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"disposeFns",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"parserFactory",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"parser",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"activeTransport",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"currentRequest",{enumerable:!0,configurable:!0,writable:!0,value:{url:"",method:"GET",headers:{}}}),Object.defineProperty(this,"options",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:"idle"}),Object.defineProperty(this,"sessionId",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"dead",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"dispatch",{enumerable:!0,configurable:!0,writable:!0,value:e=>{!function(e,t,r,s){let n=-1;const i=(t,s)=>{if(t<=n)return Promise.reject(new Error("next() 被多次调用"));if(n=t,t===e.length)return r(s),Promise.resolve();try{return Promise.resolve(e[t](s,e=>i(t+1,e??s)))}catch(e){return Promise.reject(e)}};i(0,t).catch(s)}(this.eventMiddleware,e,e=>{this.emitter.emit("event",e),this.emitter.emit(e.name,e.data,e)},e=>this.settleError(e))}}),this.options={url:r.url,method:r.method??"GET",body:r.body??"",headers:r.headers??{},transport:r.transport,plugins:r.plugins??[],parser:r.parser},this.options.parser&&(this.parserFactory=this.options.parser),this.transportRegistry.set("web",s),this.transportRegistry.set("mock",o());const n=this;this.context={emitter:this.emitter,get request(){return n.currentRequest},addRequestMiddleware:e=>this.requestMiddleware.push(e),addEventMiddleware:e=>this.eventMiddleware.push(e),setParser:e=>{this.parserFactory=e},registerTransport:(e,t)=>this.transportRegistry.set(e,t),start:()=>this.start(),fail:e=>this.settleError(e),getState:()=>this.state,isDead:()=>this.dead,onDispose:e=>this.disposeFns.push(e)};for(const e of this.options.plugins)this.use(e)}use(e){if(this.dead)throw new Error("实例已销毁,无法再注册插件");return this.plugins.some(t=>t.name===e.name)||(this.plugins.push(e),this.installed&&e.install(this.context)),this}async connect(){if(this.dead)throw new Error("实例已销毁,请创建新的 PluginSSE");await this.start()}async start(){if(this.dead)return;this.installed||this.installPlugins(),this.silentAbort();const e=++this.sessionId;let t;this.state="connecting",this.currentRequest={url:this.options.url,method:this.options.method,headers:{...this.options.headers},body:"POST"===this.options.method?this.options.body:void 0},this.emitter.emit("connecting",{session:e});try{t=await(r=this.requestMiddleware,e=>{let t=-1;const s=(e,n)=>{if(e<=t)return Promise.reject(new Error("next() 被多次调用"));if(t=e,e===r.length)return Promise.resolve(n);try{return Promise.resolve(r[e](n,t=>s(e+1,t??n)))}catch(e){return Promise.reject(e)}};return s(0,e)})(this.currentRequest)}catch(t){return void(e===this.sessionId&&this.settleError(t))}var r;if(e!==this.sessionId||this.dead)return;this.currentRequest=t,this.parser=this.parserFactory();const s=this.resolveTransportFactory()({request:t});this.activeTransport=s,s.connect(t,{data:t=>{e===this.sessionId&&(this.emitter.emit("data",t),this.parser?.write(t,this.dispatch))},end:()=>{e===this.sessionId&&(this.parser?.flush(this.dispatch),this.state="closed",this.emitter.emit("end"))},error:t=>{e===this.sessionId&&this.settleError(t)},response:t=>{e===this.sessionId&&this.emitter.emit("response",t)}}),this.state="open",this.emitter.emit("open",{transport:s.name})}destroy(){if(!this.dead){this.dead=!0,this.sessionId++,this.silentAbort(),this.state="closed";for(const e of this.disposeFns)try{e()}catch{}this.emitter.emit("closed"),this.emitter.clear()}}on(e,t){return this.emitter.on(e,t)}once(e,t){return this.emitter.once(e,t)}off(e,t){this.emitter.off(e,t)}installPlugins(){this.installed=!0;for(const e of this.plugins)e.install(this.context)}resolveTransportFactory(){const e=this.options.transport;if("string"==typeof e){const t=this.transportRegistry.get(e);if(!t)throw new Error(`未注册的传输层:${e}`);return t}return e||a()}settleError(e){this.dead||(this.sessionId++,this.silentAbort(),this.state="closed",this.emitter.emit("error",e))}silentAbort(){if(this.activeTransport){try{this.activeTransport.abort()}catch{}this.activeTransport=null}}},exports.authPlugin=function(e){const t=e.header??"Authorization",r=e.scheme??"Bearer";let s=!1;return{name:"auth",install(n){n.addRequestMiddleware(async(s,n)=>{const i=await e.getToken();return s.headers[t]=r?`${r} ${i}`:i,n(s)}),n.emitter.on("response",async({status:t})=>{if(401===t&&!s&&!n.isDead()){s=!0,n.emitter.emit("auth-refreshing");try{await e.refreshToken()}finally{s=!1}n.start()}})}}},exports.createMpTransport=function(e,t="miniprogram"){return()=>{let r,s=null,n=!1;return{name:t,connect(t,i){const o=e();s=o.request({url:t.url,method:t.method,header:{...t.headers},data:"POST"===t.method&&t.body?JSON.parse(t.body):void 0,enableChunked:!0,responseType:"arraybuffer",success:e=>{n||(i.response?.({status:e.statusCode}),i.end())},fail:e=>{n||i.error(function(e){if(e instanceof Error)return e;if(null!==e&&"object"==typeof e&&"errMsg"in e){const t=e.errMsg;return new Error("string"==typeof t&&t?t:"request 失败")}return new Error(String(e))}(e))}}),s.onChunkReceived(e=>{n||i.data(function(e){void 0===r&&(r="undefined"!=typeof TextDecoder?new TextDecoder("utf-8"):null);if(r)return r.decode(e,{stream:!0});let t="";for(let r=0;r<e.length;r++)t+="%"+e[r].toString(16).padStart(2,"0");return decodeURIComponent(t)}(new Uint8Array(e.data)))})},abort(){n=!0,s?.abort(),s=null}}}},exports.createSSEParser=t,exports.defaultScript=i,exports.detectTransport=a,exports.heartbeatPlugin=c,exports.loggerPlugin=function(e){const t=e?.sink??(e=>console.log(e));return{name:"logger",install(e){e.emitter.on("open",({transport:r})=>{const s=JSON.stringify(e.request.headers);t(`连接已打开(${r})请求头:${s}`)}),e.emitter.on("response",({status:e})=>{t(`收到响应,状态码:${e}`)}),e.emitter.on("event",e=>{const r=e.data.replace(/\n/g,"\\n"),s=r.length>40?r.slice(0,40)+"…":r;t(`事件 ${e.name}${e.id?" #"+e.id:""} (${e.data.length} 字): ${s}`)}),e.emitter.on("reconnect",({attempt:e,inMs:r})=>{t(`连接中断,${r}ms 后进行第 ${e} 次重连…`)}),e.emitter.on("heartbeat-lost",()=>{t("心跳丢失!")}),e.emitter.on("reconnect-failed",()=>{t("已达最大重试次数,不再重连")}),e.emitter.on("error",e=>{t(`发生错误:${e instanceof Error?e.message:String(e)}`)}),e.emitter.on("end",()=>{t("流正常结束")}),e.emitter.on("closed",()=>{t("实例已销毁,资源已释放")})}}},exports.mockTransport=o,exports.recommendedPlugins=function(){return[l(),c(),d()]},exports.reconnectPlugin=l,exports.statsPlugin=function(e){const t=e?.keyword??"✅";return{name:"stats",install(e){let r=0,s=0;e.emitter.on("message",n=>{r++,s+=n.length;const i={messages:r,chars:s};e.emitter.emit("stats",i),n.includes(t)&&e.emitter.emit("keyword",{keyword:t,at:s})}),e.emitter.on("connecting",()=>{r=0,s=0,e.emitter.emit("stats",{messages:r,chars:s})})}}},exports.throttlePlugin=d,exports.webFetchTransport=s;
|
|
1
|
+
"use strict";var t=function(){return t=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var i in e=arguments[r])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},t.apply(this,arguments)};function e(t,e,r,n){return new(r||(r=Promise))(function(i,o){function a(t){try{u(n.next(t))}catch(t){o(t)}}function s(t){try{u(n.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(a,s)}u((n=n.apply(t,e||[])).next())})}function r(t,e){var r,n,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(u){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(o=0)),o;)try{if(r=1,n&&(i=2&s[0]?n.return:s[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,s[1])).done)return i;switch(n=0,i&&(s=[2&s[0],i.value]),s[0]){case 0:case 1:i=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,n=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==s[0]&&2!==s[0])){o=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]<i[3])){o.label=s[1];break}if(6===s[0]&&o.label<i[1]){o.label=i[1],i=s;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(s);break}i[2]&&o.ops.pop(),o.trys.pop();continue}s=e.call(t,o)}catch(t){s=[6,t],n=0}finally{r=i=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,u])}}}function n(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function i(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,i,o=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(n=o.next()).done;)a.push(n.value)}catch(t){i={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}return a}function o(t,e,r){if(r||2===arguments.length)for(var n,i=0,o=e.length;i<o;i++)!n&&i in e||(n||(n=Array.prototype.slice.call(e,0,i)),n[i]=e[i]);return t.concat(n||Array.prototype.slice.call(e))}"function"==typeof SuppressedError&&SuppressedError;var a=function(){function t(){this.listeners=new Map}return t.prototype.on=function(t,e){var r=this,n=this.listeners.get(t);return n||(n=new Set,this.listeners.set(t,n)),n.add(e),function(){return r.off(t,e)}},t.prototype.once=function(t,e){var r=this.on(t,function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];r(),e.apply(void 0,o([],i(t),!1))});return r},t.prototype.off=function(t,e){var r;null===(r=this.listeners.get(t))||void 0===r||r.delete(e)},t.prototype.emit=function(t){for(var e,r,a=[],s=1;s<arguments.length;s++)a[s-1]=arguments[s];var u=this.listeners.get(t);if(u)try{for(var l=n(o([],i(u),!1)),c=l.next();!c.done;c=l.next()){c.value.apply(void 0,o([],i(a),!1))}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}},t.prototype.clear=function(){this.listeners.clear()},t}();function s(){var t="";return{write:function(e,r){var i,o,a,s=(t+=e).replace(/\r\n?/g,"\n").split("\n\n");t=null!==(a=s.pop())&&void 0!==a?a:"";try{for(var l=n(s),c=l.next();!c.done;c=l.next()){var d=c.value;if(d.trim()){var f=u(d);f&&r(f)}}}catch(t){i={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(i)throw i.error}}},flush:function(e){var r=t.replace(/\r\n?/g,"\n").trim();if(t="",r){var n=u(r);n&&e(n)}}}}function u(e){var r,i,o,a="message",s=[],u=!1;try{for(var l=n(e.split("\n")),c=l.next();!c.done;c=l.next()){var d=c.value;if(d&&!d.startsWith(":")){var f=d.indexOf(":"),h=void 0,p=void 0;switch(-1===f?(h=d,p=""):(h=d.slice(0,f)," "===(p=d.slice(f+1)).charAt(0)&&(p=p.slice(1))),h){case"event":a=p;break;case"data":s.push(p);break;case"id":p.includes("\0")||(o=p,u=!0)}}}}catch(t){r={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}return 0===s.length?null:t({name:a,data:s.join("\n")},u?{id:o}:{})}var l=function(){var n=null,i=!1;return{name:"web-fetch",connect:function(o,a){return e(this,void 0,void 0,function(){var e,s,u,l,d,f,h;return r(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,fetch(o.url,{method:o.method,headers:t({"Content-Type":"application/json"},o.headers),body:"POST"===o.method?o.body:void 0})];case 1:if(e=r.sent(),null===(h=a.response)||void 0===h||h.call(a,{status:e.status,headers:c(e.headers)}),!e.ok||!e.body)throw new Error("HTTP ".concat(e.status," 流不可用"));n=e.body.getReader(),s=new TextDecoder("utf-8"),r.label=2;case 2:return[4,n.read()];case 3:if(u=r.sent(),l=u.done,d=u.value,i)return[3,5];if(l)return a.end(),[3,5];a.data(s.decode(d,{stream:!0})),r.label=4;case 4:return[3,2];case 5:return[3,7];case 6:return f=r.sent(),i||a.error(f),[3,7];case 7:return[2]}})})},abort:function(){i=!0,null==n||n.cancel().catch(function(){}),n=null}}};function c(t){var e={};return t.forEach(function(t,r){e[r]=t}),e}function d(){return[{id:"m1",data:"开始解释:\n"},{id:"m2",data:"输入内容:你好\n"},{name:"ping",data:"",gap:200},{id:"m3",data:"\n1. 语法解析完成"},{id:"m4",data:"\n2. 语义分析完成"},{id:"m5",data:"\n3. 生成解释结果"},{id:"m6",data:"\n✅ 解释完毕"}]}function f(t){var e,r,i,o=null!==(e=null==t?void 0:t.events)&&void 0!==e?e:[{id:"m1",data:"开始解释:\n"},{id:"m2",data:"输入内容:你好\n"},{name:"ping",data:"",gap:200},{id:"m3",data:"\n1. 语法解析完成"},{id:"m4",data:"\n2. 语义分析完成"},{id:"m5",data:"\n3. 生成解释结果"},{id:"m6",data:"\n✅ 解释完毕"}],a=null!==(r=null==t?void 0:t.failAfter)&&void 0!==r?r:0,s=null!==(i=null==t?void 0:t.errorMessage)&&void 0!==i?i:"模拟网络中断(连接被重置)",u=!1;return function(t){var e,r=t.request,i=[],l=!1,c=0,d=null!==(e=r.headers["Last-Event-ID"])&&void 0!==e?e:r.headers["last-event-id"];if(d){var f=o.findIndex(function(t){return t.id===d});f>=0&&(c=f+1)}return{name:"mock",connect:function(t,e){var r=function(){var t;if(!l)if(a>0&&c===a&&!u){u=!0;var d=setTimeout(function(){l||e.error(new Error(s))},500);i.push(d)}else if(c>=o.length){var f=setTimeout(function(){l||e.end()},200);i.push(f)}else{var h=o[c],p=setTimeout(function(){l||(e.data(function(t){var e,r,i,o,a=[];t.id&&a.push("id:".concat(t.id));a.push("event:".concat(null!==(i=t.name)&&void 0!==i?i:"message"));try{for(var s=n((null!==(o=t.data)&&void 0!==o?o:"").split("\n")),u=s.next();!u.done;u=s.next()){var l=u.value;a.push("data:".concat(l))}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}return a.join("\n")+"\n\n"}(h)),c++,r())},null!==(t=h.gap)&&void 0!==t?t:350);i.push(p)}};r()},abort:function(){var t,e;l=!0;try{for(var r=n(i),o=r.next();!o.done;o=r.next()){var a=o.value;clearTimeout(a)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}i.length=0}}}}function h(){if("function"==typeof globalThis.fetch)return l;throw new Error("未检测到可用传输层,请通过 options.transport 显式指定,或用 createMpTransport 注册小程序传输层")}var p=function(){function i(t){var e,r,i,o,u,c,d=this;this.emitter=new a,this.plugins=[],this.installed=!1,this.transportRegistry=new Map,this.requestMiddleware=[],this.eventMiddleware=[],this.disposeFns=[],this.parserFactory=s,this.parser=null,this.activeTransport=null,this.currentRequest={url:"",method:"GET",headers:{}},this.state="idle",this.sessionId=0,this.dead=!1,this.dispatch=function(t){!function(t,e,r,n){var i=-1,o=function(e,n){if(e<=i)return Promise.reject(new Error("next() 被多次调用"));if(i=e,e===t.length)return r(n),Promise.resolve();try{return Promise.resolve(t[e](n,function(t){return o(e+1,null!=t?t:n)}))}catch(t){return Promise.reject(t)}};o(0,e).catch(n)}(d.eventMiddleware,t,function(t){d.emitter.emit("event",t),d.emitter.emit(t.name,t.data,t)},function(t){return d.settleError(t)})},this.options={url:t.url,method:null!==(i=t.method)&&void 0!==i?i:"GET",body:null!==(o=t.body)&&void 0!==o?o:"",headers:null!==(u=t.headers)&&void 0!==u?u:{},transport:t.transport,plugins:null!==(c=t.plugins)&&void 0!==c?c:[],parser:t.parser},this.options.parser&&(this.parserFactory=this.options.parser),this.transportRegistry.set("web",l),this.transportRegistry.set("mock",f());var h=this;this.context={emitter:this.emitter,get request(){return h.currentRequest},addRequestMiddleware:function(t){return d.requestMiddleware.push(t)},addEventMiddleware:function(t){return d.eventMiddleware.push(t)},setParser:function(t){d.parserFactory=t},registerTransport:function(t,e){return d.transportRegistry.set(t,e)},start:function(){return d.start()},fail:function(t){return d.settleError(t)},getState:function(){return d.state},isDead:function(){return d.dead},onDispose:function(t){return d.disposeFns.push(t)}};try{for(var p=n(this.options.plugins),v=p.next();!v.done;v=p.next()){var m=v.value;this.use(m)}}catch(t){e={error:t}}finally{try{v&&!v.done&&(r=p.return)&&r.call(p)}finally{if(e)throw e.error}}}return i.prototype.use=function(t){if(this.dead)throw new Error("实例已销毁,无法再注册插件");return this.plugins.some(function(e){return e.name===t.name})||(this.plugins.push(t),this.installed&&t.install(this.context)),this},i.prototype.connect=function(){return e(this,void 0,void 0,function(){return r(this,function(t){switch(t.label){case 0:if(this.dead)throw new Error("实例已销毁,请创建新的 PluginSSE");return[4,this.start()];case 1:return t.sent(),[2]}})})},i.prototype.start=function(){return e(this,void 0,void 0,function(){var e,n,i,o,a,s=this;return r(this,function(r){switch(r.label){case 0:if(this.dead)return[2];this.installed||this.installPlugins(),this.silentAbort(),e=++this.sessionId,this.state="connecting",this.currentRequest={url:this.options.url,method:this.options.method,headers:t({},this.options.headers),body:"POST"===this.options.method?this.options.body:void 0},this.emitter.emit("connecting",{session:e}),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,(u=this.requestMiddleware,function(t){var e=-1,r=function(t,n){if(t<=e)return Promise.reject(new Error("next() 被多次调用"));if(e=t,t===u.length)return Promise.resolve(n);try{return Promise.resolve(u[t](n,function(e){return r(t+1,null!=e?e:n)}))}catch(t){return Promise.reject(t)}};return r(0,t)})(this.currentRequest)];case 2:return n=r.sent(),[3,4];case 3:return i=r.sent(),e===this.sessionId&&this.settleError(i),[2];case 4:return e!==this.sessionId||this.dead||(this.currentRequest=n,this.parser=this.parserFactory(),o=this.resolveTransportFactory(),a=o({request:n}),this.activeTransport=a,a.connect(n,{data:function(t){var r;e===s.sessionId&&(s.emitter.emit("data",t),null===(r=s.parser)||void 0===r||r.write(t,s.dispatch))},end:function(){var t;e===s.sessionId&&(null===(t=s.parser)||void 0===t||t.flush(s.dispatch),s.state="closed",s.emitter.emit("end"))},error:function(t){e===s.sessionId&&s.settleError(t)},response:function(t){e===s.sessionId&&s.emitter.emit("response",t)}}),this.state="open",this.emitter.emit("open",{transport:a.name})),[2]}var u})})},i.prototype.destroy=function(){var t,e;if(!this.dead){this.dead=!0,this.sessionId++,this.silentAbort(),this.state="closed";try{for(var r=n(this.disposeFns),i=r.next();!i.done;i=r.next()){var o=i.value;try{o()}catch(t){}}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.emitter.emit("closed"),this.emitter.clear()}},i.prototype.on=function(t,e){return this.emitter.on(t,e)},i.prototype.once=function(t,e){return this.emitter.once(t,e)},i.prototype.off=function(t,e){this.emitter.off(t,e)},i.prototype.installPlugins=function(){var t,e;this.installed=!0;try{for(var r=n(this.plugins),i=r.next();!i.done;i=r.next()){i.value.install(this.context)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},i.prototype.resolveTransportFactory=function(){var t=this.options.transport;if("string"==typeof t){var e=this.transportRegistry.get(t);if(!e)throw new Error("未注册的传输层:".concat(t));return e}return t||h()},i.prototype.settleError=function(t){this.dead||(this.sessionId++,this.silentAbort(),this.state="closed",this.emitter.emit("error",t))},i.prototype.silentAbort=function(){if(this.activeTransport){try{this.activeTransport.abort()}catch(t){}this.activeTransport=null}},i}();function v(t){var n,i,o=null!==(n=null==t?void 0:t.maxRetries)&&void 0!==n?n:3,a=null!==(i=null==t?void 0:t.delay)&&void 0!==i?i:1500,s="",u=0,l=null;return{name:"reconnect",install:function(t){var n=this;t.addRequestMiddleware(function(t,i){return e(n,void 0,void 0,function(){return r(this,function(e){return s&&(t.headers["Last-Event-ID"]=s),[2,i(t)]})})}),t.emitter.on("event",function(t){t.id&&(s=t.id)}),t.emitter.on("error",function(e){t.isDead()||(u>=o?t.emitter.emit("reconnect-failed",e):(u++,t.emitter.emit("reconnect",{attempt:u,inMs:a}),l=setTimeout(function(){l=null,t.start()},a)))}),t.emitter.on("end",function(){u=0,s=""}),t.onDispose(function(){l&&clearTimeout(l),l=null})}}}function m(t){var e,r=null!==(e=null==t?void 0:t.interval)&&void 0!==e?e:1e4,n=null;return{name:"heartbeat",install:function(t){var e=function(){n&&(clearTimeout(n),n=null)},i=function(){e(),n=setTimeout(function(){t.emitter.emit("heartbeat-lost"),t.fail(new Error("心跳丢失:".concat(r,"ms 内未收到任何数据")))},r)};t.emitter.on("connecting",i),t.emitter.on("data",i),t.emitter.on("end",e),t.emitter.on("error",e),t.onDispose(e)}}}function y(e){var r,n,i=null!==(r=null==e?void 0:e.windowMs)&&void 0!==r?r:100,o="",a=null,s=null;return{name:"throttle",install:function(e){var r=function(){if(a&&(clearTimeout(a),a=null),o&&s){var e=o,r=n;o="",n=void 0;var i=s;s=null,i(t({name:"message",data:e},r?{id:r}:{}))}};e.addEventMiddleware(function(t,e){if("message"!==t.name)return e(t);o+=t.data,t.id&&(n=t.id),s=e,a||(a=setTimeout(r,i))}),e.emitter.on("end",r),e.emitter.on("error",r),e.onDispose(r)}}}exports.Emitter=a,exports.PluginSSE=p,exports.authPlugin=function(t){var n,i,o=null!==(n=t.header)&&void 0!==n?n:"Authorization",a=null!==(i=t.scheme)&&void 0!==i?i:"Bearer",s=!1;return{name:"auth",install:function(n){var i=this;n.addRequestMiddleware(function(n,s){return e(i,void 0,void 0,function(){var e;return r(this,function(r){switch(r.label){case 0:return[4,t.getToken()];case 1:return e=r.sent(),n.headers[o]=a?"".concat(a," ").concat(e):e,[2,s(n)]}})})}),n.emitter.on("response",function(o){return e(i,[o],void 0,function(e){var i=e.status;return r(this,function(e){switch(e.label){case 0:if(401!==i||s||n.isDead())return[2];s=!0,n.emitter.emit("auth-refreshing"),e.label=1;case 1:return e.trys.push([1,,3,4]),[4,t.refreshToken()];case 2:return e.sent(),[3,4];case 3:return s=!1,[7];case 4:return n.start(),[2]}})})})}}},exports.createMpTransport=function(e,r){return void 0===r&&(r="miniprogram"),function(){var n,i=null,o=!1;return{name:r,connect:function(r,a){var s=e();(i=s.request({url:r.url,method:r.method,header:t({},r.headers),data:"POST"===r.method&&r.body?JSON.parse(r.body):void 0,enableChunked:!0,responseType:"arraybuffer",success:function(t){var e;o||(null===(e=a.response)||void 0===e||e.call(a,{status:t.statusCode}),a.end())},fail:function(t){o||a.error(function(t){if(t instanceof Error)return t;if(null!==t&&"object"==typeof t&&"errMsg"in t){var e=t.errMsg;return new Error("string"==typeof e&&e?e:"request 失败")}return new Error(String(t))}(t))}})).onChunkReceived(function(t){o||a.data(function(t){void 0===n&&(n="undefined"!=typeof TextDecoder?new TextDecoder("utf-8"):null);if(n)return n.decode(t,{stream:!0});for(var e="",r=0;r<t.length;r++)e+="%"+t[r].toString(16).padStart(2,"0");return decodeURIComponent(e)}(new Uint8Array(t.data)))})},abort:function(){o=!0,null==i||i.abort(),i=null}}}},exports.createSSEParser=s,exports.defaultScript=d,exports.detectTransport=h,exports.heartbeatPlugin=m,exports.loggerPlugin=function(t){var e,r=null!==(e=null==t?void 0:t.sink)&&void 0!==e?e:function(t){return console.log(t)};return{name:"logger",install:function(t){t.emitter.on("open",function(e){var n=e.transport,i=JSON.stringify(t.request.headers);r("连接已打开(".concat(n,")请求头:").concat(i))}),t.emitter.on("response",function(t){var e=t.status;r("收到响应,状态码:".concat(e))}),t.emitter.on("event",function(t){var e=t.data.replace(/\n/g,"\\n"),n=e.length>40?e.slice(0,40)+"…":e;r("事件 ".concat(t.name).concat(t.id?" #"+t.id:""," ")+"(".concat(t.data.length," 字): ").concat(n))}),t.emitter.on("reconnect",function(t){var e=t.attempt,n=t.inMs;r("连接中断,".concat(n,"ms 后进行第 ").concat(e," 次重连…"))}),t.emitter.on("heartbeat-lost",function(){r("心跳丢失!")}),t.emitter.on("reconnect-failed",function(){r("已达最大重试次数,不再重连")}),t.emitter.on("error",function(t){r("发生错误:".concat(t instanceof Error?t.message:String(t)))}),t.emitter.on("end",function(){r("流正常结束")}),t.emitter.on("closed",function(){r("实例已销毁,资源已释放")})}}},exports.mockTransport=f,exports.recommendedPlugins=function(){return[v(),m(),y()]},exports.reconnectPlugin=v,exports.statsPlugin=function(t){var e,r=null!==(e=null==t?void 0:t.keyword)&&void 0!==e?e:"✅";return{name:"stats",install:function(t){var e=0,n=0;t.emitter.on("message",function(i){e++,n+=i.length;var o={messages:e,chars:n};t.emitter.emit("stats",o),i.includes(r)&&t.emitter.emit("keyword",{keyword:r,at:n})}),t.emitter.on("connecting",function(){e=0,n=0,t.emitter.emit("stats",{messages:e,chars:n})})}}},exports.throttlePlugin=y,exports.webFetchTransport=l;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sse-stream-plugin-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "插件化跨端 SSE SDK:传输层可插拔、解析器可替换、请求/事件中间件、统一插件契约",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
"main": "dist/index.js",
|
|
16
16
|
"module": "dist/index.mjs",
|
|
17
17
|
"browser": "dist/index.umd.js",
|
|
18
|
-
"miniprogram": "dist/index.mp.js",
|
|
19
18
|
"types": "dist/index.d.ts",
|
|
20
19
|
"exports": {
|
|
21
20
|
".": {
|
package/dist/index.mp.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var t=function(){return t=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var i in e=arguments[r])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},t.apply(this,arguments)};function e(t,e,r,n){return new(r||(r=Promise))(function(i,o){function a(t){try{u(n.next(t))}catch(t){o(t)}}function s(t){try{u(n.throw(t))}catch(t){o(t)}}function u(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(a,s)}u((n=n.apply(t,e||[])).next())})}function r(t,e){var r,n,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=s(0),a.throw=s(1),a.return=s(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(s){return function(u){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;a&&(a=0,s[0]&&(o=0)),o;)try{if(r=1,n&&(i=2&s[0]?n.return:s[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,s[1])).done)return i;switch(n=0,i&&(s=[2&s[0],i.value]),s[0]){case 0:case 1:i=s;break;case 4:return o.label++,{value:s[1],done:!1};case 5:o.label++,n=s[1],s=[0];continue;case 7:s=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==s[0]&&2!==s[0])){o=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]<i[3])){o.label=s[1];break}if(6===s[0]&&o.label<i[1]){o.label=i[1],i=s;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(s);break}i[2]&&o.ops.pop(),o.trys.pop();continue}s=e.call(t,o)}catch(t){s=[6,t],n=0}finally{r=i=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,u])}}}function n(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function i(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,i,o=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(n=o.next()).done;)a.push(n.value)}catch(t){i={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}return a}function o(t,e,r){if(r||2===arguments.length)for(var n,i=0,o=e.length;i<o;i++)!n&&i in e||(n||(n=Array.prototype.slice.call(e,0,i)),n[i]=e[i]);return t.concat(n||Array.prototype.slice.call(e))}"function"==typeof SuppressedError&&SuppressedError;var a=function(){function t(){this.listeners=new Map}return t.prototype.on=function(t,e){var r=this,n=this.listeners.get(t);return n||(n=new Set,this.listeners.set(t,n)),n.add(e),function(){return r.off(t,e)}},t.prototype.once=function(t,e){var r=this.on(t,function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];r(),e.apply(void 0,o([],i(t),!1))});return r},t.prototype.off=function(t,e){var r;null===(r=this.listeners.get(t))||void 0===r||r.delete(e)},t.prototype.emit=function(t){for(var e,r,a=[],s=1;s<arguments.length;s++)a[s-1]=arguments[s];var u=this.listeners.get(t);if(u)try{for(var l=n(o([],i(u),!1)),c=l.next();!c.done;c=l.next()){c.value.apply(void 0,o([],i(a),!1))}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}},t.prototype.clear=function(){this.listeners.clear()},t}();function s(){var t="";return{write:function(e,r){var i,o,a,s=(t+=e).replace(/\r\n?/g,"\n").split("\n\n");t=null!==(a=s.pop())&&void 0!==a?a:"";try{for(var l=n(s),c=l.next();!c.done;c=l.next()){var d=c.value;if(d.trim()){var f=u(d);f&&r(f)}}}catch(t){i={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(i)throw i.error}}},flush:function(e){var r=t.replace(/\r\n?/g,"\n").trim();if(t="",r){var n=u(r);n&&e(n)}}}}function u(e){var r,i,o,a="message",s=[],u=!1;try{for(var l=n(e.split("\n")),c=l.next();!c.done;c=l.next()){var d=c.value;if(d&&!d.startsWith(":")){var f=d.indexOf(":"),h=void 0,p=void 0;switch(-1===f?(h=d,p=""):(h=d.slice(0,f)," "===(p=d.slice(f+1)).charAt(0)&&(p=p.slice(1))),h){case"event":a=p;break;case"data":s.push(p);break;case"id":p.includes("\0")||(o=p,u=!0)}}}}catch(t){r={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}return 0===s.length?null:t({name:a,data:s.join("\n")},u?{id:o}:{})}var l=function(){var n=null,i=!1;return{name:"web-fetch",connect:function(o,a){return e(this,void 0,void 0,function(){var e,s,u,l,d,f,h;return r(this,function(r){switch(r.label){case 0:return r.trys.push([0,6,,7]),[4,fetch(o.url,{method:o.method,headers:t({"Content-Type":"application/json"},o.headers),body:"POST"===o.method?o.body:void 0})];case 1:if(e=r.sent(),null===(h=a.response)||void 0===h||h.call(a,{status:e.status,headers:c(e.headers)}),!e.ok||!e.body)throw new Error("HTTP ".concat(e.status," 流不可用"));n=e.body.getReader(),s=new TextDecoder("utf-8"),r.label=2;case 2:return[4,n.read()];case 3:if(u=r.sent(),l=u.done,d=u.value,i)return[3,5];if(l)return a.end(),[3,5];a.data(s.decode(d,{stream:!0})),r.label=4;case 4:return[3,2];case 5:return[3,7];case 6:return f=r.sent(),i||a.error(f),[3,7];case 7:return[2]}})})},abort:function(){i=!0,null==n||n.cancel().catch(function(){}),n=null}}};function c(t){var e={};return t.forEach(function(t,r){e[r]=t}),e}function d(){return[{id:"m1",data:"开始解释:\n"},{id:"m2",data:"输入内容:你好\n"},{name:"ping",data:"",gap:200},{id:"m3",data:"\n1. 语法解析完成"},{id:"m4",data:"\n2. 语义分析完成"},{id:"m5",data:"\n3. 生成解释结果"},{id:"m6",data:"\n✅ 解释完毕"}]}function f(t){var e,r,i,o=null!==(e=null==t?void 0:t.events)&&void 0!==e?e:[{id:"m1",data:"开始解释:\n"},{id:"m2",data:"输入内容:你好\n"},{name:"ping",data:"",gap:200},{id:"m3",data:"\n1. 语法解析完成"},{id:"m4",data:"\n2. 语义分析完成"},{id:"m5",data:"\n3. 生成解释结果"},{id:"m6",data:"\n✅ 解释完毕"}],a=null!==(r=null==t?void 0:t.failAfter)&&void 0!==r?r:0,s=null!==(i=null==t?void 0:t.errorMessage)&&void 0!==i?i:"模拟网络中断(连接被重置)",u=!1;return function(t){var e,r=t.request,i=[],l=!1,c=0,d=null!==(e=r.headers["Last-Event-ID"])&&void 0!==e?e:r.headers["last-event-id"];if(d){var f=o.findIndex(function(t){return t.id===d});f>=0&&(c=f+1)}return{name:"mock",connect:function(t,e){var r=function(){var t;if(!l)if(a>0&&c===a&&!u){u=!0;var d=setTimeout(function(){l||e.error(new Error(s))},500);i.push(d)}else if(c>=o.length){var f=setTimeout(function(){l||e.end()},200);i.push(f)}else{var h=o[c],p=setTimeout(function(){l||(e.data(function(t){var e,r,i,o,a=[];t.id&&a.push("id:".concat(t.id));a.push("event:".concat(null!==(i=t.name)&&void 0!==i?i:"message"));try{for(var s=n((null!==(o=t.data)&&void 0!==o?o:"").split("\n")),u=s.next();!u.done;u=s.next()){var l=u.value;a.push("data:".concat(l))}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}return a.join("\n")+"\n\n"}(h)),c++,r())},null!==(t=h.gap)&&void 0!==t?t:350);i.push(p)}};r()},abort:function(){var t,e;l=!0;try{for(var r=n(i),o=r.next();!o.done;o=r.next()){var a=o.value;clearTimeout(a)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}i.length=0}}}}function h(){if("function"==typeof globalThis.fetch)return l;throw new Error("未检测到可用传输层,请通过 options.transport 显式指定,或用 createMpTransport 注册小程序传输层")}var p=function(){function i(t){var e,r,i,o,u,c,d=this;this.emitter=new a,this.plugins=[],this.installed=!1,this.transportRegistry=new Map,this.requestMiddleware=[],this.eventMiddleware=[],this.disposeFns=[],this.parserFactory=s,this.parser=null,this.activeTransport=null,this.currentRequest={url:"",method:"GET",headers:{}},this.state="idle",this.sessionId=0,this.dead=!1,this.dispatch=function(t){!function(t,e,r,n){var i=-1,o=function(e,n){if(e<=i)return Promise.reject(new Error("next() 被多次调用"));if(i=e,e===t.length)return r(n),Promise.resolve();try{return Promise.resolve(t[e](n,function(t){return o(e+1,null!=t?t:n)}))}catch(t){return Promise.reject(t)}};o(0,e).catch(n)}(d.eventMiddleware,t,function(t){d.emitter.emit("event",t),d.emitter.emit(t.name,t.data,t)},function(t){return d.settleError(t)})},this.options={url:t.url,method:null!==(i=t.method)&&void 0!==i?i:"GET",body:null!==(o=t.body)&&void 0!==o?o:"",headers:null!==(u=t.headers)&&void 0!==u?u:{},transport:t.transport,plugins:null!==(c=t.plugins)&&void 0!==c?c:[],parser:t.parser},this.options.parser&&(this.parserFactory=this.options.parser),this.transportRegistry.set("web",l),this.transportRegistry.set("mock",f());var h=this;this.context={emitter:this.emitter,get request(){return h.currentRequest},addRequestMiddleware:function(t){return d.requestMiddleware.push(t)},addEventMiddleware:function(t){return d.eventMiddleware.push(t)},setParser:function(t){d.parserFactory=t},registerTransport:function(t,e){return d.transportRegistry.set(t,e)},start:function(){return d.start()},fail:function(t){return d.settleError(t)},getState:function(){return d.state},isDead:function(){return d.dead},onDispose:function(t){return d.disposeFns.push(t)}};try{for(var p=n(this.options.plugins),v=p.next();!v.done;v=p.next()){var m=v.value;this.use(m)}}catch(t){e={error:t}}finally{try{v&&!v.done&&(r=p.return)&&r.call(p)}finally{if(e)throw e.error}}}return i.prototype.use=function(t){if(this.dead)throw new Error("实例已销毁,无法再注册插件");return this.plugins.some(function(e){return e.name===t.name})||(this.plugins.push(t),this.installed&&t.install(this.context)),this},i.prototype.connect=function(){return e(this,void 0,void 0,function(){return r(this,function(t){switch(t.label){case 0:if(this.dead)throw new Error("实例已销毁,请创建新的 PluginSSE");return[4,this.start()];case 1:return t.sent(),[2]}})})},i.prototype.start=function(){return e(this,void 0,void 0,function(){var e,n,i,o,a,s=this;return r(this,function(r){switch(r.label){case 0:if(this.dead)return[2];this.installed||this.installPlugins(),this.silentAbort(),e=++this.sessionId,this.state="connecting",this.currentRequest={url:this.options.url,method:this.options.method,headers:t({},this.options.headers),body:"POST"===this.options.method?this.options.body:void 0},this.emitter.emit("connecting",{session:e}),r.label=1;case 1:return r.trys.push([1,3,,4]),[4,(u=this.requestMiddleware,function(t){var e=-1,r=function(t,n){if(t<=e)return Promise.reject(new Error("next() 被多次调用"));if(e=t,t===u.length)return Promise.resolve(n);try{return Promise.resolve(u[t](n,function(e){return r(t+1,null!=e?e:n)}))}catch(t){return Promise.reject(t)}};return r(0,t)})(this.currentRequest)];case 2:return n=r.sent(),[3,4];case 3:return i=r.sent(),e===this.sessionId&&this.settleError(i),[2];case 4:return e!==this.sessionId||this.dead||(this.currentRequest=n,this.parser=this.parserFactory(),o=this.resolveTransportFactory(),a=o({request:n}),this.activeTransport=a,a.connect(n,{data:function(t){var r;e===s.sessionId&&(s.emitter.emit("data",t),null===(r=s.parser)||void 0===r||r.write(t,s.dispatch))},end:function(){var t;e===s.sessionId&&(null===(t=s.parser)||void 0===t||t.flush(s.dispatch),s.state="closed",s.emitter.emit("end"))},error:function(t){e===s.sessionId&&s.settleError(t)},response:function(t){e===s.sessionId&&s.emitter.emit("response",t)}}),this.state="open",this.emitter.emit("open",{transport:a.name})),[2]}var u})})},i.prototype.destroy=function(){var t,e;if(!this.dead){this.dead=!0,this.sessionId++,this.silentAbort(),this.state="closed";try{for(var r=n(this.disposeFns),i=r.next();!i.done;i=r.next()){var o=i.value;try{o()}catch(t){}}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}this.emitter.emit("closed"),this.emitter.clear()}},i.prototype.on=function(t,e){return this.emitter.on(t,e)},i.prototype.once=function(t,e){return this.emitter.once(t,e)},i.prototype.off=function(t,e){this.emitter.off(t,e)},i.prototype.installPlugins=function(){var t,e;this.installed=!0;try{for(var r=n(this.plugins),i=r.next();!i.done;i=r.next()){i.value.install(this.context)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},i.prototype.resolveTransportFactory=function(){var t=this.options.transport;if("string"==typeof t){var e=this.transportRegistry.get(t);if(!e)throw new Error("未注册的传输层:".concat(t));return e}return t||h()},i.prototype.settleError=function(t){this.dead||(this.sessionId++,this.silentAbort(),this.state="closed",this.emitter.emit("error",t))},i.prototype.silentAbort=function(){if(this.activeTransport){try{this.activeTransport.abort()}catch(t){}this.activeTransport=null}},i}();function v(t){var n,i,o=null!==(n=null==t?void 0:t.maxRetries)&&void 0!==n?n:3,a=null!==(i=null==t?void 0:t.delay)&&void 0!==i?i:1500,s="",u=0,l=null;return{name:"reconnect",install:function(t){var n=this;t.addRequestMiddleware(function(t,i){return e(n,void 0,void 0,function(){return r(this,function(e){return s&&(t.headers["Last-Event-ID"]=s),[2,i(t)]})})}),t.emitter.on("event",function(t){t.id&&(s=t.id)}),t.emitter.on("error",function(e){t.isDead()||(u>=o?t.emitter.emit("reconnect-failed",e):(u++,t.emitter.emit("reconnect",{attempt:u,inMs:a}),l=setTimeout(function(){l=null,t.start()},a)))}),t.emitter.on("end",function(){u=0,s=""}),t.onDispose(function(){l&&clearTimeout(l),l=null})}}}function m(t){var e,r=null!==(e=null==t?void 0:t.interval)&&void 0!==e?e:1e4,n=null;return{name:"heartbeat",install:function(t){var e=function(){n&&(clearTimeout(n),n=null)},i=function(){e(),n=setTimeout(function(){t.emitter.emit("heartbeat-lost"),t.fail(new Error("心跳丢失:".concat(r,"ms 内未收到任何数据")))},r)};t.emitter.on("connecting",i),t.emitter.on("data",i),t.emitter.on("end",e),t.emitter.on("error",e),t.onDispose(e)}}}function y(e){var r,n,i=null!==(r=null==e?void 0:e.windowMs)&&void 0!==r?r:100,o="",a=null,s=null;return{name:"throttle",install:function(e){var r=function(){if(a&&(clearTimeout(a),a=null),o&&s){var e=o,r=n;o="",n=void 0;var i=s;s=null,i(t({name:"message",data:e},r?{id:r}:{}))}};e.addEventMiddleware(function(t,e){if("message"!==t.name)return e(t);o+=t.data,t.id&&(n=t.id),s=e,a||(a=setTimeout(r,i))}),e.emitter.on("end",r),e.emitter.on("error",r),e.onDispose(r)}}}exports.Emitter=a,exports.PluginSSE=p,exports.authPlugin=function(t){var n,i,o=null!==(n=t.header)&&void 0!==n?n:"Authorization",a=null!==(i=t.scheme)&&void 0!==i?i:"Bearer",s=!1;return{name:"auth",install:function(n){var i=this;n.addRequestMiddleware(function(n,s){return e(i,void 0,void 0,function(){var e;return r(this,function(r){switch(r.label){case 0:return[4,t.getToken()];case 1:return e=r.sent(),n.headers[o]=a?"".concat(a," ").concat(e):e,[2,s(n)]}})})}),n.emitter.on("response",function(o){return e(i,[o],void 0,function(e){var i=e.status;return r(this,function(e){switch(e.label){case 0:if(401!==i||s||n.isDead())return[2];s=!0,n.emitter.emit("auth-refreshing"),e.label=1;case 1:return e.trys.push([1,,3,4]),[4,t.refreshToken()];case 2:return e.sent(),[3,4];case 3:return s=!1,[7];case 4:return n.start(),[2]}})})})}}},exports.createMpTransport=function(e,r){return void 0===r&&(r="miniprogram"),function(){var n,i=null,o=!1;return{name:r,connect:function(r,a){var s=e();(i=s.request({url:r.url,method:r.method,header:t({},r.headers),data:"POST"===r.method&&r.body?JSON.parse(r.body):void 0,enableChunked:!0,responseType:"arraybuffer",success:function(t){var e;o||(null===(e=a.response)||void 0===e||e.call(a,{status:t.statusCode}),a.end())},fail:function(t){o||a.error(function(t){if(t instanceof Error)return t;if(null!==t&&"object"==typeof t&&"errMsg"in t){var e=t.errMsg;return new Error("string"==typeof e&&e?e:"request 失败")}return new Error(String(t))}(t))}})).onChunkReceived(function(t){o||a.data(function(t){void 0===n&&(n="undefined"!=typeof TextDecoder?new TextDecoder("utf-8"):null);if(n)return n.decode(t,{stream:!0});for(var e="",r=0;r<t.length;r++)e+="%"+t[r].toString(16).padStart(2,"0");return decodeURIComponent(e)}(new Uint8Array(t.data)))})},abort:function(){o=!0,null==i||i.abort(),i=null}}}},exports.createSSEParser=s,exports.defaultScript=d,exports.detectTransport=h,exports.heartbeatPlugin=m,exports.loggerPlugin=function(t){var e,r=null!==(e=null==t?void 0:t.sink)&&void 0!==e?e:function(t){return console.log(t)};return{name:"logger",install:function(t){t.emitter.on("open",function(e){var n=e.transport,i=JSON.stringify(t.request.headers);r("连接已打开(".concat(n,")请求头:").concat(i))}),t.emitter.on("response",function(t){var e=t.status;r("收到响应,状态码:".concat(e))}),t.emitter.on("event",function(t){var e=t.data.replace(/\n/g,"\\n"),n=e.length>40?e.slice(0,40)+"…":e;r("事件 ".concat(t.name).concat(t.id?" #"+t.id:""," ")+"(".concat(t.data.length," 字): ").concat(n))}),t.emitter.on("reconnect",function(t){var e=t.attempt,n=t.inMs;r("连接中断,".concat(n,"ms 后进行第 ").concat(e," 次重连…"))}),t.emitter.on("heartbeat-lost",function(){r("心跳丢失!")}),t.emitter.on("reconnect-failed",function(){r("已达最大重试次数,不再重连")}),t.emitter.on("error",function(t){r("发生错误:".concat(t instanceof Error?t.message:String(t)))}),t.emitter.on("end",function(){r("流正常结束")}),t.emitter.on("closed",function(){r("实例已销毁,资源已释放")})}}},exports.mockTransport=f,exports.recommendedPlugins=function(){return[v(),m(),y()]},exports.reconnectPlugin=v,exports.statsPlugin=function(t){var e,r=null!==(e=null==t?void 0:t.keyword)&&void 0!==e?e:"✅";return{name:"stats",install:function(t){var e=0,n=0;t.emitter.on("message",function(i){e++,n+=i.length;var o={messages:e,chars:n};t.emitter.emit("stats",o),i.includes(r)&&t.emitter.emit("keyword",{keyword:r,at:n})}),t.emitter.on("connecting",function(){e=0,n=0,t.emitter.emit("stats",{messages:e,chars:n})})}}},exports.throttlePlugin=y,exports.webFetchTransport=l;
|