Current section
Files
Jump to
Current section
Files
src/adapt.ffi.mjs
import { Ok, toList, toBitArray } from './gleam.mjs'
import * as option from '../gleam_stdlib/gleam/option.mjs';
import * as uri from '../gleam_stdlib/gleam/uri.mjs';
import * as http from '../gleam_http/gleam/http.mjs';
import { Request } from '../gleam_http/gleam/http/request.mjs';
import {
// Step
Send, Step, Close,
// WebsocketMessage
Binary, Text,
status_text
} from './smol.mjs'
export function adapt(handler) {
return async function(request) {
return gleamToResponse(await handler(requestToGleam(request)));
}
}
function requestToGleam(request) {
const method = http.parse_method(request.method);
if (!method.isOk()) {
throw new globalThis.Error('Invalid method');
}
const headers = toList([...request.headers.entries()]);
const body = request.body;
const url = uri.parse(request.url);
if (!url.isOk()) {
throw new globalThis.Error('Invalid url');
}
const scheme = url[0].scheme instanceof option.Some
? http.scheme_from_string(url[0].scheme[0])
: new Ok(new http.Http());
if (!scheme.isOk()) {
throw new globalThis.Error('Invalid scheme');
}
const host = option.unwrap(url[0].host, "localhost");
return new Request(method[0], headers, body, scheme[0], host, url[0].port, url[0].path, url[0].query);
}
function gleamToResponse(response) {
const headers = new globalThis.Headers();
for(const [name, value] of response.headers) {
headers.append(name, value);
}
return new globalThis.Response(response.body, {
status: response.status,
statusText: status_text(response.status),
headers: headers
})
}