mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 10:51:07 +00:00
detailed error handling for cloudflare worker
This commit is contained in:
@@ -10,6 +10,12 @@ interface CacheEntry {
|
|||||||
buffer: DataView;
|
buffer: DataView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class KeyNotFoundError extends Error {
|
||||||
|
constructor(message: string) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class LRUCache {
|
export class LRUCache {
|
||||||
entries: Map<string, CacheEntry>;
|
entries: Map<string, CacheEntry>;
|
||||||
counter: number;
|
counter: number;
|
||||||
@@ -35,6 +41,9 @@ export class LRUCache {
|
|||||||
let resp = await bucket.get(key, {
|
let resp = await bucket.get(key, {
|
||||||
range: { offset: offset, length: length },
|
range: { offset: offset, length: length },
|
||||||
});
|
});
|
||||||
|
if (!resp) {
|
||||||
|
throw new KeyNotFoundError("Key not found");
|
||||||
|
}
|
||||||
let a = await (resp as R2ObjectBody).arrayBuffer();
|
let a = await (resp as R2ObjectBody).arrayBuffer();
|
||||||
let d = new DataView(a);
|
let d = new DataView(a);
|
||||||
|
|
||||||
@@ -110,12 +119,20 @@ export default {
|
|||||||
let source = new TempSource();
|
let source = new TempSource();
|
||||||
|
|
||||||
let p = new PMTiles(source);
|
let p = new PMTiles(source);
|
||||||
|
try {
|
||||||
let metadata = await p.metadata();
|
let metadata = await p.metadata();
|
||||||
|
|
||||||
|
if (z < metadata.minzoom || z > metadata.maxzoom) {
|
||||||
|
return new Response("Tile not found", { status: 404 });
|
||||||
|
}
|
||||||
let entry = await p.getZxy(z, x, y);
|
let entry = await p.getZxy(z, x, y);
|
||||||
if (entry) {
|
if (entry) {
|
||||||
let tile = await env.BUCKET.get(pmtiles_path(env.PMTILES_PATH, name), {
|
let tile = await env.BUCKET.get(
|
||||||
|
pmtiles_path(env.PMTILES_PATH, name),
|
||||||
|
{
|
||||||
range: { offset: entry.offset, length: entry.length },
|
range: { offset: entry.offset, length: entry.length },
|
||||||
});
|
}
|
||||||
|
);
|
||||||
|
|
||||||
let headers = new Headers();
|
let headers = new Headers();
|
||||||
headers.set("Access-Control-Allow-Origin", "*");
|
headers.set("Access-Control-Allow-Origin", "*");
|
||||||
@@ -130,8 +147,17 @@ export default {
|
|||||||
headers: headers,
|
headers: headers,
|
||||||
encodeBody: "manual",
|
encodeBody: "manual",
|
||||||
} as any);
|
} as any);
|
||||||
|
} else {
|
||||||
|
return new Response(undefined, { status: 204 });
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof KeyNotFoundError) {
|
||||||
|
return new Response("Archive not found", { status: 404 });
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new Response("Not Found");
|
}
|
||||||
|
return new Response("Invalid tile URL", { status: 400 });
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user