@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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An error message to use when an operation is aborted
|
|
3
|
+
*/
|
|
4
|
+
export const ABORT_ERROR = 'AbortError';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Check if an error is an abort error
|
|
8
|
+
* @param error - An error object
|
|
9
|
+
* @returns - true if the error is an abort error
|
|
10
|
+
*/
|
|
11
|
+
export function isAbortError(error: Error): boolean {
|
|
12
|
+
return error.message === ABORT_ERROR;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Use this when you need to create an abort error.
|
|
17
|
+
* @returns An error object with the message "AbortError"
|
|
18
|
+
*/
|
|
19
|
+
export function createAbortError(): Error {
|
|
20
|
+
return new Error(ABORT_ERROR);
|
|
21
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import {Actor, ActorTarget} from './actor';
|
|
2
|
+
import {WorkerGlobalScopeInterface, workerFactory} from './web_worker';
|
|
3
|
+
import {setGlobalWorker} from '../../test/unit/lib/web_worker_mock';
|
|
4
|
+
import {sleep} from './test/util';
|
|
5
|
+
import {ABORT_ERROR, createAbortError} from './abort_error';
|
|
6
|
+
import {MessageType} from './actor_messages';
|
|
7
|
+
|
|
8
|
+
class MockWorker {
|
|
9
|
+
self: any;
|
|
10
|
+
actor: Actor;
|
|
11
|
+
constructor(self) {
|
|
12
|
+
this.self = self;
|
|
13
|
+
this.actor = new Actor(self);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
describe('Actor', () => {
|
|
18
|
+
let originalWorker;
|
|
19
|
+
beforeAll(() => {
|
|
20
|
+
originalWorker = global.Worker;
|
|
21
|
+
setGlobalWorker(MockWorker);
|
|
22
|
+
});
|
|
23
|
+
afterAll(() => {
|
|
24
|
+
global.Worker = originalWorker;
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('forwards responses to correct handler', async () => {
|
|
28
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
29
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, async (_mapId, params) => {
|
|
30
|
+
await sleep(0);
|
|
31
|
+
return params.clusterId;
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const m1 = new Actor(worker, '1');
|
|
35
|
+
const m2 = new Actor(worker, '2');
|
|
36
|
+
|
|
37
|
+
const p1 = m1.sendAsync({type: MessageType.getClusterExpansionZoom, data: {type: 'geojson', source: '', clusterId: 1729}});
|
|
38
|
+
const p2 = m2.sendAsync({type: MessageType.getClusterExpansionZoom, data: {type: 'geojson', source: '', clusterId: 4104}});
|
|
39
|
+
|
|
40
|
+
await Promise.all([p1, p2]);
|
|
41
|
+
await expect(p1).resolves.toBe(1729);
|
|
42
|
+
await expect(p2).resolves.toBe(4104);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('cancel a request does not reject or resolve a promise', async () => {
|
|
46
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
47
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, async (_mapId, params) => {
|
|
48
|
+
await sleep(200);
|
|
49
|
+
return params.clusterId;
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const m1 = new Actor(worker, '1');
|
|
53
|
+
|
|
54
|
+
let received = false;
|
|
55
|
+
const abortController = new AbortController();
|
|
56
|
+
const p1 = m1.sendAsync({type: MessageType.getClusterExpansionZoom, data: {type: 'geojson', source: '', clusterId: 1729}}, abortController)
|
|
57
|
+
.then(() => { received = true; })
|
|
58
|
+
.catch(() => { received = true; });
|
|
59
|
+
|
|
60
|
+
abortController.abort();
|
|
61
|
+
|
|
62
|
+
const p2 = new Promise((resolve) => (setTimeout(resolve, 500)));
|
|
63
|
+
|
|
64
|
+
await Promise.any([p1, p2]);
|
|
65
|
+
expect(received).toBeFalsy();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('aborting a request will successfully abort it', async () => {
|
|
69
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
70
|
+
let gotAbortSignal = false;
|
|
71
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, (_mapId, _params, handlerAbortController) => {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
handlerAbortController.signal.addEventListener('abort', () => {
|
|
74
|
+
gotAbortSignal = true;
|
|
75
|
+
reject(createAbortError());
|
|
76
|
+
});
|
|
77
|
+
setTimeout(resolve, 200);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
const m1 = new Actor(worker, '1');
|
|
82
|
+
|
|
83
|
+
let received = false;
|
|
84
|
+
const abortController = new AbortController();
|
|
85
|
+
m1.sendAsync({type: MessageType.getClusterExpansionZoom, data: {type: 'geojson', source: '', clusterId: 1729}}, abortController)
|
|
86
|
+
.then(() => { received = true; })
|
|
87
|
+
.catch(() => { received = true; });
|
|
88
|
+
|
|
89
|
+
abortController.abort();
|
|
90
|
+
|
|
91
|
+
await sleep(500);
|
|
92
|
+
|
|
93
|
+
expect(received).toBeFalsy();
|
|
94
|
+
expect(gotAbortSignal).toBeTruthy();
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test('cancel a request that must be queued will not call the method at all', async () => {
|
|
98
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
99
|
+
const actor = new Actor(worker, '1');
|
|
100
|
+
|
|
101
|
+
const spy = jest.fn().mockReturnValue(Promise.resolve({}));
|
|
102
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy);
|
|
103
|
+
|
|
104
|
+
let received = false;
|
|
105
|
+
const abortController = new AbortController();
|
|
106
|
+
const p1 = actor.sendAsync({type: MessageType.getClusterExpansionZoom, data: {type: 'geojson', source: '', clusterId: 1729}, mustQueue: true}, abortController)
|
|
107
|
+
.then(() => { received = true; })
|
|
108
|
+
.catch(() => { received = true; });
|
|
109
|
+
|
|
110
|
+
abortController.abort();
|
|
111
|
+
|
|
112
|
+
const p2 = new Promise((resolve) => (setTimeout(resolve, 500)));
|
|
113
|
+
|
|
114
|
+
await Promise.any([p1, p2]);
|
|
115
|
+
expect(received).toBeFalsy();
|
|
116
|
+
expect(spy).not.toHaveBeenCalled();
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('#remove unbinds event listener', () => new Promise<void>(done => {
|
|
120
|
+
const actor = new Actor({
|
|
121
|
+
addEventListener(type, callback, useCapture) {
|
|
122
|
+
this._addEventListenerArgs = [type, callback, useCapture];
|
|
123
|
+
},
|
|
124
|
+
removeEventListener(type, callback, useCapture) {
|
|
125
|
+
expect([type, callback, useCapture]).toEqual(this._addEventListenerArgs);
|
|
126
|
+
done();
|
|
127
|
+
}
|
|
128
|
+
} as ActorTarget, null);
|
|
129
|
+
actor.remove();
|
|
130
|
+
}));
|
|
131
|
+
|
|
132
|
+
test('send a message that is rejected', async () => {
|
|
133
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
134
|
+
const actor = new Actor(worker, '1');
|
|
135
|
+
|
|
136
|
+
worker.worker.actor.registerMessageHandler(MessageType.abortTile, () => Promise.reject(createAbortError()));
|
|
137
|
+
|
|
138
|
+
await expect(async () => actor.sendAsync({type: MessageType.abortTile, data: {} as any})).rejects.toThrow(ABORT_ERROR);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
test('send a message that must be queued, it should still arrive', async () => {
|
|
142
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
143
|
+
const actor = new Actor(worker, '1');
|
|
144
|
+
|
|
145
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, () => Promise.resolve(42));
|
|
146
|
+
|
|
147
|
+
const response = await actor.sendAsync({type: MessageType.getClusterExpansionZoom, data: {} as any, mustQueue: true});
|
|
148
|
+
|
|
149
|
+
expect(response).toBe(42);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('send a message is not registered should throw', async () => {
|
|
153
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
154
|
+
const actor = new Actor(worker, '1');
|
|
155
|
+
|
|
156
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, () => Promise.resolve(42));
|
|
157
|
+
|
|
158
|
+
await expect(async () => actor.sendAsync({type: MessageType.abortTile, data: {} as any})).rejects.toThrow(/Could not find a registered handler for.*/);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test('should not process a message with the wrong map id', async () => {
|
|
162
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
163
|
+
const actor = new Actor(worker, '1');
|
|
164
|
+
|
|
165
|
+
worker.worker.actor.mapId = '2';
|
|
166
|
+
|
|
167
|
+
const spy = jest.fn().mockReturnValue(Promise.resolve({}));
|
|
168
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy);
|
|
169
|
+
|
|
170
|
+
actor.sendAsync({type: MessageType.getClusterExpansionZoom, data: {} as any, targetMapId: '1'});
|
|
171
|
+
|
|
172
|
+
await sleep(100);
|
|
173
|
+
|
|
174
|
+
expect(spy).not.toHaveBeenCalled();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test('should not process a message with the wrong origin', async () => {
|
|
178
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
179
|
+
const actor = new Actor(worker, '1');
|
|
180
|
+
|
|
181
|
+
const spy = jest.fn().mockReturnValue(Promise.resolve({}));
|
|
182
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy);
|
|
183
|
+
|
|
184
|
+
actor.target.postMessage({type: 'getClusterExpansionZoom', data: {} as any, origin: 'https://example.com'});
|
|
185
|
+
|
|
186
|
+
await sleep(100);
|
|
187
|
+
|
|
188
|
+
expect(spy).not.toHaveBeenCalled();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('should process a message when origin is "file://"', async () => {
|
|
192
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
193
|
+
const actor = new Actor(worker, '1');
|
|
194
|
+
|
|
195
|
+
const spy = jest.fn().mockReturnValue(Promise.resolve({}));
|
|
196
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy);
|
|
197
|
+
|
|
198
|
+
actor.target.postMessage({type: MessageType.getClusterExpansionZoom, data: {} as any, origin: 'file://'});
|
|
199
|
+
|
|
200
|
+
await sleep(0);
|
|
201
|
+
|
|
202
|
+
expect(spy).toHaveBeenCalled();
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test('should process a message when origin is "resource://android"', async () => {
|
|
206
|
+
const worker = workerFactory() as any as WorkerGlobalScopeInterface & ActorTarget;
|
|
207
|
+
const actor = new Actor(worker, '1');
|
|
208
|
+
|
|
209
|
+
const spy = jest.fn().mockReturnValue(Promise.resolve({}));
|
|
210
|
+
worker.worker.actor.registerMessageHandler(MessageType.getClusterExpansionZoom, spy);
|
|
211
|
+
|
|
212
|
+
actor.target.postMessage({type: MessageType.getClusterExpansionZoom, data: {} as any, origin: 'resource://android'});
|
|
213
|
+
|
|
214
|
+
await sleep(0);
|
|
215
|
+
|
|
216
|
+
expect(spy).toHaveBeenCalled();
|
|
217
|
+
});
|
|
218
|
+
});
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import {Subscription, isWorker, subscribe} from './util';
|
|
2
|
+
import {serialize, deserialize, Serialized} from './web_worker_transfer';
|
|
3
|
+
import {ThrottledInvoker} from './throttled_invoker';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
MessageType,
|
|
7
|
+
type ActorMessage,
|
|
8
|
+
type RequestResponseMessageMap} from './actor_messages';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* An interface to be sent to the actor in order for it to allow communication between the worker and the main thread
|
|
12
|
+
*/
|
|
13
|
+
export interface ActorTarget {
|
|
14
|
+
addEventListener: typeof window.addEventListener;
|
|
15
|
+
removeEventListener: typeof window.removeEventListener;
|
|
16
|
+
postMessage: typeof window.postMessage;
|
|
17
|
+
terminate?: () => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* This is used to define the parameters of the message that is sent to the worker and back
|
|
22
|
+
*/
|
|
23
|
+
type MessageData = {
|
|
24
|
+
id: string;
|
|
25
|
+
type: MessageType | '<cancel>' | '<response>';
|
|
26
|
+
origin: string;
|
|
27
|
+
data?: Serialized;
|
|
28
|
+
targetMapId?: string | number | null;
|
|
29
|
+
mustQueue?: boolean;
|
|
30
|
+
error?: Serialized | null;
|
|
31
|
+
sourceMapId: string | number | null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type ResolveReject = {
|
|
35
|
+
resolve: (value?: RequestResponseMessageMap[MessageType][1]) => void;
|
|
36
|
+
reject: (reason?: Error) => void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* This interface allowing to substitute only the sendAsync method of the Actor class.
|
|
41
|
+
*/
|
|
42
|
+
export interface IActor {
|
|
43
|
+
sendAsync<T extends MessageType>(message: ActorMessage<T>, abortController?: AbortController): Promise<RequestResponseMessageMap[T][1]>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type MessageHandler<T extends MessageType> = (mapId: string | number, params: RequestResponseMessageMap[T][0], abortController?: AbortController) => Promise<RequestResponseMessageMap[T][1]>
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* An implementation of the [Actor design pattern](https://en.wikipedia.org/wiki/Actor_model)
|
|
50
|
+
* that maintains the relationship between asynchronous tasks and the objects
|
|
51
|
+
* that spin them off - in this case, tasks like parsing parts of styles,
|
|
52
|
+
* owned by the styles
|
|
53
|
+
*/
|
|
54
|
+
export class Actor implements IActor {
|
|
55
|
+
target: ActorTarget;
|
|
56
|
+
mapId: string | number | null;
|
|
57
|
+
resolveRejects: { [x: string]: ResolveReject};
|
|
58
|
+
name: string;
|
|
59
|
+
tasks: { [x: string]: MessageData };
|
|
60
|
+
taskQueue: Array<string>;
|
|
61
|
+
abortControllers: { [x: number | string]: AbortController };
|
|
62
|
+
invoker: ThrottledInvoker;
|
|
63
|
+
globalScope: ActorTarget;
|
|
64
|
+
messageHandlers: { [x in MessageType]?: MessageHandler<MessageType>};
|
|
65
|
+
subscription: Subscription;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @param target - The target
|
|
69
|
+
* @param mapId - A unique identifier for the Map instance using this Actor.
|
|
70
|
+
*/
|
|
71
|
+
constructor(target: ActorTarget, mapId?: string | number) {
|
|
72
|
+
this.target = target;
|
|
73
|
+
this.mapId = mapId;
|
|
74
|
+
this.resolveRejects = {};
|
|
75
|
+
this.tasks = {};
|
|
76
|
+
this.taskQueue = [];
|
|
77
|
+
this.abortControllers = {};
|
|
78
|
+
this.messageHandlers = {};
|
|
79
|
+
this.invoker = new ThrottledInvoker(() => this.process());
|
|
80
|
+
this.subscription = subscribe(this.target, 'message', (message) => this.receive(message), false);
|
|
81
|
+
this.globalScope = isWorker(self) ? target : window;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
registerMessageHandler<T extends MessageType>(type: T, handler: MessageHandler<T>) {
|
|
85
|
+
this.messageHandlers[type] = handler;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Sends a message from a main-thread map to a Worker or from a Worker back to
|
|
90
|
+
* a main-thread map instance.
|
|
91
|
+
* @param message - the message to send
|
|
92
|
+
* @param abortController - an optional AbortController to abort the request
|
|
93
|
+
* @returns a promise that will be resolved with the response data
|
|
94
|
+
*/
|
|
95
|
+
sendAsync<T extends MessageType>(message: ActorMessage<T>, abortController?: AbortController): Promise<RequestResponseMessageMap[T][1]> {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
// We're using a string ID instead of numbers because they are being used as object keys
|
|
98
|
+
// anyway, and thus stringified implicitly. We use random IDs because an actor may receive
|
|
99
|
+
// message from multiple other actors which could run in different execution context. A
|
|
100
|
+
// linearly increasing ID could produce collisions.
|
|
101
|
+
const id = Math.round((Math.random() * 1e18)).toString(36).substring(0, 10);
|
|
102
|
+
this.resolveRejects[id] = {
|
|
103
|
+
resolve,
|
|
104
|
+
reject
|
|
105
|
+
};
|
|
106
|
+
if (abortController) {
|
|
107
|
+
abortController.signal.addEventListener('abort', () => {
|
|
108
|
+
delete this.resolveRejects[id];
|
|
109
|
+
const cancelMessage: MessageData = {
|
|
110
|
+
id,
|
|
111
|
+
type: '<cancel>',
|
|
112
|
+
origin: location.origin,
|
|
113
|
+
targetMapId: message.targetMapId,
|
|
114
|
+
sourceMapId: this.mapId
|
|
115
|
+
};
|
|
116
|
+
this.target.postMessage(cancelMessage);
|
|
117
|
+
// In case of abort the current behavior is to keep the promise pending.
|
|
118
|
+
}, {once: true});
|
|
119
|
+
}
|
|
120
|
+
const buffers: Array<Transferable> = [];
|
|
121
|
+
const messageToPost: MessageData = {
|
|
122
|
+
...message,
|
|
123
|
+
id,
|
|
124
|
+
sourceMapId: this.mapId,
|
|
125
|
+
origin: location.origin,
|
|
126
|
+
data: serialize(message.data, buffers)
|
|
127
|
+
};
|
|
128
|
+
this.target.postMessage(messageToPost, {transfer: buffers});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
receive(message: {data: MessageData}) {
|
|
133
|
+
const data = message.data;
|
|
134
|
+
const id = data.id;
|
|
135
|
+
if (data.origin !== 'file://' && location.origin !== 'file://' && data.origin !== 'resource://android' && location.origin !== 'resource://android' && data.origin !== location.origin) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (data.targetMapId && this.mapId !== data.targetMapId) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (data.type === '<cancel>') {
|
|
142
|
+
// Remove the original request from the queue. This is only possible if it
|
|
143
|
+
// hasn't been kicked off yet. The id will remain in the queue, but because
|
|
144
|
+
// there is no associated task, it will be dropped once it's time to execute it.
|
|
145
|
+
delete this.tasks[id];
|
|
146
|
+
const abortController = this.abortControllers[id];
|
|
147
|
+
delete this.abortControllers[id];
|
|
148
|
+
if (abortController) {
|
|
149
|
+
abortController.abort();
|
|
150
|
+
}
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (isWorker(self) || data.mustQueue) {
|
|
154
|
+
// In workers, store the tasks that we need to process before actually processing them. This
|
|
155
|
+
// is necessary because we want to keep receiving messages, and in particular,
|
|
156
|
+
// <cancel> messages. Some tasks may take a while in the worker thread, so before
|
|
157
|
+
// executing the next task in our queue, postMessage preempts this and <cancel>
|
|
158
|
+
// messages can be processed. We're using a MessageChannel object to get throttle the
|
|
159
|
+
// process() flow to one at a time.
|
|
160
|
+
this.tasks[id] = data;
|
|
161
|
+
this.taskQueue.push(id);
|
|
162
|
+
this.invoker.trigger();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// In the main thread, process messages immediately so that other work does not slip in
|
|
166
|
+
// between getting partial data back from workers.
|
|
167
|
+
this.processTask(id, data);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
process() {
|
|
171
|
+
if (this.taskQueue.length === 0) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const id = this.taskQueue.shift();
|
|
175
|
+
const task = this.tasks[id];
|
|
176
|
+
delete this.tasks[id];
|
|
177
|
+
// Schedule another process call if we know there's more to process _before_ invoking the
|
|
178
|
+
// current task. This is necessary so that processing continues even if the current task
|
|
179
|
+
// doesn't execute successfully.
|
|
180
|
+
if (this.taskQueue.length > 0) {
|
|
181
|
+
this.invoker.trigger();
|
|
182
|
+
}
|
|
183
|
+
if (!task) {
|
|
184
|
+
// If the task ID doesn't have associated task data anymore, it was canceled.
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
this.processTask(id, task);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async processTask(id: string, task: MessageData) {
|
|
192
|
+
if (task.type === '<response>') {
|
|
193
|
+
// The `completeTask` function in the counterpart actor has been called, and we are now
|
|
194
|
+
// resolving or rejecting the promise in the originating actor, if there is one.
|
|
195
|
+
const resolveReject = this.resolveRejects[id];
|
|
196
|
+
delete this.resolveRejects[id];
|
|
197
|
+
if (!resolveReject) {
|
|
198
|
+
// If we get a response, but don't have a resolve or reject, the request was canceled.
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (task.error) {
|
|
202
|
+
resolveReject.reject(deserialize(task.error) as Error);
|
|
203
|
+
} else {
|
|
204
|
+
resolveReject.resolve(deserialize(task.data));
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (!this.messageHandlers[task.type]) {
|
|
209
|
+
this.completeTask(id, new Error(`Could not find a registered handler for ${task.type}, map ID: ${this.mapId}, available handlers: ${Object.keys(this.messageHandlers).join(', ')}`));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const params = deserialize(task.data) as RequestResponseMessageMap[MessageType][0];
|
|
213
|
+
const abortController = new AbortController();
|
|
214
|
+
this.abortControllers[id] = abortController;
|
|
215
|
+
try {
|
|
216
|
+
const data = await this.messageHandlers[task.type](task.sourceMapId, params, abortController);
|
|
217
|
+
this.completeTask(id, null, data);
|
|
218
|
+
} catch (err) {
|
|
219
|
+
this.completeTask(id, err);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
completeTask(id: string, err: Error, data?: RequestResponseMessageMap[MessageType][1]) {
|
|
224
|
+
const buffers: Array<Transferable> = [];
|
|
225
|
+
delete this.abortControllers[id];
|
|
226
|
+
const responseMessage: MessageData = {
|
|
227
|
+
id,
|
|
228
|
+
type: '<response>',
|
|
229
|
+
sourceMapId: this.mapId,
|
|
230
|
+
origin: location.origin,
|
|
231
|
+
error: err ? serialize(err) : null,
|
|
232
|
+
data: serialize(data, buffers)
|
|
233
|
+
};
|
|
234
|
+
this.target.postMessage(responseMessage, {transfer: buffers});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
remove() {
|
|
238
|
+
this.invoker.remove();
|
|
239
|
+
this.subscription.unsubscribe();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import type {LoadGeoJSONParameters} from '../source/geojson_worker_source';
|
|
2
|
+
import type {TileParameters, WorkerDEMTileParameters, WorkerTileParameters, WorkerTileResult} from '../source/worker_source';
|
|
3
|
+
import type {DEMData} from '../data/dem_data';
|
|
4
|
+
import type {StyleImage} from '../style/style_image';
|
|
5
|
+
import type {StyleGlyph} from '../style/style_glyph';
|
|
6
|
+
import type {PluginState} from '../source/rtl_text_plugin_status';
|
|
7
|
+
import type {LayerSpecification} from '@maplibre/maplibre-gl-style-spec';
|
|
8
|
+
import type {OverscaledTileID} from '../source/tile_id';
|
|
9
|
+
import type {GetResourceResponse, RequestParameters} from './ajax';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The parameters needed in order to get information about the cluster
|
|
13
|
+
*/
|
|
14
|
+
export type ClusterIDAndSource = {
|
|
15
|
+
type: 'geojson';
|
|
16
|
+
clusterId: number;
|
|
17
|
+
source: string;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Parameters needed to get the leaves of a cluster
|
|
22
|
+
*/
|
|
23
|
+
export type GetClusterLeavesParams = ClusterIDAndSource & { limit: number; offset: number };
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The result of the call to load a geojson source
|
|
27
|
+
*/
|
|
28
|
+
export type GeoJSONWorkerSourceLoadDataResult = {
|
|
29
|
+
resourceTiming?: {[_: string]: Array<PerformanceResourceTiming>};
|
|
30
|
+
abandoned?: boolean;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Parameters needed to remove a source
|
|
35
|
+
*/
|
|
36
|
+
export type RemoveSourceParams = {
|
|
37
|
+
source: string;
|
|
38
|
+
type: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Parameters needed to update the layers
|
|
43
|
+
*/
|
|
44
|
+
export type UpdateLayersParamaeters = {
|
|
45
|
+
layers: Array<LayerSpecification>;
|
|
46
|
+
removedIds: Array<string>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parameters needed to get the images
|
|
51
|
+
*/
|
|
52
|
+
export type GetImagesParameters = {
|
|
53
|
+
icons: Array<string>;
|
|
54
|
+
source: string;
|
|
55
|
+
tileID: OverscaledTileID;
|
|
56
|
+
type: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Parameters needed to get the glyphs
|
|
61
|
+
*/
|
|
62
|
+
export type GetGlyphsParameters = {
|
|
63
|
+
type: string;
|
|
64
|
+
stacks: {[_: string]: Array<number>};
|
|
65
|
+
source: string;
|
|
66
|
+
tileID: OverscaledTileID;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* A response object returned when requesting glyphs
|
|
71
|
+
*/
|
|
72
|
+
export type GetGlyphsResponse = {
|
|
73
|
+
[stack: string]: {
|
|
74
|
+
[id: number]: StyleGlyph;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* A response object returned when requesting images
|
|
80
|
+
*/
|
|
81
|
+
export type GetImagesResponse = {[_: string]: StyleImage}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* All the possible message types that can be sent to and from the worker
|
|
85
|
+
*/
|
|
86
|
+
export const enum MessageType {
|
|
87
|
+
loadDEMTile = 'LDT',
|
|
88
|
+
getClusterExpansionZoom = 'GCEZ',
|
|
89
|
+
getClusterChildren = 'GCC',
|
|
90
|
+
getClusterLeaves = 'GCL',
|
|
91
|
+
loadData = 'LD',
|
|
92
|
+
getData = 'GD',
|
|
93
|
+
loadTile = 'LT',
|
|
94
|
+
reloadTile = 'RT',
|
|
95
|
+
getGlyphs = 'GG',
|
|
96
|
+
getImages = 'GI',
|
|
97
|
+
setImages = 'SI',
|
|
98
|
+
setLayers = 'SL',
|
|
99
|
+
updateLayers = 'UL',
|
|
100
|
+
syncRTLPluginState = 'SRPS',
|
|
101
|
+
setReferrer = 'SR',
|
|
102
|
+
removeSource = 'RS',
|
|
103
|
+
removeMap = 'RM',
|
|
104
|
+
importScript = 'IS',
|
|
105
|
+
removeTile = 'RMT',
|
|
106
|
+
abortTile = 'AT',
|
|
107
|
+
removeDEMTile = 'RDT',
|
|
108
|
+
getResource = 'GR',
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* This is basically a mapping between all the calls that are made to and from the workers.
|
|
113
|
+
* The key is the event name, the first parameter is the event input type, and the last parameter is the output type.
|
|
114
|
+
*/
|
|
115
|
+
export type RequestResponseMessageMap = {
|
|
116
|
+
[MessageType.loadDEMTile]: [WorkerDEMTileParameters, DEMData];
|
|
117
|
+
[MessageType.getClusterExpansionZoom]: [ClusterIDAndSource, number];
|
|
118
|
+
[MessageType.getClusterChildren]: [ClusterIDAndSource, Array<GeoJSON.Feature>];
|
|
119
|
+
[MessageType.getClusterLeaves]: [GetClusterLeavesParams, Array<GeoJSON.Feature>];
|
|
120
|
+
[MessageType.loadData]: [LoadGeoJSONParameters, GeoJSONWorkerSourceLoadDataResult];
|
|
121
|
+
[MessageType.getData]: [LoadGeoJSONParameters, GeoJSON.GeoJSON];
|
|
122
|
+
[MessageType.loadTile]: [WorkerTileParameters, WorkerTileResult];
|
|
123
|
+
[MessageType.reloadTile]: [WorkerTileParameters, WorkerTileResult];
|
|
124
|
+
[MessageType.getGlyphs]: [GetGlyphsParameters, GetGlyphsResponse];
|
|
125
|
+
[MessageType.getImages]: [GetImagesParameters, GetImagesResponse];
|
|
126
|
+
[MessageType.setImages]: [string[], void];
|
|
127
|
+
[MessageType.setLayers]: [Array<LayerSpecification>, void];
|
|
128
|
+
[MessageType.updateLayers]: [UpdateLayersParamaeters, void];
|
|
129
|
+
[MessageType.syncRTLPluginState]: [PluginState, PluginState];
|
|
130
|
+
[MessageType.setReferrer]: [string, void];
|
|
131
|
+
[MessageType.removeSource]: [RemoveSourceParams, void];
|
|
132
|
+
[MessageType.removeMap]: [undefined, void];
|
|
133
|
+
[MessageType.importScript]: [string, void];
|
|
134
|
+
[MessageType.removeTile]: [TileParameters, void];
|
|
135
|
+
[MessageType.abortTile]: [TileParameters, void];
|
|
136
|
+
[MessageType.removeDEMTile]: [TileParameters, void];
|
|
137
|
+
[MessageType.getResource]: [RequestParameters, GetResourceResponse<any>];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The message to be sent by the actor
|
|
142
|
+
*/
|
|
143
|
+
export type ActorMessage<T extends MessageType> = {
|
|
144
|
+
type: T;
|
|
145
|
+
data: RequestResponseMessageMap[T][0];
|
|
146
|
+
targetMapId?: string | number | null;
|
|
147
|
+
mustQueue?: boolean;
|
|
148
|
+
sourceMapId?: string | number | null;
|
|
149
|
+
};
|