UNPKG

next

Version:

The React Framework

141 lines (140 loc) 4.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { handleFetch: null, interceptFetch: null, reader: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { handleFetch: function() { return handleFetch; }, interceptFetch: function() { return interceptFetch; }, reader: function() { return reader; } }); const _context = require("./context"); const reader = { url (req) { return req.url; }, header (req, name) { return req.headers.get(name); } }; function getTestStack() { let stack = (new Error().stack ?? '').split('\n'); // Skip the first line and find first non-empty line. for(let i = 1; i < stack.length; i++){ if (stack[i].length > 0) { stack = stack.slice(i); break; } } // Filter out franmework lines. stack = stack.filter((f)=>!f.includes('/next/dist/')); // At most 5 lines. stack = stack.slice(0, 5); // Cleanup some internal info and trim. stack = stack.map((s)=>s.replace('webpack-internal:///(rsc)/', '').trim()); return stack.join(' '); } async function buildProxyRequest(testData, request) { const { url, method, headers, body, cache, credentials, integrity, mode, redirect, referrer, referrerPolicy } = request; return { testData, api: 'fetch', request: { url, method, headers: [ ...Array.from(headers), [ 'next-test-stack', getTestStack() ] ], body: body ? Buffer.from(await request.arrayBuffer()).toString('base64') : null, cache, credentials, integrity, mode, redirect, referrer, referrerPolicy } }; } function buildResponse(proxyResponse) { const { status, headers, body } = proxyResponse.response; return new Response(body ? Buffer.from(body, 'base64') : null, { status, headers: new Headers(headers) }); } async function handleFetch(originalFetch, request) { const testInfo = (0, _context.getTestReqInfo)(request, reader); if (!testInfo) { // Passthrough non-test requests. return originalFetch(request); } const { testData, proxyPort } = testInfo; const proxyRequest = await buildProxyRequest(testData, request); const resp = await originalFetch(`http://localhost:${proxyPort}`, { method: 'POST', body: JSON.stringify(proxyRequest), next: { // @ts-ignore internal: true } }); if (!resp.ok) { throw Object.defineProperty(new Error(`Proxy request failed: ${resp.status}`), "__NEXT_ERROR_CODE", { value: "E146", enumerable: false, configurable: true }); } const proxyResponse = await resp.json(); const { api } = proxyResponse; switch(api){ case 'continue': return originalFetch(request); case 'abort': case 'unhandled': throw Object.defineProperty(new Error(`Proxy request aborted [${request.method} ${request.url}]`), "__NEXT_ERROR_CODE", { value: "E145", enumerable: false, configurable: true }); default: break; } return buildResponse(proxyResponse); } function interceptFetch(originalFetch) { global.fetch = function testFetch(input, init) { var _init_next; // Passthrough internal requests. // @ts-ignore if (init == null ? void 0 : (_init_next = init.next) == null ? void 0 : _init_next.internal) { return originalFetch(input, init); } return handleFetch(originalFetch, new Request(input, init)); }; return ()=>{ global.fetch = originalFetch; }; } //# sourceMappingURL=fetch.js.map