Megalo

Deno HTTP server framework aiming for maximum speed

Example

import { Megalo, Controller } from 'https://deno.land/x/megalo/mod.ts';

const megalo = new Megalo({
    notFoundHandler: (req) =>
        new Response(`<html><body>${req.pathname} not found :(</body></html>`, {
            status: 404,
            headers: { ['Content-Type']: 'text/html' },
        }),
});

megalo
    // route all requests to '/'
    .addHook('preRoute', (req) => (req.pathname = '/'))
    .get('/', { parseQuery: false }, () => {
        return new Response('<html><body>hello megalo!</body></html>', {
            status: 200,
            headers: { ['Content-Type']: 'text/html' },
        });
    })
    .get('/sus', () => {
        return new Response('<html><body>sus page</body></html>', {
            status: 200,
            headers: { ['Content-Type']: 'text/html' },
        });
    })
    .get(/^\/regex(\/.*)?$/, () => new Response(undefined, { status: 200 }))
    .get('/pattern/:id', ({ params }) => {
        return new Response(`<html><body>id: ${params.id}</body></html>`, {
            status: 200,
            headers: { ['Content-Type']: 'text/html' },
        });
    })
    .post('/posted', async (req) => {
        await req.text();
        return new Response('you posted it :)', { status: 200 });
    })
    .controller(new Controller('/users').get('/', () => new Response('user', { status: 200 })));

// fast startup
console.log(`Startup time: ${performance.now()}ms`);
megalo.serve();

Route resolution

Routes are resolved in this order

  • string literal ex. "/sus"
  • controllers ex. new Controller("/users")
  • patterns ex. "/users/:id"
  • regex ex. /^.*\/regex\/.*\/?$/
  • notFoundHandler

Notes

Until https://github.com/denoland/deno/issues/15813 is resolved, in all POST, PUT, and PATCH routes you MUST await the body or else deno will panic. Also, do not use this in production as any POST, PUT, or PATCH request will crash the server, until this bug is fixed.