Как я понял,
http.createServer
это некая надстройка над
net.createServer
в котором реализован дополнительный функционал из события
net.createServer().on('data')
Как в
net.createServer
реализовать событие
upgrade
, которое есть у
http.createServer
?
Откуда брать данные для
socket
?
http.createServer.on('upgrade', (request, socket) => { ...} )
По умолчанию события
socket.on('upgrade', (req, socket, head) ...)
не оказалось и я пытался его воспроизвести, как мог
Зашел в небольшой тупик и не понял, откуда брать данные для соединений, т.к. во всех примерах его брали из
upgrade
, как аргумент
Просьба сильно на код не ругаться )
import net from 'net'
import * as crypto from 'crypto'
const server = net.createServer(function (socket) {
console.log("connected")
const HANDSHAKE_CONSTANT = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
const connections = new Set()
// connections.add(socket)
socket.on('data', function (data) {
const request = data.toString()
const headers = new Map()
request.split('\r\n').map((item, i) => {
if(!i) return
const header = item.split(': ')
headers.set(header[0], header[1])
})
const clientKey = headers.get('Sec-WebSocket-Key')
const handshakeKey = crypto
.createHash('sha1')
.update(clientKey + HANDSHAKE_CONSTANT)
.digest('base64');
const responseHeaders = [
'HTTP/1.1 101',
'upgrade: websocket',
'connection: upgrade',
`sec-webSocket-accept: ${handshakeKey}`,
'\r\n',
]
socket.write(responseHeaders.join('\r\n'))
// setTimeout(() => {
// connections.forEach(socket => {
// const message = Buffer.from('Hello WS')
// const meta = Buffer.alloc(2)
// meta[0] = 0x81
// meta[1] = message.length
// socket.write(Buffer.concat([meta, message]))
// })
// }, 1000)
})
socket.on('upgrade', (req, socket, head) => {
console.log({
head: req.headers
})
})
})