
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
专门用于 AI 流式输出和站内消息广播的 SSE(Server-Sent Events)长连接管理 SDK。提供了完整的事件监听、自动重连和消息处理机制,特别适合 AI 对话、实时通知等场景。
专门用于 AI 流式输出和站内消息广播的 SSE(Server-Sent Events)长连接管理 SDK。提供了完整的事件监听、自动重连和消息处理机制,特别适合 AI 对话、实时通知等场景。
npm install wsse-sdk
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| url | 连接地址(必填) | string | - |
| eventListeners | 后端自定义消息类型的监听器配置 | object | {} |
| parseMessage | 是否自动解析消息 | boolean | false |
| reconnectTime | 重连间隔(毫秒) | number | 60000 |
| retryCount | 重试次数,设置为 0 可禁用自动重连 | number | 5 |
| streamTimeout | 流式响应超时(毫秒),设置为 0 可禁用超时检测 | number | 300000 |
| withCredentials | 是否发送凭证 | boolean | false |
| debugger | 是否开启调试日志 | boolean | true |
| autoReconnect | 是否启用自动重连 | boolean | true |
| timeout | 连接建立超时时间(毫秒) | number | 5000 |
配置禁用说明:
禁用流式响应超时
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
streamTimeout: 0 // 设置为0即可禁用流式响应超时
});
禁用自动重连
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
autoReconnect: false, // 方式1:直接禁用自动重连
retryCount: 0 // 方式2:设置重试次数为0
});
import WSSE from 'wsse-sdk';
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
// 配置后端自定义消息类型的监听器
eventListeners: {
chat_response: (data) => {
console.log('收到聊天响应:', data);
},
error_message: (data) => {
console.log('收到错误消息:', data);
}
},
parseMessage: true, // 启用消息自动解析(默认关闭)
streamTimeout: 300000, // 流式响应5分钟超时
});
// 添加系统事件监听
aiChat.on({
// 连接建立时触发
open: () => console.log('连接已建立'),
// 连接错误时触发
error: (error) => console.error('连接错误:', error),
// 默认消息处理器,处理所有未指定类型的消息
message: (event) => {
const data = JSON.parse(event.data);
console.log('收到未指定类型的消息:', data);
// 根据消息类型做不同处理
switch(data.type) {
case 'stream':
console.log('流式响应片段:', data.content);
break;
case 'done':
console.log('响应结束');
break;
default:
console.log('其他类型消息:', data);
}
}
});
// 添加额外的自定义消息类型监听
aiChat.addMessageListener({
status_update: (data) => {
console.log('状态更新:', data);
}
});
// 手动重连
await aiChat.reconnect();
// 关闭连接
aiChat.close();
import WSSE from 'wsse-sdk';
// 1. URL 参数方式
const aiChat1 = new WSSE({
url: "https://api.ai-service.com/stream?userId=123&token=abc",
eventListeners: {
chat_response: (data) => console.log('收到响应:', data)
}
});
// 2. URL 路径参数方式
const aiChat2 = new WSSE({
url: "https://api.ai-service.com/stream/user/123",
eventListeners: {
chat_response: (data) => console.log('收到响应:', data)
}
});
// 3. 跨域携带凭证方式
const aiChat3 = new WSSE({
url: "https://api.ai-service.com/stream",
withCredentials: true, // 允许跨域请求携带 cookie
eventListeners: {
chat_response: (data) => console.log('收到响应:', data)
}
});
// 4. 动态更新连接
let connectionUrl = "https://api.ai-service.com/stream";
const token = "user-token";
// 添加认证信息
const addAuthToUrl = (baseUrl, token) => {
const url = new URL(baseUrl);
url.searchParams.append('token', token);
return url.toString();
}
const aiChat4 = new WSSE({
url: addAuthToUrl(connectionUrl, token),
eventListeners: {
chat_response: (data) => console.log('收到响应:', data)
}
});
SDK 默认不会自动解析消息,需要通过 parseMessage 配置项来开启。这样可以让用户更灵活地控制消息解析方式。
// 手动解析消息(默认行为)
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
eventListeners: {
chat_response: (event) => {
// 需要手动解析消息
const data = JSON.parse(event.data);
console.log('收到聊天响应:', data);
}
}
});
// 开启自动解析
const aiChatWithParse = new WSSE({
url: "https://api.ai-service.com/stream",
parseMessage: true, // 开启自动解析
eventListeners: {
chat_response: (data) => {
// data 已经是解析后的对象
console.log('收到聊天响应:', data);
}
}
});
// 后端发送的原始消息
event.data = '{"type":"chat_response","content":"Hello","timestamp":1678234567890}'
// 监听器收到的数据(自动解析为对象)
{
type: "chat_response",
content: "Hello",
timestamp: 1678234567890
}
// 监听器收到的是原始字符串
aiChat.on({
message: (event) => {
// 需要手动解析
const data = JSON.parse(event.data);
console.log(data);
}
});
aiChat.on({
message: (event) => {
try {
// 手动解析示例
const data = parseMessage ? JSON.parse(event.data) : event.data;
console.log('解析成功:', data);
} catch (error) {
console.error('消息解析失败:', error);
// 保留原始数据
console.log('原始数据:', event.data);
}
}
});
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
parseMessage: true,
eventListeners: {
chat_response: (event) => {
// 某些情况下可能需要特殊处理
const rawData = event.data;
let data;
// 处理特殊格式
if (rawData.startsWith('data: ')) {
data = JSON.parse(rawData.slice(6));
} else {
data = JSON.parse(rawData);
}
console.log('处理后的数据:', data);
}
}
});
// 推荐的消息格式
{
"type": "chat_response", // 消息类型(必需)
"content": "消息内容", // 消息内容
"timestamp": 1678234567890, // 时间戳
"metadata": { // 额外信息(可选)
"messageId": "abc123",
"status": "success"
}
}
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
parseMessage: false, // 关闭自动解析
eventListeners: {
chat_response: (event) => {
// 自定义解析逻辑
const data = customParser(event.data);
console.log('自定义解析结果:', data);
}
}
});
function customParser(rawData) {
// 实现自定义解析逻辑
// 返回解析后的数据
}
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
eventListeners: {
// 监听流式内容完成事件
streamComplete: (content) => {
console.log('完整的流式内容:', content);
},
// 监听消息入队事件
messageQueued: (message) => {
console.log('新消息已入队:', message);
}
}
});
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
retryCount: 3,
reconnectTime: 5000,
eventListeners: {
error_message: (error) => {
switch(error.code) {
case 'TOKEN_EXPIRED':
// 处理 token 过期
refreshToken().then(() => aiChat.reconnect());
break;
case 'RATE_LIMIT':
// 处理限流
console.warn('请求过于频繁,请稍后重试');
break;
default:
// 其他错误处理
console.error('发生错误:', error);
}
}
}
});
// 手动重连时的错误处理
try {
await aiChat.reconnect();
console.log('重连成功');
} catch (error) {
console.error('重连失败:', error);
}
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream",
eventListeners: {
chat_response: (message) => {
// 过滤特定类型的消息
if (message.type === 'thought') {
return; // 忽略思考过程
}
// 转换消息格式
const transformedMessage = {
content: message.content,
timestamp: Date.now(),
formatted: true
};
console.log('处理后的消息:', transformedMessage);
}
}
});
const aiChat = new WSSE({
url: "https://api.ai-service.com/stream"
});
// 监听连接状态变化
aiChat.on({
open: () => {
console.log('连接状态:', aiChat.state); // WSSE.STATE_OPEN
console.log('是否正在重连:', aiChat.isReconnecting);
console.log('是否正在连接:', aiChat.isConnecting);
}
});
// 状态常量
console.log('连接中:', WSSE.STATE_CONNECTING); // 0
console.log('已连接:', WSSE.STATE_OPEN); // 1
console.log('已关闭:', WSSE.STATE_CLOSED); // 2
流式响应
自动重连
消息类型监听
重连策略优化
内存管理
URL 参数传递
// 推荐:构建 URL 时使用 URLSearchParams
const params = new URLSearchParams({
userId: '123',
token: 'abc',
timestamp: Date.now()
});
const aiChat = new WSSE({
url: `https://api.ai-service.com/stream?${params.toString()}`
});
认证信息传递
// 方式1:通过 URL 参数
const aiChat1 = new WSSE({
url: "https://api.ai-service.com/stream?token=abc"
});
// 方式2:通过 cookie(需要后端支持)
const aiChat2 = new WSSE({
url: "https://api.ai-service.com/stream",
withCredentials: true // 允许跨域请求携带 cookie
});
动态参数处理
class ChatService {
constructor(baseUrl) {
this.baseUrl = baseUrl;
this.sseInstance = null;
}
connect(params = {}) {
// 构建URL
const url = new URL(this.baseUrl);
Object.entries(params).forEach(([key, value]) => {
url.searchParams.append(key, value);
});
// 创建SSE实例
this.sseInstance = new WSSE({
url: url.toString(),
eventListeners: {
chat_response: this.handleResponse.bind(this)
}
});
}
handleResponse(data) {
console.log('收到响应:', data);
}
disconnect() {
this.sseInstance?.close();
}
}
// 使用示例
const chatService = new ChatService('https://api.ai-service.com/stream');
chatService.connect({
userId: '123',
token: 'abc',
timestamp: Date.now()
});
流式响应
自动重连
消息类型监听
消息处理
重连策略优化
内存管理
MIT
FAQs
专门用于 AI 流式输出和站内消息广播的 SSE(Server-Sent Events)长连接管理 SDK。提供了完整的事件监听、自动重连和消息处理机制,特别适合 AI 对话、实时通知等场景。
We found that wsse-sdk demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.