feat: 添加 WebSocket 支持和连接管理功能

This commit is contained in:
严浩
2025-10-16 01:45:36 +08:00
parent 4d721dfb5b
commit 4733e59d1a
3 changed files with 660 additions and 21 deletions

View File

@@ -2,17 +2,79 @@ export default {
async fetch(request, env) {
const url = new URL(request.url);
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1')
// 本地开发环境延迟处理
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
await new Promise((r) => setTimeout(r, 250));
}
// API 路由处理
if (url.pathname.startsWith('/api/')) {
await env.KV.put('last-api-call', `${Date.now()} ${request.method} ${url.pathname}`);
await env.KV.put('events:api:last-call', `${new Date().toISOString()} ${request.method} ${url.pathname}`);
// 获取所有可用的键名
const availableKeys = [
'events:api:last-call',
'events:ws:connection',
'events:ws:message',
'events:ws:disconnection'
];
return Response.json({
timestamp: Date.now(),
lastApiCall: await env.KV.get('last-api-call'),
lastApiCall: await env.KV.get('events:api:last-call'),
availableKeys: availableKeys,
storedData: {
apiLastCall: await env.KV.get('events:api:last-call'),
wsConnection: await env.KV.get('events:ws:connection'),
wsMessage: await env.KV.get('events:ws:message'),
wsDisconnection: await env.KV.get('events:ws:disconnection'),
}
});
}
// WebSocket 连接处理
if (url.pathname === '/ws') {
const upgradeHeader = request.headers.get('Upgrade');
if (upgradeHeader !== 'websocket') {
return new Response('Expected websocket', { status: 400 });
}
const [client, server] = Object.values(new WebSocketPair());
// 处理服务器端WebSocket消息
server.accept();
env.KV.put('events:ws:connection', `${new Date().toISOString()} ${url.pathname}`);
// accept 后立即发送欢迎消息
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
await new Promise((r) => setTimeout(r, 250));
}
server.send(`欢迎连接到WebSocket服务器连接时间: ${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })}`);
server.addEventListener('message', async (event) => {
console.log('收到客户端消息:', event.data);
await env.KV.put('events:ws:message', `${new Date().toISOString()} ${event.data}`);
// 回复消息给客户端
if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') {
await new Promise((r) => setTimeout(r, 250));
}
server.send(`服务器收到: ${event.data} (时间: ${new Date().toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })})`)
});
server.addEventListener('close', () => {
console.log('WebSocket连接关闭');
env.KV.put('events:ws:disconnection', `${new Date().toISOString()} ${url.pathname}`);
});
return new Response(null, {
status: 101,
webSocket: client,
});
}
return new Response(null, { status: 404 });
},
} satisfies ExportedHandler<Env>;