paginatedResponseREADME.md2 matches
1# Return a paginated response
23A helper function to take an array and return a paginated response. This is useful when defining one's own folders for [pomdtr's vscode extension](https://github.com/pomdtr/valtown-vscode).
45Usage:
8const data = [...]
910export default async function(req: Request): Promise<Response> {
11return paginatedResponse(req, data);
12}
1function happy() {
2return "😊";
3}
auth_middlewareREADME.md1 match
16import { auth } from "https://esm.town/v/pomdtr/auth_middleware";
1718async function handler(req: Request): Promise<Response> {
19return new Response("You are authenticated!");
20}
1import { createCanvas } from "https://deno.land/x/canvas/mod.ts";
23export default async function(req: Request): Promise<Response> {
4const width = 200;
5const height = 200;
1415export type PublishOpts = { url?: string; topic?: string };
16export async function publish(
17body: object,
18opts: PublishOpts
56});
5758export async function receive(
59body: string,
60headers: Headers
13import { AsyncLocalStorageContextManager } from "npm:@opentelemetry/context-async-hooks";
1415export function get_tracer() {
16return trace.getTracer("valtown");
17}
20* Initializes opentelemetry tracing.
21*/
22export function init(service_name: string, console_log: bool = false): undefined {
23const provider = new WebTracerProvider({
24resource: new Resource({
57* be tied together.
58*/
59export async function traced_fetch(
60input: string | URL,
61init?: RequestInit,
9899/**
100* Wrapper to trace a function.
101*/
102// deno-lint-ignore no-explicit-any
131* Takes an http handler and returns a new handler that
132* traces the request.
133* @returns {Function} A new handler that traces the request.
134*/
135export function traced_handler(
136handler: (req: Request) => Promise<Response>,
137): (req: Request) => Promise<Response> {
138async function _traced_hander(req: Request): Promise<Response> {
139let active_context = null;
140const prop_header = req.headers.get("b3");
connect4_sitemain.tsx13 matches
24type MatchId = z.infer<typeof MatchId>;
2526function matchid(): MatchId {
27return `m_${_nanoid()}`;
28}
86};
8788async function get_match(id: MatchId): Promise<Match | null> {
89const span = tracer.startSpan("get_match");
90span.setAttribute("match_id", id);
104};
105106async function save_match_record(match: Match): Promise<void> {
107const span = tracer.startSpan("save_match_record");
108span.setAttribute("match_id", match.id);
114}
115116async function save_match_status(match: Match): Promise<void> {
117const span = tracer.startSpan("save_match_status");
118span.setAttribute("match_id", match.id);
131}
132133async function save_match(match: Match): Promise<void> {
134await tracer.startActiveSpan("save_match", async (span) => {
135await save_match_record(match);
139}
140141async function list_matches(): Promise<MatchStatus[]> {
142const match_keys = await blob.list(`connect4_match_status/`);
143const match_status_p = [];
149}
150151function new_match(blue_player: Player, red_player: Player): Match {
152const id: MatchId = matchid();
153const players: [Player, Player] = [blue_player, red_player];
184| "column_out_of_bounds";
185186function take_turn(match: Match, action: connect4.Action): Turn | TurnError {
187const last_turn = match.turns[match.turns.length - 1];
188const last_status = last_turn.status;
215}
216217function error_turn(match: Match, player: number, error: Error): Turn {
218const last_turn = match.turns[match.turns.length - 1];
219const error_status = {
315type CreateMatch = z.infer<typeof CreateMatch>;
316317function create_match_form(create_match: CreateMatch) {
318return (
319<form
502}
503504function match_view(match: Match, turn_number: number | null) {
505if (turn_number === null) {
506turn_number = match.turns.length - 1;
808<a
809class="button primary"
810href="https://www.val.town/embed/new?code=import+*+as+connect4+from+%22https%3A%2F%2Fesm.town%2Fv%2Fsaolsen%2Fconnect4%22%3B%0Aimport+%7B+connect4_agent+%7D+from+%22https%3A%2F%2Fesm.town%2Fv%2Fsaolsen%2Fconnect4_agent%22%3B%0A%0A%2F%2F+An+agent+is+a+function+that+takes+a+State+and+returns+an+Action.%0A%2F%2F+See+the+connect4+val+for+the+types+of+State+and+Action.%0A%0A%2F%2F+This+agent+returns+random+actions.%0Afunction+action%28state%3A+connect4.State%29%3A+connect4.Action+%7B%0A++let+player+%3D+state.next_player%3B%0A++while+%28true%29+%7B%0A++++let+column+%3D+Math.floor%28Math.random%28%29+*+connect4.COLS%29%3B%0A++++let+action+%3D+%7B+player%2C+column+%7D%3B%0A++++if+%28connect4.check_action%28state%2C+action%29+%3D%3D%3D+%22ok%22%29+%7B%0A++++++return+action%3B%0A++++%7D%0A++%7D%0A%7D%0A%0Aexport+default+connect4_agent%28action%29%3B"
811>
812Create New Agent
1182});
11831184async function handler(request): Promise<Response> {
1185track("saolsen.connect4-site", request);
1186return await app.fetch(request);
1# Upstash redis client for vals.
23Creates a global redis instance and exposes functions to use it.
45To use, create a redis database on [Upstash](https://upstash.com/) and set the environment variables.
engraft_wikipediamain.tsx1 match
136import { renderToString } from "npm:react-dom/server";
137138export default async function() {
139const mem = new RefuncMemory();
140const varBindings = {};
runPythonAsyncmain.tsx1 match
2const { loadPyodide } = await import("https://www.unpkg.com/pyodide/pyodide.mjs");
3const pyodide = await loadPyodide();
4export function runPythonAsync(s) {
5return pyodide.runPythonAsync(s);
6}