| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- import { EventEmitter } from 'node:events'
- import { Readable } from 'node:stream'
- import type { IncomingMessage, ServerResponse } from 'node:http'
- import { describe, expect, it } from 'vitest'
- import { bridge } from '../src/http-bridge.ts'
- describe('HTTP bridge abort', () => {
- it('aborts a pending native picker request when the browser disconnects', async () => {
- const body = JSON.stringify({
- type: 'client-request', rpcId: 'picker-1', method: 'host.pickDirectory', payload: {},
- })
- const request = Readable.from([Buffer.from(body)]) as unknown as IncomingMessage
- Object.assign(request, {
- url: '/api/host.pickDirectory',
- method: 'POST',
- headers: { 'content-type': 'application/json' },
- })
- const response = Object.assign(new EventEmitter(), {
- writableEnded: false,
- writeHead() { return this },
- write() { return true },
- end() { this.writableEnded = true; return this },
- }) as unknown as ServerResponse
- let resolveStarted!: () => void
- const started = new Promise<void>((resolve) => { resolveStarted = resolve })
- let carrierSignal: AbortSignal | undefined
- const pending = bridge(request, response, {
- fetch: async (input) => {
- const fetchRequest = input as Request
- carrierSignal = fetchRequest.signal
- resolveStarted()
- if (!fetchRequest.signal.aborted) {
- await new Promise<void>((resolve) => {
- fetchRequest.signal.addEventListener('abort', () => { resolve() }, { once: true })
- })
- }
- return Response.json({ aborted: fetchRequest.signal.aborted })
- },
- })
- await started
- response.emit('close')
- await pending
- expect(carrierSignal?.aborted).toBe(true)
- })
- })
|