isard 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +23 -6
  3. package/dist/basemap/basemaps.js +1 -0
  4. package/dist/basemap/basemaps.js.map +1 -1
  5. package/dist/basemap/vectortiles/context.d.ts +43 -0
  6. package/dist/basemap/vectortiles/context.js +6 -0
  7. package/dist/basemap/vectortiles/context.js.map +1 -0
  8. package/dist/basemap/vectortiles/extrusions.d.ts +11 -0
  9. package/dist/basemap/vectortiles/extrusions.js +46 -0
  10. package/dist/basemap/vectortiles/extrusions.js.map +1 -0
  11. package/dist/basemap/vectortiles/labels.d.ts +22 -0
  12. package/dist/basemap/vectortiles/labels.js +225 -0
  13. package/dist/basemap/vectortiles/labels.js.map +1 -0
  14. package/dist/basemap/vectortiles/requests.d.ts +24 -0
  15. package/dist/basemap/vectortiles/requests.js +61 -0
  16. package/dist/basemap/vectortiles/requests.js.map +1 -0
  17. package/dist/basemap/vectortiles/street-wind.d.ts +19 -0
  18. package/dist/basemap/vectortiles/street-wind.js +133 -0
  19. package/dist/basemap/vectortiles/street-wind.js.map +1 -0
  20. package/dist/basemap/vectortiles/style.d.ts +47 -0
  21. package/dist/basemap/vectortiles/style.js +141 -0
  22. package/dist/basemap/vectortiles/style.js.map +1 -0
  23. package/dist/basemap/vectortiles/tiles.d.ts +34 -0
  24. package/dist/basemap/vectortiles/tiles.js +62 -0
  25. package/dist/basemap/vectortiles/tiles.js.map +1 -0
  26. package/dist/basemap/vectortiles/trees.d.ts +19 -0
  27. package/dist/basemap/vectortiles/trees.js +93 -0
  28. package/dist/basemap/vectortiles/trees.js.map +1 -0
  29. package/dist/basemap/vectortiles/vectors.d.ts +20 -0
  30. package/dist/basemap/vectortiles/vectors.js +167 -0
  31. package/dist/basemap/vectortiles/vectors.js.map +1 -0
  32. package/dist/basemap/vectortiles.d.ts +34 -75
  33. package/dist/basemap/vectortiles.js +70 -654
  34. package/dist/basemap/vectortiles.js.map +1 -1
  35. package/dist/basemap/workerpool.js +33 -5
  36. package/dist/basemap/workerpool.js.map +1 -1
  37. package/dist/basemap.worker.js +2 -2
  38. package/dist/basemap.worker.js.map +8 -5
  39. package/dist/bind/layers.js +10 -0
  40. package/dist/bind/layers.js.map +1 -1
  41. package/dist/decoder.worker.js +5 -4
  42. package/dist/decoder.worker.js.map +8 -6
  43. package/dist/engine/decoders.d.ts +4 -8
  44. package/dist/engine/decoders.js +29 -2
  45. package/dist/engine/decoders.js.map +1 -1
  46. package/dist/engine-loader.d.ts +4 -1
  47. package/dist/engine-loader.js +9 -0
  48. package/dist/engine-loader.js.map +1 -1
  49. package/dist/grid-module.d.ts +44 -0
  50. package/dist/grid-module.js +63 -0
  51. package/dist/grid-module.js.map +1 -0
  52. package/dist/grids.d.ts +51 -0
  53. package/dist/grids.js +88 -0
  54. package/dist/grids.js.map +1 -0
  55. package/dist/index.d.ts +10 -1
  56. package/dist/index.js +3 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/isard_bg.wasm +0 -0
  59. package/dist/isard_core_bg.wasm +0 -0
  60. package/dist/isard_grid_bg.wasm +0 -0
  61. package/dist/layers/flow.d.ts +118 -0
  62. package/dist/layers/flow.js +263 -0
  63. package/dist/layers/flow.js.map +1 -0
  64. package/dist/layers/panoramas.d.ts +2 -0
  65. package/dist/layers/panoramas.js +27 -6
  66. package/dist/layers/panoramas.js.map +1 -1
  67. package/dist/layers/symbols.d.ts +2 -0
  68. package/dist/layers/symbols.js +2 -1
  69. package/dist/layers/symbols.js.map +1 -1
  70. package/dist/map/layer-spec.d.ts +4 -1
  71. package/dist/map/layer-spec.js +2 -0
  72. package/dist/map/layer-spec.js.map +1 -1
  73. package/dist/map/workers.d.ts +4 -0
  74. package/dist/map/workers.js +38 -0
  75. package/dist/map/workers.js.map +1 -1
  76. package/dist/map.d.ts +14 -0
  77. package/dist/map.js +19 -1
  78. package/dist/map.js.map +1 -1
  79. package/dist/react/Layer.d.ts +2 -0
  80. package/dist/react/Layer.js.map +1 -1
  81. package/dist/types.d.ts +7 -3
  82. package/dist/types.js.map +1 -1
  83. package/dist/util/read.d.ts +4 -0
  84. package/dist/util/read.js +28 -0
  85. package/dist/util/read.js.map +1 -0
  86. package/dist/wasm/isard.d.ts +55 -0
  87. package/dist/wasm/isard.js +112 -1
  88. package/dist/wasm/isard_core.d.ts +55 -0
  89. package/dist/wasm/isard_core.js +112 -1
  90. package/dist/wasm/isard_grid.d.ts +101 -0
  91. package/dist/wasm/isard_grid.js +375 -0
  92. package/dist/workers/basemap/street.d.ts +19 -0
  93. package/dist/workers/basemap.worker.d.ts +21 -0
  94. package/dist/workers/basemap.worker.js +23 -4
  95. package/dist/workers/basemap.worker.js.map +1 -1
  96. package/package.json +2 -1
  97. package/vite.js +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"vectortiles.js","sourceRoot":"","sources":["../../src/basemap/vectortiles.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Vector basemaps from a MapLibre style (OpenFreeMap's Positron by default): the fills, lines, circles and raster\n * layers drawn tile by tile in workers into the raster pool, so that they lie on the relief like any basemap and\n * composite with the hillshade in one pass; and the labels of the style's symbol layers in a symbol layer of their own,\n * kept above the application's layers (as MapLibre's `beforeId: firstSymbol` does), listed by the workers, shaped in\n * the page once per vector tile, placed by the engine.\n *\n * Any subset of the style can be drawn on its own raster layer (`raster({ layers })`), at its own place in the stack:\n * rivers from the basemap's data over a flood layer, for instance, restyled with `extraLayers`.\n */\n\nimport { withHeaders } from '../engine/requests.ts';\nimport { IGN_ATTRIBUTION } from '../geoplateforme.ts';\nimport type { ExtrusionLayer, ExtrusionOptions } from '../layers/extrusions.ts';\nimport type { Feature, Size } from '../layers/features.ts';\nimport { type LoadedSprite, loadSprites, readPixels } from '../layers/icons.ts';\nimport type { Layer, ModelLayer, RasterLayer } from '../layers/layers.ts';\nimport type { SymbolLayer } from '../layers/symbols.ts';\nimport type { VectorLayer, VectorSublayer } from '../layers/vectors.ts';\nimport type { GeoMap } from '../map.ts';\nimport type { Anchor } from '../ui/overlay.ts';\nimport { mercatorX, mercatorY } from '../util/geo.ts';\nimport { isRecord } from '../util/guards.ts';\nimport { Lru } from '../util/lru.ts';\nimport type { Camera } from '../wasm/isard.js';\nimport type { BasemapWork, Priority, Sprite, TilePolygons } from '../workers/basemap.worker.ts';\nimport { OPENFREEMAP_ATTRIBUTION } from './basemaps.ts';\nimport { pmtiles, pmtilesUrl } from './pmtiles.ts';\nimport { isWoodland, TREE_NUMBERS, type TreeColors, treeModel, treeSpacing } from './trees.ts';\nimport {\n evaluate,\n isExpression,\n isStyle,\n type Json,\n type LabelCandidate,\n labelFont,\n type RasterSource,\n type Style,\n type StyleLayer,\n vectorKind,\n zoomOnly,\n} from './vectorstyle.ts';\nimport { type BasemapWorkers, rendererKey, tilePriority } from './workerpool.ts';\n\n/** OpenFreeMap's styles: OpenStreetMap data in the OpenMapTiles schema, worldwide, free and without a key */\nexport const OPENFREEMAP_STYLES = {\n positron: 'https://tiles.openfreemap.org/styles/positron',\n liberty: 'https://tiles.openfreemap.org/styles/liberty',\n bright: 'https://tiles.openfreemap.org/styles/bright',\n} as const;\n\n/** PLAN.IGN vector styles of the Géoplateforme (France) */\nexport const PLAN_STYLES = {\n standard: 'https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/standard.json',\n grey: 'https://data.geopf.fr/annexes/ressources/vectorTiles/styles/PLAN.IGN/gris.json',\n} as const;\n\n/** Vector basemaps by name (see `BasemapName`) */\nexport const VECTOR_BASEMAPS = {\n 'osm-positron': OPENFREEMAP_STYLES.positron,\n 'osm-liberty': OPENFREEMAP_STYLES.liberty,\n 'osm-bright': OPENFREEMAP_STYLES.bright,\n 'ign-plan-vector': PLAN_STYLES.standard,\n 'ign-plan-grey-vector': PLAN_STYLES.grey,\n} as const;\n\nexport interface VectorTilesOptions {\n /** A style URL or object (default OpenFreeMap's Positron) */\n style?: string | Style;\n /** Workers drawing the tiles (default cores - 1, 1 to 4). The vector tiles of a map share its workers (and their\n * decoded tiles); another count gives these tiles workers of their own */\n workers?: number;\n /** Where to load the worker from, when a bundler does not resolve the default URL (default the map's\n * `basemapWorkerUrl`); another URL than the map's gives these tiles workers of their own */\n workerUrl?: string | URL;\n /** Credits of the tiles, shown while its raster layers are on the map (default: OpenFreeMap's for its styles, the\n * IGN's for PLAN.IGN's) */\n attribution?: string;\n}\n\n/** The credits of a known style: OpenFreeMap's, PLAN.IGN's */\nexport const styleAttribution = (style: string | Style): string | undefined => {\n if (typeof style !== 'string') return undefined;\n if (Object.values(OPENFREEMAP_STYLES).some((s) => s === style)) return OPENFREEMAP_ATTRIBUTION;\n if (Object.values(PLAN_STYLES).some((s) => s === style)) return IGN_ATTRIBUTION;\n\n return undefined;\n};\n\n/** Text or icon size of a style (a number, legacy stops, or the stops of a zoom expression made by the worker) as a\n * size for the symbol layer */\nexport const size = (value: Json, fallback = 16): Size => {\n const stop = (s: Json): [number, number] => {\n const [z, v] = Array.isArray(s) ? s : [];\n\n return [Number(z), Number(v)];\n };\n\n if (typeof value === 'number') return value;\n if (Array.isArray(value) && value.length > 0 && value.every(Array.isArray)) return value.map(stop);\n if (isRecord(value) && Array.isArray(value.stops)) return value.stops.map(stop);\n\n return fallback;\n};\n\n/** The anchors of the symbol layer */\nconst ANCHORS: ReadonlySet<string> = new Set<Anchor>([\n 'center',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'top-left',\n 'top-right',\n 'bottom-left',\n 'bottom-right',\n]);\n\nconst isAnchor = (value: string | undefined): value is Anchor => value !== undefined && ANCHORS.has(value);\n\n/** A style's anchor (`text-anchor`, `icon-anchor`) for the symbol layer: `center` if it is none */\nconst anchor = (value: string | undefined): Anchor => (isAnchor(value) ? value : 'center');\n\n/** Fetches a JSON document (a style, a TileJSON) */\nconst json = async (url: string): Promise<unknown> => {\n const response = await fetch(url, withHeaders(url));\n\n if (!response.ok) throw new Error(`${url}: ${response.status}`);\n\n return response.json();\n};\n\n/** A style fetched: a MapLibre style, or an error */\nconst fetchStyle = async (url: string): Promise<Style> => {\n const style = await json(url);\n\n if (!isStyle(style)) throw new Error(`${url}: not a MapLibre style`);\n\n return style;\n};\n\n/** What a basemap reads of a TileJSON */\ninterface TileJson {\n tiles: string[];\n maxzoom?: number;\n}\n\nconst isTileJson = (value: unknown): value is TileJson =>\n isRecord(value) &&\n Array.isArray(value.tiles) &&\n value.tiles.every((t) => typeof t === 'string') &&\n (value.maxzoom === undefined || typeof value.maxzoom === 'number');\n\n/** A TileJSON fetched, or an error */\nconst fetchTileJson = async (url: string): Promise<TileJson> => {\n const tilejson = await json(url);\n\n if (!isTileJson(tilejson)) throw new Error(`${url}: not a TileJSON`);\n\n return tilejson;\n};\n\n/**\n * A style source's tiles and deepest level: a `pmtiles://` archive (its `url`, or a `tiles` template) read for its\n * header, its tiles then named `pmtiles://<absolute archive URL>/{z}/{x}/{y}` for the workers; other sources as they are\n */\nconst resolveSource = async (source: Style['sources'][string]): Promise<{ tiles?: string[]; maxzoom?: number }> => {\n const given = source.url ?? source.tiles?.[0] ?? '';\n const archive = pmtilesUrl(given.replace(/\\/\\{z\\}\\/\\{x\\}\\/\\{y\\}$/, ''));\n\n if (!archive)\n return {\n ...(source.tiles ? { tiles: source.tiles } : {}),\n ...(source.maxzoom === undefined ? {} : { maxzoom: source.maxzoom }),\n };\n\n const header = await pmtiles(archive).header();\n\n return { tiles: [`pmtiles://${archive}/{z}/{x}/{y}`], maxzoom: source.maxzoom ?? header.maxZoom };\n};\n\n/** Pause before the labels of tiles that failed are asked for again, when no move brings an update (ms) */\nconst RETRY_LABELS_MS = 3000;\n\n/** The style layers of buildings, by default: PLAN IGN's `bati_surf` (not its built-up areas nor its parks), the\n * OpenMapTiles' `building` */\nconst isBuildings = (layer: StyleLayer): boolean => ['bati_surf', 'building'].includes(layer['source-layer'] ?? '');\n\n/**\n * The tiles of level `z` in view, within a window around the center (a tilted view's bounds reach far), the\n * `maxTiles` nearest to the center first\n */\nconst tilesAround = (map: GeoMap, camera: Camera, z: number, maxTiles: number): [x: number, y: number][] => {\n const n = 2 ** z;\n const [west, south, east, north] = map.getBounds();\n const tx = (lon: number) => Math.floor(mercatorX(lon) * n);\n const ty = (lat: number) => Math.floor(mercatorY(lat) * n);\n const [cx, cy] = [mercatorX(camera.center[0]) * n, mercatorY(camera.center[1]) * n];\n const reach = Math.ceil(Math.sqrt(maxTiles)) + 2;\n const [x0, x1] = [Math.max(0, tx(west), Math.floor(cx) - reach), Math.min(n - 1, tx(east), Math.floor(cx) + reach)];\n const [y0, y1] = [Math.max(0, ty(north), Math.floor(cy) - reach), Math.min(n - 1, ty(south), Math.floor(cy) + reach)];\n const wanted = Array.from({ length: Math.max(0, y1 - y0 + 1) }, (_, j) => y0 + j).flatMap((y) =>\n Array.from({ length: Math.max(0, x1 - x0 + 1) }, (_, i): [number, number] => [x0 + i, y]),\n );\n\n wanted.sort((a, b) => Math.hypot(a[0] + 0.5 - cx, a[1] + 0.5 - cy) - Math.hypot(b[0] + 0.5 - cx, b[1] + 0.5 - cy));\n\n return wanted.slice(0, maxTiles);\n};\n\n/** The labels of a vector tile: features by style layer (its index in the style), the higher layers first */\ntype TileLabels = [layer: number, features: Feature<LabelCandidate>[]][];\n\n/** A tile's label candidates as features, by style layer */\nexport const tileLabels = (candidates: readonly LabelCandidate[]): TileLabels => {\n const byLayer = new Map<number, Feature<LabelCandidate>[]>();\n\n candidates.forEach((p) => {\n const feature: Feature<LabelCandidate> = {\n type: 'Feature',\n properties: p,\n geometry: p.along\n ? {\n type: 'LineString',\n coordinates: [\n [p.lon - p.along[0] / 2, p.lat - p.along[1] / 2],\n [p.lon + p.along[0] / 2, p.lat + p.along[1] / 2],\n ],\n }\n : { type: 'Point', coordinates: [p.lon, p.lat] },\n };\n const list = byLayer.get(p.layer);\n\n if (list) list.push(feature);\n else byLayer.set(p.layer, [feature]);\n });\n\n return [...byLayer].sort((a, b) => b[0] - a[0]);\n};\n\nexport class VectorTiles {\n private readonly pool: BasemapWorkers;\n /** The pool is this instance's own (a worker count or URL other than the map's): stopped with it */\n private readonly ownPool: boolean;\n /** Prefix of its renderer keys in the pool's workers */\n private readonly namespace: string;\n private destroyed = false;\n private keys = 0;\n /** Renderers sent to the workers, dropped on destroy */\n private readonly renderers: string[] = [];\n private readonly cleanup: (() => void)[] = [];\n /** Credits of its raster layers */\n private readonly attribution: string | undefined;\n /** Its raster and label layers, removed with it */\n private readonly layers: Layer[] = [];\n /** Its first raster layer: the ground its labels follow */\n private ground: RasterLayer | undefined;\n /** The style once loaded, with its source resolved */\n readonly ready: Promise<{ style: Style; tiles: string; maxzoom: number; rasters: Record<string, RasterSource> }>;\n\n /**\n * Its workers are the map's (shared by every `VectorTiles` of the map, a vector tile decoded once for all of them),\n * unless `workers` or `workerUrl` asks for others than the map's: then it has workers of its own\n */\n constructor(\n private readonly map: GeoMap,\n options: VectorTilesOptions = {},\n ) {\n const { pool, own } = map.basemapWorkers(options.workers, options.workerUrl);\n\n this.pool = pool;\n this.ownPool = own;\n this.namespace = pool.namespace();\n\n const style = options.style ?? OPENFREEMAP_STYLES.positron;\n\n this.attribution = options.attribution ?? styleAttribution(style);\n this.ready = this.load(style);\n // Reported once here; `ready`, the raster tiles and the labels fail with it\n this.ready.catch((error: unknown) => {\n if (!this.destroyed) console.warn('isard: vector tiles', error);\n });\n }\n\n private async load(input: string | Style) {\n const style = typeof input === 'string' ? await fetchStyle(input) : input;\n const [name, source] = Object.entries(style.sources).find(([, s]) => s.type === 'vector') ?? [];\n\n if (!name || !source) throw new Error('the style has no vector source');\n\n const resolved = await resolveSource(source);\n const tilejson = !resolved.tiles && source.url ? await fetchTileJson(source.url) : undefined;\n const tiles = tilejson === undefined ? resolved.tiles : tilejson.tiles;\n const maxzoom = resolved.maxzoom ?? tilejson?.maxzoom;\n const template = tiles?.[0];\n\n if (!template) throw new Error(`source ${name} has no tiles`);\n\n // Its raster sources of tiles, drawn into the same images (the shaded relief of a style at low zoom)\n const rasters: Record<string, RasterSource> = {};\n\n for (const [key, s] of Object.entries(style.sources)) {\n if (s.type !== 'raster') continue;\n\n const r = await resolveSource(s);\n const url = r.tiles?.[0];\n\n if (url) rasters[key] = { tiles: url, maxzoom: r.maxzoom ?? 22, tileSize: s.tileSize ?? 512 };\n }\n\n // Only the layers of those sources (and the background); other types (hillshade, heatmap…) are left out. The\n // application's style object stays as it is\n const layers = style.layers.filter(\n (l) =>\n l.type === 'background' ||\n (l.source === name && l.type !== 'raster') ||\n (l.type === 'raster' && l.source !== undefined && rasters[l.source] !== undefined),\n );\n\n return { style: { ...style, layers }, tiles: template, maxzoom: maxzoom ?? 14, rasters };\n }\n\n /** The fonts of the style's labels, for its glyphs (the first of each `text-font`, as the workers take it) */\n private static fonts(style: Style): string[] {\n const fonts = new Set<string>();\n\n style.layers.forEach((layer) => {\n const font = layer.layout?.['text-font'];\n\n if (layer.type === 'symbol' && Array.isArray(font) && typeof font[0] === 'string') fonts.add(labelFont(font[0]));\n });\n\n return [...fonts];\n }\n\n /** The style's sprites (their JSON and their images), loaded once, for the fill patterns and the icons */\n private sprites: Promise<LoadedSprite[]> | undefined;\n\n private loadSprites(sprite: Style['sprite']): Promise<LoadedSprite[]> {\n this.sprites ??= loadSprites(sprite).catch(() => []);\n\n return this.sprites;\n }\n\n /** Prefix of the names of its sprites' images among the map's icons */\n private get iconPrefix(): string {\n return `${this.namespace}/`;\n }\n\n private request(vz: number, vx: number, vy: number, work: BasemapWork, signal?: AbortSignal) {\n if (this.destroyed) return Promise.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n\n return this.pool.request(this.pool.worker(vz, vx, vy), work, this, signal);\n }\n\n /** Sends a renderer of these layers to every worker (again under `again`, restyled); returns its key */\n private async renderer(select: (layer: StyleLayer) => boolean, extra: StyleLayer[], again?: string) {\n const { style, tiles, maxzoom, rasters } = await this.ready;\n const key = again ?? rendererKey(this.namespace, this.keys++);\n const layers = [...style.layers.filter(select), ...extra];\n const patterns = layers.some((l) => l.paint?.['fill-pattern'] !== undefined);\n // The images are downloaded once, copied to each worker\n const sprites: Sprite[] = patterns && style.sprite ? await this.loadSprites(style.sprite) : [];\n\n if (this.destroyed) throw new DOMException('isard: vector tiles destroyed', 'AbortError');\n this.pool.broadcast({ type: 'init', key, tiles, maxzoom, layers, rasters, ...(sprites.length ? { sprites } : {}) });\n if (!again) this.renderers.push(key);\n\n return { key, maxzoom, layers };\n }\n\n /**\n * A raster layer drawing the style's fills, lines and circles (or those `layers` keeps, then `extraLayers`, of the\n * same source); `size`: texture size of its tiles (512 by default: sharp lines)\n */\n raster(\n options: {\n layers?: (layer: StyleLayer) => boolean;\n extraLayers?: StyleLayer[];\n size?: number;\n opacity?: number;\n minZoom?: number;\n maxZoom?: number;\n before?: Parameters<GeoMap['addRaster']>[0]['before'];\n } = {},\n ): RasterLayer {\n const { layers = () => true, extraLayers = [], size: texture = 512, opacity = 1, before } = options;\n const drawn = (l: StyleLayer) => l.type !== 'symbol' && layers(l);\n const renderer = this.renderer(drawn, extraLayers);\n\n // Its failure is reported by `ready` and each tile\n renderer.catch(() => undefined);\n\n const loader = async (z: number, x: number, y: number, signal: AbortSignal) => {\n const { key, maxzoom } = await renderer;\n // The vector tile it is drawn from (see the worker)\n const vz = Math.max(0, Math.min(z - 1, maxzoom));\n const shift = z - vz;\n const priority = tilePriority(z, x, y, this.map.getCamera());\n const response = await this.request(\n vz,\n x >> shift,\n y >> shift,\n { type: 'render', key, z, x, y, size: texture, priority },\n signal,\n );\n\n return 'image' in response ? response.image : null;\n };\n const layer = this.map.addRaster({\n url: '',\n size: texture,\n opacity,\n minZoom: options.minZoom ?? 0,\n maxZoom: options.maxZoom ?? 20,\n loader,\n ...(this.attribution ? { attribution: this.attribution } : {}),\n ...(before ? { before } : {}),\n });\n\n this.layers.push(layer);\n this.ground ??= layer;\n\n return layer;\n }\n\n /**\n * An extrusion layer of the polygons of the style's fill layers that `layers` keeps (by default its buildings: the\n * fill or fill-extrusion layers of PLAN IGN's `bati_surf` or OpenMapTiles' `building`), raised by the style\n * given (`height`, `base`, `color`, `ramp`…; the properties of the tiles' features). Its tiles follow the view: at\n * the source's deepest level, the `maxTiles` nearest to the center, from `minZoom` on (15 by default); the tiles\n * leaving the view are dropped.\n */\n extrusions<P = Record<string, unknown>>(\n options: Omit<ExtrusionOptions<P>, 'data'> & {\n layers?: (layer: StyleLayer) => boolean;\n minZoom?: number;\n maxTiles?: number;\n } = {},\n ): ExtrusionLayer<P> {\n const { layers = isBuildings, minZoom = 15, maxTiles = 36, ...style } = options;\n const extrusions = this.map.addExtrusions<P>(style);\n const renderer = this.renderer((l) => (l.type === 'fill' || l.type === 'fill-extrusion') && layers(l), []);\n\n renderer.catch(() => undefined);\n this.layers.push(extrusions);\n\n /** The tiles held or asked for, by key */\n const held = new Map<string, AbortController>();\n const update = async () => {\n if (this.destroyed) return;\n\n const { key, maxzoom } = await renderer;\n const camera = this.map.getCamera();\n const z = maxzoom;\n const wanted = camera.zoom < minZoom ? [] : tilesAround(this.map, camera, z, maxTiles);\n const keys = new Set(wanted.map(([x, y]) => `${z}/${x}/${y}`));\n\n // Out of view: dropped, or no longer asked for\n [...held].forEach(([k, controller]) => {\n if (keys.has(k)) return;\n controller.abort();\n held.delete(k);\n extrusions.removeTile(k);\n });\n wanted.forEach(([x, y], index) => {\n const k = `${z}/${x}/${y}`;\n\n if (held.has(k)) return;\n\n const controller = new AbortController();\n const work: BasemapWork = { type: 'polygons', key, z, x, y, priority: index < 4 ? 'auto' : 'low' };\n\n held.set(k, controller);\n this.request(z, x, y, work, controller.signal).then(\n (r) => {\n if (controller.signal.aborted || !('polygons' in r)) return;\n\n const tile: TilePolygons = r.polygons;\n\n // The features' properties as the style reads them\n extrusions.setTile(k, { arrays: tile.arrays, properties: tile.properties as P[] });\n },\n () => {\n // A failure is asked for again on the next update\n if (held.get(k) === controller) held.delete(k);\n },\n );\n });\n };\n this.followView(update, held, update);\n\n return extrusions;\n }\n\n /**\n * Trees on the style's woods, forests and grass (or the fill layers `layers` keeps) as 3D models, from street level\n * (`minZoom`, default 15): the workers scatter them over the polygons of the vector tiles around the view, `spacing`\n * metres apart (by style layer: 9 in woods, 25 on grass, by default) on a jittered grid, the same trees whenever a\n * tile comes back; the engine draws them all in one instanced draw, on the relief. A low-poly tree by default (its\n * `colors`), or your own glTF (`url`, `data`, about 10 metres high, standing on its origin). Dense around the\n * view's center, fewer and fewer away from it (as the camera moves too), at most `maxInstances` drawn (default\n * 25000); at most `maxTiles` tiles (default 9) and `maxTrees` trees in each (default 30000). The models load the\n * engine with 3D Tiles.\n */\n trees(\n options: {\n layers?: (layer: StyleLayer) => boolean;\n spacing?: number | ((layer: StyleLayer) => number);\n minZoom?: number;\n maxTiles?: number;\n maxTrees?: number;\n maxInstances?: number;\n colors?: Partial<TreeColors>;\n url?: string;\n data?: ArrayBuffer | ArrayBufferView<ArrayBuffer>;\n before?: Layer;\n } = {},\n ): ModelLayer {\n const {\n layers = isWoodland,\n spacing = treeSpacing,\n minZoom = 15,\n maxTiles = 9,\n maxTrees = 30000,\n maxInstances = 25000,\n } = options;\n const model = options.url ? { url: options.url } : { data: options.data ?? treeModel(options.colors) };\n const trees = this.map.addModels({\n ...model,\n instances: [],\n ...(options.before ? { before: options.before } : {}),\n });\n const renderer = this.renderer((l) => l.type === 'fill' && layers(l), []);\n\n renderer.catch(() => undefined);\n this.layers.push(trees);\n\n /** The tiles held or asked for, by key, and the trees of those that came */\n const held = new Map<string, AbortController>();\n const found = new Map<string, Float64Array>();\n /** The trees drawn to the engine (longitude, latitude, altitude, heading, pitch, roll, scale each): all of them\n * near the view's center, past `near` metres those of a rank under (near / distance)², at most `maxInstances` */\n const send = () => {\n const { center, zoom } = this.map.getCamera();\n const near = TREES_NEAR_METRES * 2 ** (16 - zoom);\n const metresPerDegree = 111320;\n const cos = Math.cos((center[1] * Math.PI) / 180);\n const chosen: [score: number, tile: Float64Array, i: number][] = [];\n\n found.forEach((t) => {\n for (let i = 0; i < t.length / TREE_NUMBERS; i += 1) {\n const dx = ((t[i * TREE_NUMBERS] ?? 0) - center[0]) * metresPerDegree * cos;\n const dy = ((t[i * TREE_NUMBERS + 1] ?? 0) - center[1]) * metresPerDegree;\n const far = (dx * dx + dy * dy) / (near * near);\n const score = (t[i * TREE_NUMBERS + 4] ?? 0) * Math.max(1, far);\n\n if (score < 1) chosen.push([score, t, i]);\n }\n });\n if (chosen.length > maxInstances) chosen.sort((a, b) => a[0] - b[0]).splice(maxInstances);\n\n const out = new Float64Array(chosen.length * 7);\n\n chosen.forEach(([, t, i], k) => {\n const at = i * TREE_NUMBERS;\n\n out.set([t[at] ?? 0, t[at + 1] ?? 0, 0, t[at + 3] ?? 0, 0, 0, t[at + 2] ?? 1], k * 7);\n });\n trees.setInstanceNumbers(out);\n };\n const update = async () => {\n if (this.destroyed) return;\n\n const { key, maxzoom, layers: list } = await renderer;\n const camera = this.map.getCamera();\n const z = maxzoom;\n const wanted = camera.zoom < minZoom ? [] : tilesAround(this.map, camera, z, maxTiles);\n const keys = new Set(wanted.map(([x, y]) => `${z}/${x}/${y}`));\n const metres = list.map((l) => (typeof spacing === 'number' ? spacing : spacing(l)));\n const dropped = [...held.keys()].filter((k) => !keys.has(k));\n\n // Out of view: dropped, or no longer asked for\n dropped.forEach((k) => {\n held.get(k)?.abort();\n held.delete(k);\n found.delete(k);\n });\n // Dense around the new center\n send();\n wanted.forEach(([x, y], index) => {\n const k = `${z}/${x}/${y}`;\n\n if (held.has(k)) return;\n\n const controller = new AbortController();\n const priority = index < 4 ? 'auto' : 'low';\n const work: BasemapWork = { type: 'trees', key, z, x, y, spacing: metres, maxTrees, priority };\n\n held.set(k, controller);\n this.request(z, x, y, work, controller.signal).then(\n (r) => {\n if (controller.signal.aborted || !('trees' in r)) return;\n found.set(k, r.trees);\n send();\n },\n () => {\n // A failure is asked for again on the next update\n if (held.get(k) === controller) held.delete(k);\n },\n );\n });\n };\n // While the camera moves, the trees drawn follow its center (dense near it)\n this.followView(update, held, send);\n\n return trees;\n }\n\n /**\n * A layer drawing the style's fills, lines and buildings (or those `layers` keeps; backgrounds as fills, the\n * `fill-extrusion` layers raised into buildings by their height and base height) as geometry instead of images: the\n * workers cut the vector tiles in view into polygons and lines, which the engine draws on the globe and the relief,\n * in the style's order, each style layer over its zoom range. Sharp at any zoom\n * and pitch, picked by feature (`pick` gives its properties and style layer), restyled without cutting the tiles\n * again (`setPaintProperty`, `setLayoutProperty`). Its tiles follow the view, while it moves too, coarser far away in a\n * tilted view, and those leaving it stay until the ones replacing them are there; past the source's deepest level,\n * cut again from its tiles down to level 18 (overzoom: their filters and styles those of their level). The fills' outlines are drawn one\n * pixel wide, the lines' ends as their `line-cap` says (their joins round), the colors follow the camera's zoom. The\n * layers drawn with a pattern and the circles are left out (the raster path draws them), as are `line-offset`,\n * `line-blur` and the translations (`fill-translate`, `line-translate`); `raster` stays the lighter path for heavy\n * styles and small devices. At night (`setSun`) the line layers `streets` keeps glow (by default those whose id names\n * a road, not its casing, a railway, a path or a tunnel).\n */\n vectors(\n options: { layers?: (layer: StyleLayer) => boolean; streets?: (layer: StyleLayer) => boolean; before?: Layer } = {},\n ): VectorLayer {\n const { layers = () => true, streets = isStreet, before } = options;\n const vector = this.map.addVectorLayer(before);\n const state: {\n renderer: ReturnType<VectorTiles['renderer']>;\n /** The style layers as the application changed them (`setPaintProperty`…): a copy, its style left as it is */\n own?: StyleLayer[];\n /** Bumped by each update: only the last one drops the tiles out of its view */\n update: number;\n /** Bumped by each restyle: a tile cut under an older style is restyled once it is there */\n style: number;\n } = { renderer: this.renderer((l) => vectorKind(l) !== undefined && layers(l), []), update: 0, style: 0 };\n\n state.renderer.catch(() => undefined);\n this.layers.push(vector);\n\n const sublayers = (list: StyleLayer[]): VectorSublayer[] => {\n const zoom = this.map.getCamera().zoom;\n\n return list.map((l) => ({\n id: l.id,\n sourceLayer: l['source-layer'],\n kind: vectorKind(l) ?? 'fill',\n minZoom: l.minzoom ?? 0,\n maxZoom: l.maxzoom ?? 24,\n visible: l.layout?.visibility !== 'none',\n opacity: zoomOnly(l.paint?.[`${l.type}-opacity`], 1) ?? 1,\n cap: lineCap(l.layout?.['line-cap'], zoom),\n lit: l.type === 'line' && streets(l),\n dash: l.type === 'line' ? dashes(l.paint?.['line-dasharray'], zoom) : [0, 0, 0, 0],\n }));\n };\n\n /** The tiles held or asked for, by `z/x/y` */\n const held = new Map<string, AbortController>();\n /** A tile's geometry, or its styles alone, asked of the worker of its tile of the source's level (which keeps the\n * decoded tile its deeper tiles are cut from) */\n const ask = (\n { key, maxzoom }: { key: string; maxzoom: number },\n [z = 0, x = 0, y = 0]: number[],\n styles: boolean,\n priority: Priority,\n signal?: AbortSignal,\n ) => {\n const d = Math.max(0, z - maxzoom);\n const work: BasemapWork = { type: 'vectors', key, z, x, y, deepest: deepestLevel(maxzoom), priority };\n\n // The geometry made ready for the GPU in the workers, with the prisms the relief needs\n return this.request(\n z - d,\n Math.floor(x / 2 ** d),\n Math.floor(y / 2 ** d),\n styles ? { ...work, styles } : { ...work, prism: this.map.hasRelief },\n signal,\n );\n };\n\n // The workers tessellate the tiles (the main thread only uploads them), once they know the module\n this.pool.broadcast({ type: 'tess', url: this.map.tessUrl });\n /** The styles of a tile held asked for again, the tile kept as it is */\n const restyleTile = async (renderer: { key: string; maxzoom: number }, k: string) => {\n const r = await ask(renderer, k.split('/').map(Number), true, 'auto').catch(() => undefined);\n\n if (r && 'styles' in r) vector.setTileStyles(k, r.styles);\n };\n const update = async () => {\n if (this.destroyed) return;\n\n const generation = ++state.update;\n const { key, maxzoom, layers: list } = await state.renderer;\n\n vector.setSublayers(sublayers(state.own ?? list));\n\n const view = this.map.engine.vectorTilesInView(0, deepestLevel(maxzoom));\n const wanted = Array.from({ length: Math.floor(view.length / 3) }, (_, i) => [\n ...view.subarray(i * 3, i * 3 + 3),\n ]);\n const keys = new Set(wanted.map((t) => t.join('/')));\n const loads = wanted.flatMap((t, index) => {\n const k = t.join('/');\n\n if (held.has(k)) return [];\n\n const controller = new AbortController();\n const style = state.style;\n\n held.set(k, controller);\n\n return [\n ask({ key, maxzoom }, t, false, index < 4 ? 'high' : 'auto', controller.signal).then(\n async (r) => {\n if (controller.signal.aborted || !('vectors' in r)) return;\n vector.setTile(k, r.vectors);\n // Cut under a style changed since: its styles asked for again\n if (style !== state.style) await restyleTile(await state.renderer, k);\n },\n () => {\n // A failure is asked for again on the next update\n if (held.get(k) === controller) held.delete(k);\n },\n ),\n ];\n });\n // Out of view: those still asked for go at once, those drawn once their replacements are there (no hole)\n const drop = (drawn: boolean) => {\n const shown = new Set(vector.tileKeys);\n\n [...held].forEach(([k, controller]) => {\n if (keys.has(k) || shown.has(k) !== drawn) return;\n controller.abort();\n held.delete(k);\n vector.removeTile(k);\n });\n };\n\n drop(false);\n await Promise.all(loads);\n // A later update (the view moved again meanwhile) drops for its own view: these keys are no longer the view\n if (!this.destroyed && generation === state.update) drop(true);\n };\n const refresh = () => {\n update().catch(() => undefined);\n };\n /** The style layers changed: the workers' copy, then the styles of the tiles held */\n const restyle = async (list: StyleLayer[]) => {\n state.own = list;\n state.style++;\n state.renderer = state.renderer.then(({ key }) => this.renderer(() => false, list, key));\n\n const renderer = await state.renderer;\n\n vector.setSublayers(sublayers(list));\n await Promise.all(vector.tileKeys.map((k) => restyleTile(renderer, k)));\n };\n\n vector.restyle = (id, group, name, value) => {\n state.renderer\n .then(({ layers: list }) => {\n const next = (state.own ?? list).map((l) =>\n l.id === id ? { ...l, [group]: { ...l[group], [name]: value } } : l,\n );\n\n // Visibility and dashes are the engine's: the tiles stay as they are\n if ((group === 'layout' && name === 'visibility') || name === 'line-dasharray') {\n state.own = next;\n vector.setSublayers(sublayers(next));\n\n return undefined;\n }\n // An outline added or taken away: a feature more or less in each tile, cut again\n if (name === 'fill-outline-color' || name === 'fill-antialias') {\n state.own = next;\n state.style++;\n state.renderer = state.renderer.then(({ key }) => this.renderer(() => false, next, key));\n vector.setSublayers(sublayers(next));\n vector.recut?.();\n\n return undefined;\n }\n\n return restyle(next);\n })\n .catch(() => undefined);\n };\n vector.recut = () => {\n held.forEach((controller) => {\n controller.abort();\n });\n held.clear();\n refresh();\n };\n vector.styled = state.renderer.then(({ layers: list }) => {\n if (!this.destroyed) vector.setSublayers(sublayers(state.own ?? list));\n });\n // Reported by the style's `ready`\n vector.styled.catch(() => undefined);\n\n // While the camera moves, the tiles follow it (as the labels do: a long drag or flight does not leave the view of\n // its start drawn)\n this.followView(update, held, update);\n\n return vector;\n }\n\n /**\n * A symbol layer with the labels of the style's symbol layers (or those `layers` keeps), updated as the view\n * moves: the labels of the vector tiles in view, the higher style layers placed first. With a raster layer of\n * the style (`raster`), the tiles follow the levels the ground is drawn at: a tilted view takes coarser tiles far\n * away, with the few labels of a lower zoom, as near the camera it takes the fine ones. Without, the tiles around\n * the center at the zoom of the view. It stays above the layers added after it unless one is moved over it.\n */\n labels(options: { layers?: (layer: StyleLayer) => boolean; maxTiles?: number } = {}): SymbolLayer<LabelCandidate> {\n const { layers = () => true, maxTiles = 36 } = options;\n const symbol = this.map.addSymbols<LabelCandidate>({\n data: [],\n text: (p) => p.text,\n font: (p) => p.font,\n size: (p) => size(p.size),\n color: (p) => p.color,\n haloColor: (p) => p.haloColor,\n haloWidth: (p) => p.haloWidth,\n anchor: (p) => anchor(p.anchor),\n offset: (p) => p.offset,\n maxWidth: (p) => p.maxWidth,\n lineHeight: (p) => p.lineHeight,\n overlap: (p) => p.overlap,\n placement: (p) => (p.textAlong ? 'line' : 'point'),\n textOptional: (p) => p.textOptional === true,\n icon: (p) => (p.icon ? this.iconPrefix + p.icon.image : ''),\n iconSize: (p) => size(p.icon?.size ?? 1, 1),\n iconAnchor: (p) => anchor(p.icon?.anchor),\n iconOffset: (p) => p.icon?.offset ?? [0, 0],\n iconRotate: (p) => p.icon?.rotate ?? 0,\n iconRotationAlignment: (p) => p.icon?.alignment ?? 'viewport',\n iconOverlap: (p) => p.icon?.overlap ?? false,\n iconOptional: (p) => p.icon?.optional ?? false,\n iconTextFit: (p) => p.icon?.fit ?? 'none',\n iconTextFitPadding: (p) => p.icon?.padding ?? [0, 0, 0, 0],\n iconColor: (p) => p.icon?.color ?? '#000',\n iconOpacity: (p) => p.icon?.opacity ?? 1,\n });\n\n this.map.keepOnTop(symbol);\n this.layers.push(symbol);\n\n const renderer = this.ready.then(async ({ style }) => {\n // The style's fonts from its own glyphs\n if (style.glyphs) this.map.glyphs.register(style.glyphs, VectorTiles.fonts(style));\n\n // Its icons from its sprites, before the first labels\n const icons = style.layers.some((l) => l.type === 'symbol' && l.layout?.['icon-image'] !== undefined);\n\n if (icons && style.sprite) {\n (await this.loadSprites(style.sprite)).forEach((sprite) => {\n if (!this.destroyed) this.map.icons.addSprite(this.iconPrefix, sprite.icons, () => readPixels(sprite.image));\n });\n }\n\n return this.renderer((l) => l.type === 'symbol' && layers(l), []);\n });\n\n renderer.catch(() => undefined);\n\n /** The labels of the tiles, as features by style layer, the higher layers first: each list is given to the symbol\n * layer as a group, shaped once while the tile is kept */\n const tiles = new Lru<string, Promise<TileLabels>>(256);\n let generation = 0;\n /** The tiles whose labels are shown */\n let shown = '';\n /** The update asked again after tiles failed */\n let retry = 0;\n const update = async () => {\n if (this.destroyed) return;\n\n const { key, maxzoom } = await renderer;\n const run = ++generation;\n const camera = this.map.getCamera();\n const zoom = Math.max(0, Math.min(Math.floor(camera.zoom), 24));\n const ground = this.ground && this.map.hasLayer(this.ground) ? this.map.engine.wantedTiles(this.ground.id) : [];\n const keys: string[] = [];\n\n if (ground.length > 0) {\n // The ground's tiles, the nearest first: a tile so many levels coarser than the finest in view has its\n // labels of a zoom as many under the view's, past the source's deepest level those of that level at the zoom\n const groundTiles = Array.from({ length: Math.ceil(ground.length / 3) }, (_, k): [number, number, number] => [\n ground[3 * k] ?? 0,\n ground[3 * k + 1] ?? 0,\n ground[3 * k + 2] ?? 0,\n ]);\n const top = groundTiles.reduce((t, [z]) => Math.max(t, z), 0);\n\n groundTiles.forEach(([z, x, y]) => {\n if (keys.length >= maxTiles) return;\n\n const at = Math.max(0, zoom - (top - z));\n const tz = Math.min(at, maxzoom, z);\n const shift = 2 ** (z - tz);\n const key = `${tz}/${Math.floor(x / shift)}/${Math.floor(y / shift)}${at > tz ? `@${at}` : ''}`;\n\n if (!keys.includes(key)) keys.push(key);\n });\n } else {\n const z = Math.min(zoom, maxzoom);\n const wanted = tilesAround(this.map, camera, z, maxTiles);\n\n // Past the source's deepest level, its tiles' labels at the zoom of the view (the layers of the deeper zooms)\n keys.push(...wanted.map(([x, y]) => `${z}/${x}/${y}${zoom > z ? `@${zoom}` : ''}`));\n }\n\n // The same tiles as the labels shown: nothing to do\n const set = keys.join(' ');\n\n if (set === shown) return;\n\n const lists = await Promise.all(\n keys.map((k, index) => {\n const cached = tiles.get(k);\n\n if (cached) return cached;\n\n const [tile, deeper] = k.split('@');\n const [tz = 0, x = 0, y = 0] = (tile ?? '').split('/').map(Number);\n // The nearest tiles first: the others wait for the raster tiles\n const priority: Priority = index < 4 ? 'auto' : 'low';\n const work: BasemapWork = {\n type: 'labels',\n key,\n z: tz,\n x,\n y,\n priority,\n ...(deeper === undefined ? {} : { zoom: Number(deeper) }),\n };\n const p = this.request(tz, x, y, work).then(\n (r) => tileLabels('labels' in r ? r.labels : []),\n () => {\n // A network error is not kept: the tile is asked for again on the next update\n tiles.delete(k);\n\n return [];\n },\n );\n\n // A bounded cache of tiles' labels, the least recently used dropped\n tiles.set(k, p);\n\n return p;\n }),\n );\n\n if (run !== generation || this.destroyed) return;\n // A tile that failed is missing: the next update asks for it again, after a pause if no move brings one\n shown = keys.every((k) => tiles.has(k)) ? set : '';\n if (shown === '' && !retry) {\n retry = window.setTimeout(() => {\n retry = 0;\n refresh();\n }, RETRY_LABELS_MS);\n }\n\n // The labels of the higher style layers first: they win the collisions; for each style layer, the tiles nearest\n // to the center first\n const layerIds = [...new Set(lists.flatMap((list) => list.map(([layer]) => layer)))].sort((a, b) => b - a);\n const groups = layerIds.flatMap((layer) =>\n lists.map((list) => list.find(([l]) => l === layer)?.[1]).filter((group) => group !== undefined),\n );\n\n symbol.setGroups(groups);\n };\n // The style failed to load: reported by `ready`\n const refresh = () => {\n update().catch(() => undefined);\n };\n let timer = 0;\n const schedule = () => {\n if (timer) return;\n timer = window.setTimeout(() => {\n timer = 0;\n refresh();\n }, 250);\n };\n\n this.cleanup.push(this.map.on('move', schedule), this.map.on('moveend', refresh), () => {\n clearTimeout(timer);\n clearTimeout(retry);\n });\n refresh();\n\n return symbol;\n }\n\n /**\n * Makes a layer's tiles follow the view: `update` now and where the camera stops (`moveend`), `moving` every\n * `VECTOR_MOVE_REFRESH_MS` while it moves; the requests `held` aborted when destroyed\n */\n private followView(update: () => Promise<unknown>, held: Map<string, AbortController>, moving: () => unknown): void {\n const refresh = () => {\n update().catch(() => undefined);\n };\n const pace = { timer: 0 };\n const follow = () => {\n if (pace.timer) return;\n pace.timer = window.setTimeout(() => {\n pace.timer = 0;\n Promise.resolve(moving()).catch(() => undefined);\n }, VECTOR_MOVE_REFRESH_MS);\n };\n\n this.cleanup.push(this.map.on('move', follow), this.map.on('moveend', refresh), () => {\n clearTimeout(pace.timer);\n held.forEach((controller) => {\n controller.abort();\n });\n held.clear();\n });\n refresh();\n }\n\n /** Stops its workers' work and removes its raster and label layers from the map (those still there) */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.cleanup.forEach((off) => {\n off();\n });\n this.cleanup.length = 0;\n this.layers.forEach((layer) => {\n if (this.map.hasLayer(layer)) layer.remove();\n });\n this.layers.length = 0;\n this.map.dropVectorTiles(this);\n // The page's copy of the sprites (the workers have theirs), and their icons\n this.sprites\n ?.then((sprites) => {\n sprites.forEach((sprite) => {\n sprite.image.close();\n });\n this.map.icons.remove(this.iconPrefix, true);\n })\n .catch(() => undefined);\n if (this.ownPool) {\n this.pool.terminate();\n } else {\n // Shared workers: only its requests stop and its renderers go\n this.pool.cancel(this);\n this.renderers.forEach((key) => {\n this.pool.broadcast({ type: 'drop', key });\n });\n }\n this.renderers.length = 0;\n }\n}\n\n/**\n * A `line-dasharray` as the engine takes it: two dashes and gaps in line widths (an odd count repeated, as the\n * canvas's `setLineDash`; past four, the first four), zeros for a solid line\n */\nexport const dashes = (value: Json | undefined, zoom: number): [number, number, number, number] => {\n const v = isExpression(value) ? evaluate(value, { zoom, properties: {}, type: 'Unknown' }) : value;\n const list = Array.isArray(v) ? v.map(Number).filter((d) => Number.isFinite(d) && d >= 0) : [];\n const even = list.length % 2 === 1 ? [...list, ...list] : list;\n const [a = 0, b = 0, c = 0, d = 0] = even.length >= 2 && even.some((x) => x > 0) ? even : [];\n\n return [a, b, c, d];\n};\n\n/** Metres around the view's center where every tree is drawn at zoom 16 (twice as far a zoom level out) */\nconst TREES_NEAR_METRES = 350;\n\n/** Whether a style layer draws streets, which glow at night: its id names a road (OpenMapTiles' styles, PLAN IGN's),\n * not its casing, a railway, a path or a tunnel */\nconst isStreet = (layer: StyleLayer): boolean =>\n /road|highway|street|motorway|trunk|primary|secondary|tertiary|minor|routier/i.test(layer.id) &&\n !/casing|outline|rail|path|track|ferry|tunnel|pier|area|pattern|label/i.test(layer.id);\n\n/** A `line-cap` as the engine draws it, at the camera's zoom (MapLibre's default: butt) */\nconst lineCap = (value: Json | undefined, zoom: number): 'butt' | 'round' | 'square' => {\n const v = isExpression(value) ? evaluate(value, { zoom, properties: {}, type: 'Unknown' }) : value;\n\n return v === 'round' || v === 'square' ? v : 'butt';\n};\n\n/** The deepest level `vectors()` cuts its tiles at: past the source's deepest level, its tiles cut again into deeper\n * ones (overzoom, as MapLibre does) down to level 18, their filters and styles those of their level, smaller tiles\n * drawn in a closer view; past it, the tiles of that level stretched */\nconst OVERZOOM_LEVEL = 18;\n\n/** The deepest level of the tiles of `vectors()` over a source whose deepest is `maxzoom` */\nconst deepestLevel = (maxzoom: number): number => Math.max(maxzoom, OVERZOOM_LEVEL);\n\n/** Milliseconds between two updates of the tiles of `vectors()` while the camera moves */\nconst VECTOR_MOVE_REFRESH_MS = 250;\n"]}
