@react-x11/components 0.8.0 → 0.9.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 (323) hide show
  1. package/README.md +95 -34
  2. package/dist/charts/node.d.ts +1 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +6 -2
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/embed/client.d.ts +48 -3
  7. package/dist/embed/client.d.ts.map +1 -1
  8. package/dist/embed/client.js +79 -5
  9. package/dist/embed/client.js.map +1 -1
  10. package/dist/embed/index.d.ts +1 -1
  11. package/dist/embed/index.d.ts.map +1 -1
  12. package/dist/embed/index.js +1 -1
  13. package/dist/embed/index.js.map +1 -1
  14. package/dist/html/node.d.ts +3 -1
  15. package/dist/html/node.d.ts.map +1 -1
  16. package/dist/html/node.js +7 -5
  17. package/dist/html/node.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/{markdown → internal/markdown}/ast.d.ts +12 -0
  23. package/dist/internal/markdown/ast.d.ts.map +1 -0
  24. package/dist/internal/markdown/ast.js +22 -0
  25. package/dist/internal/markdown/ast.js.map +1 -0
  26. package/dist/internal/markdown/parse.d.ts.map +1 -0
  27. package/dist/{markdown → internal/markdown}/parse.js +112 -22
  28. package/dist/internal/markdown/parse.js.map +1 -0
  29. package/dist/internal/markdown/stringify.d.ts +4 -0
  30. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  31. package/dist/internal/markdown/stringify.js +684 -0
  32. package/dist/internal/markdown/stringify.js.map +1 -0
  33. package/dist/internal/markdown/tags.d.ts.map +1 -0
  34. package/dist/internal/markdown/tags.js.map +1 -0
  35. package/dist/internal/scroll.d.ts +3 -2
  36. package/dist/internal/scroll.d.ts.map +1 -1
  37. package/dist/internal/scroll.js +1 -0
  38. package/dist/internal/scroll.js.map +1 -1
  39. package/dist/maps/anchors.d.ts +98 -0
  40. package/dist/maps/anchors.d.ts.map +1 -0
  41. package/dist/maps/anchors.js +531 -0
  42. package/dist/maps/anchors.js.map +1 -0
  43. package/dist/maps/controller.d.ts +283 -0
  44. package/dist/maps/controller.d.ts.map +1 -0
  45. package/dist/maps/controller.js +743 -0
  46. package/dist/maps/controller.js.map +1 -0
  47. package/dist/maps/gl/buckets.d.ts +95 -0
  48. package/dist/maps/gl/buckets.d.ts.map +1 -0
  49. package/dist/maps/gl/buckets.js +362 -0
  50. package/dist/maps/gl/buckets.js.map +1 -0
  51. package/dist/maps/gl/build-worker.d.ts +13 -0
  52. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  53. package/dist/maps/gl/build-worker.js +44 -0
  54. package/dist/maps/gl/build-worker.js.map +1 -0
  55. package/dist/maps/gl/color.d.ts +8 -0
  56. package/dist/maps/gl/color.d.ts.map +1 -0
  57. package/dist/maps/gl/color.js +57 -0
  58. package/dist/maps/gl/color.js.map +1 -0
  59. package/dist/maps/gl/cover.d.ts +51 -0
  60. package/dist/maps/gl/cover.d.ts.map +1 -0
  61. package/dist/maps/gl/cover.js +124 -0
  62. package/dist/maps/gl/cover.js.map +1 -0
  63. package/dist/maps/gl/index.d.ts +3 -0
  64. package/dist/maps/gl/index.d.ts.map +1 -0
  65. package/dist/maps/gl/index.js +20 -0
  66. package/dist/maps/gl/index.js.map +1 -0
  67. package/dist/maps/gl/markers.d.ts +28 -0
  68. package/dist/maps/gl/markers.d.ts.map +1 -0
  69. package/dist/maps/gl/markers.js +60 -0
  70. package/dist/maps/gl/markers.js.map +1 -0
  71. package/dist/maps/gl/overlays.d.ts +68 -0
  72. package/dist/maps/gl/overlays.d.ts.map +1 -0
  73. package/dist/maps/gl/overlays.js +300 -0
  74. package/dist/maps/gl/overlays.js.map +1 -0
  75. package/dist/maps/gl/pane.d.ts +12 -0
  76. package/dist/maps/gl/pane.d.ts.map +1 -0
  77. package/dist/maps/gl/pane.js +37 -0
  78. package/dist/maps/gl/pane.js.map +1 -0
  79. package/dist/maps/gl/placement.d.ts +111 -0
  80. package/dist/maps/gl/placement.d.ts.map +1 -0
  81. package/dist/maps/gl/placement.js +567 -0
  82. package/dist/maps/gl/placement.js.map +1 -0
  83. package/dist/maps/gl/renderer.d.ts +352 -0
  84. package/dist/maps/gl/renderer.d.ts.map +1 -0
  85. package/dist/maps/gl/renderer.js +1127 -0
  86. package/dist/maps/gl/renderer.js.map +1 -0
  87. package/dist/maps/gl/shaders.d.ts +120 -0
  88. package/dist/maps/gl/shaders.d.ts.map +1 -0
  89. package/dist/maps/gl/shaders.js +451 -0
  90. package/dist/maps/gl/shaders.js.map +1 -0
  91. package/dist/maps/gl/store.d.ts +115 -0
  92. package/dist/maps/gl/store.d.ts.map +1 -0
  93. package/dist/maps/gl/store.js +469 -0
  94. package/dist/maps/gl/store.js.map +1 -0
  95. package/dist/maps/gl/text.d.ts +154 -0
  96. package/dist/maps/gl/text.d.ts.map +1 -0
  97. package/dist/maps/gl/text.js +382 -0
  98. package/dist/maps/gl/text.js.map +1 -0
  99. package/dist/maps/gl/view.d.ts +54 -0
  100. package/dist/maps/gl/view.d.ts.map +1 -0
  101. package/dist/maps/gl/view.js +974 -0
  102. package/dist/maps/gl/view.js.map +1 -0
  103. package/dist/maps/index.d.ts +1 -1
  104. package/dist/maps/index.d.ts.map +1 -1
  105. package/dist/maps/index.js +216 -52
  106. package/dist/maps/index.js.map +1 -1
  107. package/dist/maps/labels.d.ts +37 -16
  108. package/dist/maps/labels.d.ts.map +1 -1
  109. package/dist/maps/labels.js +188 -119
  110. package/dist/maps/labels.js.map +1 -1
  111. package/dist/maps/node.d.ts +162 -56
  112. package/dist/maps/node.d.ts.map +1 -1
  113. package/dist/maps/node.js +607 -515
  114. package/dist/maps/node.js.map +1 -1
  115. package/dist/maps/overlay.d.ts +72 -9
  116. package/dist/maps/overlay.d.ts.map +1 -1
  117. package/dist/maps/overlay.js +108 -28
  118. package/dist/maps/overlay.js.map +1 -1
  119. package/dist/maps/paint.d.ts +3 -0
  120. package/dist/maps/paint.d.ts.map +1 -1
  121. package/dist/maps/paint.js.map +1 -1
  122. package/dist/maps/proj.d.ts +14 -0
  123. package/dist/maps/proj.d.ts.map +1 -1
  124. package/dist/maps/proj.js +28 -0
  125. package/dist/maps/proj.js.map +1 -1
  126. package/dist/maps/renderer.d.ts +69 -0
  127. package/dist/maps/renderer.d.ts.map +1 -0
  128. package/dist/maps/renderer.js +66 -0
  129. package/dist/maps/renderer.js.map +1 -0
  130. package/dist/maps/sources.d.ts +25 -3
  131. package/dist/maps/sources.d.ts.map +1 -1
  132. package/dist/maps/sources.js +17 -0
  133. package/dist/maps/sources.js.map +1 -1
  134. package/dist/maps/theme.d.ts +19 -0
  135. package/dist/maps/theme.d.ts.map +1 -0
  136. package/dist/maps/theme.js +44 -0
  137. package/dist/maps/theme.js.map +1 -0
  138. package/dist/maps/tiles.d.ts +117 -17
  139. package/dist/maps/tiles.d.ts.map +1 -1
  140. package/dist/maps/tiles.js +163 -30
  141. package/dist/maps/tiles.js.map +1 -1
  142. package/dist/maps/types.d.ts +188 -20
  143. package/dist/maps/types.d.ts.map +1 -1
  144. package/dist/markdown/expressions.d.ts +1 -1
  145. package/dist/markdown/expressions.d.ts.map +1 -1
  146. package/dist/markdown/expressions.js.map +1 -1
  147. package/dist/markdown/index.d.ts +7 -6
  148. package/dist/markdown/index.d.ts.map +1 -1
  149. package/dist/markdown/index.js +9 -7
  150. package/dist/markdown/index.js.map +1 -1
  151. package/dist/markdown/spans.d.ts +1 -1
  152. package/dist/markdown/spans.d.ts.map +1 -1
  153. package/dist/media-player/index.d.ts +11 -3
  154. package/dist/media-player/index.d.ts.map +1 -1
  155. package/dist/media-player/index.js +13 -2
  156. package/dist/media-player/index.js.map +1 -1
  157. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  158. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  159. package/dist/rich-text-editor/clipboard.js +307 -0
  160. package/dist/rich-text-editor/clipboard.js.map +1 -0
  161. package/dist/rich-text-editor/collab.d.ts +32 -0
  162. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  163. package/dist/rich-text-editor/collab.js +55 -0
  164. package/dist/rich-text-editor/collab.js.map +1 -0
  165. package/dist/rich-text-editor/commands.d.ts +50 -0
  166. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  167. package/dist/rich-text-editor/commands.js +376 -0
  168. package/dist/rich-text-editor/commands.js.map +1 -0
  169. package/dist/rich-text-editor/drag.d.ts +68 -0
  170. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  171. package/dist/rich-text-editor/drag.js +148 -0
  172. package/dist/rich-text-editor/drag.js.map +1 -0
  173. package/dist/rich-text-editor/html.d.ts +145 -0
  174. package/dist/rich-text-editor/html.d.ts.map +1 -0
  175. package/dist/rich-text-editor/html.js +516 -0
  176. package/dist/rich-text-editor/html.js.map +1 -0
  177. package/dist/rich-text-editor/index.d.ts +263 -0
  178. package/dist/rich-text-editor/index.d.ts.map +1 -0
  179. package/dist/rich-text-editor/index.js +822 -0
  180. package/dist/rich-text-editor/index.js.map +1 -0
  181. package/dist/rich-text-editor/inline.d.ts +94 -0
  182. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  183. package/dist/rich-text-editor/inline.js +252 -0
  184. package/dist/rich-text-editor/inline.js.map +1 -0
  185. package/dist/rich-text-editor/keymap.d.ts +71 -0
  186. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  187. package/dist/rich-text-editor/keymap.js +393 -0
  188. package/dist/rich-text-editor/keymap.js.map +1 -0
  189. package/dist/rich-text-editor/keys.d.ts +29 -0
  190. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  191. package/dist/rich-text-editor/keys.js +93 -0
  192. package/dist/rich-text-editor/keys.js.map +1 -0
  193. package/dist/rich-text-editor/look.d.ts +71 -0
  194. package/dist/rich-text-editor/look.d.ts.map +1 -0
  195. package/dist/rich-text-editor/look.js +342 -0
  196. package/dist/rich-text-editor/look.js.map +1 -0
  197. package/dist/rich-text-editor/markdown.d.ts +18 -0
  198. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  199. package/dist/rich-text-editor/markdown.js +496 -0
  200. package/dist/rich-text-editor/markdown.js.map +1 -0
  201. package/dist/rich-text-editor/nodes.d.ts +135 -0
  202. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  203. package/dist/rich-text-editor/nodes.js +397 -0
  204. package/dist/rich-text-editor/nodes.js.map +1 -0
  205. package/dist/rich-text-editor/render.d.ts +68 -0
  206. package/dist/rich-text-editor/render.d.ts.map +1 -0
  207. package/dist/rich-text-editor/render.js +500 -0
  208. package/dist/rich-text-editor/render.js.map +1 -0
  209. package/dist/rich-text-editor/schema.d.ts +16 -0
  210. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  211. package/dist/rich-text-editor/schema.js +386 -0
  212. package/dist/rich-text-editor/schema.js.map +1 -0
  213. package/dist/rich-text-editor/store.d.ts +11 -0
  214. package/dist/rich-text-editor/store.d.ts.map +1 -0
  215. package/dist/rich-text-editor/store.js +43 -0
  216. package/dist/rich-text-editor/store.js.map +1 -0
  217. package/dist/rich-text-editor/suggest.d.ts +127 -0
  218. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  219. package/dist/rich-text-editor/suggest.js +0 -0
  220. package/dist/rich-text-editor/suggest.js.map +1 -0
  221. package/dist/rich-text-editor/tables.d.ts +41 -0
  222. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  223. package/dist/rich-text-editor/tables.js +204 -0
  224. package/dist/rich-text-editor/tables.js.map +1 -0
  225. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  226. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  227. package/dist/rich-text-editor/toolbar.js +548 -0
  228. package/dist/rich-text-editor/toolbar.js.map +1 -0
  229. package/dist/rich-text-editor/view.d.ts +368 -0
  230. package/dist/rich-text-editor/view.d.ts.map +1 -0
  231. package/dist/rich-text-editor/view.js +1968 -0
  232. package/dist/rich-text-editor/view.js.map +1 -0
  233. package/dist/rich-text-editor/virtual.d.ts +54 -0
  234. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  235. package/dist/rich-text-editor/virtual.js +262 -0
  236. package/dist/rich-text-editor/virtual.js.map +1 -0
  237. package/dist/richtext/node.d.ts +25 -2
  238. package/dist/richtext/node.d.ts.map +1 -1
  239. package/dist/richtext/node.js +46 -24
  240. package/dist/richtext/node.js.map +1 -1
  241. package/dist/terminal/backends.d.ts +4 -1
  242. package/dist/terminal/backends.d.ts.map +1 -1
  243. package/dist/terminal/backends.js.map +1 -1
  244. package/dist/terminal/index.d.ts +18 -7
  245. package/dist/terminal/index.d.ts.map +1 -1
  246. package/dist/terminal/index.js +28 -11
  247. package/dist/terminal/index.js.map +1 -1
  248. package/package.json +23 -4
  249. package/src/charts/node.ts +6 -2
  250. package/src/embed/client.ts +102 -8
  251. package/src/embed/index.ts +2 -0
  252. package/src/html/node.ts +7 -5
  253. package/src/index.ts +2 -0
  254. package/src/{markdown → internal/markdown}/ast.ts +24 -7
  255. package/src/{markdown → internal/markdown}/parse.ts +134 -24
  256. package/src/internal/markdown/stringify.ts +772 -0
  257. package/src/internal/scroll.ts +5 -3
  258. package/src/maps/anchors.ts +607 -0
  259. package/src/maps/controller.ts +999 -0
  260. package/src/maps/gl/buckets.ts +457 -0
  261. package/src/maps/gl/build-worker.ts +55 -0
  262. package/src/maps/gl/color.ts +62 -0
  263. package/src/maps/gl/cover.ts +170 -0
  264. package/src/maps/gl/index.ts +23 -0
  265. package/src/maps/gl/markers.ts +83 -0
  266. package/src/maps/gl/overlays.ts +379 -0
  267. package/src/maps/gl/pane.ts +42 -0
  268. package/src/maps/gl/placement.ts +816 -0
  269. package/src/maps/gl/renderer.ts +1576 -0
  270. package/src/maps/gl/shaders.ts +486 -0
  271. package/src/maps/gl/store.ts +566 -0
  272. package/src/maps/gl/text.ts +495 -0
  273. package/src/maps/gl/view.ts +1224 -0
  274. package/src/maps/index.ts +270 -81
  275. package/src/maps/labels.ts +214 -121
  276. package/src/maps/node.ts +763 -629
  277. package/src/maps/overlay.ts +148 -43
  278. package/src/maps/paint.ts +3 -0
  279. package/src/maps/proj.ts +31 -0
  280. package/src/maps/renderer.ts +155 -0
  281. package/src/maps/sources.ts +38 -3
  282. package/src/maps/theme.ts +51 -0
  283. package/src/maps/tiles.ts +191 -33
  284. package/src/maps/types.ts +188 -20
  285. package/src/markdown/expressions.ts +5 -1
  286. package/src/markdown/index.ts +14 -11
  287. package/src/markdown/spans.ts +1 -1
  288. package/src/media-player/index.ts +18 -4
  289. package/src/rich-text-editor/clipboard.ts +439 -0
  290. package/src/rich-text-editor/collab.ts +91 -0
  291. package/src/rich-text-editor/commands.ts +448 -0
  292. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  293. package/src/rich-text-editor/drag.ts +211 -0
  294. package/src/rich-text-editor/html.ts +619 -0
  295. package/src/rich-text-editor/index.ts +1331 -0
  296. package/src/rich-text-editor/inline.ts +345 -0
  297. package/src/rich-text-editor/keymap.ts +510 -0
  298. package/src/rich-text-editor/keys.ts +119 -0
  299. package/src/rich-text-editor/look.ts +427 -0
  300. package/src/rich-text-editor/markdown.ts +653 -0
  301. package/src/rich-text-editor/nodes.ts +497 -0
  302. package/src/rich-text-editor/render.ts +800 -0
  303. package/src/rich-text-editor/schema.ts +431 -0
  304. package/src/rich-text-editor/store.ts +39 -0
  305. package/src/rich-text-editor/suggest.ts +597 -0
  306. package/src/rich-text-editor/tables.ts +272 -0
  307. package/src/rich-text-editor/toolbar.ts +724 -0
  308. package/src/rich-text-editor/view.ts +2287 -0
  309. package/src/rich-text-editor/virtual.ts +347 -0
  310. package/src/richtext/node.ts +59 -30
  311. package/src/terminal/backends.ts +4 -1
  312. package/src/terminal/index.ts +43 -15
  313. package/dist/markdown/ast.d.ts.map +0 -1
  314. package/dist/markdown/ast.js +0 -17
  315. package/dist/markdown/ast.js.map +0 -1
  316. package/dist/markdown/parse.d.ts.map +0 -1
  317. package/dist/markdown/parse.js.map +0 -1
  318. package/dist/markdown/tags.d.ts.map +0 -1
  319. package/dist/markdown/tags.js.map +0 -1
  320. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  321. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  322. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  323. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -0,0 +1,469 @@
