next
Version: 
The React Framework
127 lines (126 loc) • 3.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "reportFetch", {
    enumerable: true,
    get: function() {
        return reportFetch;
    }
});
const _step = require("./step");
async function parseBody(r) {
    const contentType = r.headers.get('content-type');
    let error;
    let text;
    let json;
    let formData;
    let buffer;
    if (contentType == null ? void 0 : contentType.includes('text')) {
        try {
            text = await r.text();
        } catch (e) {
            error = 'failed to parse text';
        }
    } else if (contentType == null ? void 0 : contentType.includes('json')) {
        try {
            json = await r.json();
        } catch (e) {
            error = 'failed to parse json';
        }
    } else if (contentType == null ? void 0 : contentType.includes('form-data')) {
        try {
            formData = await r.formData();
        } catch (e) {
            error = 'failed to parse formData';
        }
    } else {
        try {
            buffer = await r.arrayBuffer();
        } catch (e) {
            error = 'failed to parse arrayBuffer';
        }
    }
    return {
        ...error ? {
            error
        } : null,
        ...text ? {
            text
        } : null,
        ...json ? {
            json: JSON.stringify(json)
        } : null,
        ...formData ? {
            formData: JSON.stringify(Array.from(formData))
        } : null,
        ...buffer && buffer.byteLength > 0 ? {
            buffer: `base64;${Buffer.from(buffer).toString('base64')}`
        } : null
    };
}
function parseHeaders(headers) {
    return Object.fromEntries(Array.from(headers).sort(([key1], [key2])=>key1.localeCompare(key2)).map(([key, value])=>{
        return [
            `header.${key}`,
            value
        ];
    }));
}
async function reportFetch(testInfo, req, handler) {
    return (0, _step.step)(testInfo, {
        title: `next.onFetch: ${req.method} ${req.url}`,
        category: 'next.onFetch',
        apiName: 'next.onFetch',
        params: {
            method: req.method,
            url: req.url,
            ...await parseBody(req.clone()),
            ...parseHeaders(req.headers)
        }
    }, async (complete)=>{
        const res = await handler(req);
        if (res === undefined || res == null) {
            complete({
                error: {
                    message: 'unhandled'
                }
            });
        } else if (typeof res === 'string' && res !== 'continue') {
            complete({
                error: {
                    message: res
                }
            });
        } else {
            let body;
            if (typeof res === 'string') {
                body = {
                    response: res
                };
            } else {
                const { status, statusText } = res;
                body = {
                    status,
                    ...statusText ? {
                        statusText
                    } : null,
                    ...await parseBody(res.clone()),
                    ...parseHeaders(res.headers)
                };
            }
            await (0, _step.step)(testInfo, {
                title: `next.onFetch.fulfilled: ${req.method} ${req.url}`,
                category: 'next.onFetch',
                apiName: 'next.onFetch.fulfilled',
                params: {
                    ...body,
                    'request.url': req.url,
                    'request.method': req.method
                }
            }, async ()=>undefined).catch(()=>undefined);
        }
        return res;
    });
}
//# sourceMappingURL=report.js.map