Spaces:
Sleeping
Sleeping
import { NextApiRequest, NextApiResponse } from 'next' | |
import { WebSocket, debug } from '@/lib/isomorphic' | |
import { BingWebBot } from '@/lib/bots/bing' | |
import { websocketUtils } from '@/lib/bots/bing/utils' | |
import { WatchDog, createHeaders } from '@/lib/utils' | |
export default async function handler(req: NextApiRequest, res: NextApiResponse) { | |
const conversationContext = req.body | |
const headers = createHeaders(req.cookies) | |
debug(headers) | |
res.setHeader('Content-Type', 'text/stream; charset=UTF-8') | |
const ws = new WebSocket('wss://sydney.bing.com/sydney/ChatHub', { | |
headers: { | |
...headers, | |
'accept-language': 'zh-CN,zh;q=0.9', | |
'cache-control': 'no-cache', | |
'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.0 OS/Win32', | |
pragma: 'no-cache', | |
} | |
}) | |
const closeDog = new WatchDog() | |
const timeoutDog = new WatchDog() | |
ws.onmessage = (event) => { | |
timeoutDog.watch(() => { | |
ws.send(websocketUtils.packMessage({ type: 6 })) | |
}, 1500) | |
closeDog.watch(() => { | |
ws.close() | |
}, 10000) | |
res.write(event.data) | |
if (/\{"type":([367])\}/.test(String(event.data))) { | |
const type = parseInt(RegExp.$1, 10) | |
debug('connection type', type) | |
if (type === 3) { | |
ws.close() | |
} else { | |
ws.send(websocketUtils.packMessage({ type })) | |
} | |
} | |
} | |
ws.onclose = () => { | |
timeoutDog.reset() | |
closeDog.reset() | |
debug('connection close') | |
res.end() | |
} | |
await new Promise((resolve) => ws.onopen = resolve) | |
ws.send(websocketUtils.packMessage({ protocol: 'json', version: 1 })) | |
ws.send(websocketUtils.packMessage({ type: 6 })) | |
ws.send(websocketUtils.packMessage(BingWebBot.buildChatRequest(conversationContext!))) | |
req.socket.once('close', () => { | |
ws.close() | |
if (!res.closed) { | |
res.end() | |
} | |
}) | |
} | |