Skip to content

Commit

Permalink
wrangler: site
Browse files Browse the repository at this point in the history
  • Loading branch information
zo-el committed Feb 19, 2024
1 parent 0081f88 commit bcfd2c7
Show file tree
Hide file tree
Showing 5 changed files with 164 additions and 0 deletions.
Empty file added server/workers-site/.cargo-ok
Empty file.
2 changes: 2 additions & 0 deletions server/workers-site/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
node_modules
worker
100 changes: 100 additions & 0 deletions server/workers-site/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import {
getAssetFromKV,
mapRequestToAsset,
serveSinglePageApp,
} from '@cloudflare/kv-asset-handler'

/**
* The DEBUG flag will do two things that help during development:
* 1. we will skip caching on the edge, which makes it easier to
* debug.
* 2. we will return an error message on exception in your Response rather
* than the default 404.html page.
*/
const DEBUG = false

addEventListener('fetch', (event) => {
try {
event.respondWith(handleEvent(event))
} catch (e) {
if (DEBUG) {
return event.respondWith(
new Response(e.message || e.toString(), {
status: 500,
})
)
}
event.respondWith(new Response('Internal Error', { status: 500 }))
}
})

async function handleEvent(event) {
const url = new URL(event.request.url)
let options = { mapRequestToAsset: serveSinglePageApp }

/**
* You can add custom logic to how we fetch your assets
* by configuring the function `mapRequestToAsset`
*/
// options.mapRequestToAsset = handlePrefix(/^\/docs/)

try {
if (DEBUG) {
// customize caching
options.cacheControl = {
bypassCache: true,
}
}

const page = await getAssetFromKV(event, options)

// allow headers to be altered
const response = new Response(page.body, page)

response.headers.set('X-XSS-Protection', '1; mode=block')
response.headers.set('X-Content-Type-Options', 'nosniff')
response.headers.set('X-Frame-Options', 'DENY')
response.headers.set('Referrer-Policy', 'unsafe-url')
response.headers.set('Feature-Policy', 'none')

return response
} catch (e) {
// if an error is thrown try to serve the asset at 404.html
if (!DEBUG) {
try {
let notFoundResponse = await getAssetFromKV(event, {
mapRequestToAsset: (req) =>
new Request(`${new URL(req.url).origin}/404.html`, req),
})

return new Response(notFoundResponse.body, {
...notFoundResponse,
status: 404,
})
} catch (e) {}
}

return new Response(e.message || e.toString(), { status: 500 })
}
}

/**
* Here's one example of how to modify a request to
* remove a specific prefix, in this case `/docs` from
* the url. This can be useful if you are deploying to a
* route on a zone, or if you only want your static content
* to exist at a specific path.
*/
function handlePrefix(prefix) {
return (request) => {
// compute the default (e.g. / -> index.html)
let defaultAssetKey = mapRequestToAsset(request)
let url = new URL(defaultAssetKey.url)

// strip the prefix from the path for lookup
url.pathname = url.pathname.replace(prefix, '/')

// inherit all other props from the default request
return new Request(url.toString(), defaultAssetKey)
}
}
50 changes: 50 additions & 0 deletions server/workers-site/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions server/workers-site/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"private": true,
"name": "worker",
"version": "1.0.0",
"description": "A template for kick starting a Cloudflare Workers project",
"main": "index.js",
"author": "Ashley Lewis <[email protected]>",
"license": "MIT",
"dependencies": {
"@cloudflare/kv-asset-handler": "~0.1.2"
}
}

0 comments on commit bcfd2c7

Please sign in to comment.