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 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

45
index.d.ts vendored
View File

@@ -43,6 +43,16 @@ declare class Router {
* @property {string} url URL String
* @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
*
@@ -73,9 +83,7 @@ declare class Router {
* 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<string, string>
/**
* Request Object
*/
req: RouterRequest
/**
* Response Object
*/
res: RouterResponse
/**
* Next Handler
*/
next: RouterNext
}
/**
* Request Object
*/

View File

@@ -47,6 +47,16 @@ class Router {
* @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
*
@@ -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') {