Ctrl K
ComunidadGuías…

app/scripts/smoke-realtime.mjs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import assert from 'node:assert/strict'
import { createHash, randomBytes } from 'node:crypto'
import { request } from 'node:http'

/** Authenticate a real WebSocket upgrade and exercise the agent-update transport. */
export async function smokeRealtime({ origin, teamSlug, cookie }) {
  const key = randomBytes(16).toString('base64')
  const expected = createHash('sha1')
    .update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
    .digest('base64')
  await new Promise((resolve, reject) => {
    let socket
    let complete = false
    const upgrade = request(
      `${origin}/api/workspaces/updates?team=${encodeURIComponent(teamSlug)}`,
      {
        headers: {
          origin,
          cookie,
          upgrade: 'websocket',
          connection: 'Upgrade',
          'sec-websocket-version': '13',
          'sec-websocket-key': key,
        },
      },
    )
    const timer = setTimeout(
      () => finish(new Error('Workspace WebSocket timed out')),
      10000,
    )
    function finish(error) {
      if (complete) return
      complete = true
      clearTimeout(timer)
      socket?.destroy()
      upgrade.destroy()
      if (error) reject(error)
      else resolve()
    }
    upgrade.once('error', finish)
    upgrade.once('response', (response) => {
      response.resume()
      finish(
        new Error(
          `Workspace WebSocket upgrade returned ${response.statusCode}`,
        ),
      )
    })
    upgrade.once('upgrade', (response, connection, head) => {
      socket = connection
      try {
        assert.equal(response.headers['sec-websocket-accept'], expected)
      } catch (error) {
        finish(error)
        return
      }
      let pending = head
      function read(chunk) {
        pending = Buffer.concat([pending, chunk])
        if (pending.length < 2) return
        const length = pending[1] & 0x7f
        if (pending.length < length + 2) return
        try {
          assert.equal(pending[0] & 0x0f, 1, 'Expected a text response')
          assert.equal(pending.subarray(2, length + 2).toString(), 'pong')
          finish()
        } catch (error) {
          finish(error)
        }
      }
      socket.on('data', read)
      socket.once('error', finish)
      socket.once('close', () =>
        finish(new Error('Workspace WebSocket closed before pong')),
      )
      const mask = randomBytes(4)
      const payload = Buffer.from('ping')
      for (let index = 0; index < payload.length; index++)
        payload[index] ^= mask[index % 4]
      socket.write(
        Buffer.concat([
          Buffer.from([0x81, 0x80 | payload.length]),
          mask,
          payload,
        ]),
      )
      if (pending.length) read(Buffer.alloc(0))
    })
    upgrade.end()
  })
  console.log(
    'Workspace WebSocket: authenticated upgrade and ping/pong passed.',
  )
}