var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); // node_modules/fflate/esm/browser.js var u8 = Uint8Array; var u16 = Uint16Array; var i32 = Int32Array; var fleb = new u8([ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0 ]); var fdeb = new u8([ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0 ]); var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]); var freb = /* @__PURE__ */ __name(function(eb, start) { var b2 = new u16(31); for (var i = 0; i < 31; ++i) { b2[i] = start += 1 << eb[i - 1]; } var r = new i32(b2[30]); for (var i = 1; i < 30; ++i) { for (var j2 = b2[i]; j2 < b2[i + 1]; ++j2) { r[j2] = j2 - b2[i] << 5 | i; } } return { b: b2, r }; }, "freb"); var _a = freb(fleb, 2); var fl = _a.b; var revfl = _a.r; fl[28] = 258, revfl[258] = 28; var _b = freb(fdeb, 0); var fd = _b.b; var revfd = _b.r; var rev = new u16(32768); for (i = 0; i < 32768; ++i) { x2 = (i & 43690) >> 1 | (i & 21845) << 1; x2 = (x2 & 52428) >> 2 | (x2 & 13107) << 2; x2 = (x2 & 61680) >> 4 | (x2 & 3855) << 4; rev[i] = ((x2 & 65280) >> 8 | (x2 & 255) << 8) >> 1; } var x2; var i; var hMap = /* @__PURE__ */ __name((function(cd, mb, r) { var s = cd.length; var i = 0; var l2 = new u16(mb); for (; i < s; ++i) { if (cd[i]) ++l2[cd[i] - 1]; } var le = new u16(mb); for (i = 1; i < mb; ++i) { le[i] = le[i - 1] + l2[i - 1] << 1; } var co; if (r) { co = new u16(1 << mb); var rvb = 15 - mb; for (i = 0; i < s; ++i) { if (cd[i]) { var sv = i << 4 | cd[i]; var r_1 = mb - cd[i]; var v2 = le[cd[i] - 1]++ << r_1; for (var m2 = v2 | (1 << r_1) - 1; v2 <= m2; ++v2) { co[rev[v2] >> rvb] = sv; } } } } else { co = new u16(s); for (i = 0; i < s; ++i) { if (cd[i]) { co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i]; } } } return co; }), "hMap"); var flt = new u8(288); for (i = 0; i < 144; ++i) flt[i] = 8; var i; for (i = 144; i < 256; ++i) flt[i] = 9; var i; for (i = 256; i < 280; ++i) flt[i] = 7; var i; for (i = 280; i < 288; ++i) flt[i] = 8; var i; var fdt = new u8(32); for (i = 0; i < 32; ++i) fdt[i] = 5; var i; var flrm = /* @__PURE__ */ hMap(flt, 9, 1); var fdrm = /* @__PURE__ */ hMap(fdt, 5, 1); var max = /* @__PURE__ */ __name(function(a) { var m2 = a[0]; for (var i = 1; i < a.length; ++i) { if (a[i] > m2) m2 = a[i]; } return m2; }, "max"); var bits = /* @__PURE__ */ __name(function(d, p, m2) { var o = p / 8 | 0; return (d[o] | d[o + 1] << 8) >> (p & 7) & m2; }, "bits"); var bits16 = /* @__PURE__ */ __name(function(d, p) { var o = p / 8 | 0; return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7); }, "bits16"); var shft = /* @__PURE__ */ __name(function(p) { return (p + 7) / 8 | 0; }, "shft"); var slc = /* @__PURE__ */ __name(function(v2, s, e) { if (s == null || s < 0) s = 0; if (e == null || e > v2.length) e = v2.length; return new u8(v2.subarray(s, e)); }, "slc"); var ec = [ "unexpected EOF", "invalid block type", "invalid length/literal", "invalid distance", "stream finished", "no stream handler", , "no callback", "invalid UTF-8 data", "extra field too long", "date not in range 1980-2099", "filename too long", "stream finishing", "invalid zip data" // determined by unknown compression method ]; var err = /* @__PURE__ */ __name(function(ind, msg, nt) { var e = new Error(msg || ec[ind]); e.code = ind; if (Error.captureStackTrace) Error.captureStackTrace(e, err); if (!nt) throw e; return e; }, "err"); var inflt = /* @__PURE__ */ __name(function(dat, st, buf, dict) { var sl = dat.length, dl = dict ? dict.length : 0; if (!sl || st.f && !st.l) return buf || new u8(0); var noBuf = !buf; var resize = noBuf || st.i != 2; var noSt = st.i; if (noBuf) buf = new u8(sl * 3); var cbuf = /* @__PURE__ */ __name(function(l3) { var bl = buf.length; if (l3 > bl) { var nbuf = new u8(Math.max(bl * 2, l3)); nbuf.set(buf); buf = nbuf; } }, "cbuf"); var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n; var tbts = sl * 8; do { if (!lm) { final = bits(dat, pos, 1); var type = bits(dat, pos + 1, 3); pos += 3; if (!type) { var s = shft(pos) + 4, l2 = dat[s - 4] | dat[s - 3] << 8, t = s + l2; if (t > sl) { if (noSt) err(0); break; } if (resize) cbuf(bt + l2); buf.set(dat.subarray(s, t), bt); st.b = bt += l2, st.p = pos = t * 8, st.f = final; continue; } else if (type == 1) lm = flrm, dm = fdrm, lbt = 9, dbt = 5; else if (type == 2) { var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4; var tl = hLit + bits(dat, pos + 5, 31) + 1; pos += 14; var ldt = new u8(tl); var clt = new u8(19); for (var i = 0; i < hcLen; ++i) { clt[clim[i]] = bits(dat, pos + i * 3, 7); } pos += hcLen * 3; var clb = max(clt), clbmsk = (1 << clb) - 1; var clm = hMap(clt, clb, 1); for (var i = 0; i < tl; ) { var r = clm[bits(dat, pos, clbmsk)]; pos += r & 15; var s = r >> 4; if (s < 16) { ldt[i++] = s; } else { var c = 0, n = 0; if (s == 16) n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1]; else if (s == 17) n = 3 + bits(dat, pos, 7), pos += 3; else if (s == 18) n = 11 + bits(dat, pos, 127), pos += 7; while (n--) ldt[i++] = c; } } var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit); lbt = max(lt); dbt = max(dt); lm = hMap(lt, lbt, 1); dm = hMap(dt, dbt, 1); } else err(1); if (pos > tbts) { if (noSt) err(0); break; } } if (resize) cbuf(bt + 131072); var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1; var lpos = pos; for (; ; lpos = pos) { var c = lm[bits16(dat, pos) & lms], sym = c >> 4; pos += c & 15; if (pos > tbts) { if (noSt) err(0); break; } if (!c) err(2); if (sym < 256) buf[bt++] = sym; else if (sym == 256) { lpos = pos, lm = null; break; } else { var add = sym - 254; if (sym > 264) { var i = sym - 257, b2 = fleb[i]; add = bits(dat, pos, (1 << b2) - 1) + fl[i]; pos += b2; } var d = dm[bits16(dat, pos) & dms], dsym = d >> 4; if (!d) err(3); pos += d & 15; var dt = fd[dsym]; if (dsym > 3) { var b2 = fdeb[dsym]; dt += bits16(dat, pos) & (1 << b2) - 1, pos += b2; } if (pos > tbts) { if (noSt) err(0); break; } if (resize) cbuf(bt + 131072); var end = bt + add; if (bt < dt) { var shift = dl - dt, dend = Math.min(dt, end); if (shift + bt < 0) err(3); for (; bt < dend; ++bt) buf[bt] = dict[shift + bt]; } for (; bt < end; ++bt) buf[bt] = buf[bt - dt]; } } st.l = lm, st.p = lpos, st.b = bt, st.f = final; if (lm) final = 1, st.m = lbt, st.d = dm, st.n = dbt; } while (!final); return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt); }, "inflt"); var et = /* @__PURE__ */ new u8(0); var gzs = /* @__PURE__ */ __name(function(d) { if (d[0] != 31 || d[1] != 139 || d[2] != 8) err(6, "invalid gzip data"); var flg = d[3]; var st = 10; if (flg & 4) st += (d[10] | d[11] << 8) + 2; for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++]) ; return st + (flg & 2); }, "gzs"); var gzl = /* @__PURE__ */ __name(function(d) { var l2 = d.length; return (d[l2 - 4] | d[l2 - 3] << 8 | d[l2 - 2] << 16 | d[l2 - 1] << 24) >>> 0; }, "gzl"); var zls = /* @__PURE__ */ __name(function(d, dict) { if ((d[0] & 15) != 8 || d[0] >> 4 > 7 || (d[0] << 8 | d[1]) % 31) err(6, "invalid zlib data"); if ((d[1] >> 5 & 1) == +!dict) err(6, "invalid zlib data: " + (d[1] & 32 ? "need" : "unexpected") + " dictionary"); return (d[1] >> 3 & 4) + 2; }, "zls"); function inflateSync(data, opts) { return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary); } __name(inflateSync, "inflateSync"); function gunzipSync(data, opts) { var st = gzs(data); if (st + 8 > data.length) err(6, "invalid gzip data"); return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary); } __name(gunzipSync, "gunzipSync"); function unzlibSync(data, opts) { return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary); } __name(unzlibSync, "unzlibSync"); function decompressSync(data, opts) { return data[0] == 31 && data[1] == 139 && data[2] == 8 ? gunzipSync(data, opts) : (data[0] & 15) != 8 || data[0] >> 4 > 7 || (data[0] << 8 | data[1]) % 31 ? inflateSync(data, opts) : unzlibSync(data, opts); } __name(decompressSync, "decompressSync"); var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder(); var tds = 0; try { td.decode(et, { stream: true }); tds = 1; } catch (e) { } // node_modules/pmtiles/dist/esm/index.js var z = Object.defineProperty; var b = Math.pow; var l = /* @__PURE__ */ __name((i, e) => z(i, "name", { value: e, configurable: true }), "l"); var m = /* @__PURE__ */ __name((i, e, t) => new Promise((r, n) => { var s = /* @__PURE__ */ __name((u) => { try { a(t.next(u)); } catch (c) { n(c); } }, "s"), o = /* @__PURE__ */ __name((u) => { try { a(t.throw(u)); } catch (c) { n(c); } }, "o"), a = /* @__PURE__ */ __name((u) => u.done ? r(u.value) : Promise.resolve(u.value).then(s, o), "a"); a((t = t.apply(i, e)).next()); }), "m"); var re = l((i, e) => { let t = false, r = "", n = L.GridLayer.extend({ createTile: l((s, o) => { let a = document.createElement("img"), u = new AbortController(), c = u.signal; return a.cancel = () => { u.abort(); }, t || (i.getHeader().then((d) => { d.tileType === 1 ? console.error("Error: archive contains MVT vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details.") : d.tileType === 2 ? r = "image/png" : d.tileType === 3 ? r = "image/jpeg" : d.tileType === 4 ? r = "image/webp" : d.tileType === 5 && (r = "image/avif"); }), t = true), i.getZxy(s.z, s.x, s.y, c).then((d) => { if (d) { let h = new Blob([d.data], { type: r }), p = window.URL.createObjectURL(h); a.src = p, a.cancel = void 0, o(void 0, a); } }).catch((d) => { if (d.name !== "AbortError") throw d; }), a; }, "createTile"), _removeTile: l(function(s) { let o = this._tiles[s]; o && (o.el.cancel && o.el.cancel(), o.el.width = 0, o.el.height = 0, o.el.deleted = true, L.DomUtil.remove(o.el), delete this._tiles[s], this.fire("tileunload", { tile: o.el, coords: this._keyToTileCoords(s) })); }, "_removeTile") }); return new n(e); }, "leafletRasterLayer"); var j = l((i) => (e, t) => { if (t instanceof AbortController) return i(e, t); let r = new AbortController(); return i(e, r).then((n) => t(void 0, n.data, n.cacheControl || "", n.expires || ""), (n) => t(n)).catch((n) => t(n)), { cancel: l(() => r.abort(), "cancel") }; }, "v3compat"); var T = class T2 { static { __name(this, "T"); } constructor(e) { this.tilev4 = l((e2, t) => m(this, null, function* () { if (e2.type === "json") { let p = e2.url.substr(10), y = this.tiles.get(p); if (y || (y = new x(p), this.tiles.set(p, y)), this.metadata) return { data: yield y.getTileJson(e2.url) }; let f = yield y.getHeader(); return (f.minLon >= f.maxLon || f.minLat >= f.maxLat) && console.error(`Bounds of PMTiles archive ${f.minLon},${f.minLat},${f.maxLon},${f.maxLat} are not valid.`), { data: { tiles: [`${e2.url}/{z}/{x}/{y}`], minzoom: f.minZoom, maxzoom: f.maxZoom, bounds: [f.minLon, f.minLat, f.maxLon, f.maxLat] } }; } let r = new RegExp(/pmtiles:\/\/(.+)\/(\d+)\/(\d+)\/(\d+)/), n = e2.url.match(r); if (!n) throw new Error("Invalid PMTiles protocol URL"); let s = n[1], o = this.tiles.get(s); o || (o = new x(s), this.tiles.set(s, o)); let a = n[2], u = n[3], c = n[4], d = yield o.getHeader(), h = yield o == null ? void 0 : o.getZxy(+a, +u, +c, t.signal); if (h) return { data: new Uint8Array(h.data), cacheControl: h.cacheControl, expires: h.expires }; if (d.tileType === 1) { if (this.errorOnMissingTile) throw new Error("Tile not found."); return { data: new Uint8Array() }; } return { data: null }; }), "tilev4"); this.tile = j(this.tilev4); this.tiles = /* @__PURE__ */ new Map(), this.metadata = (e == null ? void 0 : e.metadata) || false, this.errorOnMissingTile = (e == null ? void 0 : e.errorOnMissingTile) || false; } add(e) { this.tiles.set(e.source.getKey(), e); } get(e) { return this.tiles.get(e); } }; l(T, "Protocol"); function w(i, e) { return (e >>> 0) * 4294967296 + (i >>> 0); } __name(w, "w"); l(w, "toNum"); function F(i, e) { let t = e.buf, r = t[e.pos++], n = (r & 112) >> 4; if (r < 128 || (r = t[e.pos++], n |= (r & 127) << 3, r < 128) || (r = t[e.pos++], n |= (r & 127) << 10, r < 128) || (r = t[e.pos++], n |= (r & 127) << 17, r < 128) || (r = t[e.pos++], n |= (r & 127) << 24, r < 128) || (r = t[e.pos++], n |= (r & 1) << 31, r < 128)) return w(i, n); throw new Error("Expected varint not more than 10 bytes"); } __name(F, "F"); l(F, "readVarintRemainder"); function v(i) { let e = i.buf, t = e[i.pos++], r = t & 127; return t < 128 || (t = e[i.pos++], r |= (t & 127) << 7, t < 128) || (t = e[i.pos++], r |= (t & 127) << 14, t < 128) || (t = e[i.pos++], r |= (t & 127) << 21, t < 128) ? r : (t = e[i.pos], r |= (t & 15) << 28, F(r, i)); } __name(v, "v"); l(v, "readVarint"); function k(i, e, t, r) { if (r === 0) { t === 1 && (e[0] = i - 1 - e[0], e[1] = i - 1 - e[1]); let n = e[0]; e[0] = e[1], e[1] = n; } } __name(k, "k"); l(k, "rotate"); function N(i, e) { let t = b(2, i), r = e, n = e, s = e, o = [0, 0], a = 1; for (; a < t; ) r = 1 & s / 2, n = 1 & (s ^ r), k(a, o, r, n), o[0] += a * r, o[1] += a * n, s = s / 4, a *= 2; return [i, o[0], o[1]]; } __name(N, "N"); l(N, "idOnLevel"); var q = [0, 1, 5, 21, 85, 341, 1365, 5461, 21845, 87381, 349525, 1398101, 5592405, 22369621, 89478485, 357913941, 1431655765, 5726623061, 22906492245, 91625968981, 366503875925, 1466015503701, 5864062014805, 23456248059221, 93824992236885, 375299968947541, 1501199875790165]; function G(i, e, t) { if (i > 26) throw new Error("Tile zoom level exceeds max safe number limit (26)"); if (e > b(2, i) - 1 || t > b(2, i) - 1) throw new Error("tile x/y outside zoom level bounds"); let r = q[i], n = b(2, i), s = 0, o = 0, a = 0, u = [e, t], c = n / 2; for (; c > 0; ) s = (u[0] & c) > 0 ? 1 : 0, o = (u[1] & c) > 0 ? 1 : 0, a += c * c * (3 * s ^ o), k(c, u, s, o), c = c / 2; return r + a; } __name(G, "G"); l(G, "zxyToTileId"); function ie(i) { let e = 0, t = 0; for (let r = 0; r < 27; r++) { let n = (1 << r) * (1 << r); if (e + n > i) return N(r, i - e); e += n; } throw new Error("Tile zoom level exceeds max safe number limit (26)"); } __name(ie, "ie"); l(ie, "tileIdToZxy"); var J = ((s) => (s[s.Unknown = 0] = "Unknown", s[s.None = 1] = "None", s[s.Gzip = 2] = "Gzip", s[s.Brotli = 3] = "Brotli", s[s.Zstd = 4] = "Zstd", s))(J || {}); function D(i, e) { return m(this, null, function* () { if (e === 1 || e === 0) return i; if (e === 2) { if (typeof globalThis.DecompressionStream == "undefined") return decompressSync(new Uint8Array(i)); let t = new Response(i).body; if (!t) throw new Error("Failed to read response stream"); let r = t.pipeThrough(new globalThis.DecompressionStream("gzip")); return new Response(r).arrayBuffer(); } throw new Error("Compression method not supported"); }); } __name(D, "D"); l(D, "defaultDecompress"); var O = ((o) => (o[o.Unknown = 0] = "Unknown", o[o.Mvt = 1] = "Mvt", o[o.Png = 2] = "Png", o[o.Jpeg = 3] = "Jpeg", o[o.Webp = 4] = "Webp", o[o.Avif = 5] = "Avif", o))(O || {}); function _(i) { return i === 1 ? ".mvt" : i === 2 ? ".png" : i === 3 ? ".jpg" : i === 4 ? ".webp" : i === 5 ? ".avif" : ""; } __name(_, "_"); l(_, "tileTypeExt"); var Y = 127; function Q(i, e) { let t = 0, r = i.length - 1; for (; t <= r; ) { let n = r + t >> 1, s = e - i[n].tileId; if (s > 0) t = n + 1; else if (s < 0) r = n - 1; else return i[n]; } return r >= 0 && (i[r].runLength === 0 || e - i[r].tileId < i[r].runLength) ? i[r] : null; } __name(Q, "Q"); l(Q, "findTile"); var A = class A2 { static { __name(this, "A"); } constructor(e) { this.file = e; } getKey() { return this.file.name; } getBytes(e, t) { return m(this, null, function* () { return { data: yield this.file.slice(e, e + t).arrayBuffer() }; }); } }; l(A, "FileSource"); var U = class U2 { static { __name(this, "U"); } constructor(e, t = new Headers()) { this.url = e, this.customHeaders = t, this.mustReload = false; let r = ""; "navigator" in globalThis && (r = globalThis.navigator.userAgent || ""); let n = r.indexOf("Windows") > -1, s = /Chrome|Chromium|Edg|OPR|Brave/.test(r); this.chromeWindowsNoCache = false, n && s && (this.chromeWindowsNoCache = true); } getKey() { return this.url; } setHeaders(e) { this.customHeaders = e; } getBytes(e, t, r, n) { return m(this, null, function* () { let s, o; r ? o = r : (s = new AbortController(), o = s.signal); let a = new Headers(this.customHeaders); a.set("range", `bytes=${e}-${e + t - 1}`); let u; this.mustReload ? u = "reload" : this.chromeWindowsNoCache && (u = "no-store"); let c = yield fetch(this.url, { signal: o, cache: u, headers: a }); if (e === 0 && c.status === 416) { let y = c.headers.get("Content-Range"); if (!y || !y.startsWith("bytes */")) throw new Error("Missing content-length on 416 response"); let f = +y.substr(8); c = yield fetch(this.url, { signal: o, cache: "reload", headers: { range: `bytes=0-${f - 1}` } }); } let d = c.headers.get("Etag"); if (d != null && d.startsWith("W/") && (d = null), c.status === 416 || n && d && d !== n) throw this.mustReload = true, new E(`Server returned non-matching ETag ${n} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`); if (c.status >= 300) throw new Error(`Bad response code: ${c.status}`); let h = c.headers.get("Content-Length"); if (c.status === 200 && (!h || +h > t)) throw s && s.abort(), new Error("Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving."); return { data: yield c.arrayBuffer(), etag: d || void 0, cacheControl: c.headers.get("Cache-Control") || void 0, expires: c.headers.get("Expires") || void 0 }; }); } }; l(U, "FetchSource"); var C = U; function g(i, e) { let t = i.getUint32(e + 4, true), r = i.getUint32(e + 0, true); return t * b(2, 32) + r; } __name(g, "g"); l(g, "getUint64"); function X(i, e) { let t = new DataView(i), r = t.getUint8(7); if (r > 3) throw new Error(`Archive is spec version ${r} but this library supports up to spec version 3`); return { specVersion: r, rootDirectoryOffset: g(t, 8), rootDirectoryLength: g(t, 16), jsonMetadataOffset: g(t, 24), jsonMetadataLength: g(t, 32), leafDirectoryOffset: g(t, 40), leafDirectoryLength: g(t, 48), tileDataOffset: g(t, 56), tileDataLength: g(t, 64), numAddressedTiles: g(t, 72), numTileEntries: g(t, 80), numTileContents: g(t, 88), clustered: t.getUint8(96) === 1, internalCompression: t.getUint8(97), tileCompression: t.getUint8(98), tileType: t.getUint8(99), minZoom: t.getUint8(100), maxZoom: t.getUint8(101), minLon: t.getInt32(102, true) / 1e7, minLat: t.getInt32(106, true) / 1e7, maxLon: t.getInt32(110, true) / 1e7, maxLat: t.getInt32(114, true) / 1e7, centerZoom: t.getUint8(118), centerLon: t.getInt32(119, true) / 1e7, centerLat: t.getInt32(123, true) / 1e7, etag: e }; } __name(X, "X"); l(X, "bytesToHeader"); function Z(i) { let e = { buf: new Uint8Array(i), pos: 0 }, t = v(e), r = [], n = 0; for (let s = 0; s < t; s++) { let o = v(e); r.push({ tileId: n + o, offset: 0, length: 0, runLength: 1 }), n += o; } for (let s = 0; s < t; s++) r[s].runLength = v(e); for (let s = 0; s < t; s++) r[s].length = v(e); for (let s = 0; s < t; s++) { let o = v(e); o === 0 && s > 0 ? r[s].offset = r[s - 1].offset + r[s - 1].length : r[s].offset = o - 1; } return r; } __name(Z, "Z"); l(Z, "deserializeIndex"); var R = class R2 extends Error { static { __name(this, "R"); } }; l(R, "EtagMismatch"); var E = R; function K(i, e) { return m(this, null, function* () { let t = yield i.getBytes(0, 16384); if (new DataView(t.data).getUint16(0, true) !== 19792) throw new Error("Wrong magic number for PMTiles archive"); let n = t.data.slice(0, Y), s = X(n, t.etag), o = t.data.slice(s.rootDirectoryOffset, s.rootDirectoryOffset + s.rootDirectoryLength), a = `${i.getKey()}|${s.etag || ""}|${s.rootDirectoryOffset}|${s.rootDirectoryLength}`, u = Z(yield e(o, s.internalCompression)); return [s, [a, u.length, u]]; }); } __name(K, "K"); l(K, "getHeaderAndRoot"); function I(i, e, t, r, n) { return m(this, null, function* () { let s = yield i.getBytes(t, r, void 0, n.etag), o = yield e(s.data, n.internalCompression), a = Z(o); if (a.length === 0) throw new Error("Empty directory is invalid"); return a; }); } __name(I, "I"); l(I, "getDirectory"); var H = class H2 { static { __name(this, "H"); } constructor(e = 100, t = true, r = D) { this.cache = /* @__PURE__ */ new Map(), this.maxCacheEntries = e, this.counter = 1, this.decompress = r; } getHeader(e) { return m(this, null, function* () { let t = e.getKey(), r = this.cache.get(t); if (r) return r.lastUsed = this.counter++, r.data; let n = yield K(e, this.decompress); return n[1] && this.cache.set(n[1][0], { lastUsed: this.counter++, data: n[1][2] }), this.cache.set(t, { lastUsed: this.counter++, data: n[0] }), this.prune(), n[0]; }); } getDirectory(e, t, r, n) { return m(this, null, function* () { let s = `${e.getKey()}|${n.etag || ""}|${t}|${r}`, o = this.cache.get(s); if (o) return o.lastUsed = this.counter++, o.data; let a = yield I(e, this.decompress, t, r, n); return this.cache.set(s, { lastUsed: this.counter++, data: a }), this.prune(), a; }); } prune() { if (this.cache.size > this.maxCacheEntries) { let e = 1 / 0, t; this.cache.forEach((r, n) => { r.lastUsed < e && (e = r.lastUsed, t = n); }), t && this.cache.delete(t); } } invalidate(e) { return m(this, null, function* () { this.cache.delete(e.getKey()); }); } }; l(H, "ResolvedValueCache"); var $ = H; var M = class M2 { static { __name(this, "M"); } constructor(e = 100, t = true, r = D) { this.cache = /* @__PURE__ */ new Map(), this.invalidations = /* @__PURE__ */ new Map(), this.maxCacheEntries = e, this.counter = 1, this.decompress = r; } getHeader(e) { return m(this, null, function* () { let t = e.getKey(), r = this.cache.get(t); if (r) return r.lastUsed = this.counter++, yield r.data; let n = new Promise((s, o) => { K(e, this.decompress).then((a) => { a[1] && this.cache.set(a[1][0], { lastUsed: this.counter++, data: Promise.resolve(a[1][2]) }), s(a[0]), this.prune(); }).catch((a) => { o(a); }); }); return this.cache.set(t, { lastUsed: this.counter++, data: n }), n; }); } getDirectory(e, t, r, n) { return m(this, null, function* () { let s = `${e.getKey()}|${n.etag || ""}|${t}|${r}`, o = this.cache.get(s); if (o) return o.lastUsed = this.counter++, yield o.data; let a = new Promise((u, c) => { I(e, this.decompress, t, r, n).then((d) => { u(d), this.prune(); }).catch((d) => { c(d); }); }); return this.cache.set(s, { lastUsed: this.counter++, data: a }), a; }); } prune() { if (this.cache.size >= this.maxCacheEntries) { let e = 1 / 0, t; this.cache.forEach((r, n) => { r.lastUsed < e && (e = r.lastUsed, t = n); }), t && this.cache.delete(t); } } invalidate(e) { return m(this, null, function* () { let t = e.getKey(); if (this.invalidations.get(t)) return yield this.invalidations.get(t); this.cache.delete(e.getKey()); let r = new Promise((n, s) => { this.getHeader(e).then((o) => { n(), this.invalidations.delete(t); }).catch((o) => { s(o); }); }); this.invalidations.set(t, r); }); } }; l(M, "SharedPromiseCache"); var P = M; var B = class B2 { static { __name(this, "B"); } constructor(e, t, r) { typeof e == "string" ? this.source = new C(e) : this.source = e, r ? this.decompress = r : this.decompress = D, t ? this.cache = t : this.cache = new P(); } getHeader() { return m(this, null, function* () { return yield this.cache.getHeader(this.source); }); } getZxyAttempt(e, t, r, n) { return m(this, null, function* () { let s = G(e, t, r), o = yield this.cache.getHeader(this.source); if (e < o.minZoom || e > o.maxZoom) return; let a = o.rootDirectoryOffset, u = o.rootDirectoryLength; for (let c = 0; c <= 3; c++) { let d = yield this.cache.getDirectory(this.source, a, u, o), h = Q(d, s); if (h) { if (h.runLength > 0) { let p = yield this.source.getBytes(o.tileDataOffset + h.offset, h.length, n, o.etag); return { data: yield this.decompress(p.data, o.tileCompression), cacheControl: p.cacheControl, expires: p.expires }; } a = o.leafDirectoryOffset + h.offset, u = h.length; } else return; } throw new Error("Maximum directory depth exceeded"); }); } getZxy(e, t, r, n) { return m(this, null, function* () { try { return yield this.getZxyAttempt(e, t, r, n); } catch (s) { if (s instanceof E) return this.cache.invalidate(this.source), yield this.getZxyAttempt(e, t, r, n); throw s; } }); } getMetadataAttempt() { return m(this, null, function* () { let e = yield this.cache.getHeader(this.source), t = yield this.source.getBytes(e.jsonMetadataOffset, e.jsonMetadataLength, void 0, e.etag), r = yield this.decompress(t.data, e.internalCompression), n = new TextDecoder("utf-8"); return JSON.parse(n.decode(r)); }); } getMetadata() { return m(this, null, function* () { try { return yield this.getMetadataAttempt(); } catch (e) { if (e instanceof E) return this.cache.invalidate(this.source), yield this.getMetadataAttempt(); throw e; } }); } getTileJson(e) { return m(this, null, function* () { let t = yield this.getHeader(), r = yield this.getMetadata(), n = _(t.tileType); return { tilejson: "3.0.0", scheme: "xyz", tiles: [`${e}/{z}/{x}/{y}${n}`], vector_layers: r.vector_layers, attribution: r.attribution, description: r.description, name: r.name, version: r.version, bounds: [t.minLon, t.minLat, t.maxLon, t.maxLat], center: [t.centerLon, t.centerLat, t.centerZoom], minzoom: t.minZoom, maxzoom: t.maxZoom }; }); } }; l(B, "PMTiles"); var x = B; // ../shared/index.ts var pmtiles_path = /* @__PURE__ */ __name((name, setting) => { if (setting) { return setting.replaceAll("{name}", name); } return name + ".pmtiles"; }, "pmtiles_path"); var TILE = /^\/(?[0-9a-zA-Z\/!\-_\.\*\'\(\)]+)\/(?\d+)\/(?\d+)\/(?\d+).(?[a-z]+)$/; var TILESET = /^\/(?[0-9a-zA-Z\/!\-_\.\*\'\(\)]+).json$/; var tile_path = /* @__PURE__ */ __name((path) => { const tile_match = path.match(TILE); if (tile_match) { const g2 = tile_match.groups; return { ok: true, name: g2.NAME, tile: [+g2.Z, +g2.X, +g2.Y], ext: g2.EXT }; } const tileset_match = path.match(TILESET); if (tileset_match) { const g2 = tileset_match.groups; return { ok: true, name: g2.NAME, ext: "json" }; } return { ok: false, name: "", tile: [0, 0, 0], ext: "" }; }, "tile_path"); // src/index.ts var KeyNotFoundError = class extends Error { static { __name(this, "KeyNotFoundError"); } }; async function nativeDecompress(buf, compression) { if (compression === J.None || compression === J.Unknown) { return buf; } if (compression === J.Gzip) { const stream = new Response(buf).body; const result = stream?.pipeThrough(new DecompressionStream("gzip")); return new Response(result).arrayBuffer(); } throw new Error("Compression method not supported"); } __name(nativeDecompress, "nativeDecompress"); var CACHE = new $(25, void 0, nativeDecompress); var R2Source = class { static { __name(this, "R2Source"); } constructor(env, archiveName) { this.env = env; this.archiveName = archiveName; } getKey() { return this.archiveName; } async getBytes(offset, length, signal, etag) { const resp = await this.env.BUCKET.get( pmtiles_path(this.archiveName, this.env.PMTILES_PATH), { range: { offset, length }, onlyIf: { etagMatches: etag } } ); if (!resp) { throw new KeyNotFoundError("Archive not found"); } const o = resp; if (!o.body) { throw new E(); } const a = await o.arrayBuffer(); return { data: a, etag: o.etag, cacheControl: o.httpMetadata?.cacheControl, expires: o.httpMetadata?.cacheExpiry?.toISOString() }; } }; var index_default = { async fetch(request, env, ctx) { if (request.method.toUpperCase() === "POST") return new Response(void 0, { status: 405 }); const url = new URL(request.url); const { ok, name, tile, ext } = tile_path(url.pathname); const cache = caches.default; if (!ok) { return new Response("Invalid URL", { status: 404 }); } let allowedOrigin = ""; 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 = /* @__PURE__ */ __name((body, cacheableHeaders2, status) => { cacheableHeaders2.set( "Cache-Control", env.CACHE_CONTROL || "public, max-age=86400" ); const cacheable = new Response(body, { headers: cacheableHeaders2, status }); ctx.waitUntil(cache.put(request.url, cacheable)); const respHeaders = new Headers(cacheableHeaders2); if (allowedOrigin) respHeaders.set("Access-Control-Allow-Origin", allowedOrigin); respHeaders.set("Vary", "Origin"); return new Response(body, { headers: respHeaders, status }); }, "cacheableResponse"); const cacheableHeaders = new Headers(); const source = new R2Source(env, name); const p = new x(source, CACHE, nativeDecompress); try { const pHeader = await p.getHeader(); if (!tile) { cacheableHeaders.set("Content-Type", "application/json"); const t = await p.getTileJson( `https://${env.PUBLIC_HOSTNAME || url.hostname}/${name}` ); return cacheableResponse(JSON.stringify(t), cacheableHeaders, 200); } if (tile[0] < pHeader.minZoom || tile[0] > pHeader.maxZoom) { return cacheableResponse(void 0, cacheableHeaders, 404); } for (const pair of [ [O.Mvt, "mvt"], [O.Png, "png"], [O.Jpeg, "jpg"], [O.Webp, "webp"], [O.Avif, "avif"] ]) { if (pHeader.tileType === pair[0] && ext !== pair[1]) { if (pHeader.tileType === O.Mvt && ext === "pbf") { 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 O.Mvt: cacheableHeaders.set("Content-Type", "application/x-protobuf"); break; case O.Png: cacheableHeaders.set("Content-Type", "image/png"); break; case O.Jpeg: cacheableHeaders.set("Content-Type", "image/jpeg"); break; case O.Webp: cacheableHeaders.set("Content-Type", "image/webp"); break; } if (tiledata) { return cacheableResponse(tiledata.data, cacheableHeaders, 200); } return cacheableResponse(void 0, cacheableHeaders, 204); } catch (e) { if (e instanceof KeyNotFoundError) { return cacheableResponse("Archive not found", cacheableHeaders, 404); } throw e; } } }; export { index_default as default }; //# sourceMappingURL=index.js.map