Create branch
This commit is contained in:
14
README.md
14
README.md
@@ -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
45
index.d.ts
vendored
@@ -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
|
||||||
*/
|
*/
|
||||||
|
|||||||
19
index.js
19
index.js
@@ -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') {
|
||||||
|
|||||||
Reference in New Issue
Block a user