| 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() |
| } |
| }) |
| } |
|
|