fn0-ski 0.1.6

Minimal Winter CG Compatible Runtime
import { core } from "ext:core/mod.js";
import { readableStreamForRid, resourceForReadableStream } from "ext:deno_web/06_streams.js";

export async function runHandler(id) {
  try {
    const {
      0: url,
      1: method,
      2: headers,
      3: rid,
    } = core.ops.op_take_request_parts(id);

    const body = rid !== null ? readableStreamForRid(rid) : null;
    const request = new Request(url, { method, headers, body });

    if (typeof handler !== "function") {
      throw new Error("User code must define a global 'handler' function.");
    }
    const response = await handler(request);
    const responseBody = response.body;

    let responseRid = null;
    if (responseBody) {
      const denoRid = responseBody[Symbol.for("Deno.core.resourceId")];
      if (denoRid !== undefined) {
        responseRid = denoRid;
      } else {
        responseRid = resourceForReadableStream(responseBody);
      }
    }

    await core.ops.op_respond(
      id,
      response.status,
      Array.from(response.headers.entries()),
      responseRid
    );
  } catch (e) {
    console.error("[ski/run.js] Error:", e.message, e.stack);
    await core.ops.op_respond(
      id,
      500,
      [["content-type", "text/plain"]],
      null
    );
  }
}