1
+ {"version":3,"file":"vectortiles.js","sourceRoot":"","sources":["../../src/basemap/vectortiles.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Vector basemaps from a MapLibre style (OpenFreeMap's Positron by default): the fills, lines, circles and raster\n * layers drawn tile by tile in workers into the raster pool, so that they lie on the relief like any basemap and\n * composite with the hillshade in one pass; and the labels of the style's symbol layers in a symbol layer of their own,\n * kept above the application's layers (as MapLibre's `beforeId: firstSymbol` does), listed by the workers, shaped in\n * the page once per vector tile, placed by the engine.\n *\n * Any subset of the style can be drawn on its own raster layer (`raster({ layers })`), at its own place in the stack:\n * rivers from the basemap's data over a flood layer, for instance, restyled with `extraLayers`.\n *\n * The layers other than the raster ones are made in `vectortiles/` (one module each), from what they use of the\n * instance (`VectorTilesContext`); the style's loading is in `vectortiles/style.ts`.\n */\n\nimport type { ExtrusionLayer } from '../layers/extrusions.ts';\nimport { type LoadedSprite, loadSprites, spriteSources } from '../layers/icons.ts';\nimport type { Layer, ModelLayer, RasterLayer } from '../layers/layers.ts';\nimport type { SymbolLayer } from '../layers/symbols.ts';\nimport type { VectorLayer } from '../layers/vectors.ts';\nimport type { GeoMap } from '../map.ts';\nimport type { BasemapWork, Sprite } from '../workers/basemap.worker.ts';\nimport type { LabelCandidate, Style, StyleLayer } from './vectorstyle.ts';\nimport type { Renderer, VectorTilesContext } from './vectortiles/context.ts';\nimport { extrusions, type VectorExtrusionOptions } from './vectortiles/extrusions.ts';\nimport { type LabelsOptions, labels, size, tileLabels } from './vectortiles/labels.ts';\nimport type { TileRequests } from './vectortiles/requests.ts';\nimport { type StreetWindLayer, type StreetWindOptions, streetWind } from './vectortiles/street-wind.ts';\nimport {\n type LoadedStyle,\n loadStyle,\n OPENFREEMAP_STYLES,\n PLAN_STYLES,\n styleAttribution,\n VECTOR_BASEMAPS,\n} from './vectortiles/style.ts';\nimport { VECTOR_MOVE_REFRESH_MS } from './vectortiles/tiles.ts';\nimport { type TreesOptions, trees } from './vectortiles/trees.ts';\nimport { dashes, type VectorsOptions, vectors } from './vectortiles/vectors.ts';\nimport { type BasemapWorkers, rendererKey, tilePriority } from './workerpool.ts';\n\n// The names the package and its tests import from here, now made in `vectortiles/`\nexport { dashes, OPENFREEMAP_STYLES, PLAN_STYLES, size, styleAttribution, tileLabels, VECTOR_BASEMAPS };\n\nexport interface VectorTilesOptions {\n /** A style URL or object (default OpenFreeMap's Positron) */\n style?: string | Style;\n /** Workers drawing the tiles (default cores - 1, 1 to 4). The vector tiles of a map share its workers (and their\n * decoded tiles); another count gives these tiles workers of their own */\n workers?: number;\n /** Where to load the worker from, when a bundler does not resolve the default URL (default the map's\n * `basemapWorkerUrl`); another URL than the map's gives these tiles workers of their own */\n workerUrl?: string | URL;\n /** Credits of the tiles, shown while its raster layers are on the map (default: OpenFreeMap's for its styles, the\n * IGN's for PLAN.IGN's) */\n attribution?: string;\n}\n\nexport class VectorTiles {\n private readonly pool: BasemapWorkers;\n /** The pool is this instance's own (a worker count or URL other than the map's): stopped with it */\n private readonly ownPool: boolean;\n /** Prefix of its renderer keys in the pool's workers */\n private readonly namespace: string;\n private destroyed = false;\n private keys = 0;\n /** Renderers sent to the workers, dropped on destroy */\n private readonly renderers: string[] = [];\n private readonly cleanup: (() => void)[] = [];\n /** Credits of its raster layers */\n private readonly attribution: string | undefined;\n /** Its raster and label layers, removed with it */\n private readonly layers: Layer[] = [];\n /** Its first raster layer: the ground its labels follow */\n private ground: RasterLayer | undefined;\n /** What its layers made in `vectortiles/` use of it */\n private readonly context: VectorTilesContext;\n /** The style once loaded, with its source resolved */\n readonly ready: Promise<LoadedStyle>;\n\n /**\n * Its workers are the map's (shared by every `VectorTiles` of the map, a vector tile decoded once for all of them),\n * unless `workers` or `workerUrl` asks for others than the map's: then it has workers of its own\n */\n constructor(\n private readonly map: GeoMap,\n options: VectorTilesOptions = {},\n ) {\n const { pool, own } = map.basemapWorkers(options.workers, options.workerUrl);\n\n this.pool = pool;\n this.ownPool = own;\n this.namespace = pool.namespace();\n\n const style = options.style ?? OPENFREEMAP_STYLES.positron;\n\n this.attribution = options.attribution ?? styleAttribution(style);\n this.ready = loadStyle(style);\n // Reported once here; `ready`, the raster tiles and the labels fail with it\n this.ready.catch((error: unknown) => {\n if (!this.destroyed) console.warn('isard: vector tiles', error);\n });\n this.context = {\n map,\n ready: this.ready,\n layers: this.layers,\n cleanup: this.cleanup,\n iconPrefix: this.iconPrefix,\n destroyed: () => this.destroyed,\n ground: () => this.ground,\n broadcast: (message) => {\n this.pool.broadcast(message);\n },\n request: (vz, vx, vy, work, signal) => this.request(vz, vx, vy, work, signal),\n renderer: (select, extra, again) => this.renderer(select, extra, again),\n loadSprites: (sprite) => this.loadSprites(sprite),\n followView: (update, requests, moving) => {\n this.followView(update, requests, moving);\n },\n };\n }\n\n /** The style's sprites (their JSON and their images), loaded once, for the fill patterns and the icons */\n private sprites: Promise<LoadedSprite[]> | undefined;\n\n /** The style's sprites, kept once all of them came: one that failed is asked for again by the next layer */\n private loadSprites(sprite: Style['sprite']): Promise<LoadedSprite[]> {\n if (this.sprites) return this.sprites;\n\n const wanted = spriteSources(sprite).length;\n const loading: Promise<LoadedSprite[]> = loadSprites(sprite)\n .catch(() => [])\n .then((loaded) => {\n if (loaded.length < wanted && this.sprites === loading) {\n console.warn(\n `isard: ${wanted - loaded.length} of the style's sprites not loaded, its icons and patterns missing`,\n );\n this.sprites = undefined;\n }\n\n return loaded;\n });\n\n this.sprites = loading;\n\n return loading;\n }\n\n /** Prefix of the names of its sprites' images among the map's icons */\n private get iconPrefix(): string {\n return `${this.namespace}/`;\n }\n\n private request(vz: number, vx: number, vy: number, work: BasemapWork, signal?: AbortSignal) {\n if (this.destroyed) return Promise.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n\n return this.pool.request(this.pool.worker(vz, vx, vy), work, this, signal);\n }\n\n /** Sends a renderer of these layers to every worker (again under `again`, restyled); returns its key */\n private async renderer(\n select: (layer: StyleLayer) => boolean,\n extra: StyleLayer[],\n again?: string,\n ): Promise<Renderer> {\n const { style, tiles, maxzoom, rasters } = await this.ready;\n const key = again ?? rendererKey(this.namespace, this.keys++);\n const layers = [...style.layers.filter(select), ...extra];\n const patterns = layers.some((l) => l.paint?.['fill-pattern'] !== undefined);\n // The images are downloaded once, copied to each worker\n const sprites: Sprite[] = patterns && style.sprite ? await this.loadSprites(style.sprite) : [];\n\n if (this.destroyed) throw new DOMException('isard: vector tiles destroyed', 'AbortError');\n this.pool.broadcast({ type: 'init', key, tiles, maxzoom, layers, rasters, ...(sprites.length ? { sprites } : {}) });\n if (!again) this.renderers.push(key);\n\n return { key, maxzoom, layers };\n }\n\n /**\n * A raster layer drawing the style's fills, lines and circles (or those `layers` keeps, then `extraLayers`, of the\n * same source); `size`: texture size of its tiles (512 by default: sharp lines)\n */\n raster(\n options: {\n layers?: (layer: StyleLayer) => boolean;\n extraLayers?: StyleLayer[];\n size?: number;\n opacity?: number;\n minZoom?: number;\n maxZoom?: number;\n before?: Parameters<GeoMap['addRaster']>[0]['before'];\n } = {},\n ): RasterLayer {\n const { layers = () => true, extraLayers = [], size: texture = 512, opacity = 1, before } = options;\n const drawn = (l: StyleLayer) => l.type !== 'symbol' && layers(l);\n const renderer = this.renderer(drawn, extraLayers);\n\n // Its failure is reported by `ready` and each tile\n renderer.catch(() => undefined);\n\n const loader = async (z: number, x: number, y: number, signal: AbortSignal) => {\n const { key, maxzoom } = await renderer;\n // The vector tile it is drawn from (see the worker)\n const vz = Math.max(0, Math.min(z - 1, maxzoom));\n const shift = z - vz;\n const priority = tilePriority(z, x, y, this.map.getCamera());\n const response = await this.request(\n vz,\n x >> shift,\n y >> shift,\n { type: 'render', key, z, x, y, size: texture, priority },\n signal,\n );\n\n return 'image' in response ? response.image : null;\n };\n const layer = this.map.addRaster({\n url: '',\n size: texture,\n opacity,\n minZoom: options.minZoom ?? 0,\n maxZoom: options.maxZoom ?? 20,\n loader,\n ...(this.attribution ? { attribution: this.attribution } : {}),\n ...(before ? { before } : {}),\n });\n\n this.layers.push(layer);\n this.ground ??= layer;\n\n return layer;\n }\n\n /**\n * An extrusion layer of the polygons of the style's fill layers that `layers` keeps (by default its buildings: the\n * fill or fill-extrusion layers of PLAN IGN's `bati_surf` or OpenMapTiles' `building`), raised by the style\n * given (`height`, `base`, `color`, `ramp`…; the properties of the tiles' features). Its tiles follow the view: at\n * the source's deepest level, the `maxTiles` nearest to the center, from `minZoom` on (15 by default); the tiles\n * leaving the view are dropped.\n */\n extrusions<P = Record<string, unknown>>(options: VectorExtrusionOptions<P> = {}): ExtrusionLayer<P> {\n return extrusions<P>(this.context, options);\n }\n\n /**\n * The wind through the streets around the view, as particles at street level (`height`, default 3 metres) between\n * the style's buildings (`layers`, default its `building` and `bati_surf` layers): their footprints laid on a grid of\n * `cell` metres (default 4) over a square of `size` metres (default 1200) around the view's center, the flow of the\n * air round them a potential flow (it goes round the blocks and faster through the narrow streets; no wake behind\n * them), computed in a worker by the grid module from street level (`minZoom`, default 15) and again when the view\n * leaves the square's middle. `wind` is the wind far away (east and north, m/s, default a light breeze from the\n * south-west); `setWind` changes it at once (the flow is linear in it: nothing computed again), from a model's hour\n * (`windAt`) for instance; `computed` resolves once the first square's flow is there. The other options are the flow\n * layer's (`addFlow`)\n */\n streetWind(options: StreetWindOptions = {}): StreetWindLayer {\n return streetWind(this.context, options);\n }\n\n /**\n * Trees on the style's woods, forests and grass (or the fill layers `layers` keeps) as 3D models, from street level\n * (`minZoom`, default 15): the workers scatter them over the polygons of the vector tiles around the view, `spacing`\n * metres apart (by style layer: 9 in woods, 25 on grass, by default) on a jittered grid, the same trees whenever a\n * tile comes back; the engine draws them all in one instanced draw, on the relief. A low-poly tree by default (its\n * `colors`), or your own glTF (`url`, `data`, about 10 metres high, standing on its origin). Dense around the\n * view's center, fewer and fewer away from it (as the camera moves too), at most `maxInstances` drawn (default\n * 25000); at most `maxTiles` tiles (default 9) and `maxTrees` trees in each (default 30000). The models load the\n * engine with 3D Tiles.\n */\n trees(options: TreesOptions = {}): ModelLayer {\n return trees(this.context, options);\n }\n\n /**\n * A layer drawing the style's fills, lines and buildings (or those `layers` keeps; backgrounds as fills, the\n * `fill-extrusion` layers raised into buildings by their height and base height) as geometry instead of images: the\n * workers cut the vector tiles in view into polygons and lines, which the engine draws on the globe and the relief,\n * in the style's order, each style layer over its zoom range. Sharp at any zoom\n * and pitch, picked by feature (`pick` gives its properties and style layer), restyled without cutting the tiles\n * again (`setPaintProperty`, `setLayoutProperty`). Its tiles follow the view, while it moves too, coarser far away in a\n * tilted view, and those leaving it stay until the ones replacing them are there; past the source's deepest level,\n * cut again from its tiles down to level 18 (overzoom: their filters and styles those of their level). The fills' outlines are drawn one\n * pixel wide, the lines' ends as their `line-cap` says (their joins round), the colors follow the camera's zoom. The\n * layers drawn with a pattern and the circles are left out (the raster path draws them), as are `line-offset`,\n * `line-blur` and the translations (`fill-translate`, `line-translate`); `raster` stays the lighter path for heavy\n * styles and small devices. At night (`setSun`) the line layers `streets` keeps glow (by default those whose id names\n * a road, not its casing, a railway, a path or a tunnel).\n */\n vectors(options: VectorsOptions = {}): VectorLayer {\n return vectors(this.context, options);\n }\n\n /**\n * A symbol layer with the labels of the style's symbol layers (or those `layers` keeps), updated as the view\n * moves: the labels of the vector tiles in view, the higher style layers placed first. With a raster layer of\n * the style (`raster`), the tiles follow the levels the ground is drawn at: a tilted view takes coarser tiles far\n * away, with the few labels of a lower zoom, as near the camera it takes the fine ones. Without, the tiles around\n * the center at the zoom of the view. It stays above the layers added after it unless one is moved over it.\n */\n labels(options: LabelsOptions = {}): SymbolLayer<LabelCandidate> {\n return labels(this.context, options);\n }\n\n /**\n * Makes a layer's tiles follow the view: `update` now and where the camera stops (`moveend`), `moving` every\n * `VECTOR_MOVE_REFRESH_MS` while it moves; the `requests` aborted when destroyed\n */\n private followView(update: () => Promise<unknown>, requests: TileRequests, moving: () => unknown): void {\n const refresh = () => {\n update().catch(() => undefined);\n };\n const pace = { timer: 0 };\n const follow = () => {\n if (pace.timer) return;\n pace.timer = window.setTimeout(() => {\n pace.timer = 0;\n Promise.resolve(moving()).catch(() => undefined);\n }, VECTOR_MOVE_REFRESH_MS);\n };\n\n this.cleanup.push(this.map.on('move', follow), this.map.on('moveend', refresh), () => {\n clearTimeout(pace.timer);\n requests.abortAll();\n });\n refresh();\n }\n\n /** Stops its workers' work and removes its raster and label layers from the map (those still there) */\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.cleanup.forEach((off) => {\n off();\n });\n this.cleanup.length = 0;\n this.layers.forEach((layer) => {\n if (this.map.hasLayer(layer)) layer.remove();\n });\n this.layers.length = 0;\n this.map.dropVectorTiles(this);\n // The page's copy of the sprites (the workers have theirs), and their icons\n this.sprites\n ?.then((sprites) => {\n sprites.forEach((sprite) => {\n sprite.image.close();\n });\n this.map.icons.remove(this.iconPrefix, true);\n })\n .catch(() => undefined);\n if (this.ownPool) {\n this.pool.terminate();\n } else {\n // Shared workers: only its requests stop and its renderers go\n this.pool.cancel(this);\n this.renderers.forEach((key) => {\n this.pool.broadcast({ type: 'drop', key });\n });\n }\n this.renderers.length = 0;\n }\n}\n"]}
@@ -50,6 +50,12 @@ export class BasemapWorkers {
50
50
  workers;
51
51
  pending = new Map();
52
52
  next = 1;
53
+ /** The workers that answered once (they loaded), and those that failed before: dead, their error given at once to
54
+ * any request still sent their way */
55
+ answered = new WeakSet();
56
+ dead = new Map();
57
+ /** The worker the next file of grids goes to, in turn */
58
+ turn = 0;
53
59
  namespaces = 0;
54
60
  terminated = false;
55
61
  /** Stops following the page's request headers */
@@ -60,6 +66,7 @@ export class BasemapWorkers {
60
66
  const start = () => {
61
67
  const worker = create(url);
62
68
  worker.onmessage = ({ data }) => {
69
+ this.answered.add(worker);
63
70
  const p = this.pending.get(data.id);
64
71
  if (!p)
65
72
  return;
@@ -69,10 +76,13 @@ export class BasemapWorkers {
69
76
  else
70
77
  p.resolve(data);
71
78
  };
72
- // A worker that fails to load (a bundler serving it from elsewhere) or to read a message fails its requests
79
+ // A worker that fails to load (a bundler serving it from elsewhere) or to read a message fails its requests; one
80
+ // that never answered is dead: its tiles go to the others, and with none left every request fails at once
73
81
  worker.onerror = (event) => {
74
82
  event.preventDefault();
75
- this.fail(worker, `the vector basemap worker ${url} failed${event.message ? `: ${event.message}` : ''}`);
83
+ const error = this.fail(worker, `the vector basemap worker ${url} failed${event.message ? `: ${event.message}` : ''}`);
84
+ if (!this.answered.has(worker))
85
+ this.dead.set(worker, error);
76
86
  };
77
87
  worker.onmessageerror = () => this.fail(worker, `the vector basemap worker ${url} sent an unreadable message`);
78
88
  const rules = headerRules();
@@ -95,7 +105,7 @@ export class BasemapWorkers {
95
105
  get size() {
96
106
  return this.pending.size;
97
107
  }
98
- /** Rejects the requests of a failed worker */
108
+ /** Rejects the requests of a failed worker, with the error returned */
99
109
  fail(worker, message) {
100
110
  const error = new Error(`isard: ${message}. If a bundler moves the worker, give its URL in the \`basemapWorkerUrl\` option (see "With a bundler" in the guide)`);
101
111
  this.pending.forEach((p, id) => {
@@ -104,10 +114,18 @@ export class BasemapWorkers {
104
114
  this.pending.delete(id);
105
115
  p.reject(error);
106
116
  });
117
+ return error;
107
118
  }
108
- /** The worker of a vector tile */
119
+ /** The worker of a vector tile: always the same one, or the next living one if it died */
109
120
  worker(vz, vx, vy) {
110
- return this.workers[workerIndex(vz, vx, vy, this.workers.length)] ?? this.workers[0];
121
+ return this.living(workerIndex(vz, vx, vy, this.workers.length));
122
+ }
123
+ /** The worker at `index`, or the next one that has not died (the first one when all have) */
124
+ living(index) {
125
+ const { workers } = this;
126
+ const at = (k) => workers[(index + k) % workers.length] ?? workers[0];
127
+ const k = workers.findIndex((_, k) => !this.dead.has(at(k)));
128
+ return at(Math.max(0, k));
111
129
  }
112
130
  /** Sends a message to every worker (a renderer, or its removal, or where the tessellation module is) */
113
131
  broadcast(message) {
@@ -127,6 +145,9 @@ export class BasemapWorkers {
127
145
  return reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));
128
146
  if (signal?.aborted)
129
147
  return reject(new DOMException('aborted', 'AbortError'));
148
+ const dead = this.dead.get(worker);
149
+ if (dead)
150
+ return reject(dead);
130
151
  const id = this.next++;
131
152
  const abort = () => {
132
153
  if (!this.pending.delete(id))
@@ -165,6 +186,13 @@ export class BasemapWorkers {
165
186
  const work = { type: 'reproject', job, cached };
166
187
  return this.request(worker, work, owner, signal).then((r) => ('image' in r ? r.image : null));
167
188
  }
189
+ /** A GRIB2 or NetCDF file (its URL, fetched by the worker, or its bytes, transferred) read into grids by the grid
190
+ * module (`module`), in the next worker */
191
+ grids(source, module, signal, owner) {
192
+ const work = { type: 'grids', module, ...source };
193
+ this.turn = (this.turn + 1) % this.workers.length;
194
+ return this.request(this.living(this.turn), work, owner, signal).then((r) => 'grids' in r ? { grids: r.grids, values: r.values } : { grids: [], values: [] });
195
+ }
168
196
  /** Cancels the requests of an owner (the workers stop them) */
169
197
  cancel(owner) {
170
198
  this.pending.forEach((p, id) => {
@@ -1 +1 @@
1
- {"version":3,"file":"workerpool.js","sourceRoot":"","sources":["../../src/basemap/workerpool.ts"],"names":[],"mappings":"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","sourcesContent":["/** The pool of basemap workers the vector tiles share: a vector tile always goes to the same worker (its decoded copy\n * kept there), the requests of an owner cancelled together, the renderers broadcast to every worker */\n\nimport { headerRules, onHeaderRules } from '../engine/requests.ts';\nimport { assetUrl } from '../engine-loader.ts';\nimport { mercatorX, mercatorY } from '../util/geo.ts';\nimport type { Camera } from '../wasm/isard.js';\nimport type { BasemapRequest, BasemapResponse, BasemapWork, Priority } from '../workers/basemap.worker.ts';\nimport { type Job, SOURCE_CACHE } from './resample.ts';\nimport type { PngEncoding } from './terrain.ts';\n\n/** Default size of a basemap worker pool: cores - 1, 1 to 4 */\nexport const defaultWorkerCount = (): number => {\n return Math.min(4, Math.max(1, (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2) - 1));\n};\n\n/** Default URL of the basemap worker: in the page's assets folder (`isard/vite`), else next to the module */\nexport const defaultWorkerUrl = (assetsUrl?: string | URL): string | URL => {\n return assetUrl('basemap.worker.js', undefined, assetsUrl);\n};\n\n/** Fetch priority of a raster tile drawn by the workers: 'high' near the center of the view, at the current zoom or\n * coarser; 'low' far from it or finer (prefetch); 'auto' between */\nexport const tilePriority = (z: number, x: number, y: number, camera: Pick<Camera, 'center' | 'zoom'>): Priority => {\n // A raster tile of level z covers the map at zoom z - 1\n if (z - 1 > camera.zoom + 1) return 'low';\n\n const n = 2 ** z;\n const [lon, lat] = camera.center;\n const cx = mercatorX(lon) * n;\n const cy = mercatorY(lat) * n;\n // Across the antimeridian, the short way\n const along = Math.abs(x + 0.5 - cx) % n;\n const dx = Math.min(along, n - along);\n const d = Math.hypot(dx, y + 0.5 - cy);\n\n if (d <= 1.5) return 'high';\n\n return d >= 4 ? 'low' : 'auto';\n};\n\n/** The worker of a vector tile among `count`: always the same one */\nexport const workerIndex = (vz: number, vx: number, vy: number, count: number): number => {\n // Unsigned: every worker gets its share\n return ((Math.imul(vx, 73856093) ^ Math.imul(vy, 19349663) ^ vz) >>> 0) % Math.max(1, count);\n};\n\n/** The worker-side key of a renderer: unique across the `VectorTiles` sharing a pool */\nexport const rendererKey = (namespace: string, n: number): string => {\n return `${namespace}:r${n}`;\n};\n\n/** What the pool needs of a worker (a `Worker`, or a stand-in in tests) */\nexport type PoolWorker = Pick<Worker, 'postMessage' | 'terminate' | 'onmessage' | 'onerror' | 'onmessageerror'>;\n\n/**\n * @internal Workers drawing vector tiles, shared by the `VectorTiles` of a map: each vector tile always goes to the\n * same worker, which keeps it decoded for every style drawn from it. Requests are tracked one by one, with their\n * owner, so that one `VectorTiles` going away cancels its own requests only.\n */\nexport class BasemapWorkers {\n private readonly workers: [PoolWorker, ...PoolWorker[]];\n private readonly pending = new Map<\n number,\n { resolve: (r: BasemapResponse) => void; reject: (e: Error) => void; worker: PoolWorker; owner: object }\n >();\n private next = 1;\n private namespaces = 0;\n private terminated = false;\n /** Stops following the page's request headers */\n private readonly unfollow: () => void;\n\n constructor(\n readonly count: number,\n readonly url: string | URL,\n create: (url: string | URL) => PoolWorker = (u) => new Worker(u, { type: 'module' }),\n ) {\n const start = (): PoolWorker => {\n const worker = create(url);\n\n worker.onmessage = ({ data }: MessageEvent<BasemapResponse>) => {\n const p = this.pending.get(data.id);\n\n if (!p) return;\n this.pending.delete(data.id);\n if ('error' in data) p.reject(new Error(data.error));\n else p.resolve(data);\n };\n // A worker that fails to load (a bundler serving it from elsewhere) or to read a message fails its requests\n worker.onerror = (event) => {\n event.preventDefault();\n this.fail(worker, `the vector basemap worker ${url} failed${event.message ? `: ${event.message}` : ''}`);\n };\n worker.onmessageerror = () => this.fail(worker, `the vector basemap worker ${url} sent an unreadable message`);\n\n const rules = headerRules();\n\n if (rules.length > 0) worker.postMessage({ type: 'headers', rules } satisfies BasemapRequest);\n\n return worker;\n };\n\n this.workers = [start(), ...Array.from({ length: Math.max(1, count) - 1 }, start)];\n this.unfollow = onHeaderRules((rules) => {\n this.workers.forEach((w) => {\n w.postMessage({ type: 'headers', rules } satisfies BasemapRequest);\n });\n });\n }\n\n /** A prefix for the renderer keys of one `VectorTiles` */\n namespace(): string {\n return `v${this.namespaces++}`;\n }\n\n /** Requests in progress */\n get size(): number {\n return this.pending.size;\n }\n\n /** Rejects the requests of a failed worker */\n private fail(worker: PoolWorker, message: string): void {\n const error = new Error(\n `isard: ${message}. If a bundler moves the worker, give its URL in the \\`basemapWorkerUrl\\` option (see \"With a bundler\" in the guide)`,\n );\n\n this.pending.forEach((p, id) => {\n if (p.worker !== worker) return;\n this.pending.delete(id);\n p.reject(error);\n });\n }\n\n /** The worker of a vector tile */\n worker(vz: number, vx: number, vy: number): PoolWorker {\n return this.workers[workerIndex(vz, vx, vy, this.workers.length)] ?? this.workers[0];\n }\n\n /** Sends a message to every worker (a renderer, or its removal, or where the tessellation module is) */\n broadcast(message: Extract<BasemapRequest, { type: 'init' } | { type: 'drop' } | { type: 'tess' }>): void {\n if (this.terminated) return;\n\n // A renderer tells the workers how many they are: they share the decoded tiles' budget\n const sent = message.type === 'init' ? { ...message, workers: this.workers.length } : message;\n\n // A sprite image is copied to each worker (structured clone)\n this.workers.forEach((w) => {\n w.postMessage(sent);\n });\n }\n\n /** Asks a worker for a tile's image or labels, on behalf of `owner` */\n request(worker: PoolWorker, work: BasemapWork, owner: object, signal?: AbortSignal): Promise<BasemapResponse> {\n return new Promise<BasemapResponse>((resolve, reject) => {\n if (this.terminated) return reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n if (signal?.aborted) return reject(new DOMException('aborted', 'AbortError'));\n\n const id = this.next++;\n const abort = () => {\n if (!this.pending.delete(id)) return;\n worker.postMessage({ type: 'abort', id } satisfies BasemapRequest);\n reject(new DOMException('aborted', 'AbortError'));\n };\n // The listener goes once the request is settled\n const settle = () => signal?.removeEventListener('abort', abort);\n\n this.pending.set(id, {\n resolve: (r) => {\n settle();\n resolve(r);\n },\n reject: (e) => {\n settle();\n reject(e);\n },\n worker,\n owner,\n });\n signal?.addEventListener('abort', abort, { once: true });\n worker.postMessage({ ...work, id } satisfies BasemapRequest);\n });\n }\n\n /** The altitudes of a PNG relief tile `z`/`x`/`y` at `url`, decoded by a worker (see `fetchHeights`) */\n heights(\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n [z, x, y]: [number, number, number],\n signal: AbortSignal,\n owner: object,\n ): Promise<Float32Array | null> {\n const work: BasemapWork = { type: 'heights', url, encoding, ...(floor === undefined ? {} : { floor }) };\n\n return this.request(this.worker(z, x, y), work, owner, signal).then((r) => ('heights' in r ? r.heights : null));\n }\n\n /** Mercator tile `z`/`x`/`y` reprojected by a worker from the source images of its plan (see `resampler`) */\n reproject(\n job: Job,\n [z, x, y]: [number, number, number],\n signal: AbortSignal,\n owner: object,\n ): Promise<ImageBitmap | null> {\n // Blocks of 4 × 4 Mercator tiles go to the same worker: neighbours share source tiles, each worker keeps its share\n const worker = this.worker(Math.max(0, z - 2), x >> 2, y >> 2);\n const cached = Math.max(16, Math.ceil(SOURCE_CACHE / this.workers.length));\n const work: BasemapWork = { type: 'reproject', job, cached };\n\n return this.request(worker, work, owner, signal).then((r) => ('image' in r ? r.image : null));\n }\n\n /** Cancels the requests of an owner (the workers stop them) */\n cancel(owner: object): void {\n this.pending.forEach((p, id) => {\n if (p.owner !== owner) return;\n this.pending.delete(id);\n p.worker.postMessage({ type: 'abort', id } satisfies BasemapRequest);\n p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n });\n }\n\n /** Stops the workers; their requests fail */\n terminate(): void {\n if (this.terminated) return;\n this.terminated = true;\n this.unfollow();\n this.workers.forEach((w) => {\n w.terminate();\n });\n\n const pending = [...this.pending.values()];\n\n this.pending.clear();\n pending.forEach((p) => {\n p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n });\n }\n}\n"]}
1
+ {"version":3,"file":"workerpool.js","sourceRoot":"","sources":["../../src/basemap/workerpool.ts"],"names":[],"mappings":"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","sourcesContent":["/** The pool of basemap workers the vector tiles share: a vector tile always goes to the same worker (its decoded copy\n * kept there), the requests of an owner cancelled together, the renderers broadcast to every worker */\n\nimport { headerRules, onHeaderRules } from '../engine/requests.ts';\nimport { assetUrl } from '../engine-loader.ts';\nimport type { GridDescription } from '../grid-module.ts';\nimport { mercatorX, mercatorY } from '../util/geo.ts';\nimport type { Camera } from '../wasm/isard.js';\nimport type { BasemapRequest, BasemapResponse, BasemapWork, Priority } from '../workers/basemap.worker.ts';\nimport { type Job, SOURCE_CACHE } from './resample.ts';\nimport type { PngEncoding } from './terrain.ts';\n\n/** Default size of a basemap worker pool: cores - 1, 1 to 4 */\nexport const defaultWorkerCount = (): number => {\n return Math.min(4, Math.max(1, (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2) - 1));\n};\n\n/** Default URL of the basemap worker: in the page's assets folder (`isard/vite`), else next to the module */\nexport const defaultWorkerUrl = (assetsUrl?: string | URL): string | URL => {\n return assetUrl('basemap.worker.js', undefined, assetsUrl);\n};\n\n/** Fetch priority of a raster tile drawn by the workers: 'high' near the center of the view, at the current zoom or\n * coarser; 'low' far from it or finer (prefetch); 'auto' between */\nexport const tilePriority = (z: number, x: number, y: number, camera: Pick<Camera, 'center' | 'zoom'>): Priority => {\n // A raster tile of level z covers the map at zoom z - 1\n if (z - 1 > camera.zoom + 1) return 'low';\n\n const n = 2 ** z;\n const [lon, lat] = camera.center;\n const cx = mercatorX(lon) * n;\n const cy = mercatorY(lat) * n;\n // Across the antimeridian, the short way\n const along = Math.abs(x + 0.5 - cx) % n;\n const dx = Math.min(along, n - along);\n const d = Math.hypot(dx, y + 0.5 - cy);\n\n if (d <= 1.5) return 'high';\n\n return d >= 4 ? 'low' : 'auto';\n};\n\n/** The worker of a vector tile among `count`: always the same one */\nexport const workerIndex = (vz: number, vx: number, vy: number, count: number): number => {\n // Unsigned: every worker gets its share\n return ((Math.imul(vx, 73856093) ^ Math.imul(vy, 19349663) ^ vz) >>> 0) % Math.max(1, count);\n};\n\n/** The worker-side key of a renderer: unique across the `VectorTiles` sharing a pool */\nexport const rendererKey = (namespace: string, n: number): string => {\n return `${namespace}:r${n}`;\n};\n\n/** What the pool needs of a worker (a `Worker`, or a stand-in in tests) */\nexport type PoolWorker = Pick<Worker, 'postMessage' | 'terminate' | 'onmessage' | 'onerror' | 'onmessageerror'>;\n\n/**\n * @internal Workers drawing vector tiles, shared by the `VectorTiles` of a map: each vector tile always goes to the\n * same worker, which keeps it decoded for every style drawn from it. Requests are tracked one by one, with their\n * owner, so that one `VectorTiles` going away cancels its own requests only.\n */\nexport class BasemapWorkers {\n private readonly workers: [PoolWorker, ...PoolWorker[]];\n private readonly pending = new Map<\n number,\n { resolve: (r: BasemapResponse) => void; reject: (e: Error) => void; worker: PoolWorker; owner: object }\n >();\n private next = 1;\n /** The workers that answered once (they loaded), and those that failed before: dead, their error given at once to\n * any request still sent their way */\n private readonly answered = new WeakSet<PoolWorker>();\n private readonly dead = new Map<PoolWorker, Error>();\n /** The worker the next file of grids goes to, in turn */\n private turn = 0;\n private namespaces = 0;\n private terminated = false;\n /** Stops following the page's request headers */\n private readonly unfollow: () => void;\n\n constructor(\n readonly count: number,\n readonly url: string | URL,\n create: (url: string | URL) => PoolWorker = (u) => new Worker(u, { type: 'module' }),\n ) {\n const start = (): PoolWorker => {\n const worker = create(url);\n\n worker.onmessage = ({ data }: MessageEvent<BasemapResponse>) => {\n this.answered.add(worker);\n\n const p = this.pending.get(data.id);\n\n if (!p) return;\n this.pending.delete(data.id);\n if ('error' in data) p.reject(new Error(data.error));\n else p.resolve(data);\n };\n // A worker that fails to load (a bundler serving it from elsewhere) or to read a message fails its requests; one\n // that never answered is dead: its tiles go to the others, and with none left every request fails at once\n worker.onerror = (event) => {\n event.preventDefault();\n\n const error = this.fail(\n worker,\n `the vector basemap worker ${url} failed${event.message ? `: ${event.message}` : ''}`,\n );\n\n if (!this.answered.has(worker)) this.dead.set(worker, error);\n };\n worker.onmessageerror = () => this.fail(worker, `the vector basemap worker ${url} sent an unreadable message`);\n\n const rules = headerRules();\n\n if (rules.length > 0) worker.postMessage({ type: 'headers', rules } satisfies BasemapRequest);\n\n return worker;\n };\n\n this.workers = [start(), ...Array.from({ length: Math.max(1, count) - 1 }, start)];\n this.unfollow = onHeaderRules((rules) => {\n this.workers.forEach((w) => {\n w.postMessage({ type: 'headers', rules } satisfies BasemapRequest);\n });\n });\n }\n\n /** A prefix for the renderer keys of one `VectorTiles` */\n namespace(): string {\n return `v${this.namespaces++}`;\n }\n\n /** Requests in progress */\n get size(): number {\n return this.pending.size;\n }\n\n /** Rejects the requests of a failed worker, with the error returned */\n private fail(worker: PoolWorker, message: string): Error {\n const error = new Error(\n `isard: ${message}. If a bundler moves the worker, give its URL in the \\`basemapWorkerUrl\\` option (see \"With a bundler\" in the guide)`,\n );\n\n this.pending.forEach((p, id) => {\n if (p.worker !== worker) return;\n this.pending.delete(id);\n p.reject(error);\n });\n\n return error;\n }\n\n /** The worker of a vector tile: always the same one, or the next living one if it died */\n worker(vz: number, vx: number, vy: number): PoolWorker {\n return this.living(workerIndex(vz, vx, vy, this.workers.length));\n }\n\n /** The worker at `index`, or the next one that has not died (the first one when all have) */\n private living(index: number): PoolWorker {\n const { workers } = this;\n const at = (k: number) => workers[(index + k) % workers.length] ?? workers[0];\n const k = workers.findIndex((_, k) => !this.dead.has(at(k)));\n\n return at(Math.max(0, k));\n }\n\n /** Sends a message to every worker (a renderer, or its removal, or where the tessellation module is) */\n broadcast(message: Extract<BasemapRequest, { type: 'init' } | { type: 'drop' } | { type: 'tess' }>): void {\n if (this.terminated) return;\n\n // A renderer tells the workers how many they are: they share the decoded tiles' budget\n const sent = message.type === 'init' ? { ...message, workers: this.workers.length } : message;\n\n // A sprite image is copied to each worker (structured clone)\n this.workers.forEach((w) => {\n w.postMessage(sent);\n });\n }\n\n /** Asks a worker for a tile's image or labels, on behalf of `owner` */\n request(worker: PoolWorker, work: BasemapWork, owner: object, signal?: AbortSignal): Promise<BasemapResponse> {\n return new Promise<BasemapResponse>((resolve, reject) => {\n if (this.terminated) return reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n if (signal?.aborted) return reject(new DOMException('aborted', 'AbortError'));\n\n const dead = this.dead.get(worker);\n\n if (dead) return reject(dead);\n\n const id = this.next++;\n const abort = () => {\n if (!this.pending.delete(id)) return;\n worker.postMessage({ type: 'abort', id } satisfies BasemapRequest);\n reject(new DOMException('aborted', 'AbortError'));\n };\n // The listener goes once the request is settled\n const settle = () => signal?.removeEventListener('abort', abort);\n\n this.pending.set(id, {\n resolve: (r) => {\n settle();\n resolve(r);\n },\n reject: (e) => {\n settle();\n reject(e);\n },\n worker,\n owner,\n });\n signal?.addEventListener('abort', abort, { once: true });\n worker.postMessage({ ...work, id } satisfies BasemapRequest);\n });\n }\n\n /** The altitudes of a PNG relief tile `z`/`x`/`y` at `url`, decoded by a worker (see `fetchHeights`) */\n heights(\n url: string,\n encoding: PngEncoding,\n floor: number | undefined,\n [z, x, y]: [number, number, number],\n signal: AbortSignal,\n owner: object,\n ): Promise<Float32Array | null> {\n const work: BasemapWork = { type: 'heights', url, encoding, ...(floor === undefined ? {} : { floor }) };\n\n return this.request(this.worker(z, x, y), work, owner, signal).then((r) => ('heights' in r ? r.heights : null));\n }\n\n /** Mercator tile `z`/`x`/`y` reprojected by a worker from the source images of its plan (see `resampler`) */\n reproject(\n job: Job,\n [z, x, y]: [number, number, number],\n signal: AbortSignal,\n owner: object,\n ): Promise<ImageBitmap | null> {\n // Blocks of 4 × 4 Mercator tiles go to the same worker: neighbours share source tiles, each worker keeps its share\n const worker = this.worker(Math.max(0, z - 2), x >> 2, y >> 2);\n const cached = Math.max(16, Math.ceil(SOURCE_CACHE / this.workers.length));\n const work: BasemapWork = { type: 'reproject', job, cached };\n\n return this.request(worker, work, owner, signal).then((r) => ('image' in r ? r.image : null));\n }\n\n /** A GRIB2 or NetCDF file (its URL, fetched by the worker, or its bytes, transferred) read into grids by the grid\n * module (`module`), in the next worker */\n grids(\n source: { url: string } | { bytes: ArrayBuffer },\n module: string,\n signal: AbortSignal | undefined,\n owner: object,\n ): Promise<{ grids: GridDescription[]; values: Float32Array[] }> {\n const work: BasemapWork = { type: 'grids', module, ...source };\n\n this.turn = (this.turn + 1) % this.workers.length;\n\n return this.request(this.living(this.turn), work, owner, signal).then((r) =>\n 'grids' in r ? { grids: r.grids, values: r.values } : { grids: [], values: [] },\n );\n }\n\n /** Cancels the requests of an owner (the workers stop them) */\n cancel(owner: object): void {\n this.pending.forEach((p, id) => {\n if (p.owner !== owner) return;\n this.pending.delete(id);\n p.worker.postMessage({ type: 'abort', id } satisfies BasemapRequest);\n p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n });\n }\n\n /** Stops the workers; their requests fail */\n terminate(): void {\n if (this.terminated) return;\n this.terminated = true;\n this.unfollow();\n this.workers.forEach((w) => {\n w.terminate();\n });\n\n const pending = [...this.pending.values()];\n\n this.pending.clear();\n pending.forEach((p) => {\n p.reject(new DOMException('isard: vector tiles destroyed', 'AbortError'));\n });\n }\n}\n"]}