like php-fpm but for js/ts files as deno modules
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Lamp 8fa97f0122 Update '' 1 month ago Update '' 1 month ago

  • use with web file server as handler for js/ts files
  • web server i.e. caddy serves static files and directory indexes
  • js/ts files sent to deno like how php is sent to php-fpm
  • quick & easy server-side js
  • still not sure what to call it


import { serve } from "";

serve(async function handler(req: Request): Promise<Response> {

	var url = new URL(req.url);
	var webroot = req.headers.get("webroot");
	var fullpath = webroot + url.pathname;

	if (!webroot || fullpath.includes('../') || !/\.(js|ts)$/i.test(url.pathname)) return new Response("", {status: 400});

	try {
		var {handler} = await import(fullpath);
		return await handler(req);
	} catch (error) {
		return new Response(error.message, {
			status: error.code == "ERR_MODULE_NOT_FOUND" ? 404 : 500
}, {
	port: 8000,
	hostname: "localhost"

example caddy config {
		root * /var/www/html/

		try_files {path} {path}/index.js {path}/index.ts

		@serverjs {
				path *.js *.ts
				not path /static/* #in case you want to serve client js
				#or another idea is to match *.server.js/ts
		reverse_proxy @serverjs localhost:8000 {
				header_up webroot /var/www/html/ #need to tell deno server where files are

		file_server browse

example systemd service

Description=thing for running server-side js files in a webroot

# user with home dir needed for webstorage/cache
ExecStart=deno run --allow-all deno-handler.ts


example files

export function handler(req) {
	return new Response("foobar javascript");
export function handler(req: Request): Response {
	return new Response("foobar typescript");
export async function handler(req: Request): Promise<Response> {
	await new Promise(r => setTimeout(r, 3000));
	return new Response("foobar async typescript");

note that edits or deletes to modules require restarting deno