all: sync with main site
This commit is contained in:
parent
e8f05020d3
commit
9147e5601d
|
@ -0,0 +1,5 @@
|
|||
export {};
|
||||
|
||||
declare global {
|
||||
const BASE_URL: string;
|
||||
}
|
110
src/handler.ts
110
src/handler.ts
|
@ -1,82 +1,112 @@
|
|||
import { getAssetFromKV } from '@cloudflare/kv-asset-handler'
|
||||
import { getAssetFromKV } from "@cloudflare/kv-asset-handler";
|
||||
|
||||
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}`
|
||||
const CSP_POLICY = "base-uri 'self'; connect-src 'self' insights.msfjarvis.dev utteranc.es; default-src 'self'; frame-ancestors 'none'; frame-src asciinema.org github.com platform.twitter.com utteranc.es; font-src 'self'; img-src 'self' data: gfycat.com imgur.com *.imgur.com insights.msfjarvis.dev syndication.twitter.com; object-src 'none'; script-src 'self' asciinema.org platform.twitter.com utteranc.es 'nonce-MZSWC5DVOJSS23TPNZRWKCQ=' 'nonce-NFXHG2LHNB2HGLTNONTGUYLSOZUXGLTEMV3AU==='; style-src 'self' 'unsafe-inline';";
|
||||
const PERMISSIONS_POLICY = "accelerometer=(), autoplay=(), camera=(), encrypted-media=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), sync-xhr=(), usb=()"
|
||||
const GITHUB_USERNAME = "msfjarvis";
|
||||
const APS_SLUG = "Android-Password-Store";
|
||||
const GITHUB_URL = `https://github.com`;
|
||||
const MY_GITHUB = `${GITHUB_URL}/${GITHUB_USERNAME}`;
|
||||
const APS_GITHUB_URL = `https://github.com/${APS_SLUG}/${APS_SLUG}`;
|
||||
const CSP_POLICY =
|
||||
"base-uri 'self'; connect-src 'self' insights.msfjarvis.dev utteranc.es; default-src 'self'; frame-ancestors 'none'; frame-src asciinema.org github.com platform.twitter.com utteranc.es; font-src 'self' fonts.gstatic.com; img-src 'self' data: gfycat.com imgur.com *.imgur.com insights.msfjarvis.dev syndication.twitter.com; object-src 'none'; script-src 'self' asciinema.org platform.twitter.com utteranc.es insights.msfjarvis.dev 'sha256-/nV291Na1MuGRmAF5BCX/72e5aDh6O5wnlvisox+3Ts=' 'sha256-a72MzDH/lZnJJFjeA4unJdesRzjwr3TeZVNYucgNkJk=' 'sha256-X5avg43RTxt2cSum+E3xICbowEMaOBxeBiNh05CXDTY=' 'sha256-4O+m6kk1wMpldFXFB8ldHkY/86U5xWfKtcSWERnGmhA='; style-src 'self' fonts.googleapis.com 'unsafe-inline';";
|
||||
const PERMISSIONS_POLICY =
|
||||
"accelerometer=(), autoplay=(), camera=(), encrypted-media=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), sync-xhr=(), usb=()";
|
||||
|
||||
export async function handleRequest(event: FetchEvent): Promise<Response> {
|
||||
return redirectGitHub(event)
|
||||
return redirectGitHub(event);
|
||||
}
|
||||
|
||||
async function getPageFromKV(event: FetchEvent): Promise<Response> {
|
||||
const options = {}
|
||||
const options = {};
|
||||
try {
|
||||
const page = await getAssetFromKV(event, options)
|
||||
const page = await getAssetFromKV(event, options);
|
||||
if (page === null) {
|
||||
throw new Error("No page found, short-circuit to 404 page");
|
||||
}
|
||||
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', 'no-referrer-when-downgrade')
|
||||
response.headers.set('Content-Security-Policy', CSP_POLICY)
|
||||
response.headers.set('Permissions-Policy', PERMISSIONS_POLICY)
|
||||
return response
|
||||
} catch (e) {
|
||||
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", "no-referrer-when-downgrade");
|
||||
response.headers.set("Content-Security-Policy", CSP_POLICY);
|
||||
response.headers.set("Permissions-Policy", PERMISSIONS_POLICY);
|
||||
const url = event.request.url;
|
||||
if (url.endsWith("css") || url.endsWith("js") || url.endsWith("ttf")) {
|
||||
response.headers.set("Cache-Control", "public, max-age=31536000");
|
||||
}
|
||||
return response;
|
||||
} catch (e: unknown) {
|
||||
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 })
|
||||
if (e instanceof Error) {
|
||||
return new Response(e.message || e.toString(), { status: 500 });
|
||||
}
|
||||
}
|
||||
return new Response("Failed to load page", { status: 500 });
|
||||
}
|
||||
|
||||
async function redirectGitHub(event: FetchEvent): Promise<Response> {
|
||||
const urlParts = event.request.url.replace(BASE_URL, '').split('/')
|
||||
const urlParts = event.request.url.replace(BASE_URL, "").split("/");
|
||||
switch (urlParts[0]) {
|
||||
case 'g':
|
||||
case "g":
|
||||
switch (urlParts.length) {
|
||||
case 1:
|
||||
return Response.redirect(GITHUB_URL, 301)
|
||||
return Response.redirect(MY_GITHUB, 301);
|
||||
case 2:
|
||||
return Response.redirect(`${GITHUB_URL}/${urlParts[1]}`, 301)
|
||||
return Response.redirect(`${MY_GITHUB}/${urlParts[1]}`, 301);
|
||||
case 3:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${urlParts[1]}/commit/${urlParts[2]}`,
|
||||
301,
|
||||
)
|
||||
`${MY_GITHUB}/${urlParts[1]}/commit/${urlParts[2]}`,
|
||||
301
|
||||
);
|
||||
case 4:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${urlParts[1]}/issues/${urlParts[3]}`,
|
||||
301,
|
||||
)
|
||||
`${MY_GITHUB}/${urlParts[1]}/issues/${urlParts[3]}`,
|
||||
301
|
||||
);
|
||||
}
|
||||
case 'aps':
|
||||
case "aps":
|
||||
switch (urlParts.length) {
|
||||
case 1:
|
||||
return Response.redirect(APS_GITHUB_URL, 301)
|
||||
return Response.redirect(APS_GITHUB_URL, 301);
|
||||
case 2:
|
||||
return Response.redirect(
|
||||
`${APS_GITHUB_URL}/commit/${urlParts[1]}`,
|
||||
301,
|
||||
)
|
||||
301
|
||||
);
|
||||
case 3:
|
||||
return Response.redirect(
|
||||
`${APS_GITHUB_URL}/issues/${urlParts[2]}`,
|
||||
301,
|
||||
)
|
||||
301
|
||||
);
|
||||
}
|
||||
default:
|
||||
return getPageFromKV(event)
|
||||
case "apsg":
|
||||
switch (urlParts.length) {
|
||||
case 1:
|
||||
return Response.redirect(`${GITHUB_URL}/${APS_SLUG}`, 301);
|
||||
case 2:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${APS_SLUG}/${urlParts[1]}`,
|
||||
301
|
||||
);
|
||||
case 3:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${APS_SLUG}/${urlParts[1]}/commit/${urlParts[2]}`,
|
||||
301
|
||||
);
|
||||
case 4:
|
||||
return Response.redirect(
|
||||
`${GITHUB_URL}/${APS_SLUG}/${urlParts[1]}/issues/${urlParts[3]}`,
|
||||
301
|
||||
);
|
||||
}
|
||||
default:
|
||||
return getPageFromKV(event);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { handleRequest } from './handler'
|
||||
import { handleRequest } from "./handler";
|
||||
|
||||
addEventListener('fetch', (event) => {
|
||||
addEventListener("fetch", (event) => {
|
||||
if (event instanceof FetchEvent) {
|
||||
event.respondWith(handleRequest(event))
|
||||
event.respondWith(handleRequest(event));
|
||||
}
|
||||
})
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue