@scoova/mgl 1.0.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.
- package/LICENSE.txt +116 -0
- package/README.md +174 -0
- package/build/banner.ts +12 -0
- package/build/bump-version-changelog.js +26 -0
- package/build/check-bundle-size.js +77 -0
- package/build/generate-dist-package.js +26 -0
- package/build/generate-doc-images.ts +78 -0
- package/build/generate-docs.ts +190 -0
- package/build/generate-shaders.ts +68 -0
- package/build/generate-struct-arrays.ts +438 -0
- package/build/generate-style-code.ts +283 -0
- package/build/readme.md +56 -0
- package/build/release-notes.js +45 -0
- package/build/rollup/bundle_prelude.js +29 -0
- package/build/rollup/maplibregl.js +22 -0
- package/build/rollup_plugins.ts +58 -0
- package/dist/LICENSE.txt +116 -0
- package/dist/maplibre-gl.css +1 -0
- package/dist/maplibre-gl.d.ts +13304 -0
- package/dist/maplibre-gl.js +59 -0
- package/dist/maplibre-gl.js.map +1 -0
- package/dist/package.json +1 -0
- package/package.json +192 -0
- package/src/css/maplibre-gl.css +854 -0
- package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
- package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
- package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
- package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
- package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
- package/src/data/array_types.g.ts +1130 -0
- package/src/data/bucket/circle_attributes.ts +8 -0
- package/src/data/bucket/circle_bucket.ts +197 -0
- package/src/data/bucket/fill_attributes.ts +8 -0
- package/src/data/bucket/fill_bucket.test.ts +95 -0
- package/src/data/bucket/fill_bucket.ts +228 -0
- package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
- package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
- package/src/data/bucket/heatmap_bucket.ts +12 -0
- package/src/data/bucket/line_attributes.ts +8 -0
- package/src/data/bucket/line_attributes_ext.ts +8 -0
- package/src/data/bucket/line_bucket.test.ts +142 -0
- package/src/data/bucket/line_bucket.ts +592 -0
- package/src/data/bucket/pattern_attributes.ts +9 -0
- package/src/data/bucket/pattern_bucket_features.ts +57 -0
- package/src/data/bucket/symbol_attributes.ts +122 -0
- package/src/data/bucket/symbol_bucket.test.ts +243 -0
- package/src/data/bucket/symbol_bucket.ts +975 -0
- package/src/data/bucket.ts +123 -0
- package/src/data/dem_data.test.ts +237 -0
- package/src/data/dem_data.ts +171 -0
- package/src/data/evaluation_feature.ts +18 -0
- package/src/data/extent.ts +13 -0
- package/src/data/feature_index.ts +337 -0
- package/src/data/feature_position_map.test.ts +33 -0
- package/src/data/feature_position_map.ts +126 -0
- package/src/data/index_array_type.ts +9 -0
- package/src/data/load_geometry.test.ts +49 -0
- package/src/data/load_geometry.ts +44 -0
- package/src/data/pos3d_attributes.ts +5 -0
- package/src/data/pos_attributes.ts +5 -0
- package/src/data/program_configuration.ts +735 -0
- package/src/data/raster_bounds_attributes.ts +6 -0
- package/src/data/segment.ts +89 -0
- package/src/geo/edge_insets.test.ts +83 -0
- package/src/geo/edge_insets.ts +146 -0
- package/src/geo/lng_lat.test.ts +65 -0
- package/src/geo/lng_lat.ts +169 -0
- package/src/geo/lng_lat_bounds.test.ts +357 -0
- package/src/geo/lng_lat_bounds.ts +356 -0
- package/src/geo/mercator_coordinate.test.ts +34 -0
- package/src/geo/mercator_coordinate.ts +157 -0
- package/src/geo/projection/projection.ts +72 -0
- package/src/geo/transform.test.ts +509 -0
- package/src/geo/transform.ts +1072 -0
- package/src/gl/color_mode.ts +31 -0
- package/src/gl/context.ts +321 -0
- package/src/gl/cull_face_mode.ts +22 -0
- package/src/gl/depth_mode.ts +26 -0
- package/src/gl/framebuffer.ts +48 -0
- package/src/gl/index_buffer.ts +55 -0
- package/src/gl/render_pool.test.ts +69 -0
- package/src/gl/render_pool.ts +93 -0
- package/src/gl/state.test.ts +125 -0
- package/src/gl/stencil_mode.ts +27 -0
- package/src/gl/types.ts +59 -0
- package/src/gl/value.ts +534 -0
- package/src/gl/vertex_buffer.test.ts +57 -0
- package/src/gl/vertex_buffer.ts +111 -0
- package/src/gl/webgl2.ts +12 -0
- package/src/index.test.ts +121 -0
- package/src/index.ts +250 -0
- package/src/render/draw_background.ts +53 -0
- package/src/render/draw_circle.ts +113 -0
- package/src/render/draw_collision_debug.ts +168 -0
- package/src/render/draw_custom.test.ts +73 -0
- package/src/render/draw_custom.ts +45 -0
- package/src/render/draw_debug.test.ts +122 -0
- package/src/render/draw_debug.ts +148 -0
- package/src/render/draw_fill.test.ts +137 -0
- package/src/render/draw_fill.ts +128 -0
- package/src/render/draw_fill_extrusion.ts +97 -0
- package/src/render/draw_heatmap.ts +228 -0
- package/src/render/draw_hillshade.ts +119 -0
- package/src/render/draw_line.ts +125 -0
- package/src/render/draw_raster.ts +133 -0
- package/src/render/draw_sky.ts +44 -0
- package/src/render/draw_symbol.test.ts +223 -0
- package/src/render/draw_symbol.ts +499 -0
- package/src/render/draw_terrain.ts +99 -0
- package/src/render/glyph_atlas.ts +83 -0
- package/src/render/glyph_manager.test.ts +147 -0
- package/src/render/glyph_manager.ts +198 -0
- package/src/render/image_atlas.ts +159 -0
- package/src/render/image_manager.ts +337 -0
- package/src/render/line_atlas.test.ts +38 -0
- package/src/render/line_atlas.ts +214 -0
- package/src/render/mesh.ts +25 -0
- package/src/render/painter.test.ts +51 -0
- package/src/render/painter.ts +666 -0
- package/src/render/program/background_program.ts +100 -0
- package/src/render/program/circle_program.ts +61 -0
- package/src/render/program/clipping_mask_program.ts +19 -0
- package/src/render/program/collision_program.ts +47 -0
- package/src/render/program/debug_program.ts +29 -0
- package/src/render/program/fill_extrusion_program.ts +120 -0
- package/src/render/program/fill_program.ts +121 -0
- package/src/render/program/heatmap_program.ts +76 -0
- package/src/render/program/hillshade_program.ts +116 -0
- package/src/render/program/line_program.ts +207 -0
- package/src/render/program/pattern.ts +102 -0
- package/src/render/program/program_uniforms.ts +46 -0
- package/src/render/program/raster_program.ts +88 -0
- package/src/render/program/sky_program.ts +28 -0
- package/src/render/program/symbol_program.ts +266 -0
- package/src/render/program/terrain_program.ts +116 -0
- package/src/render/program.ts +233 -0
- package/src/render/render_to_texture.test.ts +151 -0
- package/src/render/render_to_texture.ts +197 -0
- package/src/render/terrain.test.ts +322 -0
- package/src/render/terrain.ts +464 -0
- package/src/render/texture.ts +114 -0
- package/src/render/uniform_binding.test.ts +122 -0
- package/src/render/uniform_binding.ts +157 -0
- package/src/render/update_pattern_positions_in_program.test.ts +74 -0
- package/src/render/update_pattern_positions_in_program.ts +50 -0
- package/src/render/vertex_array_object.ts +163 -0
- package/src/shaders/README.md +42 -0
- package/src/shaders/_prelude.fragment.glsl +19 -0
- package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
- package/src/shaders/_prelude.vertex.glsl +148 -0
- package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
- package/src/shaders/background.fragment.glsl +10 -0
- package/src/shaders/background.fragment.glsl.g.ts +2 -0
- package/src/shaders/background.vertex.glsl +7 -0
- package/src/shaders/background.vertex.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.fragment.glsl +28 -0
- package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.vertex.glsl +19 -0
- package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/circle.fragment.glsl +34 -0
- package/src/shaders/circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/circle.vertex.glsl +68 -0
- package/src/shaders/circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.fragment.glsl +3 -0
- package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.vertex.glsl +7 -0
- package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_box.fragment.glsl +20 -0
- package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_box.vertex.glsl +27 -0
- package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.fragment.glsl +17 -0
- package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.vertex.glsl +59 -0
- package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/debug.fragment.glsl +9 -0
- package/src/shaders/debug.fragment.glsl.g.ts +2 -0
- package/src/shaders/debug.vertex.glsl +12 -0
- package/src/shaders/debug.vertex.glsl.g.ts +2 -0
- package/src/shaders/encode_attribute.test.ts +11 -0
- package/src/shaders/encode_attribute.ts +13 -0
- package/src/shaders/fill.fragment.glsl +13 -0
- package/src/shaders/fill.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill.vertex.glsl +13 -0
- package/src/shaders/fill.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.fragment.glsl +9 -0
- package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.vertex.glsl +84 -0
- package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.fragment.glsl +17 -0
- package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.vertex.glsl +17 -0
- package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.fragment.glsl +39 -0
- package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.vertex.glsl +39 -0
- package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap.fragment.glsl +22 -0
- package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap.vertex.glsl +54 -0
- package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.fragment.glsl +15 -0
- package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.vertex.glsl +11 -0
- package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade.fragment.glsl +52 -0
- package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade.vertex.glsl +11 -0
- package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
- package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
- package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
- package/src/shaders/line.fragment.glsl +30 -0
- package/src/shaders/line.fragment.glsl.g.ts +2 -0
- package/src/shaders/line.vertex.glsl +89 -0
- package/src/shaders/line.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.fragment.glsl +34 -0
- package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.vertex.glsl +92 -0
- package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.fragment.glsl +77 -0
- package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.vertex.glsl +103 -0
- package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.fragment.glsl +45 -0
- package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.vertex.glsl +101 -0
- package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/raster.fragment.glsl +53 -0
- package/src/shaders/raster.fragment.glsl.g.ts +2 -0
- package/src/shaders/raster.vertex.glsl +21 -0
- package/src/shaders/raster.vertex.glsl.g.ts +2 -0
- package/src/shaders/shaders.ts +197 -0
- package/src/shaders/sky.fragment.glsl +17 -0
- package/src/shaders/sky.fragment.glsl.g.ts +2 -0
- package/src/shaders/sky.vertex.glsl +5 -0
- package/src/shaders/sky.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.fragment.glsl +17 -0
- package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.vertex.glsl +117 -0
- package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.fragment.glsl +58 -0
- package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.vertex.glsl +142 -0
- package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain.fragment.glsl +32 -0
- package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain.vertex.glsl +17 -0
- package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.fragment.glsl +11 -0
- package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_coords.vertex.glsl +13 -0
- package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.fragment.glsl +15 -0
- package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
- package/src/shaders/terrain_depth.vertex.glsl +13 -0
- package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
- package/src/source/canvas_source.test.ts +210 -0
- package/src/source/canvas_source.ts +227 -0
- package/src/source/geojson_source.test.ts +492 -0
- package/src/source/geojson_source.ts +431 -0
- package/src/source/geojson_source_diff.test.ts +364 -0
- package/src/source/geojson_source_diff.ts +172 -0
- package/src/source/geojson_worker_source.test.ts +399 -0
- package/src/source/geojson_worker_source.ts +303 -0
- package/src/source/geojson_wrapper.test.ts +32 -0
- package/src/source/geojson_wrapper.ts +81 -0
- package/src/source/image_source.test.ts +235 -0
- package/src/source/image_source.ts +338 -0
- package/src/source/load_tilejson.ts +47 -0
- package/src/source/pixels_to_tile_units.ts +25 -0
- package/src/source/protocol_crud.ts +48 -0
- package/src/source/query_features.test.ts +31 -0
- package/src/source/query_features.ts +252 -0
- package/src/source/raster_dem_tile_source.test.ts +158 -0
- package/src/source/raster_dem_tile_source.ts +166 -0
- package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
- package/src/source/raster_dem_tile_worker_source.ts +38 -0
- package/src/source/raster_tile_source.test.ts +206 -0
- package/src/source/raster_tile_source.ts +227 -0
- package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
- package/src/source/rtl_text_plugin_main_thread.ts +89 -0
- package/src/source/rtl_text_plugin_status.ts +33 -0
- package/src/source/rtl_text_plugin_worker.ts +49 -0
- package/src/source/source.test.ts +41 -0
- package/src/source/source.ts +186 -0
- package/src/source/source_cache.test.ts +2069 -0
- package/src/source/source_cache.ts +1102 -0
- package/src/source/source_state.ts +157 -0
- package/src/source/terrain_source_cache.test.ts +105 -0
- package/src/source/terrain_source_cache.ts +204 -0
- package/src/source/tile.test.ts +290 -0
- package/src/source/tile.ts +478 -0
- package/src/source/tile_bounds.ts +34 -0
- package/src/source/tile_cache.test.ts +130 -0
- package/src/source/tile_cache.ts +208 -0
- package/src/source/tile_id.test.ts +112 -0
- package/src/source/tile_id.ts +221 -0
- package/src/source/vector_tile_source.test.ts +401 -0
- package/src/source/vector_tile_source.ts +283 -0
- package/src/source/vector_tile_worker_source.test.ts +396 -0
- package/src/source/vector_tile_worker_source.ts +199 -0
- package/src/source/video_source.test.ts +124 -0
- package/src/source/video_source.ts +204 -0
- package/src/source/worker.test.ts +233 -0
- package/src/source/worker.ts +301 -0
- package/src/source/worker_source.ts +117 -0
- package/src/source/worker_tile.test.ts +226 -0
- package/src/source/worker_tile.ts +208 -0
- package/src/style/create_style_layer.ts +39 -0
- package/src/style/evaluation_parameters.ts +62 -0
- package/src/style/format_section_override.test.ts +62 -0
- package/src/style/format_section_override.ts +50 -0
- package/src/style/light.test.ts +86 -0
- package/src/style/light.ts +135 -0
- package/src/style/load_glyph_range.test.ts +40 -0
- package/src/style/load_glyph_range.ts +32 -0
- package/src/style/load_sprite.test.ts +227 -0
- package/src/style/load_sprite.ts +71 -0
- package/src/style/parse_glyph_pbf.ts +42 -0
- package/src/style/pauseable_placement.ts +138 -0
- package/src/style/properties.ts +726 -0
- package/src/style/query_utils.test.ts +107 -0
- package/src/style/query_utils.ts +70 -0
- package/src/style/sky.ts +127 -0
- package/src/style/style.test.ts +2654 -0
- package/src/style/style.ts +1814 -0
- package/src/style/style_glyph.ts +25 -0
- package/src/style/style_image.ts +188 -0
- package/src/style/style_layer/background_style_layer.ts +17 -0
- package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
- package/src/style/style_layer/circle_style_layer.ts +98 -0
- package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
- package/src/style/style_layer/custom_style_layer.ts +233 -0
- package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
- package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/fill_style_layer.test.ts +37 -0
- package/src/style/style_layer/fill_style_layer.ts +65 -0
- package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
- package/src/style/style_layer/heatmap_style_layer.ts +74 -0
- package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
- package/src/style/style_layer/hillshade_style_layer.ts +21 -0
- package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
- package/src/style/style_layer/line_style_layer.test.ts +50 -0
- package/src/style/style_layer/line_style_layer.ts +131 -0
- package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
- package/src/style/style_layer/overlap_mode.test.ts +57 -0
- package/src/style/style_layer/overlap_mode.ts +25 -0
- package/src/style/style_layer/raster_style_layer.ts +17 -0
- package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
- package/src/style/style_layer/symbol_style_layer.ts +195 -0
- package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
- package/src/style/style_layer/typed_style_layer.ts +9 -0
- package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
- package/src/style/style_layer/variable_text_anchor.ts +163 -0
- package/src/style/style_layer.test.ts +372 -0
- package/src/style/style_layer.ts +287 -0
- package/src/style/style_layer_index.test.ts +99 -0
- package/src/style/style_layer_index.ts +78 -0
- package/src/style/validate_style.ts +53 -0
- package/src/style/zoom_history.ts +40 -0
- package/src/symbol/anchor.test.ts +14 -0
- package/src/symbol/anchor.ts +22 -0
- package/src/symbol/check_max_angle.test.ts +54 -0
- package/src/symbol/check_max_angle.ts +76 -0
- package/src/symbol/clip_line.test.ts +154 -0
- package/src/symbol/clip_line.ts +66 -0
- package/src/symbol/collision_feature.test.ts +98 -0
- package/src/symbol/collision_feature.ts +114 -0
- package/src/symbol/collision_index.test.ts +19 -0
- package/src/symbol/collision_index.ts +618 -0
- package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
- package/src/symbol/cross_tile_symbol_index.ts +367 -0
- package/src/symbol/get_anchors.test.ts +113 -0
- package/src/symbol/get_anchors.ts +167 -0
- package/src/symbol/grid_index.test.ts +75 -0
- package/src/symbol/grid_index.ts +414 -0
- package/src/symbol/merge_lines.test.ts +30 -0
- package/src/symbol/merge_lines.ts +80 -0
- package/src/symbol/one_em.ts +3 -0
- package/src/symbol/opacity_state.ts +23 -0
- package/src/symbol/path_interpolator.test.ts +134 -0
- package/src/symbol/path_interpolator.ts +55 -0
- package/src/symbol/placement.ts +1371 -0
- package/src/symbol/projection.test.ts +171 -0
- package/src/symbol/projection.ts +833 -0
- package/src/symbol/quads.test.ts +157 -0
- package/src/symbol/quads.ts +349 -0
- package/src/symbol/shaping.test.ts +360 -0
- package/src/symbol/shaping.ts +911 -0
- package/src/symbol/symbol_layout.ts +739 -0
- package/src/symbol/symbol_size.ts +129 -0
- package/src/symbol/symbol_style_layer.test.ts +103 -0
- package/src/symbol/transform_text.ts +27 -0
- package/src/ui/anchor.ts +27 -0
- package/src/ui/camera.test.ts +2301 -0
- package/src/ui/camera.ts +1520 -0
- package/src/ui/control/attribution_control.test.ts +543 -0
- package/src/ui/control/attribution_control.ts +209 -0
- package/src/ui/control/control.ts +67 -0
- package/src/ui/control/fullscreen_control.test.ts +114 -0
- package/src/ui/control/fullscreen_control.ts +189 -0
- package/src/ui/control/geolocate_control.test.ts +619 -0
- package/src/ui/control/geolocate_control.ts +725 -0
- package/src/ui/control/logo_control.test.ts +88 -0
- package/src/ui/control/logo_control.ts +86 -0
- package/src/ui/control/navigation_control.test.ts +238 -0
- package/src/ui/control/navigation_control.ts +294 -0
- package/src/ui/control/scale_control.test.ts +52 -0
- package/src/ui/control/scale_control.ts +152 -0
- package/src/ui/control/terrain_control.test.ts +58 -0
- package/src/ui/control/terrain_control.ts +74 -0
- package/src/ui/default_locale.ts +25 -0
- package/src/ui/events.ts +758 -0
- package/src/ui/handler/box_zoom.test.ts +163 -0
- package/src/ui/handler/box_zoom.ts +171 -0
- package/src/ui/handler/click_zoom.ts +55 -0
- package/src/ui/handler/cooperative_gestures.test.ts +338 -0
- package/src/ui/handler/cooperative_gestures.ts +111 -0
- package/src/ui/handler/dblclick_zoom.test.ts +151 -0
- package/src/ui/handler/drag_handler.ts +174 -0
- package/src/ui/handler/drag_move_state_manager.ts +115 -0
- package/src/ui/handler/drag_pan.test.ts +487 -0
- package/src/ui/handler/drag_rotate.test.ts +859 -0
- package/src/ui/handler/handler_util.ts +10 -0
- package/src/ui/handler/keyboard.test.ts +235 -0
- package/src/ui/handler/keyboard.ts +212 -0
- package/src/ui/handler/map_event.test.ts +158 -0
- package/src/ui/handler/map_event.ts +161 -0
- package/src/ui/handler/mouse.ts +92 -0
- package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
- package/src/ui/handler/mouse_rotate.test.ts +62 -0
- package/src/ui/handler/one_finger_touch_drag.ts +45 -0
- package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
- package/src/ui/handler/scroll_zoom.test.ts +382 -0
- package/src/ui/handler/scroll_zoom.ts +379 -0
- package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
- package/src/ui/handler/shim/drag_pan.ts +104 -0
- package/src/ui/handler/shim/drag_rotate.ts +76 -0
- package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
- package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
- package/src/ui/handler/tap_drag_zoom.ts +112 -0
- package/src/ui/handler/tap_recognizer.ts +138 -0
- package/src/ui/handler/tap_zoom.ts +98 -0
- package/src/ui/handler/touch_pan.ts +115 -0
- package/src/ui/handler/transform-provider.ts +44 -0
- package/src/ui/handler/two_fingers_touch.test.ts +283 -0
- package/src/ui/handler/two_fingers_touch.ts +336 -0
- package/src/ui/handler_inertia.ts +157 -0
- package/src/ui/handler_manager.ts +637 -0
- package/src/ui/hash.test.ts +404 -0
- package/src/ui/hash.ts +153 -0
- package/src/ui/map.ts +3393 -0
- package/src/ui/map_tests/map_animation.test.ts +61 -0
- package/src/ui/map_tests/map_basic.test.ts +223 -0
- package/src/ui/map_tests/map_bounds.test.ts +123 -0
- package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
- package/src/ui/map_tests/map_canvas.test.ts +59 -0
- package/src/ui/map_tests/map_control.test.ts +61 -0
- package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
- package/src/ui/map_tests/map_events.test.ts +1001 -0
- package/src/ui/map_tests/map_feature_state.test.ts +421 -0
- package/src/ui/map_tests/map_images.test.ts +175 -0
- package/src/ui/map_tests/map_is_moving.test.ts +164 -0
- package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
- package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
- package/src/ui/map_tests/map_layer.test.ts +457 -0
- package/src/ui/map_tests/map_options.test.ts +64 -0
- package/src/ui/map_tests/map_pitch.test.ts +90 -0
- package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
- package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
- package/src/ui/map_tests/map_render.test.ts +90 -0
- package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
- package/src/ui/map_tests/map_resize.test.ts +120 -0
- package/src/ui/map_tests/map_style.test.ts +541 -0
- package/src/ui/map_tests/map_terrian.test.ts +104 -0
- package/src/ui/map_tests/map_webgl.test.ts +72 -0
- package/src/ui/map_tests/map_world_copies.test.ts +103 -0
- package/src/ui/map_tests/map_zoom.test.ts +95 -0
- package/src/ui/marker.test.ts +1149 -0
- package/src/ui/marker.ts +880 -0
- package/src/ui/popup.test.ts +827 -0
- package/src/ui/popup.ts +717 -0
- package/src/util/abort_error.ts +21 -0
- package/src/util/actor.test.ts +218 -0
- package/src/util/actor.ts +241 -0
- package/src/util/actor_messages.ts +149 -0
- package/src/util/ajax.test.ts +237 -0
- package/src/util/ajax.ts +297 -0
- package/src/util/browser.test.ts +23 -0
- package/src/util/browser.ts +63 -0
- package/src/util/color_ramp.test.ts +105 -0
- package/src/util/color_ramp.ts +56 -0
- package/src/util/config.ts +29 -0
- package/src/util/dictionary_coder.ts +23 -0
- package/src/util/dispatcher.test.ts +76 -0
- package/src/util/dispatcher.ts +78 -0
- package/src/util/dom.ts +135 -0
- package/src/util/evented.test.ts +231 -0
- package/src/util/evented.ts +178 -0
- package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
- package/src/util/find_pole_of_inaccessibility.ts +130 -0
- package/src/util/geolocation_support.test.ts +43 -0
- package/src/util/geolocation_support.ts +23 -0
- package/src/util/global_worker_pool.ts +65 -0
- package/src/util/image.ts +150 -0
- package/src/util/image_request.test.ts +408 -0
- package/src/util/image_request.ts +246 -0
- package/src/util/intersection_tests.ts +206 -0
- package/src/util/is_char_in_unicode_block.test.ts +15 -0
- package/src/util/is_char_in_unicode_block.ts +345 -0
- package/src/util/offscreen_canvas_distorted.test.ts +13 -0
- package/src/util/offscreen_canvas_distorted.ts +39 -0
- package/src/util/offscreen_canvas_supported.ts +11 -0
- package/src/util/performance.ts +117 -0
- package/src/util/primitives.test.ts +140 -0
- package/src/util/primitives.ts +143 -0
- package/src/util/request_manager.ts +42 -0
- package/src/util/resolve_tokens.test.ts +45 -0
- package/src/util/resolve_tokens.ts +17 -0
- package/src/util/script_detection.test.ts +138 -0
- package/src/util/script_detection.ts +376 -0
- package/src/util/smart_wrap.test.ts +97 -0
- package/src/util/smart_wrap.ts +58 -0
- package/src/util/struct_array.test.ts +101 -0
- package/src/util/struct_array.ts +246 -0
- package/src/util/style.test.ts +34 -0
- package/src/util/style.ts +28 -0
- package/src/util/task_queue.test.ts +114 -0
- package/src/util/task_queue.ts +64 -0
- package/src/util/test/util.ts +185 -0
- package/src/util/throttle.test.ts +42 -0
- package/src/util/throttle.ts +28 -0
- package/src/util/throttled_invoker.ts +41 -0
- package/src/util/transferable_grid_index.test.ts +56 -0
- package/src/util/transferable_grid_index.ts +214 -0
- package/src/util/util.test.ts +414 -0
- package/src/util/util.ts +724 -0
- package/src/util/vectortile_to_geojson.ts +72 -0
- package/src/util/verticalize_punctuation.ts +110 -0
- package/src/util/web_worker.ts +16 -0
- package/src/util/web_worker_transfer.test.ts +153 -0
- package/src/util/web_worker_transfer.ts +254 -0
- package/src/util/webp_supported.ts +63 -0
- package/src/util/worker_pool.test.ts +43 -0
- package/src/util/worker_pool.ts +58 -0
- package/src/util/world_bounds.test.ts +59 -0
- package/src/util/world_bounds.ts +46 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import vt from '@mapbox/vector-tile';
|
|
4
|
+
import Protobuf from 'pbf';
|
|
5
|
+
import {LoadVectorData, VectorTileWorkerSource} from '../source/vector_tile_worker_source';
|
|
6
|
+
import {StyleLayerIndex} from '../style/style_layer_index';
|
|
7
|
+
import {fakeServer, type FakeServer} from 'nise';
|
|
8
|
+
import {IActor} from '../util/actor';
|
|
9
|
+
import {TileParameters, WorkerTileParameters, WorkerTileResult} from './worker_source';
|
|
10
|
+
import {WorkerTile} from './worker_tile';
|
|
11
|
+
import {setPerformance, sleep} from '../util/test/util';
|
|
12
|
+
import {ABORT_ERROR} from '../util/abort_error';
|
|
13
|
+
|
|
14
|
+
describe('vector tile worker source', () => {
|
|
15
|
+
const actor = {sendAsync: () => Promise.resolve({})} as IActor;
|
|
16
|
+
let server: FakeServer;
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
global.fetch = null;
|
|
20
|
+
server = fakeServer.create();
|
|
21
|
+
setPerformance();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
afterEach(() => {
|
|
25
|
+
server.restore();
|
|
26
|
+
jest.clearAllMocks();
|
|
27
|
+
});
|
|
28
|
+
test('VectorTileWorkerSource#abortTile aborts pending request', async () => {
|
|
29
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
30
|
+
|
|
31
|
+
const loadPromise = source.loadTile({
|
|
32
|
+
source: 'source',
|
|
33
|
+
uid: 0,
|
|
34
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
35
|
+
request: {url: 'http://localhost:2900/abort'}
|
|
36
|
+
} as any as WorkerTileParameters);
|
|
37
|
+
|
|
38
|
+
const abortPromise = source.abortTile({
|
|
39
|
+
source: 'source',
|
|
40
|
+
uid: 0
|
|
41
|
+
} as any as TileParameters);
|
|
42
|
+
|
|
43
|
+
expect(source.loading).toEqual({});
|
|
44
|
+
await expect(abortPromise).resolves.toBeFalsy();
|
|
45
|
+
await expect(loadPromise).rejects.toThrow(ABORT_ERROR);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test('VectorTileWorkerSource#removeTile removes loaded tile', async () => {
|
|
49
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
50
|
+
|
|
51
|
+
source.loaded = {
|
|
52
|
+
'0': {} as WorkerTile
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const res = await source.removeTile({
|
|
56
|
+
source: 'source',
|
|
57
|
+
uid: 0
|
|
58
|
+
} as any as TileParameters);
|
|
59
|
+
expect(res).toBeUndefined();
|
|
60
|
+
|
|
61
|
+
expect(source.loaded).toEqual({});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('VectorTileWorkerSource#reloadTile reloads a previously-loaded tile', async () => {
|
|
65
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
66
|
+
const parse = jest.fn().mockReturnValue(Promise.resolve({} as WorkerTileResult));
|
|
67
|
+
|
|
68
|
+
source.loaded = {
|
|
69
|
+
'0': {
|
|
70
|
+
status: 'done',
|
|
71
|
+
vectorTile: {},
|
|
72
|
+
parse
|
|
73
|
+
} as any as WorkerTile
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const reloadPromise = source.reloadTile({uid: 0} as any as WorkerTileParameters);
|
|
77
|
+
expect(parse).toHaveBeenCalledTimes(1);
|
|
78
|
+
await expect(reloadPromise).resolves.toBeTruthy();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('VectorTileWorkerSource#loadTile reparses tile if the reloadTile has been called during parsing', async () => {
|
|
82
|
+
const rawTileData = new Uint8Array([]);
|
|
83
|
+
const loadVectorData: LoadVectorData = async (_params, _abortController) => {
|
|
84
|
+
return {
|
|
85
|
+
vectorTile: {
|
|
86
|
+
layers: {
|
|
87
|
+
test: {
|
|
88
|
+
version: 2,
|
|
89
|
+
name: 'test',
|
|
90
|
+
extent: 8192,
|
|
91
|
+
length: 1,
|
|
92
|
+
feature: (featureIndex: number) => ({
|
|
93
|
+
extent: 8192,
|
|
94
|
+
type: 1,
|
|
95
|
+
id: featureIndex,
|
|
96
|
+
properties: {
|
|
97
|
+
name: 'test'
|
|
98
|
+
},
|
|
99
|
+
loadGeometry () {
|
|
100
|
+
return [[{x: 0, y: 0}]];
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} as any as vt.VectorTile,
|
|
106
|
+
rawData: rawTileData
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const layerIndex = new StyleLayerIndex([{
|
|
111
|
+
id: 'test',
|
|
112
|
+
source: 'source',
|
|
113
|
+
'source-layer': 'test',
|
|
114
|
+
type: 'symbol',
|
|
115
|
+
layout: {
|
|
116
|
+
'icon-image': 'hello',
|
|
117
|
+
'text-font': ['StandardFont-Bold'],
|
|
118
|
+
'text-field': '{name}'
|
|
119
|
+
}
|
|
120
|
+
}]);
|
|
121
|
+
|
|
122
|
+
const actor = {
|
|
123
|
+
sendAsync: (message: {type: string; data: unknown}, abortController: AbortController) => {
|
|
124
|
+
return new Promise((resolve, _reject) => {
|
|
125
|
+
const res = setTimeout(() => {
|
|
126
|
+
const response = message.type === 'getImages' ?
|
|
127
|
+
{'hello': {width: 1, height: 1, data: new Uint8Array([0])}} :
|
|
128
|
+
{'StandardFont-Bold': {width: 1, height: 1, data: new Uint8Array([0])}};
|
|
129
|
+
resolve(response);
|
|
130
|
+
}, 100);
|
|
131
|
+
abortController.signal.addEventListener('abort', () => {
|
|
132
|
+
clearTimeout(res);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
const source = new VectorTileWorkerSource(actor, layerIndex, ['hello']);
|
|
138
|
+
source.loadVectorTile = loadVectorData;
|
|
139
|
+
source.loadTile({
|
|
140
|
+
source: 'source',
|
|
141
|
+
uid: 0,
|
|
142
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
143
|
+
request: {url: 'http://localhost:2900/faketile.pbf'}
|
|
144
|
+
} as any as WorkerTileParameters).then(() => expect(false).toBeTruthy());
|
|
145
|
+
|
|
146
|
+
// allow promise to run
|
|
147
|
+
await sleep(0);
|
|
148
|
+
|
|
149
|
+
const res = await source.reloadTile({
|
|
150
|
+
source: 'source',
|
|
151
|
+
uid: 0,
|
|
152
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
153
|
+
} as any as WorkerTileParameters);
|
|
154
|
+
expect(res).toBeDefined();
|
|
155
|
+
expect(res.rawTileData).toBeDefined();
|
|
156
|
+
expect(res.rawTileData).toStrictEqual(rawTileData);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('VectorTileWorkerSource#loadTile reparses tile if reloadTile is called during reparsing', async () => {
|
|
160
|
+
const rawTileData = new Uint8Array([]);
|
|
161
|
+
const loadVectorData: LoadVectorData = async (_params, _abortController) => {
|
|
162
|
+
return {
|
|
163
|
+
vectorTile: new vt.VectorTile(new Protobuf(rawTileData)),
|
|
164
|
+
rawData: rawTileData
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const layerIndex = new StyleLayerIndex([{
|
|
169
|
+
id: 'test',
|
|
170
|
+
source: 'source',
|
|
171
|
+
'source-layer': 'test',
|
|
172
|
+
type: 'fill'
|
|
173
|
+
}]);
|
|
174
|
+
|
|
175
|
+
const source = new VectorTileWorkerSource(actor, layerIndex, []);
|
|
176
|
+
source.loadVectorTile = loadVectorData;
|
|
177
|
+
|
|
178
|
+
const parseWorkerTileMock = jest
|
|
179
|
+
.spyOn(WorkerTile.prototype, 'parse')
|
|
180
|
+
.mockImplementation(function(_data, _layerIndex, _availableImages, _actor) {
|
|
181
|
+
this.status = 'parsing';
|
|
182
|
+
return new Promise((resolve) => {
|
|
183
|
+
setTimeout(() => resolve({} as WorkerTileResult), 20);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
const loadPromise = source.loadTile({
|
|
188
|
+
source: 'source',
|
|
189
|
+
uid: 0,
|
|
190
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
191
|
+
request: {url: 'http://localhost:2900/faketile.pbf'}
|
|
192
|
+
} as any as WorkerTileParameters);
|
|
193
|
+
|
|
194
|
+
// let the promise start
|
|
195
|
+
await sleep(0);
|
|
196
|
+
|
|
197
|
+
const res = await source.reloadTile({
|
|
198
|
+
source: 'source',
|
|
199
|
+
uid: '0',
|
|
200
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
201
|
+
} as any as WorkerTileParameters);
|
|
202
|
+
expect(res).toBeDefined();
|
|
203
|
+
expect(parseWorkerTileMock).toHaveBeenCalledTimes(2);
|
|
204
|
+
await expect(loadPromise).resolves.toBeTruthy();
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('VectorTileWorkerSource#reloadTile does not reparse tiles with no vectorTile data but does call callback', async () => {
|
|
208
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
209
|
+
const parse = jest.fn();
|
|
210
|
+
|
|
211
|
+
source.loaded = {
|
|
212
|
+
'0': {
|
|
213
|
+
status: 'done',
|
|
214
|
+
parse
|
|
215
|
+
} as any as WorkerTile
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
await source.reloadTile({uid: 0} as any as WorkerTileParameters);
|
|
219
|
+
expect(parse).not.toHaveBeenCalled();
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test('VectorTileWorkerSource#loadTile returns null for an empty tile', async () => {
|
|
223
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
224
|
+
source.loadVectorTile = (_params, _abortController) => Promise.resolve(null);
|
|
225
|
+
const parse = jest.fn();
|
|
226
|
+
|
|
227
|
+
server.respondWith(request => {
|
|
228
|
+
request.respond(200, {'Content-Type': 'application/pbf'}, 'something...');
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const promise = source.loadTile({
|
|
232
|
+
source: 'source',
|
|
233
|
+
uid: 0,
|
|
234
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
235
|
+
request: {url: 'http://localhost:2900/faketile.pbf'}
|
|
236
|
+
} as any as WorkerTileParameters);
|
|
237
|
+
|
|
238
|
+
server.respond();
|
|
239
|
+
|
|
240
|
+
expect(parse).not.toHaveBeenCalled();
|
|
241
|
+
expect(await promise).toBeNull();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test('VectorTileWorkerSource#returns a good error message when failing to parse a tile', () => new Promise<void>(done => {
|
|
245
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
246
|
+
const parse = jest.fn();
|
|
247
|
+
|
|
248
|
+
server.respondWith(request => {
|
|
249
|
+
request.respond(200, {'Content-Type': 'application/pbf'}, 'something...');
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
source.loadTile({
|
|
253
|
+
source: 'source',
|
|
254
|
+
uid: 0,
|
|
255
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
256
|
+
request: {url: 'http://localhost:2900/faketile.pbf'}
|
|
257
|
+
} as any as WorkerTileParameters).catch((err) => {
|
|
258
|
+
expect(err.message).toContain('Unable to parse the tile at');
|
|
259
|
+
done();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
server.respond();
|
|
263
|
+
|
|
264
|
+
expect(parse).not.toHaveBeenCalled();
|
|
265
|
+
}));
|
|
266
|
+
|
|
267
|
+
test('VectorTileWorkerSource#returns a good error message when failing to parse a gzipped tile', () => new Promise<void>(done => {
|
|
268
|
+
const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
|
|
269
|
+
const parse = jest.fn();
|
|
270
|
+
|
|
271
|
+
server.respondWith(new Uint8Array([0x1f, 0x8b]).buffer);
|
|
272
|
+
|
|
273
|
+
source.loadTile({
|
|
274
|
+
source: 'source',
|
|
275
|
+
uid: 0,
|
|
276
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
277
|
+
request: {url: 'http://localhost:2900/faketile.pbf'}
|
|
278
|
+
} as any as WorkerTileParameters).catch((err) => {
|
|
279
|
+
expect(err.message).toContain('gzipped');
|
|
280
|
+
done();
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
server.respond();
|
|
284
|
+
|
|
285
|
+
expect(parse).not.toHaveBeenCalled();
|
|
286
|
+
}));
|
|
287
|
+
|
|
288
|
+
test('VectorTileWorkerSource provides resource timing information', async () => {
|
|
289
|
+
const rawTileData = fs.readFileSync(path.join(__dirname, '/../../test/unit/assets/mbsv5-6-18-23.vector.pbf'));
|
|
290
|
+
|
|
291
|
+
const loadVectorData: LoadVectorData = async (_params, _abortController) => {
|
|
292
|
+
return {
|
|
293
|
+
vectorTile: new vt.VectorTile(new Protobuf(rawTileData)),
|
|
294
|
+
rawData: rawTileData,
|
|
295
|
+
cacheControl: null,
|
|
296
|
+
expires: null
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
const exampleResourceTiming = {
|
|
301
|
+
connectEnd: 473,
|
|
302
|
+
connectStart: 473,
|
|
303
|
+
decodedBodySize: 86494,
|
|
304
|
+
domainLookupEnd: 473,
|
|
305
|
+
domainLookupStart: 473,
|
|
306
|
+
duration: 341,
|
|
307
|
+
encodedBodySize: 52528,
|
|
308
|
+
entryType: 'resource',
|
|
309
|
+
fetchStart: 473.5,
|
|
310
|
+
initiatorType: 'xmlhttprequest',
|
|
311
|
+
name: 'http://localhost:2900/faketile.pbf',
|
|
312
|
+
nextHopProtocol: 'http/1.1',
|
|
313
|
+
redirectEnd: 0,
|
|
314
|
+
redirectStart: 0,
|
|
315
|
+
requestStart: 477,
|
|
316
|
+
responseEnd: 815,
|
|
317
|
+
responseStart: 672,
|
|
318
|
+
secureConnectionStart: 0
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
const layerIndex = new StyleLayerIndex([{
|
|
322
|
+
id: 'test',
|
|
323
|
+
source: 'source',
|
|
324
|
+
'source-layer': 'test',
|
|
325
|
+
type: 'fill'
|
|
326
|
+
}]);
|
|
327
|
+
|
|
328
|
+
const source = new VectorTileWorkerSource(actor, layerIndex, []);
|
|
329
|
+
source.loadVectorTile = loadVectorData;
|
|
330
|
+
|
|
331
|
+
window.performance.getEntriesByName = jest.fn().mockReturnValue([exampleResourceTiming]);
|
|
332
|
+
|
|
333
|
+
const res = await source.loadTile({
|
|
334
|
+
source: 'source',
|
|
335
|
+
uid: 0,
|
|
336
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
337
|
+
request: {url: 'http://localhost:2900/faketile.pbf', collectResourceTiming: true}
|
|
338
|
+
} as any as WorkerTileParameters);
|
|
339
|
+
|
|
340
|
+
expect(res.resourceTiming[0]).toEqual(exampleResourceTiming);
|
|
341
|
+
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
test('VectorTileWorkerSource provides resource timing information (fallback method)', async () => {
|
|
345
|
+
const rawTileData = fs.readFileSync(path.join(__dirname, '/../../test/unit/assets/mbsv5-6-18-23.vector.pbf'));
|
|
346
|
+
|
|
347
|
+
const loadVectorData: LoadVectorData = async (_params, _abortController) => {
|
|
348
|
+
return {
|
|
349
|
+
vectorTile: new vt.VectorTile(new Protobuf(rawTileData)),
|
|
350
|
+
rawData: rawTileData,
|
|
351
|
+
cacheControl: null,
|
|
352
|
+
expires: null
|
|
353
|
+
};
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const layerIndex = new StyleLayerIndex([{
|
|
357
|
+
id: 'test',
|
|
358
|
+
source: 'source',
|
|
359
|
+
'source-layer': 'test',
|
|
360
|
+
type: 'fill'
|
|
361
|
+
}]);
|
|
362
|
+
|
|
363
|
+
const source = new VectorTileWorkerSource(actor, layerIndex, []);
|
|
364
|
+
source.loadVectorTile = loadVectorData;
|
|
365
|
+
|
|
366
|
+
const sampleMarks = [100, 350];
|
|
367
|
+
const marks = {};
|
|
368
|
+
const measures = {};
|
|
369
|
+
window.performance.getEntriesByName = jest.fn().mockImplementation(name => (measures[name] || []));
|
|
370
|
+
window.performance.mark = jest.fn().mockImplementation(name => {
|
|
371
|
+
marks[name] = sampleMarks.shift();
|
|
372
|
+
return null;
|
|
373
|
+
});
|
|
374
|
+
window.performance.measure = jest.fn().mockImplementation((name, start, end) => {
|
|
375
|
+
measures[name] = measures[name] || [];
|
|
376
|
+
measures[name].push({
|
|
377
|
+
duration: marks[end] - marks[start],
|
|
378
|
+
entryType: 'measure',
|
|
379
|
+
name,
|
|
380
|
+
startTime: marks[start]
|
|
381
|
+
});
|
|
382
|
+
return null;
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
const res = await source.loadTile({
|
|
386
|
+
source: 'source',
|
|
387
|
+
uid: 0,
|
|
388
|
+
tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
|
|
389
|
+
request: {url: 'http://localhost:2900/faketile.pbf', collectResourceTiming: true}
|
|
390
|
+
} as any as WorkerTileParameters);
|
|
391
|
+
|
|
392
|
+
expect(res.resourceTiming[0]).toEqual(
|
|
393
|
+
{'duration': 250, 'entryType': 'measure', 'name': 'http://localhost:2900/faketile.pbf', 'startTime': 100}
|
|
394
|
+
);
|
|
395
|
+
});
|
|
396
|
+
});
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import {ExpiryData, getArrayBuffer} from '../util/ajax';
|
|
2
|
+
|
|
3
|
+
import vt from '@mapbox/vector-tile';
|
|
4
|
+
import Protobuf from 'pbf';
|
|
5
|
+
import {WorkerTile} from './worker_tile';
|
|
6
|
+
import {extend} from '../util/util';
|
|
7
|
+
import {RequestPerformance} from '../util/performance';
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
WorkerSource,
|
|
11
|
+
WorkerTileParameters,
|
|
12
|
+
TileParameters,
|
|
13
|
+
WorkerTileResult
|
|
14
|
+
} from '../source/worker_source';
|
|
15
|
+
|
|
16
|
+
import type {IActor} from '../util/actor';
|
|
17
|
+
import type {StyleLayerIndex} from '../style/style_layer_index';
|
|
18
|
+
import type {VectorTile} from '@mapbox/vector-tile';
|
|
19
|
+
|
|
20
|
+
export type LoadVectorTileResult = {
|
|
21
|
+
vectorTile: VectorTile;
|
|
22
|
+
rawData: ArrayBuffer;
|
|
23
|
+
resourceTiming?: Array<PerformanceResourceTiming>;
|
|
24
|
+
} & ExpiryData;
|
|
25
|
+
|
|
26
|
+
type FetchingState = {
|
|
27
|
+
rawTileData: ArrayBuffer;
|
|
28
|
+
cacheControl: ExpiryData;
|
|
29
|
+
resourceTiming: any;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type AbortVectorData = () => void;
|
|
33
|
+
export type LoadVectorData = (params: WorkerTileParameters, abortController: AbortController) => Promise<LoadVectorTileResult | null>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
|
|
37
|
+
* This class is designed to be easily reused to support custom source types
|
|
38
|
+
* for data formats that can be parsed/converted into an in-memory VectorTile
|
|
39
|
+
* representation. To do so, override its `loadVectorTile` method.
|
|
40
|
+
*/
|
|
41
|
+
export class VectorTileWorkerSource implements WorkerSource {
|
|
42
|
+
actor: IActor;
|
|
43
|
+
layerIndex: StyleLayerIndex;
|
|
44
|
+
availableImages: Array<string>;
|
|
45
|
+
fetching: {[_: string]: FetchingState };
|
|
46
|
+
loading: {[_: string]: WorkerTile};
|
|
47
|
+
loaded: {[_: string]: WorkerTile};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @param loadVectorData - Optional method for custom loading of a VectorTile
|
|
51
|
+
* object based on parameters passed from the main-thread Source. See
|
|
52
|
+
* {@link VectorTileWorkerSource#loadTile}. The default implementation simply
|
|
53
|
+
* loads the pbf at `params.url`.
|
|
54
|
+
*/
|
|
55
|
+
constructor(actor: IActor, layerIndex: StyleLayerIndex, availableImages: Array<string>) {
|
|
56
|
+
this.actor = actor;
|
|
57
|
+
this.layerIndex = layerIndex;
|
|
58
|
+
this.availableImages = availableImages;
|
|
59
|
+
this.fetching = {};
|
|
60
|
+
this.loading = {};
|
|
61
|
+
this.loaded = {};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Loads a vector tile
|
|
66
|
+
*/
|
|
67
|
+
async loadVectorTile(params: WorkerTileParameters, abortController: AbortController): Promise<LoadVectorTileResult> {
|
|
68
|
+
const response = await getArrayBuffer(params.request, abortController);
|
|
69
|
+
try {
|
|
70
|
+
const vectorTile = new vt.VectorTile(new Protobuf(response.data));
|
|
71
|
+
return {
|
|
72
|
+
vectorTile,
|
|
73
|
+
rawData: response.data,
|
|
74
|
+
cacheControl: response.cacheControl,
|
|
75
|
+
expires: response.expires
|
|
76
|
+
};
|
|
77
|
+
} catch (ex) {
|
|
78
|
+
const bytes = new Uint8Array(response.data);
|
|
79
|
+
const isGzipped = bytes[0] === 0x1f && bytes[1] === 0x8b;
|
|
80
|
+
let errorMessage = `Unable to parse the tile at ${params.request.url}, `;
|
|
81
|
+
if (isGzipped) {
|
|
82
|
+
errorMessage += 'please make sure the data is not gzipped and that you have configured the relevant header in the server';
|
|
83
|
+
} else {
|
|
84
|
+
errorMessage += `got error: ${ex.message}`;
|
|
85
|
+
}
|
|
86
|
+
throw new Error(errorMessage);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Implements {@link WorkerSource#loadTile}. Delegates to
|
|
92
|
+
* {@link VectorTileWorkerSource#loadVectorData} (which by default expects
|
|
93
|
+
* a `params.url` property) for fetching and producing a VectorTile object.
|
|
94
|
+
*/
|
|
95
|
+
async loadTile(params: WorkerTileParameters): Promise<WorkerTileResult | null> {
|
|
96
|
+
const tileUid = params.uid;
|
|
97
|
+
|
|
98
|
+
const perf = (params && params.request && params.request.collectResourceTiming) ?
|
|
99
|
+
new RequestPerformance(params.request) : false;
|
|
100
|
+
|
|
101
|
+
const workerTile = new WorkerTile(params);
|
|
102
|
+
this.loading[tileUid] = workerTile;
|
|
103
|
+
|
|
104
|
+
const abortController = new AbortController();
|
|
105
|
+
workerTile.abort = abortController;
|
|
106
|
+
try {
|
|
107
|
+
const response = await this.loadVectorTile(params, abortController);
|
|
108
|
+
delete this.loading[tileUid];
|
|
109
|
+
if (!response) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const rawTileData = response.rawData;
|
|
114
|
+
const cacheControl = {} as ExpiryData;
|
|
115
|
+
if (response.expires) cacheControl.expires = response.expires;
|
|
116
|
+
if (response.cacheControl) cacheControl.cacheControl = response.cacheControl;
|
|
117
|
+
|
|
118
|
+
const resourceTiming = {} as {resourceTiming: any};
|
|
119
|
+
if (perf) {
|
|
120
|
+
const resourceTimingData = perf.finish();
|
|
121
|
+
// it's necessary to eval the result of getEntriesByName() here via parse/stringify
|
|
122
|
+
// late evaluation in the main thread causes TypeError: illegal invocation
|
|
123
|
+
if (resourceTimingData)
|
|
124
|
+
resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
workerTile.vectorTile = response.vectorTile;
|
|
128
|
+
const parsePromise = workerTile.parse(response.vectorTile, this.layerIndex, this.availableImages, this.actor);
|
|
129
|
+
this.loaded[tileUid] = workerTile;
|
|
130
|
+
// keep the original fetching state so that reload tile can pick it up if the original parse is cancelled by reloads' parse
|
|
131
|
+
this.fetching[tileUid] = {rawTileData, cacheControl, resourceTiming};
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const result = await parsePromise;
|
|
135
|
+
// Transferring a copy of rawTileData because the worker needs to retain its copy.
|
|
136
|
+
return extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming);
|
|
137
|
+
} finally {
|
|
138
|
+
delete this.fetching[tileUid];
|
|
139
|
+
}
|
|
140
|
+
} catch (err) {
|
|
141
|
+
delete this.loading[tileUid];
|
|
142
|
+
workerTile.status = 'done';
|
|
143
|
+
this.loaded[tileUid] = workerTile;
|
|
144
|
+
throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Implements {@link WorkerSource#reloadTile}.
|
|
150
|
+
*/
|
|
151
|
+
async reloadTile(params: WorkerTileParameters): Promise<WorkerTileResult> {
|
|
152
|
+
const uid = params.uid;
|
|
153
|
+
if (!this.loaded || !this.loaded[uid]) {
|
|
154
|
+
throw new Error('Should not be trying to reload a tile that was never loaded or has been removed');
|
|
155
|
+
}
|
|
156
|
+
const workerTile = this.loaded[uid];
|
|
157
|
+
workerTile.showCollisionBoxes = params.showCollisionBoxes;
|
|
158
|
+
if (workerTile.status === 'parsing') {
|
|
159
|
+
const result = await workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor);
|
|
160
|
+
// if we have cancelled the original parse, make sure to pass the rawTileData from the original fetch
|
|
161
|
+
let parseResult: WorkerTileResult;
|
|
162
|
+
if (this.fetching[uid]) {
|
|
163
|
+
const {rawTileData, cacheControl, resourceTiming} = this.fetching[uid];
|
|
164
|
+
delete this.fetching[uid];
|
|
165
|
+
parseResult = extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming);
|
|
166
|
+
} else {
|
|
167
|
+
parseResult = result;
|
|
168
|
+
}
|
|
169
|
+
return parseResult;
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
// if there was no vector tile data on the initial load, don't try and re-parse tile
|
|
173
|
+
if (workerTile.status === 'done' && workerTile.vectorTile) {
|
|
174
|
+
// this seems like a missing case where cache control is lost? see #3309
|
|
175
|
+
return workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Implements {@link WorkerSource#abortTile}.
|
|
181
|
+
*/
|
|
182
|
+
async abortTile(params: TileParameters): Promise<void> {
|
|
183
|
+
const loading = this.loading;
|
|
184
|
+
const uid = params.uid;
|
|
185
|
+
if (loading && loading[uid] && loading[uid].abort) {
|
|
186
|
+
loading[uid].abort.abort();
|
|
187
|
+
delete loading[uid];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Implements {@link WorkerSource#removeTile}.
|
|
193
|
+
*/
|
|
194
|
+
async removeTile(params: TileParameters): Promise<void> {
|
|
195
|
+
if (this.loaded && this.loaded[params.uid]) {
|
|
196
|
+
delete this.loaded[params.uid];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|