workers-site: bring back redirekt
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
52d476288f
commit
76b0ade93d
|
@ -1,6 +1,8 @@
|
|||
public/
|
||||
resources/
|
||||
dist/
|
||||
msfjarvis-dev/
|
||||
msfjarvis-dev-staging/
|
||||
node_modules/
|
||||
transpiled/
|
||||
worker/
|
||||
package-lock.json
|
||||
wrangler.toml
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"name": "redirekt",
|
||||
"version": "1.0.0",
|
||||
"description": "Cloudflare Worker to do simple redirects to GitHub",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "webpack",
|
||||
"dev": "NODE_ENV=development npm run build",
|
||||
"format": "prettier --write '**/*.{ts,js,css,json,md}'",
|
||||
"transpile": "tsc --project ./test"
|
||||
},
|
||||
"author": "Harsh Shandilya <me@msfjarvis.dev>",
|
||||
"license": "MIT OR Apache-2.0",
|
||||
"devDependencies": {
|
||||
"prettier": "^2.1.2",
|
||||
"source-map-loader": "^1.1.2",
|
||||
"source-map-support": "^0.5.19",
|
||||
"ts-loader": "^8.0.11",
|
||||
"typescript": "^4.0.5",
|
||||
"webpack": "^4.44.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@cloudflare/kv-asset-handler": "0.0.12"
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"module": "commonjs",
|
||||
"target": "esnext",
|
||||
"lib": ["esnext", "webworker"],
|
||||
"alwaysStrict": true,
|
||||
"strict": true,
|
||||
"preserveConstEnums": true,
|
||||
"moduleResolution": "node",
|
||||
"sourceMap": true,
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": ["./workers-site/src/*.ts", "./workers-site/test/*.ts", "./workers-site/src/**/*.ts", "./workers-site/test/**/*.ts"],
|
||||
"exclude": ["node_modules/", "dist/"]
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
const path = require('path')
|
||||
const webpack = require('webpack')
|
||||
|
||||
const mode = process.env.NODE_ENV || 'production'
|
||||
|
||||
module.exports = {
|
||||
entry: "./workers-site/src",
|
||||
output: {
|
||||
filename: `worker.${mode}.js`,
|
||||
path: path.join(__dirname, 'dist'),
|
||||
},
|
||||
devtool: 'source-map',
|
||||
mode,
|
||||
resolve: {
|
||||
extensions: ['.ts', '.tsx', '.js'],
|
||||
plugins: [],
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
transpileOnly: true,
|
||||
},
|
||||
},
|
||||
{ enforce: 'pre', test: /\.js$/, loader: 'source-map-loader' },
|
||||
],
|
||||
},
|
||||
}
|
|
@ -0,0 +1,75 @@
|
|||
import { getAssetFromKV } from '@cloudflare/kv-asset-handler';
|
||||
|
||||
const BASE_URL = 'https://msfjarvis.dev/';
|
||||
const GITHUB_USERNAME = 'msfjarvis';
|
||||
const APS_SLUG = 'Android-Password-Store/Android-Password-Store';
|
||||
const GITHUB_URL = `https://github.com/${GITHUB_USERNAME}`;
|
||||
const APS_GITHUB_URL = `https://github.com/${APS_SLUG}`;
|
||||
|
||||
export async function handleRequest(event: FetchEvent): Promise<Response> {
|
||||
return redirectGitHub(event);
|
||||
}
|
||||
|
||||
async function getPageFromKV(event: FetchEvent): Promise<Response> {
|
||||
const options = {};
|
||||
try {
|
||||
const page = await getAssetFromKV(event, options);
|
||||
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) {
|
||||
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 });
|
||||
}
|
||||
}
|
||||
|
||||
async function redirectGitHub(event: FetchEvent): Promise<Response> {
|
||||
const urlParts = event.request.url.replace(BASE_URL, '').split('/');
|
||||
switch (urlParts[0]) {
|
||||
case 'g':
|
||||
switch (urlParts.length) {
|
||||
case 1:
|
||||
return Response.redirect(GITHUB_URL, 301);
|
||||
case 2:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${urlParts[1]}`,
|
||||
301
|
||||
);
|
||||
case 3:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${urlParts[1]}/commit/${urlParts[2]}`,
|
||||
301
|
||||
);
|
||||
}
|
||||
case 'aps':
|
||||
switch (urlParts.length) {
|
||||
case 1:
|
||||
return Response.redirect(APS_GITHUB_URL, 301);
|
||||
case 2:
|
||||
return Response.redirect(
|
||||
`${APS_GITHUB_URL}/commit/${urlParts[1]}`,
|
||||
301
|
||||
);
|
||||
case 3:
|
||||
return Response.redirect(
|
||||
`${APS_GITHUB_URL}/issues/${urlParts[2]}`,
|
||||
301
|
||||
);
|
||||
}
|
||||
default:
|
||||
return getPageFromKV(event);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
import { handleRequest } from './handler'
|
||||
|
||||
addEventListener('fetch', (event) => {
|
||||
if (event instanceof FetchEvent) {
|
||||
event.respondWith(handleRequest(event))
|
||||
}
|
||||
})
|
Loading…
Reference in New Issue