From 2ebe97fe572f515fe10da9358ac348f035602f12 Mon Sep 17 00:00:00 2001 From: Tobias Schneider Date: Fri, 24 Jun 2022 16:15:50 +0200 Subject: [PATCH] Create branch --- README.md | 14 ++++++++------ index.d.ts | 55 ++++++++++++++++++++++++++++++++++++++++++++---------- index.js | 19 ++++++++++++++----- 3 files changed, 67 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index d8db6ed..8f25698 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ # Cloudflare Workers Router -Cloudflare Workers Router is a super lightweight router (3.6 kB) with middleware support and ZERO dependencies for Cloudflare Workers, inspired by the [Express.js](https://expressjs.com/) syntax. +--- +**PRE-RELEASE: This branch is only for use with [wrangler2](https://github.com/cloudflare/wrangler2)!** + +--- + +Cloudflare Workers Router is a super lightweight router (3.6 kB) with middleware support and ZERO dependencies for Cloudflare Workers. When I was trying out Cloudflare Workers I almost immediately noticed how fast it was compared to other serverless offerings. So I wanted to build a full-fledged API to see how it performs doing real work, but since I wasn't able to find a router that suited my needs I created my own. I worked a lot with [Express.js](https://expressjs.com/) in the past and really enjoyed their middleware approach, but since none of the available Cloudflare Worker routers offered middleware support at the time, I felt the need to create this router. -Attention: It's not directly compatible with [Express.js](https://expressjs.com/), it only follows the same approach. - - ## Contents - [Usage](#usage) @@ -161,9 +163,9 @@ Key | Type | Description ## Setup -### Wrangler +### Wrangler2 -You can use [wrangler](https://github.com/cloudflare/wrangler) to generate a new Cloudflare Workers project based on this router by running the following command from your terminal: +You can use [wrangler2](https://github.com/cloudflare/wrangler2) to generate a new Cloudflare Workers project based on this router by running the following command from your terminal: ``` wrangler generate myapp https://github.com/tsndr/cloudflare-worker-router-template diff --git a/index.d.ts b/index.d.ts index bea278c..0d7d8e8 100644 --- a/index.d.ts +++ b/index.d.ts @@ -37,15 +37,25 @@ declare class Router { protected corsConfig: RouterCorsConfig /** * Route Object - * + * * @typedef Route * @property {string} method HTTP request method * @property {string} url URL String * @property {RouterHandler[]} handlers Array of handler functions */ + + /** + * Router Context + * + * @typedef RouterContext + * @property {Object} env Environment + * @property {RouterRequest} req Request Object + * @property {RouterResponse} res Response Object + * @property {RouterNext} next Next Handler + */ /** * Request Object - * + * * @typedef RouterRequest * @property {string} method HTTP request method * @property {Object} params Object containing all parameters defined in the url string @@ -56,7 +66,7 @@ declare class Router { */ /** * Response Object - * + * * @typedef RouterResponse * @property {Headers} headers Response headers object * @property {number} status Return status code (default: `204`) @@ -65,17 +75,15 @@ declare class Router { */ /** * Next Function - * + * * @callback RouterNext * @returns {Promise} */ /** * Handler Function - * + * * @callback RouterHandler - * @param {Request} request - * @param {Response} response - * @param {next} next + * @param {RouterContext} ctx */ /** * Register global handler @@ -217,11 +225,12 @@ declare class Router { /** * Handle requests * + * @param {any} env * @param {Request} request * @param {any=} extend * @returns {Response} */ - handle(request: Request, extend?: any): Response + handle(env: any, request: Request, extend?: any): Response } declare namespace Router { export { Route, RouterRequest, RouterResponse, RouterNext, RouterHandler, RouterCorsConfig } @@ -271,7 +280,33 @@ type RouterCorsConfig = { /** * Handler Function */ -type RouterHandler = (req: RouterRequest, res: RouterResponse, next: RouterNext) => any +type RouterHandler = (ctx: RouterContext) => any + +/** + * Router Context + */ +type RouterContext = { + /** + * Environment + */ + env: Object + + /** + * Request Object + */ + req: RouterRequest + + /** + * Response Object + */ + res: RouterResponse + + /** + * Next Handler + */ + next: RouterNext +} + /** * Request Object */ diff --git a/index.js b/index.js index 0ad91ee..d2c39e9 100644 --- a/index.js +++ b/index.js @@ -47,6 +47,16 @@ class Router { * @property {RouterHandler[]} handlers Array of handler functions */ + /** + * Router Context + * + * @typedef RouterContext + * @property {Object} env Environment + * @property {RouterRequest} req Request Object + * @property {RouterResponse} res Response Object + * @property {RouterNext} next Next Handler + */ + /** * Request Object * @@ -80,9 +90,7 @@ class Router { * Handler Function * * @callback RouterHandler - * @param {RouterRequest} request - * @param {RouterResponse} response - * @param {RouterNext} next + * @param {RouterContext} ctx */ /** @@ -308,11 +316,12 @@ class Router { /** * Handle requests * + * @param {any} env * @param {Request} request * @param {any=} extend * @returns {Response} */ - async handle(request, extend = {}) { + async handle(env, request, extend = {}) { try { if (request instanceof Event) { request = request.request @@ -373,7 +382,7 @@ class Router { throw new Error('next() called multiple times') prevIndex = index if (typeof handlers[index] === 'function') - await handlers[index](req, res, async () => await runner(index + 1)) + await handlers[index]({ env, req, res, next: async () => await runner(index + 1) }) } await runner(0) if (typeof res.body === 'object') {