更新记录

1.0.0(2026-09-12) 下载此版本

sse


平台兼容性

uni-app(5.0)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(5.0)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - - - - -

chat-sse

uni-app UTS 原生 SSE 分块流式插件。用于 App 端真正按块接收 text/event-stream,避免 uni.requestonChunkReceived 时只能等整包、界面卡住的问题。

本仓库业务侧已在 src/utils/chat-sse.js 接入:App 优先走本插件,失败再回退 uni.request;H5 仍走浏览器 fetch 流式。

平台支持

平台 实现方式 说明
App-Android HttpURLConnection 流式读 无 OkHttp 依赖,云打包可过;readTimeout = 0
App-iOS URLSessionDataDelegate 分块 didReceive data
Web / H5 fetch + ReadableStream 兜底;业务层也可自用 fetch
微信小程序 uni.request 整包 降级,非主路径

安装

插件已内置:src/uni_modules/chat-sse,按路径导入即可:

import { onChatSse, startSse, offChatSse } from '@/uni_modules/chat-sse'

使用前必读

  1. 必须打自定义调试基座 / 云打包。标准基座不含本插件原生代码,控制台可能提示 UTS 相关警告,属正常现象。
  2. CLI 创建的部分工程对 UTS 支持不完整,建议用 HBuilderX 打开本项目再打包。
  3. 改动 utssdk 下 Kotlin / Swift / index.uts 后,需重新打自定义基座才会生效。

快速开始

持续回调采用官方约定:方法名以 on 开头,且只有一个 callback,可多次触发,无需 @UTSJS.keepAlive(部分环境对装饰器会报 Decorators are not valid here)。

import { onChatSse, startSse, offChatSse } from '@/uni_modules/chat-sse'

// 1. 先注册监听
onChatSse((event) => {
  if (event.type === 'chunk') {
    // 原始文本增量,需自行按 SSE(data: ...\\n\\n)拼包解析
    console.log('chunk', event.data)
  } else if (event.type === 'success') {
    console.log('stream done')
    offChatSse()
  } else if (event.type === 'fail') {
    console.error(event.errCode, event.errMsg)
    offChatSse()
  }
})

// 2. 再发起请求
const task = startSse({
  url: 'https://example.com/agent/api/agent/weknora/continue-stream/SESSION_ID?message_id=MSG_ID',
  method: 'GET', // POST / GET
  // 每行:key + Tab + value
  headers: [
    'Accept\ttext/event-stream',
    'Authorization\ttoken YOUR_TOKEN',
  ].join('\n'),
  // GET 可传空字符串;POST 传 JSON 字符串
  body: '',
})

// 中止
// task.abort()
// offChatSse()

API

onChatSse(callback)

注册全局 SSE 事件监听。同一时间建议只保留一个监听;新注册会覆盖旧监听。

参数 类型 说明
callback (event: SseEvent) => void 事件回调,可多次触发

offChatSse()

清空当前监听。流结束(success / fail)或主动 abort 后应调用,避免泄漏。

startSse(params)

发起一次流式请求。分块与结束事件通过 onChatSse 抛出。

SseStartParams

参数 类型 必填 默认值 说明
url string - 完整请求 URL(含 query)
method string POST GET / POST
headers string '' 请求头,见下方格式
body string '' POST 等有 body 时的字符串;GET 传空

headers 格式: 多行文本,每行 key + \\t(Tab)+ value,例如:

Accept  text/event-stream
Authorization   token xxx
Content-Type    application/json

GET 请求请勿强行带 Content-Type: application/json(本插件 Android 侧对 GET 也不会强制写死 JSON Content-Type)。

返回值 SseTask

方法 说明
abort() 中止当前连接;插件内会按成功收尾,避免业务一直转圈

SseEvent

字段 类型 说明
type string chunk / success / fail
data string 可选;chunk 时的增量文本
errCode number 可选;fail 时的错误码(HTTP 状态或 -1
errMsg string 可选;fail 时的错误信息

与业务层配合

本项目中:

  • 入口:src/utils/chat-sse.jsstreamViaUtsSse
  • App:onChatSsestartSseconsumeSseBuffer 解析 SSE
  • 续传:GET .../continue-stream/{sessionId}?message_id=
  • 问答:POST .../knowledge-chat|agent-chat/{sessionId}

插件只负责字节/文本分块投递,不解析 data: JSON;SSE 协议解析仍在 JS 层完成。

目录结构

uni_modules/chat-sse/
├── package.json
├── README.md
└── utssdk/
    ├── interface.uts          # 类型与参数定义
    ├── app-android/
    │   ├── index.uts          # onChatSse / startSse / offChatSse
    │   ├── SseClient.kt       # HttpURLConnection 实现
    │   ├── config.json
    │   └── AndroidManifest.xml
    ├── app-ios/
    │   ├── index.uts
    │   ├── ChatSseClient.swift
    │   └── config.json
    ├── web/
    │   └── index.uts
    └── mp-weixin/
        └── index.uts

常见问题

1. 控制台提示回调已释放 / Decorators are not valid

  • 不要使用 @UTSJS.keepAlive 装饰器(部分环境报 Decorators are not valid here)。
  • 请使用 onChatSse 注册监听,再调用 startSse

2. 打包装不上 OkHttp / Unresolved reference okhttp3

  • 当前 Android 实现已改为 HttpURLConnection不再依赖 OkHttp。请确认基座是改完后重新打包的。

3. 标准基座上没分块、一直等到结束

  • 标准基座不带本插件原生代码。请打自定义调试基座或正式云打包。

4. 同时发多个 SSE

  • 当前监听是模块级单例,后一次 onChatSse 会覆盖前一次。并发场景请自行串行化,或扩展为按 requestId 分发。

版本

  • 当前版本:1.0.0(见 package.json
  • 实现要点:Android 无三方依赖;持续回调用 onXxx 约定;与知识库聊天流式 / 续传对齐

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。