@react-x11/components 0.3.0 → 0.5.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 (314) hide show
  1. package/README.md +131 -4
  2. package/dist/charts/components.d.ts +3 -1
  3. package/dist/charts/components.d.ts.map +1 -1
  4. package/dist/charts/components.js +8 -4
  5. package/dist/charts/components.js.map +1 -1
  6. package/dist/charts/node.d.ts +13 -6
  7. package/dist/charts/node.d.ts.map +1 -1
  8. package/dist/charts/node.js +75 -24
  9. package/dist/charts/node.js.map +1 -1
  10. package/dist/charts/render.d.ts +4 -0
  11. package/dist/charts/render.d.ts.map +1 -1
  12. package/dist/charts/render.js +11 -6
  13. package/dist/charts/render.js.map +1 -1
  14. package/dist/code-editor/node.d.ts +47 -16
  15. package/dist/code-editor/node.d.ts.map +1 -1
  16. package/dist/code-editor/node.js +121 -51
  17. package/dist/code-editor/node.js.map +1 -1
  18. package/dist/flow/draw.d.ts +19 -1
  19. package/dist/flow/draw.d.ts.map +1 -1
  20. package/dist/flow/draw.js +64 -35
  21. package/dist/flow/draw.js.map +1 -1
  22. package/dist/flow/index.d.ts.map +1 -1
  23. package/dist/flow/index.js +24 -8
  24. package/dist/flow/index.js.map +1 -1
  25. package/dist/flow/model.d.ts +4 -2
  26. package/dist/flow/model.d.ts.map +1 -1
  27. package/dist/flow/model.js +4 -2
  28. package/dist/flow/model.js.map +1 -1
  29. package/dist/flow/node.d.ts +40 -9
  30. package/dist/flow/node.d.ts.map +1 -1
  31. package/dist/flow/node.js +142 -53
  32. package/dist/flow/node.js.map +1 -1
  33. package/dist/flow/types.d.ts +46 -21
  34. package/dist/flow/types.d.ts.map +1 -1
  35. package/dist/formula/index.d.ts +4 -2
  36. package/dist/formula/index.d.ts.map +1 -1
  37. package/dist/formula/index.js.map +1 -1
  38. package/dist/formula/node.d.ts +5 -1
  39. package/dist/formula/node.d.ts.map +1 -1
  40. package/dist/formula/node.js +19 -3
  41. package/dist/formula/node.js.map +1 -1
  42. package/dist/html/controls.d.ts +4 -1
  43. package/dist/html/controls.d.ts.map +1 -1
  44. package/dist/html/controls.js.map +1 -1
  45. package/dist/html/css/cascade.d.ts +11 -5
  46. package/dist/html/css/cascade.d.ts.map +1 -1
  47. package/dist/html/css/cascade.js +18 -8
  48. package/dist/html/css/cascade.js.map +1 -1
  49. package/dist/html/css/parse.d.ts +15 -10
  50. package/dist/html/css/parse.d.ts.map +1 -1
  51. package/dist/html/css/parse.js +41 -16
  52. package/dist/html/css/parse.js.map +1 -1
  53. package/dist/html/css/style.d.ts +3 -0
  54. package/dist/html/css/style.d.ts.map +1 -1
  55. package/dist/html/css/style.js +3 -1
  56. package/dist/html/css/style.js.map +1 -1
  57. package/dist/html/css/values.d.ts +14 -1
  58. package/dist/html/css/values.d.ts.map +1 -1
  59. package/dist/html/css/values.js +11 -8
  60. package/dist/html/css/values.js.map +1 -1
  61. package/dist/html/index.d.ts.map +1 -1
  62. package/dist/html/index.js +1 -0
  63. package/dist/html/index.js.map +1 -1
  64. package/dist/html/layout/boxes.d.ts +12 -5
  65. package/dist/html/layout/boxes.d.ts.map +1 -1
  66. package/dist/html/layout/boxes.js +7 -4
  67. package/dist/html/layout/boxes.js.map +1 -1
  68. package/dist/html/layout/inline.d.ts.map +1 -1
  69. package/dist/html/layout/inline.js +22 -1
  70. package/dist/html/layout/inline.js.map +1 -1
  71. package/dist/html/node.d.ts +22 -8
  72. package/dist/html/node.d.ts.map +1 -1
  73. package/dist/html/node.js +97 -15
  74. package/dist/html/node.js.map +1 -1
  75. package/dist/html/paint.d.ts +3 -0
  76. package/dist/html/paint.d.ts.map +1 -1
  77. package/dist/html/paint.js +2 -2
  78. package/dist/html/paint.js.map +1 -1
  79. package/dist/index.d.ts +11 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +26 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/maps/clip.d.ts +43 -0
  84. package/dist/maps/clip.d.ts.map +1 -0
  85. package/dist/maps/clip.js +171 -0
  86. package/dist/maps/clip.js.map +1 -0
  87. package/dist/maps/gzip.d.ts +15 -0
  88. package/dist/maps/gzip.d.ts.map +1 -0
  89. package/dist/maps/gzip.js +56 -0
  90. package/dist/maps/gzip.js.map +1 -0
  91. package/dist/maps/index.d.ts +55 -0
  92. package/dist/maps/index.d.ts.map +1 -0
  93. package/dist/maps/index.js +141 -0
  94. package/dist/maps/index.js.map +1 -0
  95. package/dist/maps/labels.d.ts +123 -0
  96. package/dist/maps/labels.d.ts.map +1 -0
  97. package/dist/maps/labels.js +323 -0
  98. package/dist/maps/labels.js.map +1 -0
  99. package/dist/maps/mvt.d.ts +244 -0
  100. package/dist/maps/mvt.d.ts.map +1 -0
  101. package/dist/maps/mvt.js +820 -0
  102. package/dist/maps/mvt.js.map +1 -0
  103. package/dist/maps/node.d.ts +278 -0
  104. package/dist/maps/node.d.ts.map +1 -0
  105. package/dist/maps/node.js +1459 -0
  106. package/dist/maps/node.js.map +1 -0
  107. package/dist/maps/overlay.d.ts +157 -0
  108. package/dist/maps/overlay.d.ts.map +1 -0
  109. package/dist/maps/overlay.js +472 -0
  110. package/dist/maps/overlay.js.map +1 -0
  111. package/dist/maps/paint.d.ts +226 -0
  112. package/dist/maps/paint.d.ts.map +1 -0
  113. package/dist/maps/paint.js +705 -0
  114. package/dist/maps/paint.js.map +1 -0
  115. package/dist/maps/proj.d.ts +281 -0
  116. package/dist/maps/proj.d.ts.map +1 -0
  117. package/dist/maps/proj.js +451 -0
  118. package/dist/maps/proj.js.map +1 -0
  119. package/dist/maps/sources.d.ts +256 -0
  120. package/dist/maps/sources.d.ts.map +1 -0
  121. package/dist/maps/sources.js +210 -0
  122. package/dist/maps/sources.js.map +1 -0
  123. package/dist/maps/style.d.ts +141 -0
  124. package/dist/maps/style.d.ts.map +1 -0
  125. package/dist/maps/style.js +147 -0
  126. package/dist/maps/style.js.map +1 -0
  127. package/dist/maps/styles.d.ts +82 -0
  128. package/dist/maps/styles.d.ts.map +1 -0
  129. package/dist/maps/styles.js +898 -0
  130. package/dist/maps/styles.js.map +1 -0
  131. package/dist/maps/tiles.d.ts +283 -0
  132. package/dist/maps/tiles.d.ts.map +1 -0
  133. package/dist/maps/tiles.js +469 -0
  134. package/dist/maps/tiles.js.map +1 -0
  135. package/dist/maps/types.d.ts +244 -0
  136. package/dist/maps/types.d.ts.map +1 -0
  137. package/dist/maps/types.js +2 -0
  138. package/dist/maps/types.js.map +1 -0
  139. package/dist/qml/containers.d.ts +3 -0
  140. package/dist/qml/containers.d.ts.map +1 -0
  141. package/dist/qml/containers.js +331 -0
  142. package/dist/qml/containers.js.map +1 -0
  143. package/dist/qml/controls.d.ts +12 -0
  144. package/dist/qml/controls.d.ts.map +1 -0
  145. package/dist/qml/controls.js +21 -0
  146. package/dist/qml/controls.js.map +1 -0
  147. package/dist/qml/globals.d.ts +6 -0
  148. package/dist/qml/globals.d.ts.map +1 -0
  149. package/dist/qml/globals.js +25 -0
  150. package/dist/qml/globals.js.map +1 -0
  151. package/dist/qml/index.d.ts +15 -0
  152. package/dist/qml/index.d.ts.map +1 -0
  153. package/dist/qml/index.js +25 -0
  154. package/dist/qml/index.js.map +1 -0
  155. package/dist/qml/interaction.d.ts +12 -0
  156. package/dist/qml/interaction.d.ts.map +1 -0
  157. package/dist/qml/interaction.js +246 -0
  158. package/dist/qml/interaction.js.map +1 -0
  159. package/dist/qml/ir.d.ts +106 -0
  160. package/dist/qml/ir.d.ts.map +1 -0
  161. package/dist/qml/ir.js +7 -0
  162. package/dist/qml/ir.js.map +1 -0
  163. package/dist/qml/layouts.d.ts +3 -0
  164. package/dist/qml/layouts.d.ts.map +1 -0
  165. package/dist/qml/layouts.js +122 -0
  166. package/dist/qml/layouts.js.map +1 -0
  167. package/dist/qml/models.d.ts +14 -0
  168. package/dist/qml/models.d.ts.map +1 -0
  169. package/dist/qml/models.js +80 -0
  170. package/dist/qml/models.js.map +1 -0
  171. package/dist/qml/objects.d.ts +228 -0
  172. package/dist/qml/objects.d.ts.map +1 -0
  173. package/dist/qml/objects.js +1103 -0
  174. package/dist/qml/objects.js.map +1 -0
  175. package/dist/qml/parse.d.ts +10 -0
  176. package/dist/qml/parse.d.ts.map +1 -0
  177. package/dist/qml/parse.js +607 -0
  178. package/dist/qml/parse.js.map +1 -0
  179. package/dist/qml/qtquick.d.ts +7 -0
  180. package/dist/qml/qtquick.d.ts.map +1 -0
  181. package/dist/qml/qtquick.js +347 -0
  182. package/dist/qml/qtquick.js.map +1 -0
  183. package/dist/qml/react.d.ts +83 -0
  184. package/dist/qml/react.d.ts.map +1 -0
  185. package/dist/qml/react.js +323 -0
  186. package/dist/qml/react.js.map +1 -0
  187. package/dist/qml/resolver.d.ts +38 -0
  188. package/dist/qml/resolver.d.ts.map +1 -0
  189. package/dist/qml/resolver.js +64 -0
  190. package/dist/qml/resolver.js.map +1 -0
  191. package/dist/qml/slots.d.ts +65 -0
  192. package/dist/qml/slots.d.ts.map +1 -0
  193. package/dist/qml/slots.js +230 -0
  194. package/dist/qml/slots.js.map +1 -0
  195. package/dist/qml/states.d.ts +5 -0
  196. package/dist/qml/states.d.ts.map +1 -0
  197. package/dist/qml/states.js +276 -0
  198. package/dist/qml/states.js.map +1 -0
  199. package/dist/qml/view-utils.d.ts +42 -0
  200. package/dist/qml/view-utils.d.ts.map +1 -0
  201. package/dist/qml/view-utils.js +121 -0
  202. package/dist/qml/view-utils.js.map +1 -0
  203. package/dist/reorder/hx.d.ts +18 -0
  204. package/dist/reorder/hx.d.ts.map +1 -0
  205. package/dist/reorder/hx.js +10 -0
  206. package/dist/reorder/hx.js.map +1 -0
  207. package/dist/reorder/index.d.ts +314 -0
  208. package/dist/reorder/index.d.ts.map +1 -0
  209. package/dist/reorder/index.js +1539 -0
  210. package/dist/reorder/index.js.map +1 -0
  211. package/dist/reorder/model.d.ts +107 -0
  212. package/dist/reorder/model.d.ts.map +1 -0
  213. package/dist/reorder/model.js +162 -0
  214. package/dist/reorder/model.js.map +1 -0
  215. package/dist/richtext/node.d.ts +15 -5
  216. package/dist/richtext/node.d.ts.map +1 -1
  217. package/dist/richtext/node.js +40 -11
  218. package/dist/richtext/node.js.map +1 -1
  219. package/dist/richtext/runs.d.ts +35 -13
  220. package/dist/richtext/runs.d.ts.map +1 -1
  221. package/dist/richtext/runs.js +83 -27
  222. package/dist/richtext/runs.js.map +1 -1
  223. package/dist/tabs/hx.d.ts +18 -0
  224. package/dist/tabs/hx.d.ts.map +1 -0
  225. package/dist/tabs/hx.js +10 -0
  226. package/dist/tabs/hx.js.map +1 -0
  227. package/dist/tabs/index.d.ts +160 -0
  228. package/dist/tabs/index.d.ts.map +1 -0
  229. package/dist/tabs/index.js +1265 -0
  230. package/dist/tabs/index.js.map +1 -0
  231. package/dist/terminal/vt/fonts.d.ts +45 -15
  232. package/dist/terminal/vt/fonts.d.ts.map +1 -1
  233. package/dist/terminal/vt/fonts.js +89 -19
  234. package/dist/terminal/vt/fonts.js.map +1 -1
  235. package/dist/terminal/vt/index.d.ts +1 -1
  236. package/dist/terminal/vt/index.d.ts.map +1 -1
  237. package/dist/terminal/vt/index.js +3 -3
  238. package/dist/terminal/vt/index.js.map +1 -1
  239. package/dist/terminal/vt/node.d.ts +42 -0
  240. package/dist/terminal/vt/node.d.ts.map +1 -1
  241. package/dist/terminal/vt/node.js +95 -11
  242. package/dist/terminal/vt/node.js.map +1 -1
  243. package/dist/terminal/vt/pty.d.ts +16 -0
  244. package/dist/terminal/vt/pty.d.ts.map +1 -1
  245. package/dist/terminal/vt/pty.js +186 -0
  246. package/dist/terminal/vt/pty.js.map +1 -1
  247. package/dist/terminal/vt/renderer.d.ts.map +1 -1
  248. package/dist/terminal/vt/renderer.js +13 -3
  249. package/dist/terminal/vt/renderer.js.map +1 -1
  250. package/package.json +23 -3
  251. package/src/charts/components.ts +14 -7
  252. package/src/charts/node.ts +81 -26
  253. package/src/charts/render.ts +16 -6
  254. package/src/code-editor/node.ts +147 -53
  255. package/src/flow/draw.ts +104 -35
  256. package/src/flow/index.ts +33 -13
  257. package/src/flow/model.ts +4 -2
  258. package/src/flow/node.ts +158 -59
  259. package/src/flow/types.ts +46 -21
  260. package/src/formula/index.ts +4 -2
  261. package/src/formula/node.ts +24 -5
  262. package/src/html/controls.ts +4 -1
  263. package/src/html/css/cascade.ts +18 -7
  264. package/src/html/css/parse.ts +46 -21
  265. package/src/html/css/style.ts +6 -1
  266. package/src/html/css/values.ts +25 -9
  267. package/src/html/index.ts +1 -0
  268. package/src/html/layout/boxes.ts +19 -9
  269. package/src/html/layout/inline.ts +23 -1
  270. package/src/html/node.ts +110 -17
  271. package/src/html/paint.ts +17 -2
  272. package/src/index.ts +142 -0
  273. package/src/maps/clip.ts +184 -0
  274. package/src/maps/gzip.ts +66 -0
  275. package/src/maps/index.ts +316 -0
  276. package/src/maps/labels.ts +442 -0
  277. package/src/maps/mvt.ts +857 -0
  278. package/src/maps/node.ts +1819 -0
  279. package/src/maps/overlay.ts +639 -0
  280. package/src/maps/paint.ts +978 -0
  281. package/src/maps/proj.ts +641 -0
  282. package/src/maps/sources.ts +425 -0
  283. package/src/maps/style.ts +309 -0
  284. package/src/maps/styles.ts +1040 -0
  285. package/src/maps/tiles.ts +676 -0
  286. package/src/maps/types.ts +260 -0
  287. package/src/qml/containers.tsx +380 -0
  288. package/src/qml/controls.tsx +47 -0
  289. package/src/qml/globals.ts +33 -0
  290. package/src/qml/index.ts +67 -0
  291. package/src/qml/interaction.tsx +317 -0
  292. package/src/qml/ir.ts +80 -0
  293. package/src/qml/layouts.tsx +141 -0
  294. package/src/qml/models.ts +101 -0
  295. package/src/qml/objects.ts +1431 -0
  296. package/src/qml/parse.ts +624 -0
  297. package/src/qml/qtquick.tsx +413 -0
  298. package/src/qml/react.tsx +454 -0
  299. package/src/qml/resolver.ts +99 -0
  300. package/src/qml/slots.ts +249 -0
  301. package/src/qml/states.ts +318 -0
  302. package/src/qml/view-utils.ts +140 -0
  303. package/src/reorder/hx.ts +31 -0
  304. package/src/reorder/index.ts +2223 -0
  305. package/src/reorder/model.ts +232 -0
  306. package/src/richtext/node.ts +49 -14
  307. package/src/richtext/runs.ts +115 -30
  308. package/src/tabs/hx.ts +31 -0
  309. package/src/tabs/index.ts +1686 -0
  310. package/src/terminal/vt/fonts.ts +128 -36
  311. package/src/terminal/vt/index.ts +4 -2
  312. package/src/terminal/vt/node.ts +105 -12
  313. package/src/terminal/vt/pty.ts +243 -0
  314. package/src/terminal/vt/renderer.ts +13 -3
