| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- const assert = require('node:assert/strict');
- const http = require('node:http');
- const test = require('node:test');
- const express = require('express');
- const { registerVideoProxyRoutes } = require('./video-proxy');
- function startServer(deps) {
- const app = express();
- registerVideoProxyRoutes(app, {
- isSafeRemoteUrl: () => true,
- sleep: async () => {},
- ...deps
- });
- app.get('/health', (req, res) => res.json({ status: 'ok' }));
- return new Promise(resolve => {
- const server = app.listen(0, '127.0.0.1', () => {
- resolve({
- server,
- baseUrl: `http://127.0.0.1:${server.address().port}`
- });
- });
- });
- }
- function request(url, headers = {}) {
- return new Promise((resolve, reject) => {
- const req = http.get(url, { headers }, res => {
- const chunks = [];
- res.on('data', chunk => chunks.push(chunk));
- res.on('end', () => resolve({
- status: res.statusCode,
- body: Buffer.concat(chunks).toString('utf8')
- }));
- res.on('error', reject);
- });
- req.on('error', reject);
- });
- }
- test('retries retryable connection errors before streaming', async t => {
- let attempts = 0;
- const { server, baseUrl } = await startServer({
- maxAttempts: 3,
- fetchImpl: async () => {
- attempts += 1;
- if (attempts < 3) {
- throw Object.assign(new Error('fetch failed'), {
- cause: { code: 'UND_ERR_CONNECT_TIMEOUT' }
- });
- }
- return new Response('video-bytes', {
- status: 200,
- headers: { 'content-type': 'video/mp4' }
- });
- }
- });
- t.after(() => server.close());
- const response = await request(`${baseUrl}/api/video-proxy?url=https://example.com/video.mp4`);
- assert.equal(attempts, 3);
- assert.equal(response.status, 200);
- assert.equal(response.body, 'video-bytes');
- });
- test('keeps serving requests when the upstream stream fails', async t => {
- const failingBody = new ReadableStream({
- start(controller) {
- controller.enqueue(new TextEncoder().encode('partial'));
- controller.error(Object.assign(new Error('terminated'), {
- cause: { code: 'ECONNRESET' }
- }));
- }
- });
- const { server, baseUrl } = await startServer({
- fetchImpl: async () => new Response(failingBody, {
- status: 200,
- headers: { 'content-type': 'video/mp4' }
- })
- });
- t.after(() => server.close());
- await request(`${baseUrl}/api/video-proxy?url=https://example.com/video.mp4`).catch(() => {});
- const health = await request(`${baseUrl}/health`);
- assert.equal(health.status, 200);
- assert.deepEqual(JSON.parse(health.body), { status: 'ok' });
- });
- test('does not retry an upstream HTTP error', async t => {
- let attempts = 0;
- const { server, baseUrl } = await startServer({
- fetchImpl: async () => {
- attempts += 1;
- return new Response('not found', { status: 404 });
- }
- });
- t.after(() => server.close());
- const response = await request(`${baseUrl}/api/video-proxy?url=https://example.com/missing.mp4`);
- assert.equal(attempts, 1);
- assert.equal(response.status, 404);
- });
|