import {
addRoute,
addCronCallback,
addPeriodicCallback,
parsePath,
query,
htmlHandler,
jsonHandler,
stringHandler,
HttpError,
StatusCodes,
} from "../trailbase.js";
import type {
JsonRequestType,
ParsedPath,
StringRequestType,
} from "../trailbase.d.ts";
addRoute(
"GET",
"/test",
stringHandler(async (req: StringRequestType) => {
const uri: ParsedPath = parsePath(req.uri);
const table = uri.query.get("table");
if (table) {
const rows = await query(`SELECT COUNT(*) FROM ${table}`, []);
return `entries: ${rows[0][0]}`;
}
return `test: ${req.uri}`;
}),
);
addRoute(
"GET",
"/test/{table}",
stringHandler(async (req: StringRequestType) => {
const table = req.params["table"];
if (table) {
const rows = await query(`SELECT COUNT(*) FROM ${table}`, []);
return `entries: ${rows[0][0]}`;
}
return `test: ${req.uri}`;
}),
);
addRoute(
"GET",
"/html",
htmlHandler((_req: StringRequestType) => {
return `
Html Handler
`;
}),
);
addRoute(
"GET",
"/json",
jsonHandler((_req: JsonRequestType) => {
return {
int: 5,
real: 4.2,
msg: "foo",
obj: {
nested: true,
},
};
}),
);
addRoute(
"GET",
"/error",
jsonHandler((_req: JsonRequestType) => {
throw new HttpError(StatusCodes.IM_A_TEAPOT, "I'm a teapot");
}),
);
addRoute(
"GET",
"/fetch",
stringHandler(async (req: StringRequestType) => {
const query = parsePath(req.uri).query;
const url = query.get("url");
if (url) {
const response = await fetch(url);
return await response.text();
}
throw new HttpError(StatusCodes.BAD_REQUEST, "Missing ?url param");
}),
);
class Completer {
public readonly promise: Promise;
public complete: (value: PromiseLike | T) => void;
public constructor() {
this.promise = new Promise((resolve, _reject) => {
this.complete = resolve;
});
}
}
const completer = new Completer();
addCronCallback(
"JS-registered Job",
"@daily",
async () => {
console.log("JS-registered cron job reporting for duty 🚀");
});
addPeriodicCallback(100, (cancel) => {
completer.complete("resolved");
cancel();
});
addRoute(
"GET",
"/await",
stringHandler(async (_req) => await completer.promise),
);