Skip to content

引入

ts
import {
  parseSSEChunkInH5,
  parseSSEChunkInMP,
  ab2str,
  fetchSSECoreInH5,
  getLoginCookie,
  fetchSSECoreInMP,
  fetchSSECore
} from 't-comm';

// 不支持 tree-shaking 的项目
import {
  parseSSEChunkInH5,
  parseSSEChunkInMP,
  ab2str,
  fetchSSECoreInH5,
  getLoginCookie,
  fetchSSECoreInMP,
  fetchSSECore
} from 't-comm/lib/sse/index';

// 只支持 ESM 的项目
import {
  parseSSEChunkInH5,
  parseSSEChunkInMP,
  ab2str,
  fetchSSECoreInH5,
  getLoginCookie,
  fetchSSECoreInMP,
  fetchSSECore
} from 't-comm/es/sse/index';

parseSSEChunkInH5

描述:解析 H5 环境下的 SSE 数据流

参数

参数名类型描述
paramsObject参数对象
params.successfunction成功回调函数
params.failfunction失败回调函数
params.completefunction完成回调函数
params.responseResponse响应对象

返回: Promise

返回一个 Promise,处理 SSE 数据流

示例

ts
const response = await fetch('/api/sse', { method: 'POST' });
await parseSSEChunkInH5({
  response,
  success: (chunk, line) => console.log(chunk),
  fail: ({ response }) => console.error(response.status),
  complete: () => console.log('finish'),
});

parseSSEChunkInMP

描述:解析 MP 环境下的 SSE 数据块

参数

参数名类型描述
paramsObject参数对象
params.chunkstring数据块
[params.fail]Fail失败回调函数
[params.success]Success成功回调函数

示例

ts
parseSSEChunkInMP({
  chunk: 'data: hello\ndata: world\n',
  success: (data, line) => console.log(data),
  fail: () => console.error('parse error'),
});

ab2str(buffer, encoding)

描述:将 ArrayBuffer 转换为字符串 支持多种字符编码,优先使用 TextDecoder API

参数

参数名描述
buffer要转换的 ArrayBuffer
encoding字符编码,默认为 'utf-8'

返回: 转换后的字符串

示例

ts
const buffer = new ArrayBuffer(8);
const str = ab2str(buffer); // 使用 UTF-8 编码
const gbkStr = ab2str(buffer, 'gbk'); // 使用 GBK 编码

fetchSSECoreInH5(params)

描述:在 H5 环境下发起 SSE 请求的核心函数

参数

参数名类型描述
paramsObject参数对象
params.urlstring请求 URL
params.dataany请求数据
params.successfunction成功回调函数
params.failfunction失败回调函数
params.completefunction完成回调函数

返回: Promise

返回一个 Promise,包含响应对象

示例

ts
fetchSSECoreInH5({
  url: 'https://example.com/sse',
  data: { input: 'hello' },
  success: (chunk) => console.log(chunk),
  fail: ({ response }) => console.error('failed'),
  complete: () => console.log('done'),
});

getLoginCookie(isTestEnv)

描述:获取登录 Cookie

参数

参数名类型描述
isTestEnvfunction是否为测试环境的函数

返回: string

返回拼接后的 Cookie 字符串

fetchSSECoreInMP(params)

描述:在 MP 环境下发起 SSE 请求的核心函数

参数

参数名类型描述
paramsRequestParams请求参数

返回: Promise

返回一个 Promise,包含请求任务对象

示例

ts
fetchSSECoreInMP({
  url: 'https://example.com/sse',
  data: { input: 'hello' },
  success: (data) => console.log(data),
  fail: (err) => console.error(err),
  complete: () => console.log('done'),
  isTestEnv: () => false,
});

fetchSSECore(params)

描述:发起 SSE 请求的核心函数,根据环境自动选择 H5 或 MP 实现

参数

参数名类型描述
paramsRequestParams请求参数
params.urlstring请求地址
params.dataObject请求数据
params.successfunction成功回调
params.failfunction失败回调
params.completefunction完成回调

返回: Promise

返回一个 Promise,包含请求任务或响应对象

示例

ts
import { safeJsonParse } from 't-comm/es/json';

import { fetchSSECore, type RequestParams } from 't-comm/es/sse';

// 检查是否结束,业务自定义
function checkFinish(str) {
  const data: any = safeJsonParse(str);
  return data?.status === 3;
}

// 业务二次封装,把自己的请求数据、自定义的处理数据的逻辑放进去
export function sendChatMessage({
  input,
  sessionId,
  extraInfo,
  expectedOp,

  success,
  fail,
  complete,
}: {
  input: string;
  sessionId?: string;
  extraInfo?: string;
  expectedOp?: Record<string, any>;

  success?: (data: any) => void;
  fail?: RequestParams['fail'];
  complete?: RequestParams['complete'];
}) {
  const origin = isTestEnv() ? 'https://xx.com' : 'https://xx.com';
  const url = `${origin}/xx.xx.xx.xx/xx?g_app_tk=${cookie.get('tip_token')}&tstamp=${Date.now()}`;
  const reqData = {
    input,
    session_id: sessionId,
    extra_info: extraInfo,
    expected_op: expectedOp,
  };

  const parsedSuccess = (str, fullStr) => {
    const data: any = safeJsonParse(str);
    const fullData: any = safeJsonParse(fullStr);

    if (checkFinish(str)) {
      complete?.(str);
      return;
    }

    // 检查是否失败,业务自定义
    if (fullData?.err_msg) {
      fail?.(data);
      return;
    }

    success?.(data);
  };

  return fetchSSECore({
    url,
    data: reqData,
    success: parsedSuccess,
    fail,
    complete,
    isTestEnv,
  });
}