wang-dev/bingo
0
1import { NextApiRequest, NextApiResponse } from 'next'2import { WebSocket, debug } from '@/lib/isomorphic'3import { BingWebBot } from '@/lib/bots/bing'4import { websocketUtils } from '@/lib/bots/bing/utils'5import { WatchDog, createHeaders } from '@/lib/utils'6 7 8export default async function handler(req: NextApiRequest, res: NextApiResponse) {9 const conversationContext = req.body10 const headers = createHeaders(req.cookies)11 debug(headers)12 res.setHeader('Content-Type', 'text/stream; charset=UTF-8')13 14 const ws = new WebSocket('wss://sydney.bing.com/sydney/ChatHub', {15 headers: {16 ...headers,17 'accept-language': 'zh-CN,zh;q=0.9',18 'cache-control': 'no-cache',19 'x-ms-useragent': 'azsdk-js-api-client-factory/1.0.0-beta.1 core-rest-pipeline/1.10.0 OS/Win32',20 pragma: 'no-cache',21 }22 })23 24 const closeDog = new WatchDog()25 const timeoutDog = new WatchDog()26 ws.onmessage = (event) => {27 timeoutDog.watch(() => {28 ws.send(websocketUtils.packMessage({ type: 6 }))29 }, 1500)30 closeDog.watch(() => {31 ws.close()32 }, 10000)33 res.write(event.data)34 if (/\{"type":([367])\}/.test(String(event.data))) {35 const type = parseInt(RegExp.$1, 10)36 debug('connection type', type)37 if (type === 3) {38 ws.close()39 } else {40 ws.send(websocketUtils.packMessage({ type }))41 }42 }43 }44 45 ws.onclose = () => {46 timeoutDog.reset()47 closeDog.reset()48 debug('connection close')49 res.end()50 }51 52 await new Promise((resolve) => ws.onopen = resolve)53 ws.send(websocketUtils.packMessage({ protocol: 'json', version: 1 }))54 ws.send(websocketUtils.packMessage({ type: 6 }))55 ws.send(websocketUtils.packMessage(BingWebBot.buildChatRequest(conversationContext!)))56 req.socket.once('close', () => {57 ws.close()58 if (!res.closed) {59 res.end()60 }61 })62}63 