initial commit
This commit is contained in:
commit
168093e034
|
@ -0,0 +1,4 @@
|
|||
node_modules/
|
||||
worker/
|
||||
.cargo-ok
|
||||
package-lock.json
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"trailingComma": "es5",
|
||||
"tabWidth": 4,
|
||||
"semi": false,
|
||||
"singleQuote": true
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
## Router
|
||||
|
||||
Selects the logic to respond to requests based on the `request` method and URL. Can be used with REST APIs or apps that require basic routing logic.
|
||||
|
||||
[`index.js`](https://github.com/cloudflare/worker-template-router/blob/master/index.js) is the content of the Workers script.
|
||||
|
||||
#### Wrangler
|
||||
|
||||
You can use [wrangler](https://github.com/cloudflare/wrangler) to generate a new Cloudflare Workers project based on this template by running the following command from your terminal:
|
||||
|
||||
```
|
||||
wrangler generate myapp https://github.com/cloudflare/worker-template-router
|
||||
```
|
||||
|
||||
Before publishing your code you need to edit `wrangler.toml` file and add your Cloudflare `account_id` - more information about publishing your code can be found [in the documentation](https://workers.cloudflare.com/docs/quickstart/configuring-and-publishing/).
|
||||
|
||||
Once you are ready, you can publish your code by running the following command:
|
||||
|
||||
```
|
||||
wrangler publish
|
||||
```
|
||||
|
||||
#### Serverless
|
||||
|
||||
To deploy using serverless add a [`serverless.yml`](https://serverless.com/framework/docs/providers/cloudflare/) file.
|
|
@ -0,0 +1,30 @@
|
|||
const Router = require('./router')
|
||||
|
||||
/**
|
||||
* Example of how router can be used in an application
|
||||
* */
|
||||
addEventListener('fetch', event => {
|
||||
event.respondWith(handleRequest(event.request))
|
||||
})
|
||||
|
||||
function handler(request) {
|
||||
const init = {
|
||||
headers: { 'content-type': 'application/json' },
|
||||
}
|
||||
const body = JSON.stringify({ some: 'json' })
|
||||
return new Response(body, init)
|
||||
}
|
||||
|
||||
async function handleRequest(request) {
|
||||
const r = new Router()
|
||||
// Replace with the appropriate paths and handlers
|
||||
r.get('.*/bar', () => new Response('responding for /bar'))
|
||||
r.get('.*/foo', request => handler(request))
|
||||
r.post('.*/foo.*', request => handler(request))
|
||||
r.get('/demos/router/foo', request => fetch(request)) // return the response from the origin
|
||||
|
||||
r.get('/', () => new Response('Hello worker!')) // return a default message for the root route
|
||||
|
||||
const resp = await r.route(request)
|
||||
return resp
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "dzserver",
|
||||
"version": "1.0.0",
|
||||
"description": "package for creating workers templates",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"format": "prettier --write '**/*.{js,css,json,md}'"
|
||||
},
|
||||
"author": "uh_wot <uhwot@protonmail.com>",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"prettier": "^1.17.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"serverless-cloudflare-workers": "^1.2.0"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
/**
|
||||
* Helper functions that when passed a request will return a
|
||||
* boolean indicating if the request uses that HTTP method,
|
||||
* header, host or referrer.
|
||||
*/
|
||||
const Method = method => req =>
|
||||
req.method.toLowerCase() === method.toLowerCase()
|
||||
const Connect = Method('connect')
|
||||
const Delete = Method('delete')
|
||||
const Get = Method('get')
|
||||
const Head = Method('head')
|
||||
const Options = Method('options')
|
||||
const Patch = Method('patch')
|
||||
const Post = Method('post')
|
||||
const Put = Method('put')
|
||||
const Trace = Method('trace')
|
||||
|
||||
const Header = (header, val) => req => req.headers.get(header) === val
|
||||
const Host = host => Header('host', host.toLowerCase())
|
||||
const Referrer = host => Header('referrer', host.toLowerCase())
|
||||
|
||||
const Path = regExp => req => {
|
||||
const url = new URL(req.url)
|
||||
const path = url.pathname
|
||||
const match = path.match(regExp) || []
|
||||
return match[0] === path
|
||||
}
|
||||
|
||||
/**
|
||||
* The Router handles determines which handler is matched given the
|
||||
* conditions present for each request.
|
||||
*/
|
||||
class Router {
|
||||
constructor() {
|
||||
this.routes = []
|
||||
}
|
||||
|
||||
handle(conditions, handler) {
|
||||
this.routes.push({
|
||||
conditions,
|
||||
handler,
|
||||
})
|
||||
return this
|
||||
}
|
||||
|
||||
connect(url, handler) {
|
||||
return this.handle([Connect, Path(url)], handler)
|
||||
}
|
||||
|
||||
delete(url, handler) {
|
||||
return this.handle([Delete, Path(url)], handler)
|
||||
}
|
||||
|
||||
get(url, handler) {
|
||||
return this.handle([Get, Path(url)], handler)
|
||||
}
|
||||
|
||||
head(url, handler) {
|
||||
return this.handle([Head, Path(url)], handler)
|
||||
}
|
||||
|
||||
options(url, handler) {
|
||||
return this.handle([Options, Path(url)], handler)
|
||||
}
|
||||
|
||||
patch(url, handler) {
|
||||
return this.handle([Patch, Path(url)], handler)
|
||||
}
|
||||
|
||||
post(url, handler) {
|
||||
return this.handle([Post, Path(url)], handler)
|
||||
}
|
||||
|
||||
put(url, handler) {
|
||||
return this.handle([Put, Path(url)], handler)
|
||||
}
|
||||
|
||||
trace(url, handler) {
|
||||
return this.handle([Trace, Path(url)], handler)
|
||||
}
|
||||
|
||||
all(handler) {
|
||||
return this.handle([], handler)
|
||||
}
|
||||
|
||||
route(req) {
|
||||
const route = this.resolve(req)
|
||||
|
||||
if (route) {
|
||||
return route.handler(req)
|
||||
}
|
||||
|
||||
return new Response('resource not found', {
|
||||
status: 404,
|
||||
statusText: 'not found',
|
||||
headers: {
|
||||
'content-type': 'text/plain',
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* resolve returns the matching route for a request that returns
|
||||
* true for all conditions (if any).
|
||||
*/
|
||||
resolve(req) {
|
||||
return this.routes.find(r => {
|
||||
if (!r.conditions || (Array.isArray(r) && !r.conditions.length)) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (typeof r.conditions === 'function') {
|
||||
return r.conditions(req)
|
||||
}
|
||||
|
||||
return r.conditions.every(c => c(req))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Router
|
|
@ -0,0 +1,6 @@
|
|||
name = "dzserver"
|
||||
type = "webpack"
|
||||
account_id = "03479b0523a52b140e0dabac40cb0fc8"
|
||||
workers_dev = true
|
||||
route = ""
|
||||
zone_id = ""
|
Loading…
Reference in New Issue