"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.run = exports.ErrorSource = void 0;
var _middleware = require("next/dist/compiled/@next/react-dev-overlay/dist/middleware");
var _context = require("./context");
var _bodyStreams = require("../../body-streams");
const ErrorSource = Symbol("SandboxError");
exports.ErrorSource = ErrorSource;
const run = withTaggedErrors(async (params)=>{
    var ref;
    var _onWarning;
    const { runtime , evaluateInContext  } = await (0, _context).getModuleContext({
        moduleName: params.name,
        onWarning: (_onWarning = params.onWarning) != null ? _onWarning : ()=>{},
        useCache: params.useCache !== false,
        env: params.env,
        edgeFunctionEntry: params.edgeFunctionEntry,
        distDir: params.distDir
    });
    for (const paramPath of params.paths){
        evaluateInContext(paramPath);
    }
    const subreq = params.request.headers[`x-middleware-subrequest`];
    const subrequests = typeof subreq === "string" ? subreq.split(":") : [];
    if (subrequests.includes(params.name)) {
        return {
            waitUntil: Promise.resolve(),
            response: new runtime.context.Response(null, {
                headers: {
                    "x-middleware-next": "1"
                }
            })
        };
    }
    const edgeFunction = runtime.context._ENTRIES[`middleware_${params.name}`].default;
    const cloned = ![
        "HEAD",
        "GET"
    ].includes(params.request.method) ? (ref = params.request.body) == null ? void 0 : ref.cloneBodyStream() : undefined;
    try {
        return await edgeFunction({
            request: {
                ...params.request,
                body: cloned && (0, _bodyStreams).requestToBodyStream(runtime.context, cloned)
            }
        });
    } finally{
        var ref1;
        await ((ref1 = params.request.body) == null ? void 0 : ref1.finalize());
    }
});
exports.run = run;
/**
 * Decorates the runner function making sure all errors it can produce are
 * tagged with `edge-server` so they can properly be rendered in dev.
 */ function withTaggedErrors(fn) {
    return (params)=>{
        return fn(params).then((result)=>{
            var ref;
            return {
                ...result,
                waitUntil: result == null ? void 0 : (ref = result.waitUntil) == null ? void 0 : ref.catch((error)=>{
                    throw (0, _middleware).getServerError(error, "edge-server");
                })
            };
        }).catch((error)=>{
            throw (0, _middleware).getServerError(error, "edge-server");
        });
    };
}

//# sourceMappingURL=sandbox.js.map