File size: 2,489 Bytes
fea495a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "createProxyServer", {
    enumerable: true,
    get: function() {
        return createProxyServer;
    }
});
const _http = /*#__PURE__*/ _interop_require_default(require("http"));
const _types = require("./types");
const _fetchapi = require("./fetch-api");
function _interop_require_default(obj) {
    return obj && obj.__esModule ? obj : {
        default: obj
    };
}
async function readBody(req) {
    const acc = [];
    for await (const chunk of req){
        acc.push(chunk);
    }
    return Buffer.concat(acc);
}
async function createProxyServer({ onFetch }) {
    const server = _http.default.createServer(async (req, res)=>{
        if (req.url !== '/') {
            res.writeHead(404);
            res.end();
            return;
        }
        let json;
        try {
            json = JSON.parse((await readBody(req)).toString('utf-8'));
        } catch (e) {
            res.writeHead(400);
            res.end();
            return;
        }
        const { api } = json;
        let response;
        switch(api){
            case 'fetch':
                if (onFetch) {
                    response = await (0, _fetchapi.handleFetch)(json, onFetch);
                }
                break;
            default:
                break;
        }
        if (!response) {
            response = _types.UNHANDLED;
        }
        res.writeHead(200, {
            'Content-Type': 'application/json'
        });
        res.write(JSON.stringify(response));
        res.end();
    });
    await new Promise((resolve)=>{
        server.listen(0, '::', ()=>{
            resolve(undefined);
        });
    });
    const address = server.address();
    if (!address || typeof address !== 'object') {
        server.close();
        throw Object.defineProperty(new Error('Failed to create a proxy server'), "__NEXT_ERROR_CODE", {
            value: "E107",
            enumerable: false,
            configurable: true
        });
    }
    const port = address.port;
    const fetchWith = (input, init, testData)=>{
        const request = new Request(input, init);
        request.headers.set('Next-Test-Proxy-Port', String(port));
        request.headers.set('Next-Test-Data', testData ?? '');
        return fetch(request);
    };
    return {
        port,
        close: ()=>server.close(),
        fetchWith
    };
}

//# sourceMappingURL=server.js.map