@reearth/ezu 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,7 @@ npm install @reearth/ezu
14
14
 
15
15
  ## Usage
16
16
 
17
- The package ships three builds and picks one automatically via the
17
+ The package ships four builds and picks one automatically via the
18
18
  `exports` map:
19
19
 
20
20
  | Runtime | Build used |
@@ -22,7 +22,10 @@ The package ships three builds and picks one automatically via the
22
22
  | Vite / Webpack / Rollup | `bundler` |
23
23
  | Browser (native ESM) | `web` |
24
24
  | Node.js | `nodejs` |
25
- | Cloudflare Workers | `bundler` (via `workerd` condition) |
25
+ | Cloudflare Workers | `workerd` (via the `workerd` condition) |
26
+
27
+ Every build also exists in a wasm SIMD128 flavor under
28
+ `@reearth/ezu/simd` — see [SIMD](#simd).
26
29
 
27
30
  ### Bundler / Cloudflare Workers / Node.js
28
31
 
@@ -47,7 +50,54 @@ const renderer = new Renderer(styleJson);
47
50
  ### Explicit build selection
48
51
 
49
52
  If the auto-resolved entry doesn't fit your toolchain, import a build
50
- directly: `@reearth/ezu/web`, `@reearth/ezu/bundler`, or `@reearth/ezu/nodejs`.
53
+ directly: `@reearth/ezu/web`, `@reearth/ezu/bundler`, `@reearth/ezu/nodejs`,
54
+ or `@reearth/ezu/workerd`.
55
+
56
+ `workerd` reuses the `bundler` glue but instantiates the wasm itself,
57
+ because Cloudflare Workers resolve a `.wasm` import to an uninstantiated
58
+ `WebAssembly.Module` rather than to live exports. Importing
59
+ `@reearth/ezu/bundler` on Workers therefore fails with
60
+ `__wbindgen_start is not a function`.
61
+
62
+ The raw artifacts are exported too, for hosts that need to wire up
63
+ instantiation themselves: `@reearth/ezu/bundler/ezu_bg.js`,
64
+ `@reearth/ezu/bundler/ezu_bg.wasm`, and `@reearth/ezu/web/ezu_bg.wasm`.
65
+
66
+ ## SIMD
67
+
68
+ The same four builds are shipped a second time compiled with
69
+ `-C target-feature=+simd128`, under the `simd` subpath. It resolves by
70
+ the same conditions as the default entry, so one import covers every
71
+ runtime:
72
+
73
+ ```js
74
+ import { Renderer } from "@reearth/ezu/simd";
75
+ ```
76
+
77
+ The default entry (`.`) stays **non-SIMD** on purpose. Safari gained
78
+ wasm SIMD128 only in 16.4, and a module that uses SIMD instructions
79
+ fails to *compile* on older engines rather than degrading — so making
80
+ SIMD the package default would hard-break those browsers. Opt in where
81
+ you know the engine supports it: Cloudflare Workers (workerd), Node 16+,
82
+ and Chrome/Firefox/Safari 16.4+.
83
+
84
+ `simdEnabled()` reports which flavor is loaded — `true` only in the
85
+ `simd` builds:
86
+
87
+ ```js
88
+ import { simdEnabled } from "@reearth/ezu/simd";
89
+ simdEnabled(); // true
90
+ ```
91
+
92
+ Individual builds and raw artifacts mirror the default layout:
93
+ `@reearth/ezu/simd/web`, `/simd/bundler`, `/simd/nodejs`,
94
+ `/simd/workerd`, `@reearth/ezu/simd/bundler/ezu_bg.js`,
95
+ `@reearth/ezu/simd/bundler/ezu_bg.wasm`, and
96
+ `@reearth/ezu/simd/web/ezu_bg.wasm`.
97
+
98
+ A future version could ship a single entry that feature-detects SIMD at
99
+ load time and instantiates the matching wasm; that would double the
100
+ bytes a browser may download, so for now the choice is explicit.
51
101
 
52
102
  ## API
53
103
 
package/bundler/ezu.d.ts CHANGED
@@ -92,6 +92,28 @@ export class Renderer {
92
92
  * Drop every pending source binding. Call between tile renders.
93
93
  */
94
94
  clearSources(): void;
95
+ /**
96
+ * Glyph ranges the currently bound features can require, as
97
+ * `{ [glyphsSourceName]: number[] }` where each number is a range
98
+ * start (`0`, `256`, `512`, …) — i.e. the `{range}` in a
99
+ * `…/{fontstack}/{range}.pbf` URL is `<start>-<start + 255>`.
100
+ *
101
+ * This host cannot fetch glyph ranges lazily, so every range a
102
+ * tile's labels touch must be bound before `renderTile`. Rather than
103
+ * scraping every string in the MVT, call this after binding the
104
+ * vector sources and bind exactly the listed ranges.
105
+ *
106
+ * It is an over-approximation, deliberately: a range is listed if
107
+ * *any* feature in a text layer carries the codepoint in a property
108
+ * the layer's `text` expression reads, without evaluating filters,
109
+ * zoom ranges, or the expression itself, and it is listed for every
110
+ * fontstack in that layer's fallback chain. So it never omits a
111
+ * range a label needs, and it may name a few that go unused. Text
112
+ * layers that build their string from something other than a `get`
113
+ * of a feature property (a literal, a `concat` of formatted values)
114
+ * contribute their literal text where it is a plain string.
115
+ */
116
+ neededGlyphRanges(): object;
95
117
  /**
96
118
  * Build a renderer from a style JSON document.
97
119
  */
@@ -106,6 +128,22 @@ export class Renderer {
106
128
  * - `png`: `{ compression?: "fast" | "default" | "best" }`
107
129
  */
108
130
  renderTile(z: number, x: number, y: number, opts?: object | null): Uint8Array;
131
+ /**
132
+ * Neighbour tile offsets the active style actually asks for from
133
+ * `source`, as an array of `[dx, dy]` pairs (never including the
134
+ * centre `[0, 0]`).
135
+ *
136
+ * Cross-tile label collision and edge-continuous DEM shading are the
137
+ * only things that read neighbours, and only for the sources they
138
+ * name. A host that fetches the full 3×3 window unconditionally
139
+ * therefore pays for up to eight tiles it will not look at; passing
140
+ * each offset from this list to `bindSource(name, bytes, { coord })`
141
+ * fetches exactly what the recipe needs. An empty array means the
142
+ * centre tile is enough.
143
+ *
144
+ * Throws `UnknownSource` if `name` is not declared in the style.
145
+ */
146
+ requestedNeighborOffsets(name: string): Array<any>;
109
147
  /**
110
148
  * Replace the active style. Returns the new node count. Invalidates
111
149
  * the intermediate cache and drops any pending source bindings.
package/bundler/ezu_bg.js CHANGED
@@ -178,6 +178,35 @@ export class Renderer {
178
178
  clearSources() {
179
179
  wasm.renderer_clearSources(this.__wbg_ptr);
180
180
  }
181
+ /**
182
+ * Glyph ranges the currently bound features can require, as
183
+ * `{ [glyphsSourceName]: number[] }` where each number is a range
184
+ * start (`0`, `256`, `512`, …) — i.e. the `{range}` in a
185
+ * `…/{fontstack}/{range}.pbf` URL is `<start>-<start + 255>`.
186
+ *
187
+ * This host cannot fetch glyph ranges lazily, so every range a
188
+ * tile's labels touch must be bound before `renderTile`. Rather than
189
+ * scraping every string in the MVT, call this after binding the
190
+ * vector sources and bind exactly the listed ranges.
191
+ *
192
+ * It is an over-approximation, deliberately: a range is listed if
193
+ * *any* feature in a text layer carries the codepoint in a property
194
+ * the layer's `text` expression reads, without evaluating filters,
195
+ * zoom ranges, or the expression itself, and it is listed for every
196
+ * fontstack in that layer's fallback chain. So it never omits a
197
+ * range a label needs, and it may name a few that go unused. Text
198
+ * layers that build their string from something other than a `get`
199
+ * of a feature property (a literal, a `concat` of formatted values)
200
+ * contribute their literal text where it is a plain string.
201
+ * @returns {object}
202
+ */
203
+ neededGlyphRanges() {
204
+ const ret = wasm.renderer_neededGlyphRanges(this.__wbg_ptr);
205
+ if (ret[2]) {
206
+ throw takeFromExternrefTable0(ret[1]);
207
+ }
208
+ return takeFromExternrefTable0(ret[0]);
209
+ }
181
210
  /**
182
211
  * Build a renderer from a style JSON document.
183
212
  * @param {string} style_json
@@ -216,6 +245,32 @@ export class Renderer {
216
245
  wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
217
246
  return v1;
218
247
  }
248
+ /**
249
+ * Neighbour tile offsets the active style actually asks for from
250
+ * `source`, as an array of `[dx, dy]` pairs (never including the
251
+ * centre `[0, 0]`).
252
+ *
253
+ * Cross-tile label collision and edge-continuous DEM shading are the
254
+ * only things that read neighbours, and only for the sources they
255
+ * name. A host that fetches the full 3×3 window unconditionally
256
+ * therefore pays for up to eight tiles it will not look at; passing
257
+ * each offset from this list to `bindSource(name, bytes, { coord })`
258
+ * fetches exactly what the recipe needs. An empty array means the
259
+ * centre tile is enough.
260
+ *
261
+ * Throws `UnknownSource` if `name` is not declared in the style.
262
+ * @param {string} name
263
+ * @returns {Array<any>}
264
+ */
265
+ requestedNeighborOffsets(name) {
266
+ const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
267
+ const len0 = WASM_VECTOR_LEN;
268
+ const ret = wasm.renderer_requestedNeighborOffsets(this.__wbg_ptr, ptr0, len0);
269
+ if (ret[2]) {
270
+ throw takeFromExternrefTable0(ret[1]);
271
+ }
272
+ return takeFromExternrefTable0(ret[0]);
273
+ }
219
274
  /**
220
275
  * Replace the active style. Returns the new node count. Invalidates
221
276
  * the intermediate cache and drops any pending source bindings.
@@ -282,6 +337,9 @@ export function __wbg___wbindgen_number_get_f73a1244370fcc2c(arg0, arg1) {
282
337
  getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
283
338
  getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
284
339
  }
340
+ export function __wbg___wbindgen_rethrow_2b7cc655458909c2(arg0) {
341
+ throw arg0;
342
+ }
285
343
  export function __wbg___wbindgen_string_get_d109740c0d18f4d7(arg0, arg1) {
286
344
  const obj = arg1;
287
345
  const ret = typeof(obj) === 'string' ? obj : undefined;
Binary file
@@ -15,8 +15,10 @@ export const renderer_attribution: (a: number) => [number, number];
15
15
  export const renderer_bindSource: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
16
16
  export const renderer_boundSources: (a: number) => [number, number];
17
17
  export const renderer_clearSources: (a: number) => void;
18
+ export const renderer_neededGlyphRanges: (a: number) => [number, number, number];
18
19
  export const renderer_new: (a: number, b: number) => [number, number, number];
19
20
  export const renderer_renderTile: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
21
+ export const renderer_requestedNeighborOffsets: (a: number, b: number, c: number) => [number, number, number];
20
22
  export const renderer_setStyle: (a: number, b: number, c: number) => [number, number, number];
21
23
  export const renderer_tileSize: (a: number) => number;
22
24
  export const simdEnabled: () => number;
package/nodejs/ezu.d.ts CHANGED
@@ -92,6 +92,28 @@ export class Renderer {
92
92
  * Drop every pending source binding. Call between tile renders.
93
93
  */
94
94
  clearSources(): void;
95
+ /**
96
+ * Glyph ranges the currently bound features can require, as
97
+ * `{ [glyphsSourceName]: number[] }` where each number is a range
98
+ * start (`0`, `256`, `512`, …) — i.e. the `{range}` in a
99
+ * `…/{fontstack}/{range}.pbf` URL is `<start>-<start + 255>`.
100
+ *
101
+ * This host cannot fetch glyph ranges lazily, so every range a
102
+ * tile's labels touch must be bound before `renderTile`. Rather than
103
+ * scraping every string in the MVT, call this after binding the
104
+ * vector sources and bind exactly the listed ranges.
105
+ *
106
+ * It is an over-approximation, deliberately: a range is listed if
107
+ * *any* feature in a text layer carries the codepoint in a property
108
+ * the layer's `text` expression reads, without evaluating filters,
109
+ * zoom ranges, or the expression itself, and it is listed for every
110
+ * fontstack in that layer's fallback chain. So it never omits a
111
+ * range a label needs, and it may name a few that go unused. Text
112
+ * layers that build their string from something other than a `get`
113
+ * of a feature property (a literal, a `concat` of formatted values)
114
+ * contribute their literal text where it is a plain string.
115
+ */
116
+ neededGlyphRanges(): object;
95
117
  /**
96
118
  * Build a renderer from a style JSON document.
97
119
  */
@@ -106,6 +128,22 @@ export class Renderer {
106
128
  * - `png`: `{ compression?: "fast" | "default" | "best" }`
107
129
  */
108
130
  renderTile(z: number, x: number, y: number, opts?: object | null): Uint8Array;
131
+ /**
132
+ * Neighbour tile offsets the active style actually asks for from
133
+ * `source`, as an array of `[dx, dy]` pairs (never including the
134
+ * centre `[0, 0]`).
135
+ *
136
+ * Cross-tile label collision and edge-continuous DEM shading are the
137
+ * only things that read neighbours, and only for the sources they
138
+ * name. A host that fetches the full 3×3 window unconditionally
139
+ * therefore pays for up to eight tiles it will not look at; passing
140
+ * each offset from this list to `bindSource(name, bytes, { coord })`
141
+ * fetches exactly what the recipe needs. An empty array means the
142
+ * centre tile is enough.
143
+ *
144
+ * Throws `UnknownSource` if `name` is not declared in the style.
145
+ */
146
+ requestedNeighborOffsets(name: string): Array<any>;
109
147
  /**
110
148
  * Replace the active style. Returns the new node count. Invalidates
111
149
  * the intermediate cache and drops any pending source bindings.
package/nodejs/ezu.js CHANGED
@@ -181,6 +181,35 @@ class Renderer {
181
181
  clearSources() {
182
182
  wasm.renderer_clearSources(this.__wbg_ptr);
183
183
  }
184
+ /**
185
+ * Glyph ranges the currently bound features can require, as
186
+ * `{ [glyphsSourceName]: number[] }` where each number is a range
187
+ * start (`0`, `256`, `512`, …) — i.e. the `{range}` in a
188
+ * `…/{fontstack}/{range}.pbf` URL is `<start>-<start + 255>`.
189
+ *
190
+ * This host cannot fetch glyph ranges lazily, so every range a
191
+ * tile's labels touch must be bound before `renderTile`. Rather than
192
+ * scraping every string in the MVT, call this after binding the
193
+ * vector sources and bind exactly the listed ranges.
194
+ *
195
+ * It is an over-approximation, deliberately: a range is listed if
196
+ * *any* feature in a text layer carries the codepoint in a property
197
+ * the layer's `text` expression reads, without evaluating filters,
198
+ * zoom ranges, or the expression itself, and it is listed for every
199
+ * fontstack in that layer's fallback chain. So it never omits a
200
+ * range a label needs, and it may name a few that go unused. Text
201
+ * layers that build their string from something other than a `get`
202
+ * of a feature property (a literal, a `concat` of formatted values)
203
+ * contribute their literal text where it is a plain string.
204
+ * @returns {object}
205
+ */
206
+ neededGlyphRanges() {
207
+ const ret = wasm.renderer_neededGlyphRanges(this.__wbg_ptr);
208
+ if (ret[2]) {
209
+ throw takeFromExternrefTable0(ret[1]);
210
+ }
211
+ return takeFromExternrefTable0(ret[0]);
212
+ }
184
213
  /**
185
214
  * Build a renderer from a style JSON document.
186
215
  * @param {string} style_json
@@ -219,6 +248,32 @@ class Renderer {
219
248
  wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
220
249
  return v1;
221
250
  }
251
+ /**
252
+ * Neighbour tile offsets the active style actually asks for from
253
+ * `source`, as an array of `[dx, dy]` pairs (never including the
254
+ * centre `[0, 0]`).
255
+ *
256
+ * Cross-tile label collision and edge-continuous DEM shading are the
257
+ * only things that read neighbours, and only for the sources they
258
+ * name. A host that fetches the full 3×3 window unconditionally
259
+ * therefore pays for up to eight tiles it will not look at; passing
260
+ * each offset from this list to `bindSource(name, bytes, { coord })`
261
+ * fetches exactly what the recipe needs. An empty array means the
262
+ * centre tile is enough.
263
+ *
264
+ * Throws `UnknownSource` if `name` is not declared in the style.
265
+ * @param {string} name
266
+ * @returns {Array<any>}
267
+ */
268
+ requestedNeighborOffsets(name) {
269
+ const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
270
+ const len0 = WASM_VECTOR_LEN;
271
+ const ret = wasm.renderer_requestedNeighborOffsets(this.__wbg_ptr, ptr0, len0);
272
+ if (ret[2]) {
273
+ throw takeFromExternrefTable0(ret[1]);
274
+ }
275
+ return takeFromExternrefTable0(ret[0]);
276
+ }
222
277
  /**
223
278
  * Replace the active style. Returns the new node count. Invalidates
224
279
  * the intermediate cache and drops any pending source bindings.
@@ -291,6 +346,9 @@ function __wbg_get_imports() {
291
346
  getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
292
347
  getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
293
348
  },
349
+ __wbg___wbindgen_rethrow_2b7cc655458909c2: function(arg0) {
350
+ throw arg0;
351
+ },
294
352
  __wbg___wbindgen_string_get_d109740c0d18f4d7: function(arg0, arg1) {
295
353
  const obj = arg1;
296
354
  const ret = typeof(obj) === 'string' ? obj : undefined;
Binary file
@@ -15,8 +15,10 @@ export const renderer_attribution: (a: number) => [number, number];
15
15
  export const renderer_bindSource: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
16
16
  export const renderer_boundSources: (a: number) => [number, number];
17
17
  export const renderer_clearSources: (a: number) => void;
18
+ export const renderer_neededGlyphRanges: (a: number) => [number, number, number];
18
19
  export const renderer_new: (a: number, b: number) => [number, number, number];
19
20
  export const renderer_renderTile: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
21
+ export const renderer_requestedNeighborOffsets: (a: number, b: number, c: number) => [number, number, number];
20
22
  export const renderer_setStyle: (a: number, b: number, c: number) => [number, number, number];
21
23
  export const renderer_tileSize: (a: number) => number;
22
24
  export const simdEnabled: () => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reearth/ezu",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Painterly map renderer — WebAssembly bindings",
5
5
  "license": "MIT OR Apache-2.0",
6
6
  "repository": {
@@ -24,8 +24,8 @@
24
24
  "exports": {
25
25
  ".": {
26
26
  "workerd": {
27
- "types": "./bundler/ezu.d.ts",
28
- "default": "./bundler/ezu.js"
27
+ "types": "./workerd/ezu.d.ts",
28
+ "default": "./workerd/ezu.js"
29
29
  },
30
30
  "browser": {
31
31
  "types": "./web/ezu.d.ts",
@@ -51,12 +51,61 @@
51
51
  "./nodejs": {
52
52
  "types": "./nodejs/ezu.d.ts",
53
53
  "default": "./nodejs/ezu.js"
54
- }
54
+ },
55
+ "./workerd": {
56
+ "types": "./workerd/ezu.d.ts",
57
+ "default": "./workerd/ezu.js"
58
+ },
59
+ "./workerd/ezu.js": "./workerd/ezu.js",
60
+ "./bundler/ezu_bg.js": "./bundler/ezu_bg.js",
61
+ "./bundler/ezu_bg.wasm": "./bundler/ezu_bg.wasm",
62
+ "./web/ezu_bg.wasm": "./web/ezu_bg.wasm",
63
+ "./simd": {
64
+ "workerd": {
65
+ "types": "./simd/workerd/ezu.d.ts",
66
+ "default": "./simd/workerd/ezu.js"
67
+ },
68
+ "browser": {
69
+ "types": "./simd/web/ezu.d.ts",
70
+ "default": "./simd/web/ezu.js"
71
+ },
72
+ "node": {
73
+ "types": "./simd/nodejs/ezu.d.ts",
74
+ "default": "./simd/nodejs/ezu.js"
75
+ },
76
+ "import": {
77
+ "types": "./simd/bundler/ezu.d.ts",
78
+ "default": "./simd/bundler/ezu.js"
79
+ }
80
+ },
81
+ "./simd/web": {
82
+ "types": "./simd/web/ezu.d.ts",
83
+ "default": "./simd/web/ezu.js"
84
+ },
85
+ "./simd/bundler": {
86
+ "types": "./simd/bundler/ezu.d.ts",
87
+ "default": "./simd/bundler/ezu.js"
88
+ },
89
+ "./simd/nodejs": {
90
+ "types": "./simd/nodejs/ezu.d.ts",
91
+ "default": "./simd/nodejs/ezu.js"
92
+ },
93
+ "./simd/workerd": {
94
+ "types": "./simd/workerd/ezu.d.ts",
95
+ "default": "./simd/workerd/ezu.js"
96
+ },
97
+ "./simd/workerd/ezu.js": "./simd/workerd/ezu.js",
98
+ "./simd/bundler/ezu_bg.js": "./simd/bundler/ezu_bg.js",
99
+ "./simd/bundler/ezu_bg.wasm": "./simd/bundler/ezu_bg.wasm",
100
+ "./simd/web/ezu_bg.wasm": "./simd/web/ezu_bg.wasm",
101
+ "./package.json": "./package.json"
55
102
  },
56
103
  "files": [
57
104
  "web",
58
105
  "bundler",
59
106
  "nodejs",
107
+ "workerd",
108
+ "simd",
60
109
  "README.md",
61
110
  "LICENSE-MIT",
62
111
  "LICENSE-APACHE"
@@ -65,6 +114,11 @@
65
114
  "*.wasm",
66
115
  "./web/ezu.js",
67
116
  "./bundler/ezu.js",
68
- "./nodejs/ezu.js"
117
+ "./nodejs/ezu.js",
118
+ "./workerd/ezu.js",
119
+ "./simd/web/ezu.js",
120
+ "./simd/bundler/ezu.js",
121
+ "./simd/nodejs/ezu.js",
122
+ "./simd/workerd/ezu.js"
69
123
  ]
70
124
  }
@@ -0,0 +1,176 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ /**
5
+ * Buffered log sink that captures `tracing` events from the renderer.
6
+ *
7
+ * Construct once near the top of your bootstrap, then either set a
8
+ * callback for live forwarding (`onEvent(e => console.log(e))`) or
9
+ * `drainLines()` periodically to flush into a UI panel.
10
+ */
11
+ export class LogSink {
12
+ free(): void;
13
+ [Symbol.dispose](): void;
14
+ /**
15
+ * Drop all buffered records without returning them.
16
+ */
17
+ clear(): void;
18
+ /**
19
+ * Drain every buffered record. Returns a JS array of structured
20
+ * objects `{ level, target, message, fields, timestampMs }`.
21
+ */
22
+ drain(): Array<any>;
23
+ /**
24
+ * Drain buffered records and return pre-formatted strings — the
25
+ * same shape the CLI prints. Convenient for `console.log(lines.join('\n'))`.
26
+ */
27
+ drainLines(): string[];
28
+ /**
29
+ * `true` if no records are buffered.
30
+ */
31
+ isEmpty(): boolean;
32
+ /**
33
+ * Install (idempotently) the global tracing subscriber. `level` is
34
+ * an `EnvFilter` string — e.g. `"info"`, `"debug"`,
35
+ * `"info,ezu_graph::eval=debug"`. Honoured on first call only.
36
+ */
37
+ constructor(level: string);
38
+ /**
39
+ * Set (or clear with `null` / `undefined`) the per-event JS
40
+ * callback. The callback receives a structured record object.
41
+ *
42
+ * No-op in multithreaded (`threads`) builds — events can originate
43
+ * on rayon worker threads, so live forwarding to a main-thread JS
44
+ * callback isn't available. Use `drain` / `drainLines` instead.
45
+ */
46
+ onEvent(callback?: Function | null): void;
47
+ /**
48
+ * Resize the ring-buffer cap. Older entries are evicted FIFO once
49
+ * the buffer reaches the new cap. Default is 4096.
50
+ */
51
+ setCapacity(cap: number): void;
52
+ /**
53
+ * Number of records currently buffered.
54
+ */
55
+ readonly len: number;
56
+ }
57
+
58
+ /**
59
+ * Stateful WASM renderer.
60
+ */
61
+ export class Renderer {
62
+ free(): void;
63
+ [Symbol.dispose](): void;
64
+ /**
65
+ * Bind raw tile bytes under a `sources.<name>` entry from the style.
66
+ * The renderer dispatches on the source's declared `type`:
67
+ *
68
+ * - `mvt` / `pmtiles` → store raw MVT bytes per `(dx, dy)` neighbour
69
+ * offset (centre `coord: [0, 0]`, the default). Layers are bound as
70
+ * `<source>.<layer>` (centre) or `<source>.<layer>@dx,dy`
71
+ * (neighbours) when [`render_tile`] runs. Binding only the centre
72
+ * degrades cross-tile label collision to centre-only at borders.
73
+ * - `dem` / `raster` → store the raw bytes per `(dx, dy)` neighbour
74
+ * offset. The centre tile is `coord: [0, 0]` (default). Decoding
75
+ * and 3×3 stitching happen at render time once the tile id is known.
76
+ * - `geojson` (remote) → store raw bytes per `(dx, dy)` offset;
77
+ * projected per tile (and neighbour) at render time.
78
+ *
79
+ * `opts` is a JS object: `{ coord?: [dx, dy] }`. Throws
80
+ * `UnknownSource` if `name` doesn't match any entry in the style's
81
+ * `sources` block, `MvtDecode` if MVT bytes don't parse, and
82
+ * `DemDecode` for non-image DEM bytes (the decode itself runs at
83
+ * render time, but obvious cases are caught here).
84
+ */
85
+ bindSource(name: string, bytes: Uint8Array, opts?: object | null): void;
86
+ /**
87
+ * Names of every source with at least one pending binding.
88
+ * Order matches the style's `sources` declaration order.
89
+ */
90
+ boundSources(): string[];
91
+ /**
92
+ * Drop every pending source binding. Call between tile renders.
93
+ */
94
+ clearSources(): void;
95
+ /**
96
+ * Glyph ranges the currently bound features can require, as
97
+ * `{ [glyphsSourceName]: number[] }` where each number is a range
98
+ * start (`0`, `256`, `512`, …) — i.e. the `{range}` in a
99
+ * `…/{fontstack}/{range}.pbf` URL is `<start>-<start + 255>`.
100
+ *
101
+ * This host cannot fetch glyph ranges lazily, so every range a
102
+ * tile's labels touch must be bound before `renderTile`. Rather than
103
+ * scraping every string in the MVT, call this after binding the
104
+ * vector sources and bind exactly the listed ranges.
105
+ *
106
+ * It is an over-approximation, deliberately: a range is listed if
107
+ * *any* feature in a text layer carries the codepoint in a property
108
+ * the layer's `text` expression reads, without evaluating filters,
109
+ * zoom ranges, or the expression itself, and it is listed for every
110
+ * fontstack in that layer's fallback chain. So it never omits a
111
+ * range a label needs, and it may name a few that go unused. Text
112
+ * layers that build their string from something other than a `get`
113
+ * of a feature property (a literal, a `concat` of formatted values)
114
+ * contribute their literal text where it is a plain string.
115
+ */
116
+ neededGlyphRanges(): object;
117
+ /**
118
+ * Build a renderer from a style JSON document.
119
+ */
120
+ constructor(style_json: string);
121
+ /**
122
+ * Render a single tile using whatever sources are currently bound.
123
+ *
124
+ * `opts` (JS object, all fields optional):
125
+ * - `format`: `"png"` (default) / `"webp"` / `"rgba"`
126
+ * - `tileSize`, `pad`: override the style's canvas size for this
127
+ * call (hi-DPI / preview)
128
+ * - `png`: `{ compression?: "fast" | "default" | "best" }`
129
+ */
130
+ renderTile(z: number, x: number, y: number, opts?: object | null): Uint8Array;
131
+ /**
132
+ * Neighbour tile offsets the active style actually asks for from
133
+ * `source`, as an array of `[dx, dy]` pairs (never including the
134
+ * centre `[0, 0]`).
135
+ *
136
+ * Cross-tile label collision and edge-continuous DEM shading are the
137
+ * only things that read neighbours, and only for the sources they
138
+ * name. A host that fetches the full 3×3 window unconditionally
139
+ * therefore pays for up to eight tiles it will not look at; passing
140
+ * each offset from this list to `bindSource(name, bytes, { coord })`
141
+ * fetches exactly what the recipe needs. An empty array means the
142
+ * centre tile is enough.
143
+ *
144
+ * Throws `UnknownSource` if `name` is not declared in the style.
145
+ */
146
+ requestedNeighborOffsets(name: string): Array<any>;
147
+ /**
148
+ * Replace the active style. Returns the new node count. Invalidates
149
+ * the intermediate cache and drops any pending source bindings.
150
+ */
151
+ setStyle(style_json: string): number;
152
+ /**
153
+ * Effective attribution declared by the style (document +
154
+ * sources), joined with ` | `. Upstream TileJSON / PMTiles
155
+ * metadata is the JS host's concern — merge it on that side.
156
+ */
157
+ readonly attribution: string | undefined;
158
+ /**
159
+ * `tile-size` declared by the current style.
160
+ */
161
+ readonly tileSize: number;
162
+ }
163
+
164
+ /**
165
+ * Whether the wasm binary was compiled with `+simd128`. Lets the demo
166
+ * page label the renderer build accurately.
167
+ */
168
+ export function simdEnabled(): boolean;
169
+
170
+ /**
171
+ * Whether this build supports multithreaded rendering (compiled with
172
+ * the `threads` feature). When `false`, `initThreadPool` is absent and
173
+ * `renderTile`'s `parallel` option is a no-op. Mirrors `simdEnabled` so
174
+ * the host can label the build.
175
+ */
176
+ export function threadsEnabled(): boolean;
@@ -0,0 +1,9 @@
1
+ /* @ts-self-types="./ezu.d.ts" */
2
+ import * as wasm from "./ezu_bg.wasm";
3
+ import { __wbg_set_wasm } from "./ezu_bg.js";
4
+
5
+ __wbg_set_wasm(wasm);
6
+ wasm.__wbindgen_start();
7
+ export {
8
+ LogSink, Renderer, simdEnabled, threadsEnabled
9
+ } from "./ezu_bg.js";