@empty-sekai/sekai-custom-profile-sdk 0.3.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 (130) hide show
  1. package/LICENSE +235 -0
  2. package/LICENSE-EXCEPTION +32 -0
  3. package/NOTICE +11 -0
  4. package/README.en.md +456 -0
  5. package/README.md +458 -0
  6. package/dist/allium_renderer_wasm.js +14 -0
  7. package/dist/allium_renderer_wasm.wasm +0 -0
  8. package/dist/authoring.d.ts +14 -0
  9. package/dist/authoring.js +34 -0
  10. package/dist/cache/glyphPersistentCache.d.ts +145 -0
  11. package/dist/cache/glyphPersistentCache.js +346 -0
  12. package/dist/cache/indexedDbGlyphRecordStore.d.ts +26 -0
  13. package/dist/cache/indexedDbGlyphRecordStore.js +214 -0
  14. package/dist/cache/sessionImageResourceCache.d.ts +39 -0
  15. package/dist/cache/sessionImageResourceCache.js +156 -0
  16. package/dist/emscripten.d.ts +11 -0
  17. package/dist/emscripten.js +1 -0
  18. package/dist/fontProvider.d.ts +36 -0
  19. package/dist/fontProvider.js +84 -0
  20. package/dist/fontSdfAtlas.d.ts +92 -0
  21. package/dist/fontSdfAtlas.js +296 -0
  22. package/dist/gpu/browserSemanticResources.d.ts +64 -0
  23. package/dist/gpu/browserSemanticResources.js +232 -0
  24. package/dist/gpu/generalTextRenderPlacement.d.ts +8 -0
  25. package/dist/gpu/generalTextRenderPlacement.js +131 -0
  26. package/dist/gpu/previewTransformTextureLayout.d.ts +1 -0
  27. package/dist/gpu/previewTransformTextureLayout.js +12 -0
  28. package/dist/gpu/semanticCommandGeometry.d.ts +21 -0
  29. package/dist/gpu/semanticCommandGeometry.js +226 -0
  30. package/dist/gpu/semanticCommandPlanner.d.ts +131 -0
  31. package/dist/gpu/semanticCommandPlanner.js +203 -0
  32. package/dist/gpu/semanticTextGlyphBridge.d.ts +3 -0
  33. package/dist/gpu/semanticTextGlyphBridge.js +22 -0
  34. package/dist/gpu/semanticWebglSceneRenderer.d.ts +70 -0
  35. package/dist/gpu/semanticWebglSceneRenderer.js +211 -0
  36. package/dist/gpu/slotRanges.d.ts +5 -0
  37. package/dist/gpu/slotRanges.js +14 -0
  38. package/dist/gpu/webglSdfAtlasTexture.d.ts +17 -0
  39. package/dist/gpu/webglSdfAtlasTexture.js +72 -0
  40. package/dist/gpu/webglSdfGlyphPipeline.d.ts +26 -0
  41. package/dist/gpu/webglSdfGlyphPipeline.js +267 -0
  42. package/dist/gpu/webglSemanticCommandExecutor.d.ts +79 -0
  43. package/dist/gpu/webglSemanticCommandExecutor.js +686 -0
  44. package/dist/index.d.ts +18 -0
  45. package/dist/index.js +8 -0
  46. package/dist/interaction/numericTextRegions.d.ts +46 -0
  47. package/dist/interaction/numericTextRegions.js +44 -0
  48. package/dist/localizationProvider.d.ts +33 -0
  49. package/dist/localizationProvider.js +74 -0
  50. package/dist/originPrebuiltSdfAtlasPackage.d.ts +39 -0
  51. package/dist/originPrebuiltSdfAtlasPackage.js +316 -0
  52. package/dist/prebuiltSdfAtlas.d.ts +36 -0
  53. package/dist/prebuiltSdfAtlas.js +261 -0
  54. package/dist/protocol.d.ts +456 -0
  55. package/dist/protocol.js +1 -0
  56. package/dist/renderer.d.ts +218 -0
  57. package/dist/renderer.js +641 -0
  58. package/dist/resourceProvider.d.ts +24 -0
  59. package/dist/resourceProvider.js +41 -0
  60. package/dist/telemetry/rendererTelemetry.d.ts +158 -0
  61. package/dist/telemetry/rendererTelemetry.js +232 -0
  62. package/dist/third-party/freetype/FTL.txt +169 -0
  63. package/dist/types/atlas.d.ts +90 -0
  64. package/dist/types/atlas.js +1 -0
  65. package/dist/types/authoring.d.ts +81 -0
  66. package/dist/types/authoring.js +1 -0
  67. package/dist/types/core.d.ts +128 -0
  68. package/dist/types/core.js +1 -0
  69. package/dist/types/freeType.d.ts +54 -0
  70. package/dist/types/freeType.js +13 -0
  71. package/dist/types/glyph.d.ts +33 -0
  72. package/dist/types/glyph.js +1 -0
  73. package/dist/types/layout.d.ts +25 -0
  74. package/dist/types/layout.js +1 -0
  75. package/dist/types/text.d.ts +28 -0
  76. package/dist/types/text.js +1 -0
  77. package/dist/worker/glyphWorkScheduler.d.ts +29 -0
  78. package/dist/worker/glyphWorkScheduler.js +107 -0
  79. package/dist/worker-client.d.ts +114 -0
  80. package/dist/worker-client.js +413 -0
  81. package/dist/worker.d.ts +1 -0
  82. package/dist/worker.js +708 -0
  83. package/package.json +46 -0
  84. package/src/atlas.rs +652 -0
  85. package/src/authoring.ts +42 -0
  86. package/src/authoring_runtime.rs +303 -0
  87. package/src/cache/glyphPersistentCache.ts +463 -0
  88. package/src/cache/indexedDbGlyphRecordStore.ts +238 -0
  89. package/src/cache/sessionImageResourceCache.ts +186 -0
  90. package/src/edt.rs +97 -0
  91. package/src/emscripten.ts +17 -0
  92. package/src/fontProvider.ts +127 -0
  93. package/src/fontSdfAtlas.ts +431 -0
  94. package/src/geometry.rs +149 -0
  95. package/src/glyph_plan.rs +226 -0
  96. package/src/gpu/browserSemanticResources.ts +294 -0
  97. package/src/gpu/generalTextRenderPlacement.ts +175 -0
  98. package/src/gpu/previewTransformTextureLayout.ts +12 -0
  99. package/src/gpu/semanticCommandGeometry.ts +260 -0
  100. package/src/gpu/semanticCommandPlanner.ts +280 -0
  101. package/src/gpu/semanticTextGlyphBridge.ts +35 -0
  102. package/src/gpu/semanticWebglSceneRenderer.ts +261 -0
  103. package/src/gpu/slotRanges.ts +15 -0
  104. package/src/gpu/webglSdfAtlasTexture.ts +69 -0
  105. package/src/gpu/webglSdfGlyphPipeline.ts +299 -0
  106. package/src/gpu/webglSemanticCommandExecutor.ts +739 -0
  107. package/src/index.ts +84 -0
  108. package/src/interaction/numericTextRegions.ts +80 -0
  109. package/src/layout.rs +1882 -0
  110. package/src/lib.rs +1443 -0
  111. package/src/localizationProvider.ts +113 -0
  112. package/src/main.rs +55 -0
  113. package/src/masterdata_runtime.rs +496 -0
  114. package/src/originPrebuiltSdfAtlasPackage.ts +403 -0
  115. package/src/prebuiltSdfAtlas.ts +306 -0
  116. package/src/protocol.ts +150 -0
  117. package/src/renderer.ts +792 -0
  118. package/src/resourceProvider.ts +69 -0
  119. package/src/scene.rs +665 -0
  120. package/src/telemetry/rendererTelemetry.ts +358 -0
  121. package/src/types/atlas.ts +80 -0
  122. package/src/types/authoring.ts +85 -0
  123. package/src/types/core.ts +110 -0
  124. package/src/types/freeType.ts +63 -0
  125. package/src/types/glyph.ts +33 -0
  126. package/src/types/layout.ts +28 -0
  127. package/src/types/text.ts +28 -0
  128. package/src/worker/glyphWorkScheduler.ts +130 -0
  129. package/src/worker-client.ts +484 -0
  130. package/src/worker.ts +895 -0
