@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,396 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import vt from '@mapbox/vector-tile';
4
+ import Protobuf from 'pbf';
5
+ import {LoadVectorData, VectorTileWorkerSource} from '../source/vector_tile_worker_source';
6
+ import {StyleLayerIndex} from '../style/style_layer_index';
7
+ import {fakeServer, type FakeServer} from 'nise';
8
+ import {IActor} from '../util/actor';
9
+ import {TileParameters, WorkerTileParameters, WorkerTileResult} from './worker_source';
10
+ import {WorkerTile} from './worker_tile';
11
+ import {setPerformance, sleep} from '../util/test/util';
12
+ import {ABORT_ERROR} from '../util/abort_error';
13
+
14
+ describe('vector tile worker source', () => {
15
+ const actor = {sendAsync: () => Promise.resolve({})} as IActor;
16
+ let server: FakeServer;
17
+
18
+ beforeEach(() => {
19
+ global.fetch = null;
20
+ server = fakeServer.create();
21
+ setPerformance();
22
+ });
23
+
24
+ afterEach(() => {
25
+ server.restore();
26
+ jest.clearAllMocks();
27
+ });
28
+ test('VectorTileWorkerSource#abortTile aborts pending request', async () => {
29
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
30
+
31
+ const loadPromise = source.loadTile({
32
+ source: 'source',
33
+ uid: 0,
34
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
35
+ request: {url: 'http://localhost:2900/abort'}
36
+ } as any as WorkerTileParameters);
37
+
38
+ const abortPromise = source.abortTile({
39
+ source: 'source',
40
+ uid: 0
41
+ } as any as TileParameters);
42
+
43
+ expect(source.loading).toEqual({});
44
+ await expect(abortPromise).resolves.toBeFalsy();
45
+ await expect(loadPromise).rejects.toThrow(ABORT_ERROR);
46
+ });
47
+
48
+ test('VectorTileWorkerSource#removeTile removes loaded tile', async () => {
49
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
50
+
51
+ source.loaded = {
52
+ '0': {} as WorkerTile
53
+ };
54
+
55
+ const res = await source.removeTile({
56
+ source: 'source',
57
+ uid: 0
58
+ } as any as TileParameters);
59
+ expect(res).toBeUndefined();
60
+
61
+ expect(source.loaded).toEqual({});
62
+ });
63
+
64
+ test('VectorTileWorkerSource#reloadTile reloads a previously-loaded tile', async () => {
65
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
66
+ const parse = jest.fn().mockReturnValue(Promise.resolve({} as WorkerTileResult));
67
+
68
+ source.loaded = {
69
+ '0': {
70
+ status: 'done',
71
+ vectorTile: {},
72
+ parse
73
+ } as any as WorkerTile
74
+ };
75
+
76
+ const reloadPromise = source.reloadTile({uid: 0} as any as WorkerTileParameters);
77
+ expect(parse).toHaveBeenCalledTimes(1);
78
+ await expect(reloadPromise).resolves.toBeTruthy();
79
+ });
80
+
81
+ test('VectorTileWorkerSource#loadTile reparses tile if the reloadTile has been called during parsing', async () => {
82
+ const rawTileData = new Uint8Array([]);
83
+ const loadVectorData: LoadVectorData = async (_params, _abortController) => {
84
+ return {
85
+ vectorTile: {
86
+ layers: {
87
+ test: {
88
+ version: 2,
89
+ name: 'test',
90
+ extent: 8192,
91
+ length: 1,
92
+ feature: (featureIndex: number) => ({
93
+ extent: 8192,
94
+ type: 1,
95
+ id: featureIndex,
96
+ properties: {
97
+ name: 'test'
98
+ },
99
+ loadGeometry () {
100
+ return [[{x: 0, y: 0}]];
101
+ }
102
+ })
103
+ }
104
+ }
105
+ } as any as vt.VectorTile,
106
+ rawData: rawTileData
107
+ };
108
+ };
109
+
110
+ const layerIndex = new StyleLayerIndex([{
111
+ id: 'test',
112
+ source: 'source',
113
+ 'source-layer': 'test',
114
+ type: 'symbol',
115
+ layout: {
116
+ 'icon-image': 'hello',
117
+ 'text-font': ['StandardFont-Bold'],
118
+ 'text-field': '{name}'
119
+ }
120
+ }]);
121
+
122
+ const actor = {
123
+ sendAsync: (message: {type: string; data: unknown}, abortController: AbortController) => {
124
+ return new Promise((resolve, _reject) => {
125
+ const res = setTimeout(() => {
126
+ const response = message.type === 'getImages' ?
127
+ {'hello': {width: 1, height: 1, data: new Uint8Array([0])}} :
128
+ {'StandardFont-Bold': {width: 1, height: 1, data: new Uint8Array([0])}};
129
+ resolve(response);
130
+ }, 100);
131
+ abortController.signal.addEventListener('abort', () => {
132
+ clearTimeout(res);
133
+ });
134
+ });
135
+ }
136
+ };
137
+ const source = new VectorTileWorkerSource(actor, layerIndex, ['hello']);
138
+ source.loadVectorTile = loadVectorData;
139
+ source.loadTile({
140
+ source: 'source',
141
+ uid: 0,
142
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
143
+ request: {url: 'http://localhost:2900/faketile.pbf'}
144
+ } as any as WorkerTileParameters).then(() => expect(false).toBeTruthy());
145
+
146
+ // allow promise to run
147
+ await sleep(0);
148
+
149
+ const res = await source.reloadTile({
150
+ source: 'source',
151
+ uid: 0,
152
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
153
+ } as any as WorkerTileParameters);
154
+ expect(res).toBeDefined();
155
+ expect(res.rawTileData).toBeDefined();
156
+ expect(res.rawTileData).toStrictEqual(rawTileData);
157
+ });
158
+
159
+ test('VectorTileWorkerSource#loadTile reparses tile if reloadTile is called during reparsing', async () => {
160
+ const rawTileData = new Uint8Array([]);
161
+ const loadVectorData: LoadVectorData = async (_params, _abortController) => {
162
+ return {
163
+ vectorTile: new vt.VectorTile(new Protobuf(rawTileData)),
164
+ rawData: rawTileData
165
+ };
166
+ };
167
+
168
+ const layerIndex = new StyleLayerIndex([{
169
+ id: 'test',
170
+ source: 'source',
171
+ 'source-layer': 'test',
172
+ type: 'fill'
173
+ }]);
174
+
175
+ const source = new VectorTileWorkerSource(actor, layerIndex, []);
176
+ source.loadVectorTile = loadVectorData;
177
+
178
+ const parseWorkerTileMock = jest
179
+ .spyOn(WorkerTile.prototype, 'parse')
180
+ .mockImplementation(function(_data, _layerIndex, _availableImages, _actor) {
181
+ this.status = 'parsing';
182
+ return new Promise((resolve) => {
183
+ setTimeout(() => resolve({} as WorkerTileResult), 20);
184
+ });
185
+ });
186
+
187
+ const loadPromise = source.loadTile({
188
+ source: 'source',
189
+ uid: 0,
190
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
191
+ request: {url: 'http://localhost:2900/faketile.pbf'}
192
+ } as any as WorkerTileParameters);
193
+
194
+ // let the promise start
195
+ await sleep(0);
196
+
197
+ const res = await source.reloadTile({
198
+ source: 'source',
199
+ uid: '0',
200
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
201
+ } as any as WorkerTileParameters);
202
+ expect(res).toBeDefined();
203
+ expect(parseWorkerTileMock).toHaveBeenCalledTimes(2);
204
+ await expect(loadPromise).resolves.toBeTruthy();
205
+ });
206
+
207
+ test('VectorTileWorkerSource#reloadTile does not reparse tiles with no vectorTile data but does call callback', async () => {
208
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
209
+ const parse = jest.fn();
210
+
211
+ source.loaded = {
212
+ '0': {
213
+ status: 'done',
214
+ parse
215
+ } as any as WorkerTile
216
+ };
217
+
218
+ await source.reloadTile({uid: 0} as any as WorkerTileParameters);
219
+ expect(parse).not.toHaveBeenCalled();
220
+ });
221
+
222
+ test('VectorTileWorkerSource#loadTile returns null for an empty tile', async () => {
223
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
224
+ source.loadVectorTile = (_params, _abortController) => Promise.resolve(null);
225
+ const parse = jest.fn();
226
+
227
+ server.respondWith(request => {
228
+ request.respond(200, {'Content-Type': 'application/pbf'}, 'something...');
229
+ });
230
+
231
+ const promise = source.loadTile({
232
+ source: 'source',
233
+ uid: 0,
234
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
235
+ request: {url: 'http://localhost:2900/faketile.pbf'}
236
+ } as any as WorkerTileParameters);
237
+
238
+ server.respond();
239
+
240
+ expect(parse).not.toHaveBeenCalled();
241
+ expect(await promise).toBeNull();
242
+ });
243
+
244
+ test('VectorTileWorkerSource#returns a good error message when failing to parse a tile', () => new Promise<void>(done => {
245
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
246
+ const parse = jest.fn();
247
+
248
+ server.respondWith(request => {
249
+ request.respond(200, {'Content-Type': 'application/pbf'}, 'something...');
250
+ });
251
+
252
+ source.loadTile({
253
+ source: 'source',
254
+ uid: 0,
255
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
256
+ request: {url: 'http://localhost:2900/faketile.pbf'}
257
+ } as any as WorkerTileParameters).catch((err) => {
258
+ expect(err.message).toContain('Unable to parse the tile at');
259
+ done();
260
+ });
261
+
262
+ server.respond();
263
+
264
+ expect(parse).not.toHaveBeenCalled();
265
+ }));
266
+
267
+ test('VectorTileWorkerSource#returns a good error message when failing to parse a gzipped tile', () => new Promise<void>(done => {
268
+ const source = new VectorTileWorkerSource(actor, new StyleLayerIndex(), []);
269
+ const parse = jest.fn();
270
+
271
+ server.respondWith(new Uint8Array([0x1f, 0x8b]).buffer);
272
+
273
+ source.loadTile({
274
+ source: 'source',
275
+ uid: 0,
276
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
277
+ request: {url: 'http://localhost:2900/faketile.pbf'}
278
+ } as any as WorkerTileParameters).catch((err) => {
279
+ expect(err.message).toContain('gzipped');
280
+ done();
281
+ });
282
+
283
+ server.respond();
284
+
285
+ expect(parse).not.toHaveBeenCalled();
286
+ }));
287
+
288
+ test('VectorTileWorkerSource provides resource timing information', async () => {
289
+ const rawTileData = fs.readFileSync(path.join(__dirname, '/../../test/unit/assets/mbsv5-6-18-23.vector.pbf'));
290
+
291
+ const loadVectorData: LoadVectorData = async (_params, _abortController) => {
292
+ return {
293
+ vectorTile: new vt.VectorTile(new Protobuf(rawTileData)),
294
+ rawData: rawTileData,
295
+ cacheControl: null,
296
+ expires: null
297
+ };
298
+ };
299
+
300
+ const exampleResourceTiming = {
301
+ connectEnd: 473,
302
+ connectStart: 473,
303
+ decodedBodySize: 86494,
304
+ domainLookupEnd: 473,
305
+ domainLookupStart: 473,
306
+ duration: 341,
307
+ encodedBodySize: 52528,
308
+ entryType: 'resource',
309
+ fetchStart: 473.5,
310
+ initiatorType: 'xmlhttprequest',
311
+ name: 'http://localhost:2900/faketile.pbf',
312
+ nextHopProtocol: 'http/1.1',
313
+ redirectEnd: 0,
314
+ redirectStart: 0,
315
+ requestStart: 477,
316
+ responseEnd: 815,
317
+ responseStart: 672,
318
+ secureConnectionStart: 0
319
+ };
320
+
321
+ const layerIndex = new StyleLayerIndex([{
322
+ id: 'test',
323
+ source: 'source',
324
+ 'source-layer': 'test',
325
+ type: 'fill'
326
+ }]);
327
+
328
+ const source = new VectorTileWorkerSource(actor, layerIndex, []);
329
+ source.loadVectorTile = loadVectorData;
330
+
331
+ window.performance.getEntriesByName = jest.fn().mockReturnValue([exampleResourceTiming]);
332
+
333
+ const res = await source.loadTile({
334
+ source: 'source',
335
+ uid: 0,
336
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
337
+ request: {url: 'http://localhost:2900/faketile.pbf', collectResourceTiming: true}
338
+ } as any as WorkerTileParameters);
339
+
340
+ expect(res.resourceTiming[0]).toEqual(exampleResourceTiming);
341
+
342
+ });
343
+
344
+ test('VectorTileWorkerSource provides resource timing information (fallback method)', async () => {
345
+ const rawTileData = fs.readFileSync(path.join(__dirname, '/../../test/unit/assets/mbsv5-6-18-23.vector.pbf'));
346
+
347
+ const loadVectorData: LoadVectorData = async (_params, _abortController) => {
348
+ return {
349
+ vectorTile: new vt.VectorTile(new Protobuf(rawTileData)),
350
+ rawData: rawTileData,
351
+ cacheControl: null,
352
+ expires: null
353
+ };
354
+ };
355
+
356
+ const layerIndex = new StyleLayerIndex([{
357
+ id: 'test',
358
+ source: 'source',
359
+ 'source-layer': 'test',
360
+ type: 'fill'
361
+ }]);
362
+
363
+ const source = new VectorTileWorkerSource(actor, layerIndex, []);
364
+ source.loadVectorTile = loadVectorData;
365
+
366
+ const sampleMarks = [100, 350];
367
+ const marks = {};
368
+ const measures = {};
369
+ window.performance.getEntriesByName = jest.fn().mockImplementation(name => (measures[name] || []));
370
+ window.performance.mark = jest.fn().mockImplementation(name => {
371
+ marks[name] = sampleMarks.shift();
372
+ return null;
373
+ });
374
+ window.performance.measure = jest.fn().mockImplementation((name, start, end) => {
375
+ measures[name] = measures[name] || [];
376
+ measures[name].push({
377
+ duration: marks[end] - marks[start],
378
+ entryType: 'measure',
379
+ name,
380
+ startTime: marks[start]
381
+ });
382
+ return null;
383
+ });
384
+
385
+ const res = await source.loadTile({
386
+ source: 'source',
387
+ uid: 0,
388
+ tileID: {overscaledZ: 0, wrap: 0, canonical: {x: 0, y: 0, z: 0, w: 0}},
389
+ request: {url: 'http://localhost:2900/faketile.pbf', collectResourceTiming: true}
390
+ } as any as WorkerTileParameters);
391
+
392
+ expect(res.resourceTiming[0]).toEqual(
393
+ {'duration': 250, 'entryType': 'measure', 'name': 'http://localhost:2900/faketile.pbf', 'startTime': 100}
394
+ );
395
+ });
396
+ });
@@ -0,0 +1,199 @@
1
+ import {ExpiryData, getArrayBuffer} from '../util/ajax';
2
+
3
+ import vt from '@mapbox/vector-tile';
4
+ import Protobuf from 'pbf';
5
+ import {WorkerTile} from './worker_tile';
6
+ import {extend} from '../util/util';
7
+ import {RequestPerformance} from '../util/performance';
8
+
9
+ import type {
10
+ WorkerSource,
11
+ WorkerTileParameters,
12
+ TileParameters,
13
+ WorkerTileResult
14
+ } from '../source/worker_source';
15
+
16
+ import type {IActor} from '../util/actor';
17
+ import type {StyleLayerIndex} from '../style/style_layer_index';
18
+ import type {VectorTile} from '@mapbox/vector-tile';
19
+
20
+ export type LoadVectorTileResult = {
21
+ vectorTile: VectorTile;
22
+ rawData: ArrayBuffer;
23
+ resourceTiming?: Array<PerformanceResourceTiming>;
24
+ } & ExpiryData;
25
+
26
+ type FetchingState = {
27
+ rawTileData: ArrayBuffer;
28
+ cacheControl: ExpiryData;
29
+ resourceTiming: any;
30
+ }
31
+
32
+ export type AbortVectorData = () => void;
33
+ export type LoadVectorData = (params: WorkerTileParameters, abortController: AbortController) => Promise<LoadVectorTileResult | null>;
34
+
35
+ /**
36
+ * The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
37
+ * This class is designed to be easily reused to support custom source types
38
+ * for data formats that can be parsed/converted into an in-memory VectorTile
39
+ * representation. To do so, override its `loadVectorTile` method.
40
+ */
41
+ export class VectorTileWorkerSource implements WorkerSource {
42
+ actor: IActor;
43
+ layerIndex: StyleLayerIndex;
44
+ availableImages: Array<string>;
45
+ fetching: {[_: string]: FetchingState };
46
+ loading: {[_: string]: WorkerTile};
47
+ loaded: {[_: string]: WorkerTile};
48
+
49
+ /**
50
+ * @param loadVectorData - Optional method for custom loading of a VectorTile
51
+ * object based on parameters passed from the main-thread Source. See
52
+ * {@link VectorTileWorkerSource#loadTile}. The default implementation simply
53
+ * loads the pbf at `params.url`.
54
+ */
55
+ constructor(actor: IActor, layerIndex: StyleLayerIndex, availableImages: Array<string>) {
56
+ this.actor = actor;
57
+ this.layerIndex = layerIndex;
58
+ this.availableImages = availableImages;
59
+ this.fetching = {};
60
+ this.loading = {};
61
+ this.loaded = {};
62
+ }
63
+
64
+ /**
65
+ * Loads a vector tile
66
+ */
67
+ async loadVectorTile(params: WorkerTileParameters, abortController: AbortController): Promise<LoadVectorTileResult> {
68
+ const response = await getArrayBuffer(params.request, abortController);
69
+ try {
70
+ const vectorTile = new vt.VectorTile(new Protobuf(response.data));
71
+ return {
72
+ vectorTile,
73
+ rawData: response.data,
74
+ cacheControl: response.cacheControl,
75
+ expires: response.expires
76
+ };
77
+ } catch (ex) {
78
+ const bytes = new Uint8Array(response.data);
79
+ const isGzipped = bytes[0] === 0x1f && bytes[1] === 0x8b;
80
+ let errorMessage = `Unable to parse the tile at ${params.request.url}, `;
81
+ if (isGzipped) {
82
+ errorMessage += 'please make sure the data is not gzipped and that you have configured the relevant header in the server';
83
+ } else {
84
+ errorMessage += `got error: ${ex.message}`;
85
+ }
86
+ throw new Error(errorMessage);
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Implements {@link WorkerSource#loadTile}. Delegates to
92
+ * {@link VectorTileWorkerSource#loadVectorData} (which by default expects
93
+ * a `params.url` property) for fetching and producing a VectorTile object.
94
+ */
95
+ async loadTile(params: WorkerTileParameters): Promise<WorkerTileResult | null> {
96
+ const tileUid = params.uid;
97
+
98
+ const perf = (params && params.request && params.request.collectResourceTiming) ?
99
+ new RequestPerformance(params.request) : false;
100
+
101
+ const workerTile = new WorkerTile(params);
102
+ this.loading[tileUid] = workerTile;
103
+
104
+ const abortController = new AbortController();
105
+ workerTile.abort = abortController;
106
+ try {
107
+ const response = await this.loadVectorTile(params, abortController);
108
+ delete this.loading[tileUid];
109
+ if (!response) {
110
+ return null;
111
+ }
112
+
113
+ const rawTileData = response.rawData;
114
+ const cacheControl = {} as ExpiryData;
115
+ if (response.expires) cacheControl.expires = response.expires;
116
+ if (response.cacheControl) cacheControl.cacheControl = response.cacheControl;
117
+
118
+ const resourceTiming = {} as {resourceTiming: any};
119
+ if (perf) {
120
+ const resourceTimingData = perf.finish();
121
+ // it's necessary to eval the result of getEntriesByName() here via parse/stringify
122
+ // late evaluation in the main thread causes TypeError: illegal invocation
123
+ if (resourceTimingData)
124
+ resourceTiming.resourceTiming = JSON.parse(JSON.stringify(resourceTimingData));
125
+ }
126
+
127
+ workerTile.vectorTile = response.vectorTile;
128
+ const parsePromise = workerTile.parse(response.vectorTile, this.layerIndex, this.availableImages, this.actor);
129
+ this.loaded[tileUid] = workerTile;
130
+ // keep the original fetching state so that reload tile can pick it up if the original parse is cancelled by reloads' parse
131
+ this.fetching[tileUid] = {rawTileData, cacheControl, resourceTiming};
132
+
133
+ try {
134
+ const result = await parsePromise;
135
+ // Transferring a copy of rawTileData because the worker needs to retain its copy.
136
+ return extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming);
137
+ } finally {
138
+ delete this.fetching[tileUid];
139
+ }
140
+ } catch (err) {
141
+ delete this.loading[tileUid];
142
+ workerTile.status = 'done';
143
+ this.loaded[tileUid] = workerTile;
144
+ throw err;
145
+ }
146
+ }
147
+
148
+ /**
149
+ * Implements {@link WorkerSource#reloadTile}.
150
+ */
151
+ async reloadTile(params: WorkerTileParameters): Promise<WorkerTileResult> {
152
+ const uid = params.uid;
153
+ if (!this.loaded || !this.loaded[uid]) {
154
+ throw new Error('Should not be trying to reload a tile that was never loaded or has been removed');
155
+ }
156
+ const workerTile = this.loaded[uid];
157
+ workerTile.showCollisionBoxes = params.showCollisionBoxes;
158
+ if (workerTile.status === 'parsing') {
159
+ const result = await workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor);
160
+ // if we have cancelled the original parse, make sure to pass the rawTileData from the original fetch
161
+ let parseResult: WorkerTileResult;
162
+ if (this.fetching[uid]) {
163
+ const {rawTileData, cacheControl, resourceTiming} = this.fetching[uid];
164
+ delete this.fetching[uid];
165
+ parseResult = extend({rawTileData: rawTileData.slice(0)}, result, cacheControl, resourceTiming);
166
+ } else {
167
+ parseResult = result;
168
+ }
169
+ return parseResult;
170
+
171
+ }
172
+ // if there was no vector tile data on the initial load, don't try and re-parse tile
173
+ if (workerTile.status === 'done' && workerTile.vectorTile) {
174
+ // this seems like a missing case where cache control is lost? see #3309
175
+ return workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor);
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Implements {@link WorkerSource#abortTile}.
181
+ */
182
+ async abortTile(params: TileParameters): Promise<void> {
183
+ const loading = this.loading;
184
+ const uid = params.uid;
185
+ if (loading && loading[uid] && loading[uid].abort) {
186
+ loading[uid].abort.abort();
187
+ delete loading[uid];
188
+ }
189
+ }
190
+
191
+ /**
192
+ * Implements {@link WorkerSource#removeTile}.
193
+ */
194
+ async removeTile(params: TileParameters): Promise<void> {
195
+ if (this.loaded && this.loaded[params.uid]) {
196
+ delete this.loaded[params.uid];
197
+ }
198
+ }
199
+ }