Skip to main content

src/gflare_ffi_worker.mjs

import { Ok, Error, List, NonEmpty, Empty } from "./gleam.mjs";

export function wait_until(ctx, promise) {
  ctx.waitUntil(promise);
}

export function pass_through_on_exception(ctx) {
  ctx.passThroughOnException();
}

export function new_response(status) {
  return new Response(null, { status });
}

export function set_body(response, body) {
  return new Response(body, {
    status: response.status,
    headers: response.headers,
  });
}

export function set_header(response, name, value) {
  const headers = new Headers(response.headers);
  headers.set(name, value);
  return new Response(response.body, {
    status: response.status,
    headers,
  });
}

export function response_json(response, data) {
  const headers = new Headers(response.headers);
  headers.set("content-type", "application/json");
  return new Response(JSON.stringify(data), {
    status: response.status,
    headers,
  });
}

export function append_header(response, name, value) {
  const headers = new Headers(response.headers);
  headers.append(name, value);
  return new Response(response.body, {
    status: response.status,
    headers,
  });
}

export function get_response_header(response, name) {
  const value = response.headers.get(name);
  if (value === null || value === undefined) {
    return new Error("Header not found: " + name);
  }
  return new Ok(value);
}

export function remove_response_header(response, name) {
  const headers = new Headers(response.headers);
  headers.delete(name);
  return new Response(response.body, {
    status: response.status,
    headers,
  });
}

export function response_bytes(response, data) {
  return new Response(data, {
    status: response.status,
    headers: response.headers,
  });
}

export function response_empty(status) {
  return new Response(null, { status });
}

export function redirect(url, status) {
  return Response.redirect(url, status);
}

export function request_url(request) {
  return request.url;
}

export function request_method(request) {
  return request.method;
}

export function request_headers(request) {
  const headers = [];
  request.headers.forEach((value, key) => {
    headers.push([key, value]);
  });
  return List.fromArray(headers);
}

export function request_body(request) {
  return request.body;
}

export async function request_text(request) {
  try {
    const text = await request.text();
    return new Ok(text);
  } catch (error) {
    return new Error(`${error}`);
  }
}

export async function request_json(request) {
  try {
    const json = await request.json();
    return new Ok(json);
  } catch (error) {
    return new Error(`${error}`);
  }
}

export async function request_array_buffer(request) {
  try {
    const buffer = await request.arrayBuffer();
    return new Ok(new Uint8Array(buffer));
  } catch (error) {
    return new Error(`${error}`);
  }
}