微信小程序中的EventSource类实现

103 阅读2分钟

这是一个微信小程序中的EventSource类实现,用于模拟Server-Sent Events (SSE) 通信。由于微信小程序不支持原生的EventSource,所以通过wx.request的enableChunked和onChunkReceived来实现分块接收数据。

1. 引入模块:log、env、base64,并定义了两个全局变量joinStatus和joinStringCache,用于处理分块数据拼接。

2. EventSource类:

-   构造函数:接收url、data和retryTime(重连时间,默认为0)。初始化属性,并调用connect方法。

-   connect方法:发起网络请求,设置请求头,包括content-type、appid和Accept(注意这里设置为text/event-stream)。如果有token,则加上Authorization头。使用wx.request,并启用分块传输(enableChunked: true),设置响应类型为text,方法为POST,超时时间为300秒。

    -   成功回调:触发'success'事件,如果设置了重连时间,则定时重连。
    -   失败回调:触发'fail'事件。
    -   监听onHeadersReceived:触发'open'事件。
    -   监听onChunkReceived:调用handleChunk方法处理分块数据。

3. handleChunk方法:处理分块数据。

-   将接收到的ArrayBuffer转换为Uint8Array,然后通过String.fromCharCode和escape、decodeURIComponent转换为字符串。

-   将字符串按换行符分割成多条消息。

-   遍历每条消息:

    -   空行跳过。
    -   如果处于join状态(即上一条消息不完整),则将当前消息与缓存的消息拼接,并重置join状态和缓存。
    -   如果消息以'data:'开头,则去掉前缀。
    -   如果去掉前缀后为空,则跳过。
    -   检查消息的最后一个字符是否为'}',如果不是,则认为消息不完整,设置join状态,并缓存当前消息,跳过当前处理。
    -   尝试将消息解析为JSON,如果解析失败,则打印错误日志。
    -   触发'chunkReceived'事件,传递处理后的消息。

4. 事件监听:通过addEventListener方法注册事件,emit方法触发事件。

5. close方法:中止请求。

话不多说,上代码