1
0

Create branch

This commit is contained in:
2022-06-24 16:15:50 +02:00
parent ae0c933868
commit 2ebe97fe57
3 changed files with 67 additions and 21 deletions

View File

@@ -1,14 +1,16 @@
# Cloudflare Workers Router # 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. 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. 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 ## Contents
- [Usage](#usage) - [Usage](#usage)
@@ -161,9 +163,9 @@ Key | Type | Description
## Setup ## 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 wrangler generate myapp https://github.com/tsndr/cloudflare-worker-router-template

45
index.d.ts vendored
View File

@@ -43,6 +43,16 @@ declare class Router {
* @property {string} url URL String * @property {string} url URL String
* @property {RouterHandler[]} handlers Array of handler functions * @property {RouterHandler[]} handlers Array of handler functions
*/ */
/**
* Router Context
*
* @typedef RouterContext
* @property {Object<string, string>} env Environment
* @property {RouterRequest} req Request Object
* @property {RouterResponse} res Response Object
* @property {RouterNext} next Next Handler
*/
/** /**
* Request Object * Request Object
* *
@@ -73,9 +83,7 @@ declare class Router {
* Handler Function * Handler Function
* *
* @callback RouterHandler * @callback RouterHandler
* @param {Request} request * @param {RouterContext} ctx
* @param {Response} response
* @param {next} next
*/ */
/** /**
* Register global handler * Register global handler
@@ -217,11 +225,12 @@ declare class Router {
/** /**
* Handle requests * Handle requests
* *
* @param {any} env
* @param {Request} request * @param {Request} request
* @param {any=} extend * @param {any=} extend
* @returns {Response} * @returns {Response}
*/ */
handle(request: Request, extend?: any): Response handle(env: any, request: Request, extend?: any): Response
} }
declare namespace Router { declare namespace Router {
export { Route, RouterRequest, RouterResponse, RouterNext, RouterHandler, RouterCorsConfig } export { Route, RouterRequest, RouterResponse, RouterNext, RouterHandler, RouterCorsConfig }
@@ -271,7 +280,33 @@ type RouterCorsConfig = {
/** /**
* Handler Function * Handler Function
*/ */
type RouterHandler = (req: RouterRequest, res: RouterResponse, next: RouterNext) => any type RouterHandler = (ctx: RouterContext) => any
/**
* Router Context
*/
type RouterContext = {
/**
* Environment
*/
env: Object<string, string>
/**
* Request Object
*/
req: RouterRequest
/**
* Response Object
*/
res: RouterResponse
/**
* Next Handler
*/
next: RouterNext
}
/** /**
* Request Object * Request Object
*/ */

View File

@@ -47,6 +47,16 @@ class Router {
* @property {RouterHandler[]} handlers Array of handler functions * @property {RouterHandler[]} handlers Array of handler functions
*/ */
/**
* Router Context
*
* @typedef RouterContext
* @property {Object<string, string>} env Environment
* @property {RouterRequest} req Request Object
* @property {RouterResponse} res Response Object
* @property {RouterNext} next Next Handler
*/
/** /**
* Request Object * Request Object
* *
@@ -80,9 +90,7 @@ class Router {
* Handler Function * Handler Function
* *
* @callback RouterHandler * @callback RouterHandler
* @param {RouterRequest} request * @param {RouterContext} ctx
* @param {RouterResponse} response
* @param {RouterNext} next
*/ */
/** /**
@@ -308,11 +316,12 @@ class Router {
/** /**
* Handle requests * Handle requests
* *
* @param {any} env
* @param {Request} request * @param {Request} request
* @param {any=} extend * @param {any=} extend
* @returns {Response} * @returns {Response}
*/ */
async handle(request, extend = {}) { async handle(env, request, extend = {}) {
try { try {
if (request instanceof Event) { if (request instanceof Event) {
request = request.request request = request.request
@@ -373,7 +382,7 @@ class Router {
throw new Error('next() called multiple times') throw new Error('next() called multiple times')
prevIndex = index prevIndex = index
if (typeof handlers[index] === 'function') 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) await runner(0)
if (typeof res.body === 'object') { if (typeof res.body === 'object') {