@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.
Files changed (565) hide show
  1. package/LICENSE.txt +116 -0
  2. package/README.md +174 -0
  3. package/build/banner.ts +12 -0
  4. package/build/bump-version-changelog.js +26 -0
  5. package/build/check-bundle-size.js +77 -0
  6. package/build/generate-dist-package.js +26 -0
  7. package/build/generate-doc-images.ts +78 -0
  8. package/build/generate-docs.ts +190 -0
  9. package/build/generate-shaders.ts +68 -0
  10. package/build/generate-struct-arrays.ts +438 -0
  11. package/build/generate-style-code.ts +283 -0
  12. package/build/readme.md +56 -0
  13. package/build/release-notes.js +45 -0
  14. package/build/rollup/bundle_prelude.js +29 -0
  15. package/build/rollup/maplibregl.js +22 -0
  16. package/build/rollup_plugins.ts +58 -0
  17. package/dist/LICENSE.txt +116 -0
  18. package/dist/maplibre-gl.css +1 -0
  19. package/dist/maplibre-gl.d.ts +13304 -0
  20. package/dist/maplibre-gl.js +59 -0
  21. package/dist/maplibre-gl.js.map +1 -0
  22. package/dist/package.json +1 -0
  23. package/package.json +192 -0
  24. package/src/css/maplibre-gl.css +854 -0
  25. package/src/css/svg/maplibregl-ctrl-attrib.svg +3 -0
  26. package/src/css/svg/maplibregl-ctrl-compass.svg +4 -0
  27. package/src/css/svg/maplibregl-ctrl-fullscreen.svg +3 -0
  28. package/src/css/svg/maplibregl-ctrl-geolocate.svg +5 -0
  29. package/src/css/svg/maplibregl-ctrl-logo.svg +11 -0
  30. package/src/css/svg/maplibregl-ctrl-shrink.svg +3 -0
  31. package/src/css/svg/maplibregl-ctrl-terrain.svg +3 -0
  32. package/src/css/svg/maplibregl-ctrl-zoom-in.svg +3 -0
  33. package/src/css/svg/maplibregl-ctrl-zoom-out.svg +3 -0
  34. package/src/data/array_types.g.ts +1130 -0
  35. package/src/data/bucket/circle_attributes.ts +8 -0
  36. package/src/data/bucket/circle_bucket.ts +197 -0
  37. package/src/data/bucket/fill_attributes.ts +8 -0
  38. package/src/data/bucket/fill_bucket.test.ts +95 -0
  39. package/src/data/bucket/fill_bucket.ts +228 -0
  40. package/src/data/bucket/fill_extrusion_attributes.ts +13 -0
  41. package/src/data/bucket/fill_extrusion_bucket.ts +305 -0
  42. package/src/data/bucket/heatmap_bucket.ts +12 -0
  43. package/src/data/bucket/line_attributes.ts +8 -0
  44. package/src/data/bucket/line_attributes_ext.ts +8 -0
  45. package/src/data/bucket/line_bucket.test.ts +142 -0
  46. package/src/data/bucket/line_bucket.ts +592 -0
  47. package/src/data/bucket/pattern_attributes.ts +9 -0
  48. package/src/data/bucket/pattern_bucket_features.ts +57 -0
  49. package/src/data/bucket/symbol_attributes.ts +122 -0
  50. package/src/data/bucket/symbol_bucket.test.ts +243 -0
  51. package/src/data/bucket/symbol_bucket.ts +975 -0
  52. package/src/data/bucket.ts +123 -0
  53. package/src/data/dem_data.test.ts +237 -0
  54. package/src/data/dem_data.ts +171 -0
  55. package/src/data/evaluation_feature.ts +18 -0
  56. package/src/data/extent.ts +13 -0
  57. package/src/data/feature_index.ts +337 -0
  58. package/src/data/feature_position_map.test.ts +33 -0
  59. package/src/data/feature_position_map.ts +126 -0
  60. package/src/data/index_array_type.ts +9 -0
  61. package/src/data/load_geometry.test.ts +49 -0
  62. package/src/data/load_geometry.ts +44 -0
  63. package/src/data/pos3d_attributes.ts +5 -0
  64. package/src/data/pos_attributes.ts +5 -0
  65. package/src/data/program_configuration.ts +735 -0
  66. package/src/data/raster_bounds_attributes.ts +6 -0
  67. package/src/data/segment.ts +89 -0
  68. package/src/geo/edge_insets.test.ts +83 -0
  69. package/src/geo/edge_insets.ts +146 -0
  70. package/src/geo/lng_lat.test.ts +65 -0
  71. package/src/geo/lng_lat.ts +169 -0
  72. package/src/geo/lng_lat_bounds.test.ts +357 -0
  73. package/src/geo/lng_lat_bounds.ts +356 -0
  74. package/src/geo/mercator_coordinate.test.ts +34 -0
  75. package/src/geo/mercator_coordinate.ts +157 -0
  76. package/src/geo/projection/projection.ts +72 -0
  77. package/src/geo/transform.test.ts +509 -0
  78. package/src/geo/transform.ts +1072 -0
  79. package/src/gl/color_mode.ts +31 -0
  80. package/src/gl/context.ts +321 -0
  81. package/src/gl/cull_face_mode.ts +22 -0
  82. package/src/gl/depth_mode.ts +26 -0
  83. package/src/gl/framebuffer.ts +48 -0
  84. package/src/gl/index_buffer.ts +55 -0
  85. package/src/gl/render_pool.test.ts +69 -0
  86. package/src/gl/render_pool.ts +93 -0
  87. package/src/gl/state.test.ts +125 -0
  88. package/src/gl/stencil_mode.ts +27 -0
  89. package/src/gl/types.ts +59 -0
  90. package/src/gl/value.ts +534 -0
  91. package/src/gl/vertex_buffer.test.ts +57 -0
  92. package/src/gl/vertex_buffer.ts +111 -0
  93. package/src/gl/webgl2.ts +12 -0
  94. package/src/index.test.ts +121 -0
  95. package/src/index.ts +250 -0
  96. package/src/render/draw_background.ts +53 -0
  97. package/src/render/draw_circle.ts +113 -0
  98. package/src/render/draw_collision_debug.ts +168 -0
  99. package/src/render/draw_custom.test.ts +73 -0
  100. package/src/render/draw_custom.ts +45 -0
  101. package/src/render/draw_debug.test.ts +122 -0
  102. package/src/render/draw_debug.ts +148 -0
  103. package/src/render/draw_fill.test.ts +137 -0
  104. package/src/render/draw_fill.ts +128 -0
  105. package/src/render/draw_fill_extrusion.ts +97 -0
  106. package/src/render/draw_heatmap.ts +228 -0
  107. package/src/render/draw_hillshade.ts +119 -0
  108. package/src/render/draw_line.ts +125 -0
  109. package/src/render/draw_raster.ts +133 -0
  110. package/src/render/draw_sky.ts +44 -0
  111. package/src/render/draw_symbol.test.ts +223 -0
  112. package/src/render/draw_symbol.ts +499 -0
  113. package/src/render/draw_terrain.ts +99 -0
  114. package/src/render/glyph_atlas.ts +83 -0
  115. package/src/render/glyph_manager.test.ts +147 -0
  116. package/src/render/glyph_manager.ts +198 -0
  117. package/src/render/image_atlas.ts +159 -0
  118. package/src/render/image_manager.ts +337 -0
  119. package/src/render/line_atlas.test.ts +38 -0
  120. package/src/render/line_atlas.ts +214 -0
  121. package/src/render/mesh.ts +25 -0
  122. package/src/render/painter.test.ts +51 -0
  123. package/src/render/painter.ts +666 -0
  124. package/src/render/program/background_program.ts +100 -0
  125. package/src/render/program/circle_program.ts +61 -0
  126. package/src/render/program/clipping_mask_program.ts +19 -0
  127. package/src/render/program/collision_program.ts +47 -0
  128. package/src/render/program/debug_program.ts +29 -0
  129. package/src/render/program/fill_extrusion_program.ts +120 -0
  130. package/src/render/program/fill_program.ts +121 -0
  131. package/src/render/program/heatmap_program.ts +76 -0
  132. package/src/render/program/hillshade_program.ts +116 -0
  133. package/src/render/program/line_program.ts +207 -0
  134. package/src/render/program/pattern.ts +102 -0
  135. package/src/render/program/program_uniforms.ts +46 -0
  136. package/src/render/program/raster_program.ts +88 -0
  137. package/src/render/program/sky_program.ts +28 -0
  138. package/src/render/program/symbol_program.ts +266 -0
  139. package/src/render/program/terrain_program.ts +116 -0
  140. package/src/render/program.ts +233 -0
  141. package/src/render/render_to_texture.test.ts +151 -0
  142. package/src/render/render_to_texture.ts +197 -0
  143. package/src/render/terrain.test.ts +322 -0
  144. package/src/render/terrain.ts +464 -0
  145. package/src/render/texture.ts +114 -0
  146. package/src/render/uniform_binding.test.ts +122 -0
  147. package/src/render/uniform_binding.ts +157 -0
  148. package/src/render/update_pattern_positions_in_program.test.ts +74 -0
  149. package/src/render/update_pattern_positions_in_program.ts +50 -0
  150. package/src/render/vertex_array_object.ts +163 -0
  151. package/src/shaders/README.md +42 -0
  152. package/src/shaders/_prelude.fragment.glsl +19 -0
  153. package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
  154. package/src/shaders/_prelude.vertex.glsl +148 -0
  155. package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
  156. package/src/shaders/background.fragment.glsl +10 -0
  157. package/src/shaders/background.fragment.glsl.g.ts +2 -0
  158. package/src/shaders/background.vertex.glsl +7 -0
  159. package/src/shaders/background.vertex.glsl.g.ts +2 -0
  160. package/src/shaders/background_pattern.fragment.glsl +28 -0
  161. package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
  162. package/src/shaders/background_pattern.vertex.glsl +19 -0
  163. package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
  164. package/src/shaders/circle.fragment.glsl +34 -0
  165. package/src/shaders/circle.fragment.glsl.g.ts +2 -0
  166. package/src/shaders/circle.vertex.glsl +68 -0
  167. package/src/shaders/circle.vertex.glsl.g.ts +2 -0
  168. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  169. package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
  170. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  171. package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
  172. package/src/shaders/collision_box.fragment.glsl +20 -0
  173. package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
  174. package/src/shaders/collision_box.vertex.glsl +27 -0
  175. package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
  176. package/src/shaders/collision_circle.fragment.glsl +17 -0
  177. package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
  178. package/src/shaders/collision_circle.vertex.glsl +59 -0
  179. package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
  180. package/src/shaders/debug.fragment.glsl +9 -0
  181. package/src/shaders/debug.fragment.glsl.g.ts +2 -0
  182. package/src/shaders/debug.vertex.glsl +12 -0
  183. package/src/shaders/debug.vertex.glsl.g.ts +2 -0
  184. package/src/shaders/encode_attribute.test.ts +11 -0
  185. package/src/shaders/encode_attribute.ts +13 -0
  186. package/src/shaders/fill.fragment.glsl +13 -0
  187. package/src/shaders/fill.fragment.glsl.g.ts +2 -0
  188. package/src/shaders/fill.vertex.glsl +13 -0
  189. package/src/shaders/fill.vertex.glsl.g.ts +2 -0
  190. package/src/shaders/fill_extrusion.fragment.glsl +9 -0
  191. package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
  192. package/src/shaders/fill_extrusion.vertex.glsl +84 -0
  193. package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
  194. package/src/shaders/fill_extrusion_pattern.fragment.glsl +47 -0
  195. package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
  196. package/src/shaders/fill_extrusion_pattern.vertex.glsl +96 -0
  197. package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
  198. package/src/shaders/fill_outline.fragment.glsl +17 -0
  199. package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
  200. package/src/shaders/fill_outline.vertex.glsl +17 -0
  201. package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
  202. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  203. package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
  204. package/src/shaders/fill_outline_pattern.vertex.glsl +44 -0
  205. package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
  206. package/src/shaders/fill_pattern.fragment.glsl +39 -0
  207. package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
  208. package/src/shaders/fill_pattern.vertex.glsl +39 -0
  209. package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
  210. package/src/shaders/heatmap.fragment.glsl +22 -0
  211. package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
  212. package/src/shaders/heatmap.vertex.glsl +54 -0
  213. package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
  214. package/src/shaders/heatmap_texture.fragment.glsl +15 -0
  215. package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
  216. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  217. package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
  218. package/src/shaders/hillshade.fragment.glsl +52 -0
  219. package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
  220. package/src/shaders/hillshade.vertex.glsl +11 -0
  221. package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
  222. package/src/shaders/hillshade_prepare.fragment.glsl +77 -0
  223. package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
  224. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  225. package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
  226. package/src/shaders/line.fragment.glsl +30 -0
  227. package/src/shaders/line.fragment.glsl.g.ts +2 -0
  228. package/src/shaders/line.vertex.glsl +89 -0
  229. package/src/shaders/line.vertex.glsl.g.ts +2 -0
  230. package/src/shaders/line_gradient.fragment.glsl +34 -0
  231. package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
  232. package/src/shaders/line_gradient.vertex.glsl +92 -0
  233. package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
  234. package/src/shaders/line_pattern.fragment.glsl +77 -0
  235. package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
  236. package/src/shaders/line_pattern.vertex.glsl +103 -0
  237. package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
  238. package/src/shaders/line_sdf.fragment.glsl +45 -0
  239. package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
  240. package/src/shaders/line_sdf.vertex.glsl +101 -0
  241. package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
  242. package/src/shaders/raster.fragment.glsl +53 -0
  243. package/src/shaders/raster.fragment.glsl.g.ts +2 -0
  244. package/src/shaders/raster.vertex.glsl +21 -0
  245. package/src/shaders/raster.vertex.glsl.g.ts +2 -0
  246. package/src/shaders/shaders.ts +197 -0
  247. package/src/shaders/sky.fragment.glsl +17 -0
  248. package/src/shaders/sky.fragment.glsl.g.ts +2 -0
  249. package/src/shaders/sky.vertex.glsl +5 -0
  250. package/src/shaders/sky.vertex.glsl.g.ts +2 -0
  251. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  252. package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
  253. package/src/shaders/symbol_icon.vertex.glsl +117 -0
  254. package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
  255. package/src/shaders/symbol_sdf.fragment.glsl +58 -0
  256. package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
  257. package/src/shaders/symbol_sdf.vertex.glsl +142 -0
  258. package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
  259. package/src/shaders/symbol_text_and_icon.fragment.glsl +68 -0
  260. package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
  261. package/src/shaders/symbol_text_and_icon.vertex.glsl +140 -0
  262. package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
  263. package/src/shaders/terrain.fragment.glsl +32 -0
  264. package/src/shaders/terrain.fragment.glsl.g.ts +2 -0
  265. package/src/shaders/terrain.vertex.glsl +17 -0
  266. package/src/shaders/terrain.vertex.glsl.g.ts +2 -0
  267. package/src/shaders/terrain_coords.fragment.glsl +11 -0
  268. package/src/shaders/terrain_coords.fragment.glsl.g.ts +2 -0
  269. package/src/shaders/terrain_coords.vertex.glsl +13 -0
  270. package/src/shaders/terrain_coords.vertex.glsl.g.ts +2 -0
  271. package/src/shaders/terrain_depth.fragment.glsl +15 -0
  272. package/src/shaders/terrain_depth.fragment.glsl.g.ts +2 -0
  273. package/src/shaders/terrain_depth.vertex.glsl +13 -0
  274. package/src/shaders/terrain_depth.vertex.glsl.g.ts +2 -0
  275. package/src/source/canvas_source.test.ts +210 -0
  276. package/src/source/canvas_source.ts +227 -0
  277. package/src/source/geojson_source.test.ts +492 -0
  278. package/src/source/geojson_source.ts +431 -0
  279. package/src/source/geojson_source_diff.test.ts +364 -0
  280. package/src/source/geojson_source_diff.ts +172 -0
  281. package/src/source/geojson_worker_source.test.ts +399 -0
  282. package/src/source/geojson_worker_source.ts +303 -0
  283. package/src/source/geojson_wrapper.test.ts +32 -0
  284. package/src/source/geojson_wrapper.ts +81 -0
  285. package/src/source/image_source.test.ts +235 -0
  286. package/src/source/image_source.ts +338 -0
  287. package/src/source/load_tilejson.ts +47 -0
  288. package/src/source/pixels_to_tile_units.ts +25 -0
  289. package/src/source/protocol_crud.ts +48 -0
  290. package/src/source/query_features.test.ts +31 -0
  291. package/src/source/query_features.ts +252 -0
  292. package/src/source/raster_dem_tile_source.test.ts +158 -0
  293. package/src/source/raster_dem_tile_source.ts +166 -0
  294. package/src/source/raster_dem_tile_worker_source.test.ts +36 -0
  295. package/src/source/raster_dem_tile_worker_source.ts +38 -0
  296. package/src/source/raster_tile_source.test.ts +206 -0
  297. package/src/source/raster_tile_source.ts +227 -0
  298. package/src/source/rtl_text_plugin_main_thread.test.ts +170 -0
  299. package/src/source/rtl_text_plugin_main_thread.ts +89 -0
  300. package/src/source/rtl_text_plugin_status.ts +33 -0
  301. package/src/source/rtl_text_plugin_worker.ts +49 -0
  302. package/src/source/source.test.ts +41 -0
  303. package/src/source/source.ts +186 -0
  304. package/src/source/source_cache.test.ts +2069 -0
  305. package/src/source/source_cache.ts +1102 -0
  306. package/src/source/source_state.ts +157 -0
  307. package/src/source/terrain_source_cache.test.ts +105 -0
  308. package/src/source/terrain_source_cache.ts +204 -0
  309. package/src/source/tile.test.ts +290 -0
  310. package/src/source/tile.ts +478 -0
  311. package/src/source/tile_bounds.ts +34 -0
  312. package/src/source/tile_cache.test.ts +130 -0
  313. package/src/source/tile_cache.ts +208 -0
  314. package/src/source/tile_id.test.ts +112 -0
  315. package/src/source/tile_id.ts +221 -0
  316. package/src/source/vector_tile_source.test.ts +401 -0
  317. package/src/source/vector_tile_source.ts +283 -0
  318. package/src/source/vector_tile_worker_source.test.ts +396 -0
  319. package/src/source/vector_tile_worker_source.ts +199 -0
  320. package/src/source/video_source.test.ts +124 -0
  321. package/src/source/video_source.ts +204 -0
  322. package/src/source/worker.test.ts +233 -0
  323. package/src/source/worker.ts +301 -0
  324. package/src/source/worker_source.ts +117 -0
  325. package/src/source/worker_tile.test.ts +226 -0
  326. package/src/source/worker_tile.ts +208 -0
  327. package/src/style/create_style_layer.ts +39 -0
  328. package/src/style/evaluation_parameters.ts +62 -0
  329. package/src/style/format_section_override.test.ts +62 -0
  330. package/src/style/format_section_override.ts +50 -0
  331. package/src/style/light.test.ts +86 -0
  332. package/src/style/light.ts +135 -0
  333. package/src/style/load_glyph_range.test.ts +40 -0
  334. package/src/style/load_glyph_range.ts +32 -0
  335. package/src/style/load_sprite.test.ts +227 -0
  336. package/src/style/load_sprite.ts +71 -0
  337. package/src/style/parse_glyph_pbf.ts +42 -0
  338. package/src/style/pauseable_placement.ts +138 -0
  339. package/src/style/properties.ts +726 -0
  340. package/src/style/query_utils.test.ts +107 -0
  341. package/src/style/query_utils.ts +70 -0
  342. package/src/style/sky.ts +127 -0
  343. package/src/style/style.test.ts +2654 -0
  344. package/src/style/style.ts +1814 -0
  345. package/src/style/style_glyph.ts +25 -0
  346. package/src/style/style_image.ts +188 -0
  347. package/src/style/style_layer/background_style_layer.ts +17 -0
  348. package/src/style/style_layer/background_style_layer_properties.g.ts +40 -0
  349. package/src/style/style_layer/circle_style_layer.ts +98 -0
  350. package/src/style/style_layer/circle_style_layer_properties.g.ts +76 -0
  351. package/src/style/style_layer/custom_style_layer.ts +233 -0
  352. package/src/style/style_layer/fill_extrusion_style_layer.ts +224 -0
  353. package/src/style/style_layer/fill_extrusion_style_layer_properties.g.ts +55 -0
  354. package/src/style/style_layer/fill_style_layer.test.ts +37 -0
  355. package/src/style/style_layer/fill_style_layer.ts +65 -0
  356. package/src/style/style_layer/fill_style_layer_properties.g.ts +64 -0
  357. package/src/style/style_layer/heatmap_style_layer.ts +74 -0
  358. package/src/style/style_layer/heatmap_style_layer_properties.g.ts +46 -0
  359. package/src/style/style_layer/hillshade_style_layer.ts +21 -0
  360. package/src/style/style_layer/hillshade_style_layer_properties.g.ts +49 -0
  361. package/src/style/style_layer/line_style_layer.test.ts +50 -0
  362. package/src/style/style_layer/line_style_layer.ts +131 -0
  363. package/src/style/style_layer/line_style_layer_properties.g.ts +88 -0
  364. package/src/style/style_layer/overlap_mode.test.ts +57 -0
  365. package/src/style/style_layer/overlap_mode.ts +25 -0
  366. package/src/style/style_layer/raster_style_layer.ts +17 -0
  367. package/src/style/style_layer/raster_style_layer_properties.g.ts +55 -0
  368. package/src/style/style_layer/symbol_style_layer.ts +195 -0
  369. package/src/style/style_layer/symbol_style_layer_properties.g.ts +218 -0
  370. package/src/style/style_layer/typed_style_layer.ts +9 -0
  371. package/src/style/style_layer/variable_text_anchor.test.ts +117 -0
  372. package/src/style/style_layer/variable_text_anchor.ts +163 -0
  373. package/src/style/style_layer.test.ts +372 -0
  374. package/src/style/style_layer.ts +287 -0
  375. package/src/style/style_layer_index.test.ts +99 -0
  376. package/src/style/style_layer_index.ts +78 -0
  377. package/src/style/validate_style.ts +53 -0
  378. package/src/style/zoom_history.ts +40 -0
  379. package/src/symbol/anchor.test.ts +14 -0
  380. package/src/symbol/anchor.ts +22 -0
  381. package/src/symbol/check_max_angle.test.ts +54 -0
  382. package/src/symbol/check_max_angle.ts +76 -0
  383. package/src/symbol/clip_line.test.ts +154 -0
  384. package/src/symbol/clip_line.ts +66 -0
  385. package/src/symbol/collision_feature.test.ts +98 -0
  386. package/src/symbol/collision_feature.ts +114 -0
  387. package/src/symbol/collision_index.test.ts +19 -0
  388. package/src/symbol/collision_index.ts +618 -0
  389. package/src/symbol/cross_tile_symbol_index.test.ts +260 -0
  390. package/src/symbol/cross_tile_symbol_index.ts +367 -0
  391. package/src/symbol/get_anchors.test.ts +113 -0
  392. package/src/symbol/get_anchors.ts +167 -0
  393. package/src/symbol/grid_index.test.ts +75 -0
  394. package/src/symbol/grid_index.ts +414 -0
  395. package/src/symbol/merge_lines.test.ts +30 -0
  396. package/src/symbol/merge_lines.ts +80 -0
  397. package/src/symbol/one_em.ts +3 -0
  398. package/src/symbol/opacity_state.ts +23 -0
  399. package/src/symbol/path_interpolator.test.ts +134 -0
  400. package/src/symbol/path_interpolator.ts +55 -0
  401. package/src/symbol/placement.ts +1371 -0
  402. package/src/symbol/projection.test.ts +171 -0
  403. package/src/symbol/projection.ts +833 -0
  404. package/src/symbol/quads.test.ts +157 -0
  405. package/src/symbol/quads.ts +349 -0
  406. package/src/symbol/shaping.test.ts +360 -0
  407. package/src/symbol/shaping.ts +911 -0
  408. package/src/symbol/symbol_layout.ts +739 -0
  409. package/src/symbol/symbol_size.ts +129 -0
  410. package/src/symbol/symbol_style_layer.test.ts +103 -0
  411. package/src/symbol/transform_text.ts +27 -0
  412. package/src/ui/anchor.ts +27 -0
  413. package/src/ui/camera.test.ts +2301 -0
  414. package/src/ui/camera.ts +1520 -0
  415. package/src/ui/control/attribution_control.test.ts +543 -0
  416. package/src/ui/control/attribution_control.ts +209 -0
  417. package/src/ui/control/control.ts +67 -0
  418. package/src/ui/control/fullscreen_control.test.ts +114 -0
  419. package/src/ui/control/fullscreen_control.ts +189 -0
  420. package/src/ui/control/geolocate_control.test.ts +619 -0
  421. package/src/ui/control/geolocate_control.ts +725 -0
  422. package/src/ui/control/logo_control.test.ts +88 -0
  423. package/src/ui/control/logo_control.ts +86 -0
  424. package/src/ui/control/navigation_control.test.ts +238 -0
  425. package/src/ui/control/navigation_control.ts +294 -0
  426. package/src/ui/control/scale_control.test.ts +52 -0
  427. package/src/ui/control/scale_control.ts +152 -0
  428. package/src/ui/control/terrain_control.test.ts +58 -0
  429. package/src/ui/control/terrain_control.ts +74 -0
  430. package/src/ui/default_locale.ts +25 -0
  431. package/src/ui/events.ts +758 -0
  432. package/src/ui/handler/box_zoom.test.ts +163 -0
  433. package/src/ui/handler/box_zoom.ts +171 -0
  434. package/src/ui/handler/click_zoom.ts +55 -0
  435. package/src/ui/handler/cooperative_gestures.test.ts +338 -0
  436. package/src/ui/handler/cooperative_gestures.ts +111 -0
  437. package/src/ui/handler/dblclick_zoom.test.ts +151 -0
  438. package/src/ui/handler/drag_handler.ts +174 -0
  439. package/src/ui/handler/drag_move_state_manager.ts +115 -0
  440. package/src/ui/handler/drag_pan.test.ts +487 -0
  441. package/src/ui/handler/drag_rotate.test.ts +859 -0
  442. package/src/ui/handler/handler_util.ts +10 -0
  443. package/src/ui/handler/keyboard.test.ts +235 -0
  444. package/src/ui/handler/keyboard.ts +212 -0
  445. package/src/ui/handler/map_event.test.ts +158 -0
  446. package/src/ui/handler/map_event.ts +161 -0
  447. package/src/ui/handler/mouse.ts +92 -0
  448. package/src/ui/handler/mouse_handler_interface.test.ts +111 -0
  449. package/src/ui/handler/mouse_rotate.test.ts +62 -0
  450. package/src/ui/handler/one_finger_touch_drag.ts +45 -0
  451. package/src/ui/handler/one_finger_touch_drag_handler_interface.test.ts +77 -0
  452. package/src/ui/handler/scroll_zoom.test.ts +382 -0
  453. package/src/ui/handler/scroll_zoom.ts +379 -0
  454. package/src/ui/handler/shim/dblclick_zoom.ts +64 -0
  455. package/src/ui/handler/shim/drag_pan.ts +104 -0
  456. package/src/ui/handler/shim/drag_rotate.ts +76 -0
  457. package/src/ui/handler/shim/two_fingers_touch.ts +112 -0
  458. package/src/ui/handler/tap_drag_zoom.test.ts +113 -0
  459. package/src/ui/handler/tap_drag_zoom.ts +112 -0
  460. package/src/ui/handler/tap_recognizer.ts +138 -0
  461. package/src/ui/handler/tap_zoom.ts +98 -0
  462. package/src/ui/handler/touch_pan.ts +115 -0
  463. package/src/ui/handler/transform-provider.ts +44 -0
  464. package/src/ui/handler/two_fingers_touch.test.ts +283 -0
  465. package/src/ui/handler/two_fingers_touch.ts +336 -0
  466. package/src/ui/handler_inertia.ts +157 -0
  467. package/src/ui/handler_manager.ts +637 -0
  468. package/src/ui/hash.test.ts +404 -0
  469. package/src/ui/hash.ts +153 -0
  470. package/src/ui/map.ts +3393 -0
  471. package/src/ui/map_tests/map_animation.test.ts +61 -0
  472. package/src/ui/map_tests/map_basic.test.ts +223 -0
  473. package/src/ui/map_tests/map_bounds.test.ts +123 -0
  474. package/src/ui/map_tests/map_calculate_camera_options.test.ts +113 -0
  475. package/src/ui/map_tests/map_canvas.test.ts +59 -0
  476. package/src/ui/map_tests/map_control.test.ts +61 -0
  477. package/src/ui/map_tests/map_disable_handlers.test.ts +38 -0
  478. package/src/ui/map_tests/map_events.test.ts +1001 -0
  479. package/src/ui/map_tests/map_feature_state.test.ts +421 -0
  480. package/src/ui/map_tests/map_images.test.ts +175 -0
  481. package/src/ui/map_tests/map_is_moving.test.ts +164 -0
  482. package/src/ui/map_tests/map_is_rotating.test.ts +62 -0
  483. package/src/ui/map_tests/map_is_zooming.test.ts +86 -0
  484. package/src/ui/map_tests/map_layer.test.ts +457 -0
  485. package/src/ui/map_tests/map_options.test.ts +64 -0
  486. package/src/ui/map_tests/map_pitch.test.ts +90 -0
  487. package/src/ui/map_tests/map_pixel_ratio.test.ts +75 -0
  488. package/src/ui/map_tests/map_query_rendered_features.test.ts +93 -0
  489. package/src/ui/map_tests/map_render.test.ts +90 -0
  490. package/src/ui/map_tests/map_request_render_frame.test.ts +51 -0
  491. package/src/ui/map_tests/map_resize.test.ts +120 -0
  492. package/src/ui/map_tests/map_style.test.ts +541 -0
  493. package/src/ui/map_tests/map_terrian.test.ts +104 -0
  494. package/src/ui/map_tests/map_webgl.test.ts +72 -0
  495. package/src/ui/map_tests/map_world_copies.test.ts +103 -0
  496. package/src/ui/map_tests/map_zoom.test.ts +95 -0
  497. package/src/ui/marker.test.ts +1149 -0
  498. package/src/ui/marker.ts +880 -0
  499. package/src/ui/popup.test.ts +827 -0
  500. package/src/ui/popup.ts +717 -0
  501. package/src/util/abort_error.ts +21 -0
  502. package/src/util/actor.test.ts +218 -0
  503. package/src/util/actor.ts +241 -0
  504. package/src/util/actor_messages.ts +149 -0
  505. package/src/util/ajax.test.ts +237 -0
  506. package/src/util/ajax.ts +297 -0
  507. package/src/util/browser.test.ts +23 -0
  508. package/src/util/browser.ts +63 -0
  509. package/src/util/color_ramp.test.ts +105 -0
  510. package/src/util/color_ramp.ts +56 -0
  511. package/src/util/config.ts +29 -0
  512. package/src/util/dictionary_coder.ts +23 -0
  513. package/src/util/dispatcher.test.ts +76 -0
  514. package/src/util/dispatcher.ts +78 -0
  515. package/src/util/dom.ts +135 -0
  516. package/src/util/evented.test.ts +231 -0
  517. package/src/util/evented.ts +178 -0
  518. package/src/util/find_pole_of_inaccessibility.test.ts +21 -0
  519. package/src/util/find_pole_of_inaccessibility.ts +130 -0
  520. package/src/util/geolocation_support.test.ts +43 -0
  521. package/src/util/geolocation_support.ts +23 -0
  522. package/src/util/global_worker_pool.ts +65 -0
  523. package/src/util/image.ts +150 -0
  524. package/src/util/image_request.test.ts +408 -0
  525. package/src/util/image_request.ts +246 -0
  526. package/src/util/intersection_tests.ts +206 -0
  527. package/src/util/is_char_in_unicode_block.test.ts +15 -0
  528. package/src/util/is_char_in_unicode_block.ts +345 -0
  529. package/src/util/offscreen_canvas_distorted.test.ts +13 -0
  530. package/src/util/offscreen_canvas_distorted.ts +39 -0
  531. package/src/util/offscreen_canvas_supported.ts +11 -0
  532. package/src/util/performance.ts +117 -0
  533. package/src/util/primitives.test.ts +140 -0
  534. package/src/util/primitives.ts +143 -0
  535. package/src/util/request_manager.ts +42 -0
  536. package/src/util/resolve_tokens.test.ts +45 -0
  537. package/src/util/resolve_tokens.ts +17 -0
  538. package/src/util/script_detection.test.ts +138 -0
  539. package/src/util/script_detection.ts +376 -0
  540. package/src/util/smart_wrap.test.ts +97 -0
  541. package/src/util/smart_wrap.ts +58 -0
  542. package/src/util/struct_array.test.ts +101 -0
  543. package/src/util/struct_array.ts +246 -0
  544. package/src/util/style.test.ts +34 -0
  545. package/src/util/style.ts +28 -0
  546. package/src/util/task_queue.test.ts +114 -0
  547. package/src/util/task_queue.ts +64 -0
  548. package/src/util/test/util.ts +185 -0
  549. package/src/util/throttle.test.ts +42 -0
  550. package/src/util/throttle.ts +28 -0
  551. package/src/util/throttled_invoker.ts +41 -0
  552. package/src/util/transferable_grid_index.test.ts +56 -0
  553. package/src/util/transferable_grid_index.ts +214 -0
  554. package/src/util/util.test.ts +414 -0
  555. package/src/util/util.ts +724 -0
  556. package/src/util/vectortile_to_geojson.ts +72 -0
  557. package/src/util/verticalize_punctuation.ts +110 -0
  558. package/src/util/web_worker.ts +16 -0
  559. package/src/util/web_worker_transfer.test.ts +153 -0
  560. package/src/util/web_worker_transfer.ts +254 -0
  561. package/src/util/webp_supported.ts +63 -0
  562. package/src/util/worker_pool.test.ts +43 -0
  563. package/src/util/worker_pool.ts +58 -0
  564. package/src/util/world_bounds.test.ts +59 -0
  565. 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
+ };