mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 19:01:08 +00:00
refactor: early return (#389)
* refactor: early return Undents all the code below it 1 level. Readability win. --------- Co-authored-by: Brandon Liu <bdon@bdon.org>
This commit is contained in:
@@ -101,124 +101,124 @@ export default {
|
|||||||
|
|
||||||
const cache = caches.default;
|
const cache = caches.default;
|
||||||
|
|
||||||
if (ok) {
|
if (!ok) {
|
||||||
let allowedOrigin = "";
|
return new Response("Invalid URL", { status: 404 });
|
||||||
if (typeof env.ALLOWED_ORIGINS !== "undefined") {
|
}
|
||||||
for (const o of env.ALLOWED_ORIGINS.split(",")) {
|
|
||||||
if (o === request.headers.get("Origin") || o === "*") {
|
let allowedOrigin = "";
|
||||||
allowedOrigin = o;
|
if (typeof env.ALLOWED_ORIGINS !== "undefined") {
|
||||||
}
|
for (const o of env.ALLOWED_ORIGINS.split(",")) {
|
||||||
|
if (o === request.headers.get("Origin") || o === "*") {
|
||||||
|
allowedOrigin = o;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const cached = await cache.match(request.url);
|
|
||||||
if (cached) {
|
|
||||||
const respHeaders = new Headers(cached.headers);
|
|
||||||
if (allowedOrigin)
|
|
||||||
respHeaders.set("Access-Control-Allow-Origin", allowedOrigin);
|
|
||||||
respHeaders.set("Vary", "Origin");
|
|
||||||
|
|
||||||
return new Response(cached.body, {
|
|
||||||
headers: respHeaders,
|
|
||||||
status: cached.status,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const cacheableResponse = (
|
|
||||||
body: ArrayBuffer | string | undefined,
|
|
||||||
cacheableHeaders: Headers,
|
|
||||||
status: number
|
|
||||||
) => {
|
|
||||||
cacheableHeaders.set(
|
|
||||||
"Cache-Control",
|
|
||||||
`max-age=${env.CACHE_MAX_AGE || 86400}`
|
|
||||||
);
|
|
||||||
const cacheable = new Response(body, {
|
|
||||||
headers: cacheableHeaders,
|
|
||||||
status: status,
|
|
||||||
});
|
|
||||||
|
|
||||||
ctx.waitUntil(cache.put(request.url, cacheable));
|
|
||||||
|
|
||||||
const respHeaders = new Headers(cacheableHeaders);
|
|
||||||
if (allowedOrigin)
|
|
||||||
respHeaders.set("Access-Control-Allow-Origin", allowedOrigin);
|
|
||||||
respHeaders.set("Vary", "Origin");
|
|
||||||
return new Response(body, { headers: respHeaders, status: status });
|
|
||||||
};
|
|
||||||
|
|
||||||
const cacheableHeaders = new Headers();
|
|
||||||
const source = new R2Source(env, name);
|
|
||||||
const p = new PMTiles(source, CACHE, nativeDecompress);
|
|
||||||
try {
|
|
||||||
const pHeader = await p.getHeader();
|
|
||||||
|
|
||||||
if (!tile) {
|
|
||||||
cacheableHeaders.set("Content-Type", "application/json");
|
|
||||||
|
|
||||||
const t = tileJSON(
|
|
||||||
pHeader,
|
|
||||||
await p.getMetadata(),
|
|
||||||
env.PUBLIC_HOSTNAME || url.hostname,
|
|
||||||
name
|
|
||||||
);
|
|
||||||
|
|
||||||
return cacheableResponse(JSON.stringify(t), cacheableHeaders, 200);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile[0] < pHeader.minZoom || tile[0] > pHeader.maxZoom) {
|
|
||||||
return cacheableResponse(undefined, cacheableHeaders, 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const pair of [
|
|
||||||
[TileType.Mvt, "mvt"],
|
|
||||||
[TileType.Png, "png"],
|
|
||||||
[TileType.Jpeg, "jpg"],
|
|
||||||
[TileType.Webp, "webp"],
|
|
||||||
[TileType.Avif, "avif"],
|
|
||||||
]) {
|
|
||||||
if (pHeader.tileType === pair[0] && ext !== pair[1]) {
|
|
||||||
if (pHeader.tileType === TileType.Mvt && ext === "pbf") {
|
|
||||||
// allow this for now. Eventually we will delete this in favor of .mvt
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return cacheableResponse(
|
|
||||||
`Bad request: requested .${ext} but archive has type .${pair[1]}`,
|
|
||||||
cacheableHeaders,
|
|
||||||
400
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const tiledata = await p.getZxy(tile[0], tile[1], tile[2]);
|
|
||||||
|
|
||||||
switch (pHeader.tileType) {
|
|
||||||
case TileType.Mvt:
|
|
||||||
cacheableHeaders.set("Content-Type", "application/x-protobuf");
|
|
||||||
break;
|
|
||||||
case TileType.Png:
|
|
||||||
cacheableHeaders.set("Content-Type", "image/png");
|
|
||||||
break;
|
|
||||||
case TileType.Jpeg:
|
|
||||||
cacheableHeaders.set("Content-Type", "image/jpeg");
|
|
||||||
break;
|
|
||||||
case TileType.Webp:
|
|
||||||
cacheableHeaders.set("Content-Type", "image/webp");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tiledata) {
|
|
||||||
return cacheableResponse(tiledata.data, cacheableHeaders, 200);
|
|
||||||
}
|
|
||||||
return cacheableResponse(undefined, cacheableHeaders, 204);
|
|
||||||
} catch (e) {
|
|
||||||
if (e instanceof KeyNotFoundError) {
|
|
||||||
return cacheableResponse("Archive not found", cacheableHeaders, 404);
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Response("Invalid URL", { status: 404 });
|
const cached = await cache.match(request.url);
|
||||||
|
if (cached) {
|
||||||
|
const respHeaders = new Headers(cached.headers);
|
||||||
|
if (allowedOrigin)
|
||||||
|
respHeaders.set("Access-Control-Allow-Origin", allowedOrigin);
|
||||||
|
respHeaders.set("Vary", "Origin");
|
||||||
|
|
||||||
|
return new Response(cached.body, {
|
||||||
|
headers: respHeaders,
|
||||||
|
status: cached.status,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const cacheableResponse = (
|
||||||
|
body: ArrayBuffer | string | undefined,
|
||||||
|
cacheableHeaders: Headers,
|
||||||
|
status: number
|
||||||
|
) => {
|
||||||
|
cacheableHeaders.set(
|
||||||
|
"Cache-Control",
|
||||||
|
`max-age=${env.CACHE_MAX_AGE || 86400}`
|
||||||
|
);
|
||||||
|
const cacheable = new Response(body, {
|
||||||
|
headers: cacheableHeaders,
|
||||||
|
status: status,
|
||||||
|
});
|
||||||
|
|
||||||
|
ctx.waitUntil(cache.put(request.url, cacheable));
|
||||||
|
|
||||||
|
const respHeaders = new Headers(cacheableHeaders);
|
||||||
|
if (allowedOrigin)
|
||||||
|
respHeaders.set("Access-Control-Allow-Origin", allowedOrigin);
|
||||||
|
respHeaders.set("Vary", "Origin");
|
||||||
|
return new Response(body, { headers: respHeaders, status: status });
|
||||||
|
};
|
||||||
|
|
||||||
|
const cacheableHeaders = new Headers();
|
||||||
|
const source = new R2Source(env, name);
|
||||||
|
const p = new PMTiles(source, CACHE, nativeDecompress);
|
||||||
|
try {
|
||||||
|
const pHeader = await p.getHeader();
|
||||||
|
|
||||||
|
if (!tile) {
|
||||||
|
cacheableHeaders.set("Content-Type", "application/json");
|
||||||
|
|
||||||
|
const t = tileJSON(
|
||||||
|
pHeader,
|
||||||
|
await p.getMetadata(),
|
||||||
|
env.PUBLIC_HOSTNAME || url.hostname,
|
||||||
|
name
|
||||||
|
);
|
||||||
|
|
||||||
|
return cacheableResponse(JSON.stringify(t), cacheableHeaders, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tile[0] < pHeader.minZoom || tile[0] > pHeader.maxZoom) {
|
||||||
|
return cacheableResponse(undefined, cacheableHeaders, 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const pair of [
|
||||||
|
[TileType.Mvt, "mvt"],
|
||||||
|
[TileType.Png, "png"],
|
||||||
|
[TileType.Jpeg, "jpg"],
|
||||||
|
[TileType.Webp, "webp"],
|
||||||
|
[TileType.Avif, "avif"],
|
||||||
|
]) {
|
||||||
|
if (pHeader.tileType === pair[0] && ext !== pair[1]) {
|
||||||
|
if (pHeader.tileType === TileType.Mvt && ext === "pbf") {
|
||||||
|
// allow this for now. Eventually we will delete this in favor of .mvt
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return cacheableResponse(
|
||||||
|
`Bad request: requested .${ext} but archive has type .${pair[1]}`,
|
||||||
|
cacheableHeaders,
|
||||||
|
400
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const tiledata = await p.getZxy(tile[0], tile[1], tile[2]);
|
||||||
|
|
||||||
|
switch (pHeader.tileType) {
|
||||||
|
case TileType.Mvt:
|
||||||
|
cacheableHeaders.set("Content-Type", "application/x-protobuf");
|
||||||
|
break;
|
||||||
|
case TileType.Png:
|
||||||
|
cacheableHeaders.set("Content-Type", "image/png");
|
||||||
|
break;
|
||||||
|
case TileType.Jpeg:
|
||||||
|
cacheableHeaders.set("Content-Type", "image/jpeg");
|
||||||
|
break;
|
||||||
|
case TileType.Webp:
|
||||||
|
cacheableHeaders.set("Content-Type", "image/webp");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tiledata) {
|
||||||
|
return cacheableResponse(tiledata.data, cacheableHeaders, 200);
|
||||||
|
}
|
||||||
|
return cacheableResponse(undefined, cacheableHeaders, 204);
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof KeyNotFoundError) {
|
||||||
|
return cacheableResponse("Archive not found", cacheableHeaders, 404);
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user