1
+ // Tiles for the GL renderer: loaded, parsed, bucketed, and let go.
2
+ //
3
+ // The retained renderer's cache has three layers (data, surfaces, labels);
4
+ // this one has one, because a tile's buckets are valid for every camera and
5
+ // every palette. What it keeps per tile is the bucket arrays — a few hundred
6
+ // kilobytes where the retained cache keeps two 4 MB surfaces — and the only
7
+ // thing that invalidates them is a style whose *filters* changed, since the
8
+ // filters are what decide which features a layer draws. Colours, widths and
9
+ // zoom ranges are uniforms and gates, read every frame; a light-to-dark
10
+ // switch rebuilds nothing.
11
+ //
12
+ // Building is the one cost a tile has, and there are two places to pay it.
13
+ // On this thread, `pump` builds until the frame's deadline — always at
14
+ // least one tile, the retained renderer's budget rule — and a dense city
15
+ // tile is 5–20 ms of it, which is most of a 50 Hz frame. On **worker
16
+ // threads** (`workers > 0`) this thread only dispatches: the bytes go over
17
+ // by copy, the buckets come back by transfer, and the main thread's whole
18
+ // cost for a tile is its upload. The bucket format is what makes the second
19
+ // one free to have — two ArrayBuffers and a small draw list, nothing that
20
+ // needs a serializer.
21
+ import { parseVectorTile } from '../sources.js';
22
+ import { buildTileBuckets, rasterTileData } from './buckets.js';
23
+ const globals = globalThis;
24
+ const now = () => globals.performance?.now() ?? Date.now();
25
+ const key = (t) => `${t.z}/${t.x}/${t.y}`;
26
+ export class GlTileStore {
27
+ _source;
28
+ _sourceId;
29
+ _onError;
30
+ _prepared;
31
+ _style;
32
+ _onChange;
33
+ _concurrency;
34
+ _capacity;
35
+ _entries = new Map();
36
+ /** Loaded tiles waiting for a build, oldest first. */
37
+ _queue = [];
38
+ _waiting = [];
39
+ _inFlight = 0;
40
+ _frame = 0;
41
+ _disposed = false;
42
+ _pool;
43
+ /** Bucket builds and their cost on this thread, for a HUD. */
44
+ built = 0;
45
+ buildMs = 0;
46
+ constructor(options) {
47
+ this._source = options.source;
48
+ this._sourceId = options.sourceId ?? options.source.id ?? 'source-0';
49
+ this._onError = options.onError;
50
+ this._prepared = options.prepared;
51
+ this._style = {
52
+ id: 1,
53
+ layers: options.prepared.layers.map((l) => l.layer),
54
+ };
55
+ this._onChange = options.onChange;
56
+ this._concurrency = options.concurrency ?? 8;
57
+ this._capacity = options.capacity ?? 256;
58
+ const workers = options.workers ?? 0;
59
+ this._pool =
60
+ workers > 0 ? new BuildPool(workers, () => this._onChange()) : null;
61
+ }
62
+ get source() {
63
+ return this._source;
64
+ }
65
+ /** Tiles loaded and waiting for (or in) a build. */
66
+ get building() {
67
+ let n = this._queue.length;
68
+ for (const entry of this._entries.values())
69
+ if (entry.state === 'building')
70
+ n++;
71
+ return n;
72
+ }
73
+ /** Tiles asked for and not yet answered. */
74
+ get loading() {
75
+ return this._inFlight + this._waiting.length;
76
+ }
77
+ /** Whether builds happen off this thread. */
78
+ get threaded() {
79
+ return this._pool?.ready === true;
80
+ }
81
+ get(tile) {
82
+ const entry = this._entries.get(key(tile));
83
+ if (!entry)
84
+ return undefined;
85
+ entry.used = this._frame;
86
+ if (entry.state === 'ready')
87
+ return entry.data;
88
+ if (entry.state === 'empty')
89
+ return null;
90
+ // A tile being rebuilt for a new style keeps drawing its old buckets
91
+ // until the new ones exist, so a restyle never opens a hole.
92
+ return entry.data ?? undefined;
93
+ }
94
+ /** A new frame: what the cover asks for from here on is this frame's. */
95
+ tick() {
96
+ this._frame++;
97
+ }
98
+ /** Ask for tiles, centre-out. Already-known tiles cost a lookup. */
99
+ want(tiles) {
100
+ const at = now();
101
+ for (const tile of tiles) {
102
+ const k = key(tile);
103
+ let entry = this._entries.get(k);
104
+ if (entry && !(entry.state === 'failed' && at >= entry.retryAt))
105
+ continue;
106
+ if (!entry) {
107
+ entry = {
108
+ tile,
109
+ state: 'loading',
110
+ bytes: null,
111
+ data: null,
112
+ used: this._frame,
113
+ retryAt: 0,
114
+ failures: 0,
115
+ job: 0,
116
+ abort: null,
117
+ };
118
+ this._entries.set(k, entry);
119
+ }
120
+ entry.state = 'loading';
121
+ this._waiting.push(entry);
122
+ }
123
+ this._drain();
124
+ }
125
+ _drain() {
126
+ while (this._inFlight < this._concurrency && this._waiting.length > 0) {
127
+ const entry = this._waiting.shift();
128
+ // Asked for, then scrolled away from before a slot came free.
129
+ if (entry.used < this._frame - 2) {
130
+ this._entries.delete(key(entry.tile));
131
+ continue;
132
+ }
133
+ this._load(entry);
134
+ }
135
+ }
136
+ _load(entry) {
137
+ this._inFlight++;
138
+ // A real `AbortController` where the runtime has one: `fetch` rejects a
139
+ // signal that is not an instance of `AbortSignal`, so a look-alike would
140
+ // fail every load a source makes the documented way (`../tiles.ts`).
141
+ const controller = globals.AbortController
142
+ ? new globals.AbortController()
143
+ : null;
144
+ let aborted = false;
145
+ entry.abort = () => {
146
+ aborted = true;
147
+ controller?.abort();
148
+ };
149
+ const { z, x, y } = entry.tile;
150
+ const sourceId = this._sourceId;
151
+ Promise.resolve()
152
+ .then(() => this._source.load({ z, x, y, sourceId, signal: controller?.signal }))
153
+ .then((data) => {
154
+ if (this._disposed || aborted)
155
+ return;
156
+ entry.failures = 0;
157
+ if (data && data.kind === 'vector' && data.data.length > 0) {
158
+ entry.bytes = data.data;
159
+ entry.state = 'loaded';
160
+ this._queue.push(entry);
161
+ }
162
+ else if (data && data.kind === 'raster' && data.width > 0) {
163
+ // An image needs no building — it is its own texture — and no
164
+ // style: nothing to queue, and nothing a restyle rebuilds.
165
+ entry.data = rasterTileData(data.width, data.height, data.data);
166
+ entry.state = 'ready';
167
+ }
168
+ else {
169
+ entry.state = 'empty';
170
+ }
171
+ }, (error) => {
172
+ // Whatever an aborted load answers — its `AbortError` included —
173
+ // is not news: the map stopped wanting the tile.
174
+ if (this._disposed || aborted)
175
+ return;
176
+ entry.failures++;
177
+ entry.state = 'failed';
178
+ // 0.5 s, 1, 2, 4 … up to 30 s: the retained cache's backoff, so a
179
+ // source that is down costs nothing and a blip repairs itself.
180
+ entry.retryAt =
181
+ now() + Math.min(30_000, 500 * 2 ** (entry.failures - 1));
182
+ // A failed tile draws nothing, so a map whose tiles all fail looks
183
+ // exactly like a map that is still loading: somebody has to be
184
+ // told, once per failure, as the retained cache tells them.
185
+ this._onError?.(error, { z, x, y, sourceId });
186
+ })
187
+ .finally(() => {
188
+ this._inFlight--;
189
+ entry.abort = null;
190
+ if (this._disposed)
191
+ return;
192
+ this._drain();
193
+ if (!aborted)
194
+ this._onChange();
195
+ });
196
+ }
197
+ /**
198
+ * How many of `tiles` failed to load and are waiting on a retry — the
199
+ * frame's `errors`.
200
+ */
201
+ failedAmong(tiles) {
202
+ let n = 0;
203
+ for (const tile of tiles) {
204
+ if (this._entries.get(key(tile))?.state === 'failed')
205
+ n++;
206
+ }
207
+ return n;
208
+ }
209
+ /**
210
+ * Stop loading: every load in flight is aborted and forgotten, and nothing
211
+ * waiting is started. For a source taken off the map, whose tiles that
212
+ * have arrived stay, so switching back to it is free — the retained
213
+ * cache's rule.
214
+ */
215
+ abortLoads() {
216
+ for (const [k, entry] of this._entries) {
217
+ if (entry.state !== 'loading')
218
+ continue;
219
+ entry.abort?.();
220
+ this._entries.delete(k);
221
+ }
222
+ this._waiting = [];
223
+ }
224
+ /** Build every tile again from its bytes — `refresh()`, after a style
225
+ * the application edited in place. The old buckets draw until then. */
226
+ rebuild() {
227
+ this._style = { ...this._style, id: this._style.id + 1 };
228
+ this._requeue();
229
+ }
230
+ /**
231
+ * Work through the loaded tiles. Answers whether more are waiting on this
232
+ * thread, which is the caller's cue for another frame.
233
+ *
234
+ * With workers, everything waiting is dispatched and nothing is built
235
+ * here: a finished build calls `onChange` like a finished load does. On
236
+ * this thread, tiles are built until `deadline` — always at least one, or
237
+ * a budget smaller than one tile would build nothing forever.
238
+ */
239
+ pump(deadline) {
240
+ const pool = this._pool;
241
+ if (pool && !pool.failed) {
242
+ if (!pool.ready)
243
+ return this._queue.length > 0;
244
+ while (this._queue.length > 0 && pool.hasRoom()) {
245
+ const entry = this._queue.shift();
246
+ if (!entry.bytes)
247
+ continue;
248
+ entry.state = 'building';
249
+ const style = this._style.id;
250
+ entry.job = pool.build(entry.bytes, this._style, (result) => {
251
+ if (this._disposed || entry.job === 0)
252
+ return;
253
+ entry.job = 0;
254
+ if (!this._entries.has(key(entry.tile)))
255
+ return;
256
+ if (result.data && style === this._style.id) {
257
+ entry.data = result.data;
258
+ entry.state = 'ready';
259
+ }
260
+ else if (result.data) {
261
+ // Built for a style that has since been replaced: build again.
262
+ entry.state = 'loaded';
263
+ this._queue.push(entry);
264
+ }
265
+ else {
266
+ entry.state = 'empty';
267
+ }
268
+ this._onChange();
269
+ });
270
+ }
271
+ return false;
272
+ }
273
+ let first = true;
274
+ while (this._queue.length > 0 && (first || now() < deadline)) {
275
+ first = false;
276
+ const entry = this._queue.shift();
277
+ if (!entry.bytes)
278
+ continue;
279
+ const started = now();
280
+ try {
281
+ entry.data = buildTileBuckets(parseVectorTile(entry.bytes), this._prepared);
282
+ entry.state = 'ready';
283
+ }
284
+ catch {
285
+ entry.state = 'empty';
286
+ }
287
+ this.buildMs += now() - started;
288
+ this.built++;
289
+ }
290
+ return this._queue.length > 0;
291
+ }
292
+ /**
293
+ * A new style. Buckets are rebuilt only if the new one would select
294
+ * different features — a different layer list or different filters —
295
+ * and until a tile is rebuilt its old buckets keep drawing.
296
+ */
297
+ setStyle(prepared) {
298
+ const same = structureOf(prepared) === structureOf(this._prepared);
299
+ this._prepared = prepared;
300
+ if (same)
301
+ return;
302
+ this._style = {
303
+ id: this._style.id + 1,
304
+ layers: prepared.layers.map((l) => l.layer),
305
+ };
306
+ this._requeue();
307
+ }
308
+ /** Every tile with bytes back on the build queue, most recently drawn
309
+ * first; each keeps drawing its old buckets until its new ones exist. */
310
+ _requeue() {
311
+ this._queue = [];
312
+ for (const entry of this._entries.values()) {
313
+ if (entry.bytes &&
314
+ (entry.state === 'ready' ||
315
+ entry.state === 'loaded' ||
316
+ entry.state === 'building')) {
317
+ entry.state = 'loaded';
318
+ entry.job = 0;
319
+ this._queue.push(entry);
320
+ }
321
+ }
322
+ this._queue.sort((a, b) => b.used - a.used);
323
+ }
324
+ /**
325
+ * The end of a frame: cancel every load it did not want, and let go of the
326
+ * least recently drawn tiles past capacity.
327
+ *
328
+ * A tile panned or zoomed out of the cover — and the ring around it the
329
+ * cover keeps warm — would otherwise load to the end: a request nobody is
330
+ * waiting for, pointed at somebody else's servers. That is the contract
331
+ * the docs make for `request.signal`, on either renderer. A tile that
332
+ * comes back is asked for again, with a new signal.
333
+ */
334
+ evict(release) {
335
+ for (const [k, entry] of this._entries) {
336
+ if (entry.abort && entry.used < this._frame) {
337
+ entry.abort();
338
+ this._entries.delete(k);
339
+ }
340
+ }
341
+ if (this._entries.size <= this._capacity)
342
+ return;
343
+ const candidates = [...this._entries.entries()]
344
+ .filter(([, e]) => e.state !== 'loading' &&
345
+ e.state !== 'building' &&
346
+ e.used < this._frame)
347
+ .sort((a, b) => a[1].used - b[1].used);
348
+ let excess = this._entries.size - this._capacity;
349
+ for (const [k, entry] of candidates) {
350
+ if (excess <= 0)
351
+ break;
352
+ if (entry.data)
353
+ release(entry.data);
354
+ this._entries.delete(k);
355
+ excess--;
356
+ }
357
+ this._queue = this._queue.filter((e) => this._entries.has(key(e.tile)));
358
+ }
359
+ dispose(release) {
360
+ this._disposed = true;
361
+ for (const entry of this._entries.values()) {
362
+ if (entry.data)
363
+ release(entry.data);
364
+ }
365
+ this._entries.clear();
366
+ this._queue = [];
367
+ this._waiting = [];
368
+ this._pool?.terminate();
369
+ }
370
+ }
371
+ /** Jobs a worker may hold at once: enough to never sit idle between two
372
+ * messages, few enough that the store's queue — which is centre-out and
373
+ * reorders every frame — still decides what is built next. */
374
+ const PER_WORKER = 2;
375
+ const WORKER_THREADS = 'node:worker_threads';
376
+ class BuildPool {
377
+ ready = false;
378
+ failed = false;
379
+ _slots = [];
380
+ _jobs = new Map();
381
+ _next = 1;
382
+ constructor(count, onReady) {
383
+ void this._spawn(count).then(onReady);
384
+ }
385
+ async _spawn(count) {
386
+ try {
387
+ // `URL` and `import.meta.url` reached structurally, like everything
388
+ // else runtime-only here: `src/` compiles with `types: []` and no DOM
389
+ // lib, so neither is declared. The entry has to be a URL object, not a
390
+ // string — Node reads a string as a path.
391
+ const here = import.meta.url;
392
+ const Url = globalThis.URL;
393
+ if (!here || !Url)
394
+ throw new Error('no module URL to find the worker by');
395
+ const { Worker } = (await import(WORKER_THREADS));
396
+ for (let i = 0; i < count; i++) {
397
+ const worker = new Worker(new Url('./build-worker.js', here));
398
+ // An idle pool must not keep the process alive.
399
+ worker.unref?.();
400
+ const slot = { worker, busy: 0, style: 0 };
401
+ worker.on('message', (value) => {
402
+ const result = value;
403
+ slot.busy--;
404
+ const done = this._jobs.get(result.job);
405
+ this._jobs.delete(result.job);
406
+ done?.(result);
407
+ });
408
+ worker.on('error', () => {
409
+ this.failed = true;
410
+ });
411
+ this._slots.push(slot);
412
+ }
413
+ this.ready = true;
414
+ }
415
+ catch {
416
+ this.failed = true;
417
+ }
418
+ }
419
+ hasRoom() {
420
+ return this._slots.some((s) => s.busy < PER_WORKER);
421
+ }
422
+ build(bytes, style, done) {
423
+ let slot = this._slots[0];
424
+ for (const s of this._slots)
425
+ if (s.busy < slot.busy)
426
+ slot = s;
427
+ if (slot.style !== style.id) {
428
+ slot.worker.postMessage({
429
+ type: 'style',
430
+ id: style.id,
431
+ layers: style.layers,
432
+ });
433
+ slot.style = style.id;
434
+ }
435
+ const job = this._next++;
436
+ this._jobs.set(job, done);
437
+ // A copy of just this tile's bytes, transferred: the store keeps its own
438
+ // for a restyle, and a view into a larger buffer would clone all of it.
439
+ const copy = bytes.slice();
440
+ slot.busy++;
441
+ slot.worker.postMessage({ type: 'build', job, style: style.id, bytes: copy }, [copy.buffer]);
442
+ return job;
443
+ }
444
+ terminate() {
445
+ for (const slot of this._slots)
446
+ void slot.worker.terminate();
447
+ this._slots.length = 0;
448
+ this._jobs.clear();
449
+ }
450
+ }
451
+ const structures = new WeakMap();
452
+ /** What in a style decides a tile's buckets: which layers, over which
453
+ * source layers, with which filters — and for a label layer, which field
454
+ * its text is read from. Everything else is per frame. */
455
+ function structureOf(prepared) {
456
+ let structure = structures.get(prepared);
457
+ if (structure === undefined) {
458
+ structure = JSON.stringify(prepared.layers.map(({ layer }) => [
459
+ layer.type,
460
+ layer.sourceLayer,
461
+ layer.visible === false,
462
+ 'filter' in layer ? (layer.filter ?? null) : null,
463
+ layer.type === 'symbol' ? layer.textField : null,
464
+ ]));
465
+ structures.set(prepared, structure);
466
+ }
467
+ return structure;
468
+ }
469
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/maps/gl/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /** A set string's box, in device pixels. */
2
+ export interface TextBox {
3
+ width: number;
4
+ height: number;
5
+ }
6
+ /** One string to set, at `size` device pixels. */
7
+ export interface TextItem {
8
+ text: string;
9
+ size: number;
10
+ }
11
+ /** A rasterized string: RGBA as read back, coverage in alpha, `pad`
12
+ * pixels of clear margin included. */
13
+ export interface TextRaster {
14
+ width: number;
15
+ height: number;
16
+ pixels: Uint8Array;
17
+ }
18
+ /** What the atlas asks of a text engine. */
19
+ export interface TextEngine {
20
+ /** The box `text` sets in, synchronously — placement needs it now. */
21
+ measure(text: string, size: number): TextBox;
22
+ /**
23
+ * Rasterize as many of `items` as fit one batch. Answers per item: a
24
+ * raster; `null` for one that can never be drawn (wider than the engine
25
+ * can set); `undefined` for one left for the next batch.
26
+ */
27
+ rasterize(items: readonly TextItem[], pad: number): Promise<(TextRaster | null | undefined)[]>;
28
+ dispose(): void;
29
+ }
30
+ /** ntk's font cache, structurally — `../labels.ts`' `FontsLike`. */
31
+ interface FontsLike {
32
+ layout(content: string, style: Record<string, unknown>): {
33
+ width: number;
34
+ height: number;
35
+ draw(ctx: unknown, x: number, y: number): void;
36
+ };
37
+ }
38
+ /** The text engine over an app's fonts and an offscreen surface. */
39
+ export declare class SurfaceTextEngine implements TextEngine {
40
+ private readonly _app;
41
+ private readonly _fonts;
42
+ private readonly _family;
43
+ private readonly _layouts;
44
+ private _surface;
45
+ private _ctx;
46
+ constructor(app: unknown, fonts: FontsLike, family: string);
47
+ /** The engine for the app a node belongs to, or null where there is
48
+ * nothing to set text with. */
49
+ static forApp(app: unknown, family: string): SurfaceTextEngine | null;
50
+ private _layout;
51
+ measure(text: string, size: number): TextBox;
52
+ rasterize(items: readonly TextItem[], pad: number): Promise<(TextRaster | null | undefined)[]>;
53
+ dispose(): void;
54
+ }
55
+ /** A rasterized label's place in the atlas: its whole padded raster. */
56
+ export interface AtlasEntry {
57
+ key: string;
58
+ x: number;
59
+ y: number;
60
+ width: number;
61
+ height: number;
62
+ /** The raster, kept to upload again — after a compaction moves it, or
63
+ * into the texture of a new context. */
64
+ pixels: Uint8Array;
65
+ /** In the texture where it is now; only then is it drawn. Set by the
66
+ * renderer that uploads it. */
67
+ ready: boolean;
68
+ /** The frame it was last asked for — what a compaction keeps. */
69
+ used: number;
70
+ }
71
+ /**
72
+ * The widest halo a raster's margin holds, in pixels. The drawn quad sits
73
+ * {@link quadInset} inside the margin and a halo samples up to this far
74
+ * past the quad, so its samples stay a texel inside the raster's own clear
75
+ * margin and never reach a neighbour's.
76
+ */
77
+ export declare const haloReach: (pad: number) => number;
78
+ export declare const quadInset: (pad: number) => number;
79
+ /**
80
+ * Every label raster, packed into one texture's worth of shelves, with the
81
+ * uploads the renderer owes it.
82
+ *
83
+ * The atlas is CPU-side and outlives any one GL context: it keeps each
84
+ * entry's raster, so a renderer that is new — the surface was recreated —
85
+ * uploads it again from here ({@link restart}), and asks nothing of the text
86
+ * engine. What it holds is bounded by the texture it packs into: 16 MB for
87
+ * the default 2048², whatever is panned past.
88
+ *
89
+ * **Measuring is budgeted, drawing is asynchronous, uploading is metered.**
90
+ * Placement needs a label's box the frame it is considered, which is a
91
+ * synchronous shaping call — tens of microseconds on the Cocoa backend, but
92
+ * milliseconds each the first time on X11, where fonts load and glyphs
93
+ * rasterize in JS — so a frame measures until its deadline and leaves the
94
+ * rest for the next. A raster is asked for only once a label has won a
95
+ * place, and arrives a batch at a time, a readback later; the renderer
96
+ * takes a few dozen a frame into the texture, and a label fades in once its
97
+ * raster is there.
98
+ */
99
+ export declare class LabelAtlas {
100
+ readonly size: number;
101
+ /** Clear margin rasterized around every string, in pixels — what a halo
102
+ * grows into, and what keeps it from sampling a neighbour. */
103
+ readonly pad: number;
104
+ /** A frame's measuring ran out of budget: there is more to place. */
105
+ starved: boolean;
106
+ onChange: (() => void) | null;
107
+ private _engine;
108
+ private readonly _entries;
109
+ /** Entries the texture does not have where they are, oldest first. */
110
+ private _uploads;
111
+ private readonly _wanted;
112
+ private readonly _failed;
113
+ private readonly _measured;
114
+ private _busy;
115
+ private _shelves;
116
+ private _top;
117
+ private _frame;
118
+ private _deadline;
119
+ private _measures;
120
+ constructor(engine: TextEngine | null, options: {
121
+ size?: number;
122
+ pad: number;
123
+ });
124
+ /** Strings asked for and not yet rasterized, or a batch in flight. */
125
+ get pending(): boolean;
126
+ /** Rasters waiting for the texture. */
127
+ get uploading(): boolean;
128
+ get entries(): number;
129
+ /** A new frame, whose measuring stops at `deadline` (after one). */
130
+ beginFrame(deadline: number): void;
131
+ /** The box a string sets in, or null when this frame's budget is spent. */
132
+ measure(text: string, size: number): TextBox | null;
133
+ /** The string's raster, once the texture has it; null until then —
134
+ * asking is what gets it rasterized. */
135
+ entry(text: string, size: number): AtlasEntry | null;
136
+ /** Start rasterizing what has been asked for, unless a batch is out. */
137
+ pump(): void;
138
+ /** Up to `max` rasters for the texture, oldest first. The renderer marks
139
+ * each `ready` once it is uploaded. */
140
+ takeUploads(max: number): AtlasEntry[];
141
+ /** The texture is new, and has none of it: everything goes up again. */
142
+ restart(): void;
143
+ dispose(): void;
144
+ private _add;
145
+ /** A shelf packer: rows of one height class (rounded up to 8 pixels),
146
+ * filled left to right, a new row below the last when none has room. */
147
+ private _allocate;
148
+ /** Drop what has not been drawn for a while and pack the rest again,
149
+ * tallest first. Everything kept has moved, so none of it is drawn
150
+ * until the renderer has uploaded it where it now is. */
151
+ private _compact;
152
+ }
153
+ export {};
154
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/maps/gl/text.ts"],"names":[],"mappings":"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"}