@@ -0,0 +1,469 @@
1
+ import { parseTile } from './mvt.js';
2
+ import { tileKey } from './proj.js';
3
+ import { pyramidOf } from './sources.js';
4
+ /**
5
+ * One tile as the cover asked for it, and its renderings.
6
+ *
7
+ * The data behind it is `data`, which is this tile until the cover goes
8
+ * deeper than the source does. The status accessors read through, so
9
+ * everything that only wants "is there anything to draw" reads the same
10
+ * names it always did.
11
+ */
12
+ export class CachedTile {
13
+ key;
14
+ sourceId;
15
+ tile;
16
+ /** The source tile whose bytes this draws. Itself, or an ancestor. */
17
+ data;
18
+ /** Where this tile sits inside `data`: cell `(x, y)` of `span × span`. */
19
+ sub;
20
+ /**
21
+ * The rendering that is on screen. **Always finished**, which is the
22
+ * whole point of the pair.
23
+ *
24
+ * A tile is re-rasterized whenever its size, its style zoom or the cache
25
+ * generation moves. Drawn in place, each of those clears the surface and
26
+ * leaves the tile blank for the six or so frames it takes to redraw: a
27
+ * visible flash, and many more of them on a backend that paints more
28
+ * frames. So the new rendering goes into {@link drawing} and this one
29
+ * keeps being composited until it is ready to be replaced.
30
+ */
31
+ shown = null;
32
+ /** The rendering being drawn, or null when there is nothing to draw. */
33
+ drawing = null;
34
+ /** Frame counter of the last frame that wanted it — what eviction sorts
35
+ * on. */
36
+ lastUsed = 0;
37
+ constructor(key, sourceId, tile, data, sub) {
38
+ this.key = key;
39
+ this.sourceId = sourceId;
40
+ this.tile = tile;
41
+ this.data = data;
42
+ this.sub = sub;
43
+ }
44
+ get status() {
45
+ return this.data.status;
46
+ }
47
+ get error() {
48
+ return this.data.error;
49
+ }
50
+ get vector() {
51
+ return this.data.vector;
52
+ }
53
+ get raster() {
54
+ return this.data.raster;
55
+ }
56
+ }
57
+ const DEFAULT_SURFACE_BUDGET = 128 * 1024 * 1024;
58
+ const DEFAULT_DATA_BUDGET = 192;
59
+ /**
60
+ * The cache.
61
+ *
62
+ * One per element. Nothing in it knows about the camera: it is asked for
63
+ * tiles by name, and told once a frame which ones are still wanted.
64
+ */
65
+ export class TileCache {
66
+ _entries = new Map();
67
+ /** The source's own tiles, shared by every rendering that draws one. */
68
+ _data = new Map();
69
+ _options;
70
+ _frame = 0;
71
+ _surfaceBytes = 0;
72
+ /** Bumped by a style change, which retires every surface without
73
+ * touching the data behind it. */
74
+ _generation = 0;
75
+ constructor(options = {}) {
76
+ this._options = options;
77
+ }
78
+ /** Bumped once per paint; `lastUsed` is stamped from it. */
79
+ beginFrame() {
80
+ return ++this._frame;
81
+ }
82
+ get generation() {
83
+ return this._generation;
84
+ }
85
+ /** Every rendered surface is stale — a new style, a new display scale. */
86
+ invalidateStyle() {
87
+ this._generation++;
88
+ }
89
+ /** How much the rendered surfaces are holding, in bytes. */
90
+ get surfaceBytes() {
91
+ return this._surfaceBytes;
92
+ }
93
+ get size() {
94
+ return this._entries.size;
95
+ }
96
+ key(sourceId, tile) {
97
+ return `${sourceId}:${tileKey(tile)}`;
98
+ }
99
+ peek(sourceId, tile) {
100
+ return this._entries.get(this.key(sourceId, tile));
101
+ }
102
+ /**
103
+ * The entry for a tile the cover asked for, and the data behind it,
104
+ * asking the source for that data if nothing has yet.
105
+ *
106
+ * `dataTile` is the tile whose bytes serve this one — itself, until the
107
+ * cover goes deeper than the source cuts. Marks both used by the current
108
+ * frame, which is what keeps them out of the next eviction.
109
+ */
110
+ want(source, sourceId, tile, dataTile = tile, sub = { x: 0, y: 0, span: 1 }) {
111
+ const data = this._wantData(source, sourceId, dataTile);
112
+ const key = this.key(sourceId, tile);
113
+ let entry = this._entries.get(key);
114
+ if (!entry) {
115
+ entry = new CachedTile(key, sourceId, tile, data, sub);
116
+ this._entries.set(key, entry);
117
+ }
118
+ entry.lastUsed = this._frame;
119
+ return entry;
120
+ }
121
+ _wantData(source, sourceId, tile) {
122
+ const key = this.key(sourceId, tile);
123
+ let data = this._data.get(key);
124
+ if (!data) {
125
+ data = {
126
+ key,
127
+ tile,
128
+ status: 'idle',
129
+ error: null,
130
+ vector: null,
131
+ raster: null,
132
+ abort: null,
133
+ attempts: 0,
134
+ retryAt: 0,
135
+ lastUsed: 0,
136
+ };
137
+ this._data.set(key, data);
138
+ }
139
+ data.lastUsed = this._frame;
140
+ if (data.status === 'idle') {
141
+ this._load(source, sourceId, data);
142
+ }
143
+ else if (data.status === 'error' && Date.now() >= data.retryAt) {
144
+ // A failed tile is retried, but on a backoff rather than on every
145
+ // frame. Without it a source that is down — or an application whose
146
+ // `load` throws on the first call, which is how this was found — is
147
+ // asked for every visible tile sixty times a second, which is a
148
+ // retry storm pointed at somebody else's servers.
149
+ this._load(source, sourceId, data);
150
+ }
151
+ return data;
152
+ }
153
+ _load(source, sourceId, entry) {
154
+ entry.status = 'loading';
155
+ entry.error = null;
156
+ // A **real** `AbortController` where the runtime has one. A look-alike
157
+ // is not good enough: `fetch` checks `instanceof AbortSignal` and
158
+ // throws `TypeError` on anything else, so handing a source a plain
159
+ // object with an `aborted` getter fails every load a source makes the
160
+ // documented way — which is exactly what it did.
161
+ const Controller = globalThis.AbortController;
162
+ let aborted = false;
163
+ const controller = Controller ? new Controller() : null;
164
+ const signal = controller
165
+ ? controller.signal
166
+ : {
167
+ get aborted() {
168
+ return aborted;
169
+ },
170
+ };
171
+ entry.abort = () => {
172
+ aborted = true;
173
+ controller?.abort();
174
+ };
175
+ const fail = (error) => {
176
+ entry.status = 'error';
177
+ entry.error = error;
178
+ entry.attempts++;
179
+ // 0.5s, 1, 2, 4, 8, 16, then 30s — long enough that a dead source
180
+ // costs nothing, short enough that a blip repairs itself.
181
+ entry.retryAt =
182
+ Date.now() + Math.min(30_000, 500 * 2 ** (entry.attempts - 1));
183
+ };
184
+ const settle = (fn) => {
185
+ // A load that finished after its tile was evicted must not resurrect
186
+ // it: the entry is gone from the map, so writing to it would leak a
187
+ // surface nothing composites.
188
+ if (aborted || this._data.get(entry.key) !== entry)
189
+ return;
190
+ entry.abort = null;
191
+ fn();
192
+ if (entry.status === 'error')
193
+ this._options.onError?.(entry);
194
+ this._options.onChange?.(entry);
195
+ };
196
+ let result;
197
+ try {
198
+ result = source.load({ ...entry.tile, sourceId, signal });
199
+ }
200
+ catch (error) {
201
+ settle(() => fail(error));
202
+ return;
203
+ }
204
+ const accept = (data) => settle(() => {
205
+ entry.attempts = 0;
206
+ entry.retryAt = 0;
207
+ if (data === null) {
208
+ entry.status = 'empty';
209
+ return;
210
+ }
211
+ if (data.kind === 'vector') {
212
+ try {
213
+ entry.vector = parseTile(data.data);
214
+ entry.status = 'ready';
215
+ }
216
+ catch (error) {
217
+ fail(error);
218
+ }
219
+ return;
220
+ }
221
+ entry.raster = data;
222
+ entry.status = 'ready';
223
+ });
224
+ if (result && typeof result.then === 'function') {
225
+ result.then(accept, (error) => settle(() => fail(error)));
226
+ }
227
+ else {
228
+ accept(result);
229
+ }
230
+ }
231
+ /**
232
+ * The nearest ancestor of `tile` that already has a drawn surface, or
233
+ * null.
234
+ *
235
+ * What covers a hole. A zoom in has the previous level's tiles in hand
236
+ * and the new level's on the way, so the coarse picture is scaled up
237
+ * under the fine one until it arrives — which is the difference between a
238
+ * map that fills in and a map that flashes empty. Bounded, because
239
+ * scaling one tile over sixteen screenfuls is worse than the hole.
240
+ */
241
+ ancestorWithSurface(sourceId, tile, levels = 5) {
242
+ let z = tile.z - 1;
243
+ let x = tile.x >> 1;
244
+ let y = tile.y >> 1;
245
+ for (let up = 0; up < levels && z >= 0; up++, z--, x >>= 1, y >>= 1) {
246
+ const entry = this._entries.get(this.key(sourceId, { z, x, y }));
247
+ // `shown` is finished by construction, so an ancestor is never a
248
+ // half-drawn picture.
249
+ if (entry?.shown) {
250
+ // Stamped, because for as long as it is covering a hole it is on
251
+ // screen — and an unstamped entry is the *first* thing eviction
252
+ // takes, which would drop the only picture the map is showing.
253
+ entry.lastUsed = this._frame;
254
+ return entry;
255
+ }
256
+ }
257
+ return null;
258
+ }
259
+ /**
260
+ * The finished **descendants** of a tile, and where each sits inside it.
261
+ *
262
+ * The mirror of {@link ancestorWithSurface}, and the half a map needs
263
+ * when it zooms *out*: the tiles already in hand are then the target's
264
+ * children, and walking up the pyramid finds nothing. Without this a
265
+ * zoom-out shows the background — with the labels and markers still drawn
266
+ * over it, which is exactly as odd as it sounds — until the coarser tile
267
+ * has been fetched, rasterized and composited.
268
+ *
269
+ * `depth` is how many levels down to look, and it is small on purpose: a
270
+ * level down is 4 tiles, two is 16, and beyond that the pieces are too
271
+ * small to be worth the composites.
272
+ */
273
+ descendantsWithSurface(sourceId, tile, depth = 2) {
274
+ for (let down = 1; down <= depth; down++) {
275
+ const span = 1 << down;
276
+ const found = [];
277
+ for (let dy = 0; dy < span; dy++) {
278
+ for (let dx = 0; dx < span; dx++) {
279
+ const entry = this._entries.get(this.key(sourceId, {
280
+ z: tile.z + down,
281
+ x: (tile.x << down) + dx,
282
+ y: (tile.y << down) + dy,
283
+ }));
284
+ if (entry?.shown) {
285
+ entry.lastUsed = this._frame;
286
+ found.push({ entry, x: dx, y: dy, span });
287
+ }
288
+ }
289
+ }
290
+ // The nearest level that has anything wins: one level down is both
291
+ // the sharpest and the fewest composites.
292
+ if (found.length > 0)
293
+ return found;
294
+ }
295
+ return [];
296
+ }
297
+ /**
298
+ * The rendering this tile should be drawn into, or null when what is on
299
+ * screen is already right.
300
+ *
301
+ * The size, the zoom and the cache generation are all part of what makes
302
+ * a rendering valid: one drawn at the wrong size composites blurry, and
303
+ * one drawn at another zoom carries the wrong road widths and the wrong
304
+ * layers.
305
+ *
306
+ * When something is already on screen and a *new* rendering is needed,
307
+ * this hands back a second surface and leaves the first one composited
308
+ * until {@link promote} swaps them. That is the whole of the
309
+ * double-buffering: without it a re-rasterization clears the surface and
310
+ * the tile is blank for the several frames it takes to redraw, which
311
+ * above a source's `maxZoom` happens at every integer zoom — the same
312
+ * z14 tile serves 15, 16, 17 and on.
313
+ */
314
+ beginRender(entry, size, zoom, make) {
315
+ if (this._matches(entry.shown, size, zoom))
316
+ return null;
317
+ if (this._matches(entry.drawing, size, zoom))
318
+ return entry.drawing;
319
+ // A draft for something else — an intermediate zoom the camera swept
320
+ // past — is thrown away rather than finished.
321
+ if (entry.drawing)
322
+ this._release(entry.drawing);
323
+ entry.drawing = null;
324
+ const surface = make(size);
325
+ if (!surface)
326
+ return null;
327
+ this._surfaceBytes += size * size * 4;
328
+ entry.drawing = {
329
+ surface,
330
+ context: surface.getContext('2d'),
331
+ size,
332
+ zoom,
333
+ generation: this._generation,
334
+ progress: 0,
335
+ progressLayer: 0,
336
+ };
337
+ return entry.drawing;
338
+ }
339
+ _matches(render, size, zoom) {
340
+ return (render !== null &&
341
+ render.size === size &&
342
+ render.zoom === zoom &&
343
+ render.generation === this._generation);
344
+ }
345
+ /** The finished draft becomes what is on screen, and the old one goes.
346
+ * True when that happened, which is the one moment a tile's pixels
347
+ * change and therefore the one moment worth claiming damage for. */
348
+ promote(entry) {
349
+ if (!entry.drawing || entry.drawing.progress !== -1)
350
+ return false;
351
+ if (entry.shown)
352
+ this._release(entry.shown);
353
+ entry.shown = entry.drawing;
354
+ entry.drawing = null;
355
+ return true;
356
+ }
357
+ /** Note where a tile's rasterization stopped: at run `run`, having
358
+ * finished `layer` of its active layers (`-1` for all of them). */
359
+ advance(render, run, layer, style) {
360
+ render.progress = run >= style.runs.length ? -1 : run;
361
+ render.progressLayer = layer < 0 ? 0 : layer;
362
+ }
363
+ /**
364
+ * Drop what is no longer worth keeping.
365
+ *
366
+ * Surfaces go first and by least-recently-wanted, because they are two
367
+ * orders of magnitude larger than the data behind them and much cheaper
368
+ * to lose: a dropped surface is one re-rasterization, a dropped tile is a
369
+ * network request.
370
+ */
371
+ sweep() {
372
+ if (this._surfaceBytes >
373
+ (this._options.surfaceBudget ?? DEFAULT_SURFACE_BUDGET)) {
374
+ const withSurfaces = [...this._entries.values()]
375
+ .filter((entry) => entry.shown !== null || entry.drawing !== null)
376
+ .sort((a, b) => a.lastUsed - b.lastUsed);
377
+ const budget = this._options.surfaceBudget ?? DEFAULT_SURFACE_BUDGET;
378
+ for (const entry of withSurfaces) {
379
+ if (this._surfaceBytes <= budget)
380
+ break;
381
+ // Never the frame being drawn: a surface evicted this frame is one
382
+ // that will be rebuilt this frame.
383
+ if (entry.lastUsed >= this._frame)
384
+ continue;
385
+ this._dropSurface(entry);
386
+ }
387
+ }
388
+ const dataBudget = this._options.dataBudget ?? DEFAULT_DATA_BUDGET;
389
+ if (this._entries.size > dataBudget) {
390
+ const all = [...this._entries.values()].sort((a, b) => a.lastUsed - b.lastUsed);
391
+ for (const entry of all) {
392
+ if (this._entries.size <= dataBudget)
393
+ break;
394
+ if (entry.lastUsed >= this._frame)
395
+ continue;
396
+ this._drop(entry);
397
+ }
398
+ }
399
+ if (this._data.size > dataBudget) {
400
+ const all = [...this._data.values()].sort((a, b) => a.lastUsed - b.lastUsed);
401
+ for (const data of all) {
402
+ if (this._data.size <= dataBudget)
403
+ break;
404
+ if (data.lastUsed >= this._frame)
405
+ continue;
406
+ this._dropData(data);
407
+ }
408
+ }
409
+ }
410
+ _dropSurface(entry) {
411
+ if (entry.shown)
412
+ this._release(entry.shown);
413
+ if (entry.drawing)
414
+ this._release(entry.drawing);
415
+ entry.shown = null;
416
+ entry.drawing = null;
417
+ }
418
+ _release(render) {
419
+ this._surfaceBytes -= render.size * render.size * 4;
420
+ render.context?.destroy?.();
421
+ render.surface.destroy();
422
+ }
423
+ _drop(entry) {
424
+ this._dropSurface(entry);
425
+ this._entries.delete(entry.key);
426
+ }
427
+ /** Drop a source tile's bytes, and abort a load still in flight for it.
428
+ * Only when no rendering still points at it. */
429
+ _dropData(data) {
430
+ for (const entry of this._entries.values()) {
431
+ if (entry.data === data)
432
+ return;
433
+ }
434
+ data.abort?.();
435
+ this._data.delete(data.key);
436
+ }
437
+ /** Release everything. Called from the element's `destroySubtree`. */
438
+ destroy() {
439
+ for (const entry of [...this._entries.values()])
440
+ this._drop(entry);
441
+ this._entries.clear();
442
+ for (const data of this._data.values())
443
+ data.abort?.();
444
+ this._data.clear();
445
+ this._surfaceBytes = 0;
446
+ }
447
+ /** Every entry — for a test, and for the `onTiles` diagnostic. */
448
+ entries() {
449
+ return this._entries.values();
450
+ }
451
+ /** Every source tile whose bytes are held. What labels are collected
452
+ * from: a label belongs to the tile the data came from, and past a
453
+ * source's depth many renderings share one of those. */
454
+ dataEntries() {
455
+ return this._data.values();
456
+ }
457
+ }
458
+ /** A source's pyramid, memoized per source object so the defaults are not
459
+ * refilled per frame. */
460
+ const pyramids = new WeakMap();
461
+ export function pyramid(source) {
462
+ let found = pyramids.get(source);
463
+ if (!found) {
464
+ found = pyramidOf(source);
465
+ pyramids.set(source, found);
466
+ }
467
+ return found;
468
+ }
469
+ //# sourceMappingURL=tiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiles.js","sourceRoot":"","sources":["../../src/maps/tiles.ts"],"names":[],"mappings":"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"}