@drawcall/glts 0.1.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.
@@ -0,0 +1,302 @@
1
+ import * as THREE from "three";
2
+ import { GLTSError } from "./errors.js";
3
+ import { ModuleURLStore } from "./module-url-store.js";
4
+ let runtimeSequence = 0;
5
+ function nextRuntimeKey() {
6
+ runtimeSequence += 1;
7
+ return `__glts_runtime_${Date.now()}_${runtimeSequence}`;
8
+ }
9
+ function disposableMethod(value) {
10
+ return Reflect.get(value, "dispose");
11
+ }
12
+ function callDispose(value) {
13
+ const method = disposableMethod(value);
14
+ if (typeof method !== "function") {
15
+ return;
16
+ }
17
+ Reflect.apply(method, value, []);
18
+ }
19
+ export class WrapperRuntime {
20
+ #runtimeKey = nextRuntimeKey();
21
+ #moduleURLs;
22
+ #assetClasses = new Map();
23
+ #wrapperClasses = new Map();
24
+ #wrapperModuleURLs = new Map();
25
+ #records = new WeakMap();
26
+ #liveWrappers = new Map();
27
+ #constructionScope;
28
+ #disposed = false;
29
+ threeModuleURL;
30
+ constructor(moduleURLs) {
31
+ this.#moduleURLs = moduleURLs;
32
+ Reflect.set(globalThis, this.#runtimeKey, this);
33
+ this.threeModuleURL = moduleURLs.create(this.#createThreeBridgeSource());
34
+ }
35
+ getThreeExport(name) {
36
+ return Reflect.get(THREE, name);
37
+ }
38
+ getWrapperConstructor(url) {
39
+ const existing = this.#wrapperClasses.get(url);
40
+ if (existing) {
41
+ return existing;
42
+ }
43
+ const runtime = this;
44
+ class GLTSWrapper extends THREE.Group {
45
+ constructor() {
46
+ super();
47
+ runtime.#mountWrapper(this, url);
48
+ }
49
+ }
50
+ this.#wrapperClasses.set(url, GLTSWrapper);
51
+ return GLTSWrapper;
52
+ }
53
+ getWrapperModuleURL(url) {
54
+ const existing = this.#wrapperModuleURLs.get(url);
55
+ if (existing) {
56
+ return existing;
57
+ }
58
+ const source = [
59
+ `const runtime = globalThis[${JSON.stringify(this.#runtimeKey)}];`,
60
+ `if (!runtime) throw new Error(${JSON.stringify(`GLTS runtime is unavailable for ${url}`)});`,
61
+ `const Wrapper = runtime.getWrapperConstructor(${JSON.stringify(url)});`,
62
+ "export default Wrapper;"
63
+ ].join("\n");
64
+ const moduleURL = this.#moduleURLs.create(source);
65
+ this.#wrapperModuleURLs.set(url, moduleURL);
66
+ return moduleURL;
67
+ }
68
+ setAssetClass(url, assetClass) {
69
+ this.#assertActive();
70
+ this.#assetClasses.set(url, assetClass);
71
+ }
72
+ createRoot(url) {
73
+ this.#assertActive();
74
+ return this.#withConstructionTransaction(() => {
75
+ const Wrapper = this.getWrapperConstructor(url);
76
+ return new Wrapper();
77
+ });
78
+ }
79
+ replace(url, nextClass) {
80
+ this.#assertActive();
81
+ const wrappers = [...(this.#liveWrappers.get(url) ?? [])];
82
+ const staged = [];
83
+ try {
84
+ this.#withConstructionTransaction(() => {
85
+ for (const wrapper of wrappers) {
86
+ const record = this.#records.get(wrapper);
87
+ if (!record || record.disposed) {
88
+ continue;
89
+ }
90
+ staged.push({
91
+ wrapper,
92
+ record,
93
+ previous: record.raw,
94
+ next: this.#constructRaw(url, nextClass)
95
+ });
96
+ }
97
+ });
98
+ }
99
+ catch (error) {
100
+ const cleanupErrors = this.#disposeStaged(staged);
101
+ if (cleanupErrors.length > 0) {
102
+ throw new GLTSError("Replacement construction and cleanup both failed", { url, phase: "reload" }, new AggregateError([error, ...cleanupErrors]));
103
+ }
104
+ throw error;
105
+ }
106
+ this.#assetClasses.set(url, nextClass);
107
+ for (const replacement of staged) {
108
+ replacement.wrapper.remove(replacement.previous);
109
+ replacement.wrapper.add(replacement.next);
110
+ replacement.record.raw = replacement.next;
111
+ }
112
+ const disposalErrors = [];
113
+ for (const replacement of staged) {
114
+ try {
115
+ this.#disposeRaw(replacement.previous);
116
+ }
117
+ catch (error) {
118
+ disposalErrors.push(error);
119
+ }
120
+ }
121
+ if (disposalErrors.length > 0) {
122
+ throw new GLTSError("Replacement committed, but one or more old instances failed to dispose", { url, phase: "dispose" }, new AggregateError(disposalErrors));
123
+ }
124
+ }
125
+ disposeWrapper(wrapper) {
126
+ const record = this.#records.get(wrapper);
127
+ if (!record || record.disposed) {
128
+ return;
129
+ }
130
+ record.disposed = true;
131
+ wrapper.remove(record.raw);
132
+ this.#removeLiveWrapper(wrapper, record.url);
133
+ this.#records.delete(wrapper);
134
+ this.#disposeRaw(record.raw);
135
+ }
136
+ dispose() {
137
+ if (this.#disposed) {
138
+ return;
139
+ }
140
+ const wrappers = [...this.#liveWrappers.values()].flatMap((group) => [...group]);
141
+ const errors = [];
142
+ for (const wrapper of wrappers) {
143
+ try {
144
+ this.disposeWrapper(wrapper);
145
+ }
146
+ catch (error) {
147
+ errors.push(error);
148
+ }
149
+ }
150
+ this.#disposed = true;
151
+ Reflect.deleteProperty(globalThis, this.#runtimeKey);
152
+ this.#moduleURLs.dispose();
153
+ if (errors.length > 0) {
154
+ throw new GLTSError("One or more assets failed to dispose", { url: "glts://runtime", phase: "dispose" }, new AggregateError(errors));
155
+ }
156
+ }
157
+ #mountWrapper(wrapper, url) {
158
+ const mount = () => {
159
+ const assetClass = this.#assetClasses.get(url);
160
+ if (!assetClass) {
161
+ throw new GLTSError("Asset has not been evaluated", {
162
+ url,
163
+ phase: "construct"
164
+ });
165
+ }
166
+ const raw = this.#constructRaw(url, assetClass);
167
+ const record = { url, raw, disposed: false };
168
+ this.#records.set(wrapper, record);
169
+ this.#addLiveWrapper(wrapper, url);
170
+ this.#constructionScope?.add(wrapper);
171
+ wrapper.add(raw);
172
+ };
173
+ if (this.#constructionScope) {
174
+ mount();
175
+ return;
176
+ }
177
+ this.#withConstructionTransaction(mount);
178
+ }
179
+ #constructRaw(url, assetClass) {
180
+ let value;
181
+ try {
182
+ value = new assetClass();
183
+ }
184
+ catch (error) {
185
+ throw new GLTSError("Default export failed during construction", {
186
+ url,
187
+ phase: "construct"
188
+ }, error);
189
+ }
190
+ if (value instanceof THREE.Object3D) {
191
+ return value;
192
+ }
193
+ if (typeof value === "object" && value !== null) {
194
+ callDispose(value);
195
+ }
196
+ throw new GLTSError("Default export did not construct a THREE.Object3D", {
197
+ url,
198
+ phase: "construct"
199
+ });
200
+ }
201
+ #withConstructionTransaction(operation) {
202
+ if (this.#constructionScope) {
203
+ return operation();
204
+ }
205
+ const scope = new Set();
206
+ this.#constructionScope = scope;
207
+ try {
208
+ return operation();
209
+ }
210
+ catch (error) {
211
+ const cleanupErrors = this.#rollbackConstruction(scope);
212
+ if (cleanupErrors.length > 0) {
213
+ throw new AggregateError([error, ...cleanupErrors], "GLTS construction rollback failed");
214
+ }
215
+ throw error;
216
+ }
217
+ finally {
218
+ this.#constructionScope = undefined;
219
+ }
220
+ }
221
+ #rollbackConstruction(scope) {
222
+ const errors = [];
223
+ const wrappers = [...scope].reverse();
224
+ for (const wrapper of wrappers) {
225
+ try {
226
+ this.disposeWrapper(wrapper);
227
+ }
228
+ catch (error) {
229
+ errors.push(error);
230
+ }
231
+ }
232
+ return errors;
233
+ }
234
+ #disposeStaged(staged) {
235
+ const errors = [];
236
+ for (const replacement of staged) {
237
+ try {
238
+ this.#disposeRaw(replacement.next);
239
+ }
240
+ catch (error) {
241
+ errors.push(error);
242
+ }
243
+ }
244
+ return errors;
245
+ }
246
+ #disposeRaw(raw) {
247
+ const nestedWrappers = [];
248
+ raw.traverse((object) => {
249
+ if (object instanceof THREE.Group && this.#records.has(object)) {
250
+ nestedWrappers.push(object);
251
+ }
252
+ });
253
+ for (const wrapper of nestedWrappers) {
254
+ this.disposeWrapper(wrapper);
255
+ }
256
+ callDispose(raw);
257
+ }
258
+ #addLiveWrapper(wrapper, url) {
259
+ const wrappers = this.#liveWrappers.get(url) ?? new Set();
260
+ wrappers.add(wrapper);
261
+ this.#liveWrappers.set(url, wrappers);
262
+ }
263
+ #removeLiveWrapper(wrapper, url) {
264
+ const wrappers = this.#liveWrappers.get(url);
265
+ if (!wrappers) {
266
+ return;
267
+ }
268
+ wrappers.delete(wrapper);
269
+ if (wrappers.size === 0) {
270
+ this.#liveWrappers.delete(url);
271
+ }
272
+ }
273
+ #createThreeBridgeSource() {
274
+ const lines = [
275
+ `const runtime = globalThis[${JSON.stringify(this.#runtimeKey)}];`,
276
+ "if (!runtime) throw new Error('GLTS runtime is unavailable');"
277
+ ];
278
+ const exports = [];
279
+ let index = 0;
280
+ for (const name of Object.keys(THREE)) {
281
+ if (!/^[$A-Z_a-z][$\w]*$/.test(name)) {
282
+ continue;
283
+ }
284
+ const localName = `threeExport${index}`;
285
+ lines.push(`const ${localName} = runtime.getThreeExport(${JSON.stringify(name)});`);
286
+ exports.push(`${localName} as ${name}`);
287
+ index += 1;
288
+ }
289
+ lines.push(`export { ${exports.join(", ")} };`);
290
+ return lines.join("\n");
291
+ }
292
+ #assertActive() {
293
+ if (!this.#disposed) {
294
+ return;
295
+ }
296
+ throw new GLTSError("Loader has been disposed", {
297
+ url: "glts://runtime",
298
+ phase: "resolve"
299
+ });
300
+ }
301
+ }
302
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type * as THREE from "three";
2
+ export type GLTSAssetClass = new () => THREE.Object3D;
3
+ export type GLTSFetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
4
+ export interface GLTSLoaderOptions {
5
+ baseURL?: string | URL;
6
+ cdnURL?: string | URL;
7
+ esbuildWasmURL?: string | URL;
8
+ fetch?: GLTSFetch;
9
+ }
10
+ export interface GLTSAsset {
11
+ readonly scene: THREE.Group;
12
+ readonly url: string;
13
+ reload(): Promise<void>;
14
+ dispose(): void;
15
+ }
16
+ export type GLTSLoadCallback = (asset: GLTSAsset) => void;
17
+ export type GLTSProgressCallback = (event: ProgressEvent<EventTarget>) => void;
18
+ export type GLTSErrorCallback = (error: unknown) => void;
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,MAAM,MAAM,cAAc,GAAG,UAAU,KAAK,CAAC,QAAQ,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;AAC1D,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAC/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@drawcall/glts",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Like glTF, but for procedural Three.js assets.",
6
+ "license": "MIT",
7
+ "keywords": [
8
+ "three",
9
+ "threejs",
10
+ "procedural",
11
+ "assets",
12
+ "loader",
13
+ "hot-reload",
14
+ "typescript"
15
+ ],
16
+ "sideEffects": false,
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md",
26
+ "LICENSE"
27
+ ],
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "node -e \"require('fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
33
+ "prepack": "pnpm build && pnpm test",
34
+ "test": "vitest run",
35
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit"
36
+ },
37
+ "dependencies": {
38
+ "es-module-lexer": "^2.0.0",
39
+ "esbuild-wasm": "0.28.2",
40
+ "magic-string": "^0.30.21"
41
+ },
42
+ "peerDependencies": {
43
+ "three": ">=0.160.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/three": "^0.185.0",
47
+ "three": "^0.185.1",
48
+ "vitest": "^4.0.17"
49
+ }
50
+ }