@@ -0,0 +1,81 @@
1
+ export type AuthoringElementId = number;
2
+ export declare const AUTHORING_CHECKPOINT_SCHEMA: "allium.renderer-authoring-checkpoint/v1";
3
+ export type AuthoringCategory = "bondsHonors" | "cardMembers" | "collections" | "generalBackgrounds" | "generals" | "honors" | "others" | "shapes" | "stamps" | "standMembers" | "storyBackgrounds" | "texts";
4
+ export type AuthoringCommand = {
5
+ kind: "create";
6
+ page: number;
7
+ category: AuthoringCategory;
8
+ element: Record<string, unknown>;
9
+ } | {
10
+ kind: "duplicate";
11
+ id: AuthoringElementId;
12
+ } | {
13
+ kind: "delete";
14
+ id: AuthoringElementId;
15
+ } | {
16
+ kind: "set_transform";
17
+ id: AuthoringElementId;
18
+ position?: [number, number, number] | null;
19
+ scale?: [number, number, number] | null;
20
+ rotation?: [number, number, number, number] | null;
21
+ } | {
22
+ kind: "set_lock";
23
+ id: AuthoringElementId;
24
+ lock: boolean;
25
+ } | {
26
+ kind: "set_visible";
27
+ id: AuthoringElementId;
28
+ visible: boolean;
29
+ } | {
30
+ kind: "set_parameters";
31
+ id: AuthoringElementId;
32
+ values: Record<string, unknown>;
33
+ } | {
34
+ kind: "change_layer";
35
+ id: AuthoringElementId;
36
+ layer: number;
37
+ };
38
+ export type AuthoringChangeKind = "inserted" | "updated" | "removed";
39
+ export type AuthoringElementChange = {
40
+ id: AuthoringElementId;
41
+ page: number;
42
+ category: AuthoringCategory;
43
+ kind: AuthoringChangeKind;
44
+ element: Record<string, unknown> | null;
45
+ };
46
+ export type AuthoringSelection = {
47
+ id: AuthoringElementId;
48
+ page: number;
49
+ category: AuthoringCategory;
50
+ index: number;
51
+ element: Record<string, unknown>;
52
+ };
53
+ export type AuthoringDelta = {
54
+ revision: number;
55
+ changes: AuthoringElementChange[];
56
+ canUndo: boolean;
57
+ canRedo: boolean;
58
+ selectedId: AuthoringElementId | null;
59
+ selected: AuthoringSelection | null;
60
+ pageChanges: AuthoringPageChange[];
61
+ };
62
+ export type AuthoringPageChangeKind = "inserted" | "removed" | "moved";
63
+ export type AuthoringPageChange = {
64
+ kind: AuthoringPageChangeKind;
65
+ page: number;
66
+ fromPage: number | null;
67
+ };
68
+ export type GameProfileDocument = {
69
+ userCustomProfileCards: Array<Record<string, unknown>>;
70
+ };
71
+ /** Opaque renderer-owned history payload. Callers may persist it but must not edit its internals. */
72
+ export type AuthoringCheckpoint = {
73
+ schema: typeof AUTHORING_CHECKPOINT_SCHEMA;
74
+ document: GameProfileDocument;
75
+ ids: unknown[];
76
+ nextId: number;
77
+ revision: number;
78
+ undo: unknown[];
79
+ redo: unknown[];
80
+ selectedId: AuthoringElementId | null;
81
+ };
@@ -0,0 +1 @@
1
+ export const AUTHORING_CHECKPOINT_SCHEMA = "allium.renderer-authoring-checkpoint/v1";
@@ -0,0 +1,128 @@
1
+ export type StableId = string;
2
+ export type CoreControlBinding = {
3
+ kind: "tab_option";
4
+ control_id: StableId;
5
+ value: string;
6
+ } | {
7
+ kind: "scroll_content";
8
+ control_id: StableId;
9
+ } | {
10
+ kind: "scroll_thumb";
11
+ control_id: StableId;
12
+ } | {
13
+ kind: "scroll_viewport";
14
+ control_id: StableId;
15
+ };
16
+ export type CoreLayerPatch = {
17
+ layer_id: StableId;
18
+ render_mask: boolean | null;
19
+ transform: {
20
+ dx: number;
21
+ dy: number;
22
+ } | null;
23
+ };
24
+ export type CoreCommandPatch = {
25
+ command_id: StableId;
26
+ slot: number;
27
+ render_mask: boolean | null;
28
+ transform: {
29
+ dx: number;
30
+ dy: number;
31
+ } | null;
32
+ };
33
+ export type CoreSceneDelta = {
34
+ schema_major: number;
35
+ schema_minor: number;
36
+ scene_id: StableId;
37
+ base_revision: number;
38
+ revision: number;
39
+ tick: number;
40
+ dirty: {
41
+ mask: boolean;
42
+ transform: boolean;
43
+ material: boolean;
44
+ layout: boolean;
45
+ command: boolean;
46
+ atlas: boolean;
47
+ control: boolean;
48
+ };
49
+ patches: CoreLayerPatch[];
50
+ command_patches: CoreCommandPatch[];
51
+ error?: string;
52
+ };
53
+ export type CoreInteractionRegion = {
54
+ id: StableId;
55
+ layer_id: StableId;
56
+ role: string;
57
+ bounds: {
58
+ x: number;
59
+ y: number;
60
+ width: number;
61
+ height: number;
62
+ };
63
+ quad: Array<[number, number]>;
64
+ matrix: [number, number, number, number, number, number];
65
+ hit_geometry: Array<[number, number]>;
66
+ clip: Array<[number, number]> | null;
67
+ control_bindings: CoreControlBinding[];
68
+ resolved_data: Record<string, unknown>;
69
+ capabilities: string[];
70
+ render_mask: boolean;
71
+ };
72
+ export type CoreLayerTableEntry = {
73
+ layer_id: StableId;
74
+ parent_id: StableId | null;
75
+ slot: number;
76
+ subtree_start: number;
77
+ subtree_end: number;
78
+ };
79
+ export type CoreSceneDump = {
80
+ schema: "allium.scene-dump";
81
+ schema_major: number;
82
+ schema_minor: number;
83
+ coordinate_space: "card-device-v1";
84
+ scene_id: StableId;
85
+ tick: number;
86
+ revisions: Record<string, number>;
87
+ layer_table: CoreLayerTableEntry[];
88
+ layer_tree: Array<[StableId, StableId | null]>;
89
+ layers: Array<Record<string, unknown>>;
90
+ interaction_regions: CoreInteractionRegion[];
91
+ component_controls: Array<Record<string, unknown>>;
92
+ command_states: Array<Record<string, unknown>>;
93
+ telemetry: Record<string, number>;
94
+ error?: string;
95
+ };
96
+ export type CoreSceneCreateResponse = {
97
+ handle: number;
98
+ layer_bindings: Array<{
99
+ source_key: string;
100
+ layer_id: StableId;
101
+ }>;
102
+ snapshot: {
103
+ schema_major: number;
104
+ schema_minor: number;
105
+ scene_id: StableId;
106
+ revisions: Record<string, number>;
107
+ layer_table: CoreLayerTableEntry[];
108
+ layer_sources: Array<{
109
+ id: StableId;
110
+ matrix: [number, number, number, number, number, number];
111
+ } & Record<string, unknown>>;
112
+ commands: Array<{
113
+ layer_id: StableId;
114
+ render_mask: boolean;
115
+ transform: {
116
+ dx: number;
117
+ dy: number;
118
+ };
119
+ command_start: number;
120
+ command_count: number;
121
+ }>;
122
+ semantic_commands: Array<Record<string, unknown>>;
123
+ interaction_regions: CoreInteractionRegion[];
124
+ component_controls: Array<Record<string, unknown>>;
125
+ command_states: Array<Record<string, unknown>>;
126
+ };
127
+ error?: string;
128
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,54 @@
1
+ export type FreeTypeGlyph = {
2
+ key: string;
3
+ region: string;
4
+ family: string;
5
+ font_source_hash: string;
6
+ ch: string;
7
+ glyph_index: number;
8
+ width: number;
9
+ height: number;
10
+ bearing_x: number;
11
+ bearing_y: number;
12
+ x_offset: number;
13
+ y_offset: number;
14
+ advance: number;
15
+ plane_bearing_x: number;
16
+ plane_bearing_y: number;
17
+ plane_width: number;
18
+ plane_height: number;
19
+ drawable: boolean;
20
+ pixels?: number[] | Uint8Array;
21
+ pixels_base64?: string;
22
+ };
23
+ export type FreeTypeGlyphMapBatch = {
24
+ region: string;
25
+ family: string;
26
+ font_source_hash: string;
27
+ glyphs: Array<{
28
+ ch: string;
29
+ glyph_index: number;
30
+ }>;
31
+ missing: string[];
32
+ error?: string;
33
+ };
34
+ export type FreeTypeGlyphBatchPerf = {
35
+ total_ms: number;
36
+ face_load_ms: number;
37
+ glyph_total_ms: number;
38
+ glyph_count: number;
39
+ per_glyph_avg_ms: number;
40
+ total_pixel_count: number;
41
+ avg_pixels_per_glyph: number;
42
+ };
43
+ export type FreeTypeGlyphBatch = {
44
+ region: string;
45
+ family: string;
46
+ font_source_hash: string;
47
+ base_size: number;
48
+ spread: number;
49
+ glyphs: FreeTypeGlyph[];
50
+ missing: string[];
51
+ perf?: FreeTypeGlyphBatchPerf;
52
+ error?: string;
53
+ };
54
+ export declare function decodeFreeTypePixels(glyph: FreeTypeGlyph): Uint8Array;
@@ -0,0 +1,13 @@
1
+ export function decodeFreeTypePixels(glyph) {
2
+ if (glyph.pixels instanceof Uint8Array)
3
+ return glyph.pixels;
4
+ if (Array.isArray(glyph.pixels))
5
+ return new Uint8Array(glyph.pixels);
6
+ if (!glyph.pixels_base64)
7
+ return new Uint8Array(glyph.width * glyph.height);
8
+ const raw = atob(glyph.pixels_base64);
9
+ const pixels = new Uint8Array(raw.length);
10
+ for (let index = 0; index < raw.length; index += 1)
11
+ pixels[index] = raw.charCodeAt(index);
12
+ return pixels;
13
+ }
@@ -0,0 +1,33 @@
1
+ /** A glyph instance produced by the shared Rust layout engine. */
2
+ export type GlyphInstance = {
3
+ layerId: string;
4
+ plainTextIndex: number;
5
+ char: string;
6
+ drawable: boolean;
7
+ glyphKey: string;
8
+ atlasPage: number;
9
+ z: number;
10
+ quad: Array<[number, number, number, number, number]>;
11
+ charPosition: [string, number, number, number, number, number];
12
+ charOp: [string, number, number, number, number, number, number];
13
+ charQuad: [string, Array<[number, number]>];
14
+ deviceCharPosition: [string, number, number];
15
+ deviceCharQuad: [string, Array<[number, number]>];
16
+ deviceGlyphQuad: [string, Array<[number, number]>];
17
+ layoutMetrics: {
18
+ lineWidths: number[];
19
+ rectWidths: number[];
20
+ boxW: number;
21
+ anchorBase: number;
22
+ lineOffsets: number[];
23
+ };
24
+ fill: [number, number, number, number];
25
+ outline: [number, number, number, number];
26
+ outlineWidth: number;
27
+ shaderFontSize: number;
28
+ shaderFaceScale: number;
29
+ shaderFaceBias: number;
30
+ shaderUnderlayScale: number;
31
+ shaderUnderlayBias: number;
32
+ shaderVertexAlpha: number;
33
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import type { GlyphInstance } from "./glyph.js";
2
+ export type CoreDynamicProgramDescriptor = {
3
+ layerId: string;
4
+ percent: number;
5
+ lineAdvancesTmp: number[][];
6
+ rotationDeg: number;
7
+ scaleX: number;
8
+ };
9
+ export type WasmLayoutBatch = {
10
+ version: number;
11
+ source: string;
12
+ instances: GlyphInstance[];
13
+ dynamicPrograms: CoreDynamicProgramDescriptor[];
14
+ error?: string;
15
+ };
16
+ export type WasmGlyphDemandBatch = {
17
+ version: number;
18
+ source: "wasm-tmp-glyph-demand";
19
+ requests: Array<{
20
+ region: string;
21
+ family: string;
22
+ font_source_hash: string;
23
+ char: string;
24
+ }>;
25
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ /** Text command input consumed by the shared Rust TMP layout engine. */
2
+ export type TextLayer = {
3
+ id: string;
4
+ parentId?: string | null;
5
+ documentKey: string;
6
+ z: number;
7
+ text: string;
8
+ authoredVisible: boolean;
9
+ region: string;
10
+ fontId: number;
11
+ fontFamily: string;
12
+ fontSourceHash: string;
13
+ x: number;
14
+ y: number;
15
+ rotationDeg: number;
16
+ scaleX: number;
17
+ scaleY: number;
18
+ skewX: number;
19
+ fontSize: number;
20
+ color: [number, number, number, number];
21
+ outlineColor: [number, number, number, number];
22
+ colorRgb: [number, number, number];
23
+ colorId: number;
24
+ outlineColorId: number;
25
+ outlineWidth: number;
26
+ lineSpacing: number;
27
+ textType: number;
28
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ export type KeyedGlyphJob = {
2
+ key: string;
3
+ };
4
+ export type KeyedGlyphResult = {
5
+ key: string;
6
+ };
7
+ export type GlyphWorkSchedulerStats = {
8
+ dispatches: number;
9
+ dispatchedJobs: number;
10
+ cacheHits: number;
11
+ coalesced: number;
12
+ failures: number;
13
+ pending: number;
14
+ cached: number;
15
+ };
16
+ export declare class GlyphWorkScheduler<Job extends KeyedGlyphJob, Result extends KeyedGlyphResult> {
17
+ private readonly dispatch;
18
+ private readonly cache;
19
+ private readonly pending;
20
+ private readonly counters;
21
+ constructor(dispatch: (jobs: readonly Job[]) => Promise<readonly Result[]>);
22
+ run(jobs: readonly Job[]): Promise<Result[]>;
23
+ get(key: string): Result | undefined;
24
+ prime(results: readonly Result[]): void;
25
+ delete(key: string): boolean;
26
+ clear(): void;
27
+ stats(): GlyphWorkSchedulerStats;
28
+ private dispatchFresh;
29
+ }
@@ -0,0 +1,107 @@
1
+ export class GlyphWorkScheduler {
2
+ dispatch;
3
+ cache = new Map();
4
+ pending = new Map();
5
+ counters = {
6
+ dispatches: 0,
7
+ dispatchedJobs: 0,
8
+ cacheHits: 0,
9
+ coalesced: 0,
10
+ failures: 0,
11
+ };
12
+ constructor(dispatch) {
13
+ this.dispatch = dispatch;
14
+ }
15
+ run(jobs) {
16
+ const ordered = [];
17
+ const fresh = [];
18
+ const freshKeys = new Set();
19
+ for (const job of jobs) {
20
+ const cached = this.cache.get(job.key);
21
+ if (cached) {
22
+ this.counters.cacheHits += 1;
23
+ ordered.push(Promise.resolve(cached));
24
+ continue;
25
+ }
26
+ const inFlight = this.pending.get(job.key);
27
+ if (inFlight) {
28
+ this.counters.coalesced += 1;
29
+ ordered.push(inFlight.promise);
30
+ continue;
31
+ }
32
+ const deferred = createDeferred();
33
+ this.pending.set(job.key, deferred);
34
+ ordered.push(deferred.promise);
35
+ if (!freshKeys.has(job.key)) {
36
+ freshKeys.add(job.key);
37
+ fresh.push(job);
38
+ }
39
+ }
40
+ if (fresh.length > 0)
41
+ void this.dispatchFresh(fresh);
42
+ return Promise.all(ordered);
43
+ }
44
+ get(key) {
45
+ const value = this.cache.get(key);
46
+ if (value)
47
+ this.counters.cacheHits += 1;
48
+ return value;
49
+ }
50
+ prime(results) {
51
+ for (const result of results) {
52
+ if (!this.pending.has(result.key))
53
+ this.cache.set(result.key, result);
54
+ }
55
+ }
56
+ delete(key) {
57
+ return this.cache.delete(key);
58
+ }
59
+ clear() {
60
+ this.cache.clear();
61
+ }
62
+ stats() {
63
+ return {
64
+ ...this.counters,
65
+ pending: this.pending.size,
66
+ cached: this.cache.size,
67
+ };
68
+ }
69
+ async dispatchFresh(jobs) {
70
+ this.counters.dispatches += 1;
71
+ this.counters.dispatchedJobs += jobs.length;
72
+ try {
73
+ const results = await this.dispatch(jobs);
74
+ const byKey = new Map(results.map((result) => [result.key, result]));
75
+ for (const job of jobs) {
76
+ const deferred = this.pending.get(job.key);
77
+ if (!deferred)
78
+ continue;
79
+ const result = byKey.get(job.key);
80
+ this.pending.delete(job.key);
81
+ if (!result) {
82
+ deferred.reject(new Error(`glyph worker omitted result for ${job.key}`));
83
+ continue;
84
+ }
85
+ this.cache.set(job.key, result);
86
+ deferred.resolve(result);
87
+ }
88
+ }
89
+ catch (error) {
90
+ this.counters.failures += 1;
91
+ for (const job of jobs) {
92
+ const deferred = this.pending.get(job.key);
93
+ this.pending.delete(job.key);
94
+ deferred?.reject(error);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ function createDeferred() {
100
+ let resolve;
101
+ let reject;
102
+ const promise = new Promise((resolvePromise, rejectPromise) => {
103
+ resolve = resolvePromise;
104
+ reject = rejectPromise;
105
+ });
106
+ return { promise, resolve, reject };
107
+ }
@@ -0,0 +1,114 @@
1
+ import { type GlyphBatchRequest, type LayerMaskOverride, type RegisteredFont, type RendererFontContract, type RendererWorkerRequest, type RendererWorkerResult, type RendererWorkerStats } from "./protocol.js";
2
+ import type { CoreSceneCreateResponse, CoreSceneDelta, CoreSceneDump, StableId } from "./types/core.js";
3
+ import type { FreeTypeGlyphBatch, FreeTypeGlyphMapBatch } from "./types/freeType.js";
4
+ import type { WasmGlyphDemandBatch, WasmLayoutBatch } from "./types/layout.js";
5
+ import type { AtlasGenerateRequest, AtlasGlyphRecord, AtlasPageUpdate, AtlasResolveResult, AtlasStats, GlyphRasterPlan } from "./types/atlas.js";
6
+ import type { AuthoringCheckpoint, AuthoringCommand, AuthoringDelta, AuthoringSelection, GameProfileDocument } from "./types/authoring.js";
7
+ export type RendererWorkerClientOptions = {
8
+ workerUrl?: string | URL;
9
+ moduleUrl?: string | URL;
10
+ wasmUrl?: string | URL;
11
+ workerFactory?: (url: string | URL) => Worker;
12
+ };
13
+ export declare class RendererWorkerClient {
14
+ private readonly worker;
15
+ private readonly pending;
16
+ private sequence;
17
+ private closed;
18
+ private constructor();
19
+ static create(options?: RendererWorkerClientOptions): Promise<RendererWorkerClient>;
20
+ registerFont(font: RegisteredFont): Promise<void>;
21
+ contract(): Promise<RendererFontContract>;
22
+ mapGlyphs(request: GlyphBatchRequest): Promise<FreeTypeGlyphMapBatch>;
23
+ planGlyphs(request: GlyphBatchRequest): Promise<GlyphRasterPlan>;
24
+ buildGlyphs(request: GlyphBatchRequest): Promise<FreeTypeGlyphBatch>;
25
+ layoutText(request: unknown): Promise<WasmLayoutBatch>;
26
+ glyphDemand(request: unknown): Promise<WasmGlyphDemandBatch>;
27
+ createAtlas(): Promise<RendererAtlas>;
28
+ createAuthoringDocument(profile?: unknown): Promise<RendererAuthoringDocument>;
29
+ restoreAuthoringDocument(checkpoint: AuthoringCheckpoint): Promise<RendererAuthoringDocument>;
30
+ createMasterData(region: string, revision: string): Promise<RendererMasterData>;
31
+ stats(): Promise<RendererWorkerStats>;
32
+ terminate(): void;
33
+ sceneRequest(kind: RendererWorkerRequest["kind"], payload: unknown): Promise<RendererWorkerResult>;
34
+ private request;
35
+ private receive;
36
+ private failAll;
37
+ }
38
+ export declare class RendererAuthoringDocument {
39
+ private readonly client;
40
+ readonly id: string;
41
+ readonly initialDocument: GameProfileDocument;
42
+ readonly initialRevision: number;
43
+ private destroyed;
44
+ constructor(client: RendererWorkerClient, id: string, initialDocument: GameProfileDocument, initialRevision: number);
45
+ apply(command: AuthoringCommand): Promise<AuthoringDelta>;
46
+ select(id: number | null): Promise<AuthoringDelta>;
47
+ elements(): Promise<AuthoringSelection[]>;
48
+ beginGesture(id: number): Promise<AuthoringDelta>;
49
+ previewGesture(command: Extract<AuthoringCommand, {
50
+ kind: "set_transform" | "set_parameters";
51
+ }>): Promise<AuthoringDelta>;
52
+ commitGesture(): Promise<AuthoringDelta>;
53
+ cancelGesture(): Promise<AuthoringDelta>;
54
+ appendPage(): Promise<AuthoringDelta>;
55
+ duplicatePage(page: number): Promise<AuthoringDelta>;
56
+ deletePage(page: number): Promise<AuthoringDelta>;
57
+ movePage(fromPage: number, page: number): Promise<AuthoringDelta>;
58
+ undo(): Promise<AuthoringDelta | null>;
59
+ redo(): Promise<AuthoringDelta | null>;
60
+ export(): Promise<GameProfileDocument>;
61
+ checkpoint(): Promise<AuthoringCheckpoint>;
62
+ destroy(): Promise<void>;
63
+ private history;
64
+ private delta;
65
+ private assertAlive;
66
+ }
67
+ export declare class RendererAtlas {
68
+ private readonly client;
69
+ readonly id: string;
70
+ readonly initialStats: AtlasStats;
71
+ private destroyed;
72
+ constructor(client: RendererWorkerClient, id: string, initialStats: AtlasStats);
73
+ resolve(keys: string[], cached: AtlasGlyphRecord[], generate: AtlasGenerateRequest[]): Promise<AtlasResolveResult>;
74
+ pages(revisions: ReadonlyMap<number, number>): Promise<AtlasPageUpdate[]>;
75
+ release(lease: number): Promise<void>;
76
+ destroy(): Promise<void>;
77
+ private assertAlive;
78
+ }
79
+ export declare class RendererMasterData {
80
+ private readonly client;
81
+ readonly id: string;
82
+ readonly region: string;
83
+ readonly revision: string;
84
+ readonly requiredTables: readonly string[];
85
+ private destroyed;
86
+ constructor(client: RendererWorkerClient, id: string, region: string, revision: string, requiredTables: readonly string[]);
87
+ putTable(name: string, table: unknown): Promise<Record<string, unknown>>;
88
+ seal(): Promise<Record<string, unknown>>;
89
+ prepareProfile(request: unknown): Promise<Record<string, unknown>>;
90
+ destroy(): Promise<void>;
91
+ private report;
92
+ private assertAlive;
93
+ }
94
+ export declare class RendererScene {
95
+ private readonly client;
96
+ readonly id: string;
97
+ readonly initial: CoreSceneCreateResponse;
98
+ private destroyed;
99
+ constructor(client: RendererWorkerClient, id: string, initial: CoreSceneCreateResponse);
100
+ advance(tick: number): Promise<CoreSceneDelta>;
101
+ setLayerVisible(layerId: StableId, visible: boolean): Promise<CoreSceneDelta>;
102
+ setLayerMasks(expectedLayerTableRevision: number, overrides: LayerMaskOverride[]): Promise<CoreSceneDelta>;
103
+ setTab(controlId: StableId, value: string): Promise<CoreSceneDelta>;
104
+ setScrollOffset(controlId: StableId, offset: number): Promise<CoreSceneDelta>;
105
+ scrollBy(controlId: StableId, delta: number): Promise<CoreSceneDelta>;
106
+ dump(): Promise<CoreSceneDump>;
107
+ destroy(): Promise<void>;
108
+ private delta;
109
+ private assertAlive;
110
+ }
111
+ export declare class RendererWorkerError extends Error {
112
+ readonly code: string;
113
+ constructor(code: string, message: string);
114
+ }