@aura3d/cli 4.7.18 → 5.0.1
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/data/aura.exports.json +589 -87
- package/dist/admission/artDirection.d.ts.map +1 -1
- package/dist/admission/artDirection.js.map +1 -1
- package/dist/admission/audio.d.ts.map +1 -1
- package/dist/admission/audio.js.map +1 -1
- package/dist/admission/builder-patterns.d.ts.map +1 -1
- package/dist/admission/builder-patterns.js.map +1 -1
- package/dist/admission/cubeLut.d.ts.map +1 -1
- package/dist/admission/cubeLut.js.map +1 -1
- package/dist/admission/gates.d.ts.map +1 -1
- package/dist/admission/gates.js.map +1 -1
- package/dist/admission/glb.d.ts.map +1 -1
- package/dist/admission/glb.js.map +1 -1
- package/dist/admission/index.d.ts.map +1 -1
- package/dist/admission/index.js.map +1 -1
- package/dist/admission/profiles.d.ts.map +1 -1
- package/dist/admission/profiles.js.map +1 -1
- package/dist/admission/qrFlags.d.ts.map +1 -1
- package/dist/admission/qrFlags.js.map +1 -1
- package/dist/admission/routeGates.d.ts.map +1 -1
- package/dist/admission/routeGates.js.map +1 -1
- package/dist/admission/texel.d.ts.map +1 -1
- package/dist/admission/texel.js.map +1 -1
- package/dist/admission/textureStats.d.ts.map +1 -1
- package/dist/admission/textureStats.js.map +1 -1
- package/dist/animation-asset-profiles.d.ts.map +1 -1
- package/dist/animation-asset-profiles.js.map +1 -1
- package/dist/animation-asset-validator.d.ts.map +1 -1
- package/dist/animation-asset-validator.js.map +1 -1
- package/dist/asset-constants.d.ts +2 -0
- package/dist/asset-constants.d.ts.map +1 -1
- package/dist/asset-constants.js +2 -0
- package/dist/asset-constants.js.map +1 -1
- package/dist/asset-core-types.d.ts +43 -1
- package/dist/asset-core-types.d.ts.map +1 -1
- package/dist/asset-core-types.js.map +1 -1
- package/dist/asset-inspection-types.d.ts.map +1 -1
- package/dist/asset-inspection-types.js.map +1 -1
- package/dist/asset-intent.d.ts.map +1 -1
- package/dist/asset-intent.js.map +1 -1
- package/dist/asset-manifest.d.ts +1 -1
- package/dist/asset-manifest.d.ts.map +1 -1
- package/dist/asset-manifest.js +160 -6
- package/dist/asset-manifest.js.map +1 -1
- package/dist/asset-readiness-types.d.ts.map +1 -1
- package/dist/asset-readiness-types.js.map +1 -1
- package/dist/asset-role-admission.d.ts.map +1 -1
- package/dist/asset-role-admission.js.map +1 -1
- package/dist/asset-route-typegen.d.ts.map +1 -1
- package/dist/asset-route-typegen.js +90 -1
- package/dist/asset-route-typegen.js.map +1 -1
- package/dist/asset-screening-effects.d.ts.map +1 -1
- package/dist/asset-screening-effects.js.map +1 -1
- package/dist/asset-screening-pipeline.d.ts.map +1 -1
- package/dist/asset-screening-pipeline.js.map +1 -1
- package/dist/asset-source-ast.d.ts.map +1 -1
- package/dist/asset-source-ast.js.map +1 -1
- package/dist/asset-source-roles.d.ts.map +1 -1
- package/dist/asset-source-roles.js.map +1 -1
- package/dist/asset-source-validation.d.ts.map +1 -1
- package/dist/asset-source-validation.js.map +1 -1
- package/dist/character-assembly-types.d.ts.map +1 -1
- package/dist/character-assembly-types.js.map +1 -1
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +16 -3
- package/dist/cli-help.js.map +1 -1
- package/dist/cli-options.d.ts +1 -1
- package/dist/cli-options.d.ts.map +1 -1
- package/dist/cli-options.js +2 -2
- package/dist/cli-options.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -2
- package/dist/cli.js.map +1 -1
- package/dist/codemods/camera-cast.d.ts.map +1 -1
- package/dist/codemods/camera-cast.js.map +1 -1
- package/dist/codemods/core-v2.d.ts.map +1 -1
- package/dist/codemods/core-v2.js.map +1 -1
- package/dist/codemods/engine-entry-imports.d.ts.map +1 -1
- package/dist/codemods/engine-entry-imports.js.map +1 -1
- package/dist/codemods/lean-imports.d.ts.map +1 -1
- package/dist/codemods/lean-imports.js.map +1 -1
- package/dist/codemods/post-v2.d.ts.map +1 -1
- package/dist/codemods/post-v2.js.map +1 -1
- package/dist/codemods/renderer-imports.d.ts.map +1 -1
- package/dist/codemods/renderer-imports.js +49 -4
- package/dist/codemods/renderer-imports.js.map +1 -1
- package/dist/codemods/renderer-mode.d.ts.map +1 -1
- package/dist/codemods/renderer-mode.js.map +1 -1
- package/dist/commands/assets/certifyCategories.d.ts.map +1 -1
- package/dist/commands/assets/certifyCategories.js.map +1 -1
- package/dist/commands/assets/export.d.ts +20 -0
- package/dist/commands/assets/export.d.ts.map +1 -0
- package/dist/commands/assets/export.js +431 -0
- package/dist/commands/assets/export.js.map +1 -0
- package/dist/commands/assets/gltfToolkit.d.ts.map +1 -1
- package/dist/commands/assets/gltfToolkit.js.map +1 -1
- package/dist/commands/assets/importMeshy.d.ts.map +1 -1
- package/dist/commands/assets/importMeshy.js.map +1 -1
- package/dist/commands/assets/index.d.ts.map +1 -1
- package/dist/commands/assets/index.js +8 -0
- package/dist/commands/assets/index.js.map +1 -1
- package/dist/commands/assets/mergeClips.d.ts.map +1 -1
- package/dist/commands/assets/mergeClips.js.map +1 -1
- package/dist/commands/assets/optimize.d.ts +9 -1
- package/dist/commands/assets/optimize.d.ts.map +1 -1
- package/dist/commands/assets/optimize.js +29 -5
- package/dist/commands/assets/optimize.js.map +1 -1
- package/dist/commands/assets/optimizeVerb.d.ts.map +1 -1
- package/dist/commands/assets/optimizeVerb.js +22 -1
- package/dist/commands/assets/optimizeVerb.js.map +1 -1
- package/dist/commands/evidence/index.d.ts.map +1 -1
- package/dist/commands/evidence/index.js.map +1 -1
- package/dist/commands/evidence/judge.d.ts.map +1 -1
- package/dist/commands/evidence/judge.js.map +1 -1
- package/dist/commands/evidence/judgeLib.d.ts.map +1 -1
- package/dist/commands/evidence/judgeLib.js.map +1 -1
- package/dist/commands/meshyLedger.d.ts.map +1 -1
- package/dist/commands/meshyLedger.js.map +1 -1
- package/dist/commands/prd01/index.d.ts.map +1 -1
- package/dist/commands/prd01/index.js.map +1 -1
- package/dist/commands/prd02/environmentsBake.d.ts.map +1 -1
- package/dist/commands/prd02/environmentsBake.js +23 -2
- package/dist/commands/prd02/environmentsBake.js.map +1 -1
- package/dist/commands/prd02/index.d.ts.map +1 -1
- package/dist/commands/prd02/index.js +1 -1
- package/dist/commands/prd02/index.js.map +1 -1
- package/dist/commands/prd02/migrateLighting.d.ts.map +1 -1
- package/dist/commands/prd02/migrateLighting.js.map +1 -1
- package/dist/commands/prd02/migrateLightingSweep.d.ts.map +1 -1
- package/dist/commands/prd02/migrateLightingSweep.js.map +1 -1
- package/dist/commands/prd02/probeFormatOptions.d.ts +8 -0
- package/dist/commands/prd02/probeFormatOptions.d.ts.map +1 -0
- package/dist/commands/prd02/probeFormatOptions.js +19 -0
- package/dist/commands/prd02/probeFormatOptions.js.map +1 -0
- package/dist/commands/prd03/index.d.ts.map +1 -1
- package/dist/commands/prd03/index.js.map +1 -1
- package/dist/commands/prd04/index.d.ts.map +1 -1
- package/dist/commands/prd04/index.js.map +1 -1
- package/dist/commands/prd04/modelTintReport.d.ts.map +1 -1
- package/dist/commands/prd04/modelTintReport.js.map +1 -1
- package/dist/commands/prd04/pinEmissiveDefaults.d.ts.map +1 -1
- package/dist/commands/prd04/pinEmissiveDefaults.js.map +1 -1
- package/dist/commands/prd05/admit.d.ts.map +1 -1
- package/dist/commands/prd05/admit.js.map +1 -1
- package/dist/commands/prd05/codemods/assetsRouteModules.d.ts.map +1 -1
- package/dist/commands/prd05/codemods/assetsRouteModules.js.map +1 -1
- package/dist/commands/prd05/index.d.ts.map +1 -1
- package/dist/commands/prd05/index.js +1 -1
- package/dist/commands/prd05/index.js.map +1 -1
- package/dist/commands/prd05/library.d.ts.map +1 -1
- package/dist/commands/prd05/library.js.map +1 -1
- package/dist/commands/prd05/lookdev.d.ts.map +1 -1
- package/dist/commands/prd05/lookdev.js.map +1 -1
- package/dist/commands/prd05/optimize.d.ts.map +1 -1
- package/dist/commands/prd05/optimize.js.map +1 -1
- package/dist/commands/prd05/prune.d.ts.map +1 -1
- package/dist/commands/prd05/prune.js.map +1 -1
- package/dist/commands/prd05/review.d.ts.map +1 -1
- package/dist/commands/prd05/review.js.map +1 -1
- package/dist/commands/prd06/index.d.ts.map +1 -1
- package/dist/commands/prd06/index.js.map +1 -1
- package/dist/commands/prd06/inspectAnimationClips.d.ts.map +1 -1
- package/dist/commands/prd06/inspectAnimationClips.js.map +1 -1
- package/dist/commands/prd06/validateHero.d.ts.map +1 -1
- package/dist/commands/prd06/validateHero.js.map +1 -1
- package/dist/commands/prd07/codemods.d.ts.map +1 -1
- package/dist/commands/prd07/codemods.js.map +1 -1
- package/dist/commands/prd07/index.d.ts.map +1 -1
- package/dist/commands/prd07/index.js.map +1 -1
- package/dist/commands/prd08/feelLint.d.ts.map +1 -1
- package/dist/commands/prd08/feelLint.js.map +1 -1
- package/dist/commands/prd08/index.d.ts.map +1 -1
- package/dist/commands/prd08/index.js.map +1 -1
- package/dist/commands/prd08/motionReport.d.ts.map +1 -1
- package/dist/commands/prd08/motionReport.js.map +1 -1
- package/dist/commands/prd09/codemods/audio-wrapper.d.ts.map +1 -1
- package/dist/commands/prd09/codemods/audio-wrapper.js.map +1 -1
- package/dist/commands/prd09/codemods/capture-branches.d.ts.map +1 -1
- package/dist/commands/prd09/codemods/capture-branches.js.map +1 -1
- package/dist/commands/prd09/codemods/evidence-globals.d.ts.map +1 -1
- package/dist/commands/prd09/codemods/evidence-globals.js.map +1 -1
- package/dist/commands/prd09/codemods/perf-script.d.ts.map +1 -1
- package/dist/commands/prd09/codemods/perf-script.js.map +1 -1
- package/dist/commands/prd09/index.d.ts.map +1 -1
- package/dist/commands/prd09/index.js.map +1 -1
- package/dist/commands/prd09/perf-report.d.ts.map +1 -1
- package/dist/commands/prd09/perf-report.js.map +1 -1
- package/dist/commands/prd09/sfx-admit.d.ts.map +1 -1
- package/dist/commands/prd09/sfx-admit.js.map +1 -1
- package/dist/commands/prd10/index.d.ts.map +1 -1
- package/dist/commands/prd10/index.js.map +1 -1
- package/dist/commands/prd11/batchOptout.d.ts.map +1 -1
- package/dist/commands/prd11/batchOptout.js.map +1 -1
- package/dist/commands/prd11/index.d.ts.map +1 -1
- package/dist/commands/prd11/index.js.map +1 -1
- package/dist/commands/prd11/perfGate.d.ts.map +1 -1
- package/dist/commands/prd11/perfGate.js.map +1 -1
- package/dist/commands/prd13/index.d.ts.map +1 -1
- package/dist/commands/prd13/index.js.map +1 -1
- package/dist/commands/prd13/run.d.ts.map +1 -1
- package/dist/commands/prd13/run.js.map +1 -1
- package/dist/commands/prd14/index.d.ts.map +1 -1
- package/dist/commands/prd14/index.js.map +1 -1
- package/dist/commands/prd15/index.d.ts.map +1 -1
- package/dist/commands/prd15/index.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js.map +1 -1
- package/dist/contracts/assetManifest.d.ts.map +1 -1
- package/dist/contracts/assetManifest.js.map +1 -1
- package/dist/contracts/commands.d.ts.map +1 -1
- package/dist/contracts/commands.js.map +1 -1
- package/dist/deploy-browser-check.d.ts.map +1 -1
- package/dist/deploy-browser-check.js.map +1 -1
- package/dist/game-asset-profiles.d.ts.map +1 -1
- package/dist/game-asset-profiles.js.map +1 -1
- package/dist/game-asset-validator.d.ts.map +1 -1
- package/dist/game-asset-validator.js.map +1 -1
- package/dist/glb-dependency-validation.d.ts +41 -0
- package/dist/glb-dependency-validation.d.ts.map +1 -0
- package/dist/glb-dependency-validation.js +574 -0
- package/dist/glb-dependency-validation.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1276 -35
- package/dist/index.js.map +1 -1
- package/dist/library-manifest.d.ts.map +1 -1
- package/dist/library-manifest.js.map +1 -1
- package/dist/lint/feelSourceScan.d.ts.map +1 -1
- package/dist/lint/feelSourceScan.js.map +1 -1
- package/dist/look/capture.d.ts.map +1 -1
- package/dist/look/capture.js.map +1 -1
- package/dist/look/judge.d.ts.map +1 -1
- package/dist/look/judge.js.map +1 -1
- package/dist/look/lint-static.d.ts.map +1 -1
- package/dist/look/lint-static.js.map +1 -1
- package/dist/look/rubric.d.ts.map +1 -1
- package/dist/look/rubric.js.map +1 -1
- package/dist/meshy/admission.d.ts.map +1 -1
- package/dist/meshy/admission.js.map +1 -1
- package/dist/meshy/evidence.d.ts.map +1 -1
- package/dist/meshy/evidence.js.map +1 -1
- package/dist/meshy/import.d.ts.map +1 -1
- package/dist/meshy/import.js.map +1 -1
- package/dist/meshy/index.d.ts.map +1 -1
- package/dist/meshy/index.js.map +1 -1
- package/dist/meshy/metadata.d.ts.map +1 -1
- package/dist/meshy/metadata.js.map +1 -1
- package/dist/meshy/provenance.d.ts.map +1 -1
- package/dist/meshy/provenance.js.map +1 -1
- package/dist/meshy/thumbnail.d.ts.map +1 -1
- package/dist/meshy/thumbnail.js.map +1 -1
- package/dist/meshy/validation.d.ts.map +1 -1
- package/dist/meshy/validation.js.map +1 -1
- package/dist/migrate-three/CompatibilityWarnings.d.ts.map +1 -1
- package/dist/migrate-three/CompatibilityWarnings.js.map +1 -1
- package/dist/migrate-three/ImportMap.d.ts.map +1 -1
- package/dist/migrate-three/ImportMap.js.map +1 -1
- package/dist/migrate-three/R3fMigration.d.ts.map +1 -1
- package/dist/migrate-three/R3fMigration.js.map +1 -1
- package/dist/migrate-three/ThreeToA3DAdapter.d.ts.map +1 -1
- package/dist/migrate-three/ThreeToA3DAdapter.js.map +1 -1
- package/dist/migrate-three/emit.d.ts.map +1 -1
- package/dist/migrate-three/emit.js.map +1 -1
- package/dist/migrate-three/mappings.d.ts.map +1 -1
- package/dist/migrate-three/mappings.js +32 -17
- package/dist/migrate-three/mappings.js.map +1 -1
- package/dist/migrate-three/parse.d.ts.map +1 -1
- package/dist/migrate-three/parse.js.map +1 -1
- package/dist/migrate-three/report.d.ts.map +1 -1
- package/dist/migrate-three/report.js.map +1 -1
- package/dist/pull-bridge/adapters.d.ts.map +1 -1
- package/dist/pull-bridge/adapters.js.map +1 -1
- package/dist/pull-bridge/download.d.ts.map +1 -1
- package/dist/pull-bridge/download.js.map +1 -1
- package/dist/pull-bridge/profiles.d.ts.map +1 -1
- package/dist/pull-bridge/profiles.js.map +1 -1
- package/dist/pull-bridge/provenance.d.ts.map +1 -1
- package/dist/pull-bridge/provenance.js.map +1 -1
- package/dist/pull-bridge/pullable.d.ts.map +1 -1
- package/dist/pull-bridge/pullable.js.map +1 -1
- package/dist/pull-bridge/scoring.d.ts.map +1 -1
- package/dist/pull-bridge/scoring.js.map +1 -1
- package/dist/pull-bridge/search.d.ts.map +1 -1
- package/dist/pull-bridge/search.js.map +1 -1
- package/dist/pull-bridge/types.d.ts.map +1 -1
- package/dist/pull-bridge/types.js.map +1 -1
- package/dist/pull-bridge/vector3.d.ts.map +1 -1
- package/dist/pull-bridge/vector3.js.map +1 -1
- package/dist/pull-bridge.d.ts.map +1 -1
- package/dist/pull-bridge.js.map +1 -1
- package/dist/resolve-ladder.d.ts.map +1 -1
- package/dist/resolve-ladder.js.map +1 -1
- package/dist/skin/analysis.d.ts.map +1 -1
- package/dist/skin/analysis.js.map +1 -1
- package/dist/skin/command.d.ts.map +1 -1
- package/dist/skin/command.js.map +1 -1
- package/dist/skin/glbEdit.d.ts.map +1 -1
- package/dist/skin/glbEdit.js.map +1 -1
- package/dist/skin/gltf.d.ts +15 -0
- package/dist/skin/gltf.d.ts.map +1 -1
- package/dist/skin/gltf.js.map +1 -1
- package/dist/skin/rebuildLimbs.d.ts.map +1 -1
- package/dist/skin/rebuildLimbs.js.map +1 -1
- package/dist/skin/refitSkeleton.d.ts.map +1 -1
- package/dist/skin/refitSkeleton.js.map +1 -1
- package/dist/skin/repair.d.ts.map +1 -1
- package/dist/skin/repair.js.map +1 -1
- package/package.json +7 -6
- package/skills/aura3d-browser-game/references/kits-and-hooks.md +1 -1
- package/skills/aura3d-scene-authoring/SKILL.md +2 -2
- package/skills/llms.txt +2 -2
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readSync, realpathSync } from "node:fs";
|
|
3
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
+
// Inspect only the bounded JSON chunk, never the potentially much larger BIN
|
|
5
|
+
// chunk. Hashing the document and its sidecars is streamed in fixed-size blocks.
|
|
6
|
+
const MAX_GLB_JSON_BYTES = 16 * 1024 * 1024;
|
|
7
|
+
const MAX_GLB_CHUNKS = 1024;
|
|
8
|
+
const MAX_RESOURCE_REFERENCES = 4096;
|
|
9
|
+
const MAX_RESOURCE_URI_LENGTH = 4096;
|
|
10
|
+
const MAX_EXTERNAL_GLB_BYTES = 64 * 1024 * 1024;
|
|
11
|
+
const MAX_INSPECTION_VALUES = 200_000;
|
|
12
|
+
const MAX_INSPECTION_COLLECTION_ITEMS = 32_768;
|
|
13
|
+
const MAX_SCENE_DEPTH = 256;
|
|
14
|
+
const HASH_BLOCK_BYTES = 128 * 1024;
|
|
15
|
+
const JSON_CHUNK = 0x4e4f534a;
|
|
16
|
+
/**
|
|
17
|
+
* Capture the real document and every external resource into immutable buffers.
|
|
18
|
+
* The same bounded JSON parser and URI policy are used by assets validate.
|
|
19
|
+
* A single-file GLB retains its historical size behavior; multi-file
|
|
20
|
+
* admissions have a 64 MiB aggregate snapshot limit.
|
|
21
|
+
*/
|
|
22
|
+
export function captureGlbSource(projectDir, sourcePath) {
|
|
23
|
+
const project = resolve(projectDir);
|
|
24
|
+
const source = resolve(sourcePath);
|
|
25
|
+
const rel = relative(project, source);
|
|
26
|
+
const withinProject = Boolean(rel) && rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);
|
|
27
|
+
const sourceDir = dirname(source);
|
|
28
|
+
if (!withinProject && lstatSync(sourceDir).isSymbolicLink()) {
|
|
29
|
+
throw new Error("Aura3D assets add failed: GLB source directory is a symbolic link.");
|
|
30
|
+
}
|
|
31
|
+
// An external source directory is an explicitly selected trust anchor. All
|
|
32
|
+
// referenced paths are still confined beneath it and cannot contain links.
|
|
33
|
+
const anchor = realpathSync(withinProject ? project : sourceDir);
|
|
34
|
+
const rootPath = withinProject ? resolve(anchor, rel) : join(anchor, basename(source));
|
|
35
|
+
const root = openContainedSource(anchor, rootPath);
|
|
36
|
+
const captured = [];
|
|
37
|
+
let bytes;
|
|
38
|
+
let uris;
|
|
39
|
+
let json;
|
|
40
|
+
try {
|
|
41
|
+
// Check the budget before allocating a potentially large multi-file GLB.
|
|
42
|
+
const preliminary = parseGlbJson(readGlbJson(root.fd, root.stat.size));
|
|
43
|
+
if (externalResourceUris(preliminary).length && root.stat.size > MAX_EXTERNAL_GLB_BYTES) {
|
|
44
|
+
throw new Error("Aura3D assets add failed: external GLB and dependencies exceed the 64 MiB input budget.");
|
|
45
|
+
}
|
|
46
|
+
bytes = readExactly(root.fd, root.stat.size, 0);
|
|
47
|
+
assertSameFile(root.stat, fstatSync(root.fd));
|
|
48
|
+
// Parse the snapshot, not a separate read of a potentially changed file.
|
|
49
|
+
json = parseGlbJson(readGlbJsonBytes(bytes));
|
|
50
|
+
uris = externalResourceUris(json);
|
|
51
|
+
if (uris.length && bytes.length > MAX_EXTERNAL_GLB_BYTES) {
|
|
52
|
+
throw new Error("Aura3D assets add failed: external GLB and dependencies exceed the 64 MiB input budget.");
|
|
53
|
+
}
|
|
54
|
+
if (uris.length)
|
|
55
|
+
assertExternalInspectionBudget(json);
|
|
56
|
+
captured.push({ path: rootPath, stat: root.stat, hash: digestBytes(bytes) });
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
closeSync(root.fd);
|
|
60
|
+
}
|
|
61
|
+
const dependencies = [];
|
|
62
|
+
const byPath = new Map();
|
|
63
|
+
let totalBytes = bytes.length;
|
|
64
|
+
for (const uri of uris) {
|
|
65
|
+
let path;
|
|
66
|
+
try {
|
|
67
|
+
path = safeResourcePath(uri);
|
|
68
|
+
const folded = path.normalize("NFC").toLowerCase();
|
|
69
|
+
for (const existing of byPath.keys()) {
|
|
70
|
+
const other = existing.normalize("NFC").toLowerCase();
|
|
71
|
+
if (existing !== path && (folded === other || folded.startsWith(`${other}/`) || other.startsWith(`${folded}/`))) {
|
|
72
|
+
throw new Error("dependency paths collide on a portable filesystem");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const child = resolve(dirname(rootPath), path);
|
|
76
|
+
if (child.normalize("NFC").toLowerCase() === rootPath.normalize("NFC").toLowerCase()) {
|
|
77
|
+
throw new Error("reference points to the GLB itself");
|
|
78
|
+
}
|
|
79
|
+
let contents = byPath.get(path);
|
|
80
|
+
if (!contents) {
|
|
81
|
+
const file = openContainedSource(anchor, child);
|
|
82
|
+
try {
|
|
83
|
+
if (file.stat.size > MAX_EXTERNAL_GLB_BYTES - totalBytes) {
|
|
84
|
+
throw new Error("external GLB and dependencies exceed the 64 MiB input budget");
|
|
85
|
+
}
|
|
86
|
+
contents = readExactly(file.fd, file.stat.size, 0);
|
|
87
|
+
assertSameFile(file.stat, fstatSync(file.fd));
|
|
88
|
+
totalBytes += contents.length;
|
|
89
|
+
byPath.set(path, contents);
|
|
90
|
+
captured.push({ path: child, stat: file.stat, hash: digestBytes(contents) });
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
closeSync(file.fd);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
dependencies.push({ uri, path, bytes: contents });
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new Error(`Aura3D assets add failed: missing, unsafe, or unreadable GLB dependency ${JSON.stringify(uri)} (${errorMessage(error)}).`, { cause: error });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
assertExternalBufferLengths(json, dependencies);
|
|
103
|
+
const assertUnchanged = () => {
|
|
104
|
+
for (const original of captured) {
|
|
105
|
+
try {
|
|
106
|
+
const file = openContainedSource(anchor, original.path);
|
|
107
|
+
try {
|
|
108
|
+
assertSameFile(original.stat, file.stat);
|
|
109
|
+
if (hashOpenFile(file.fd, file.stat) !== original.hash)
|
|
110
|
+
throw new Error("contents changed");
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
closeSync(file.fd);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new Error(`Aura3D assets add failed: GLB source or dependency changed or became unsafe during admission (${errorMessage(error)}).`, { cause: error });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
assertUnchanged();
|
|
122
|
+
return { bytes, dependencies, assertUnchanged };
|
|
123
|
+
}
|
|
124
|
+
/** Compare a staged file without following a symbolic link or trusting its name. */
|
|
125
|
+
export function assertStagedGlbFile(projectDir, path, bytes, reason) {
|
|
126
|
+
try {
|
|
127
|
+
const file = openProjectFile(projectDir, path);
|
|
128
|
+
try {
|
|
129
|
+
if (file.stat.size !== bytes.length || hashOpenFile(file.fd, file.stat) !== digestBytes(bytes)) {
|
|
130
|
+
throw new Error("contents differ");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
closeSync(file.fd);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
throw new Error(`Aura3D assets add failed: ${reason} (${errorMessage(error)}).`, { cause: error });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/** Read actual references, not potentially stale manifest inspection metadata. */
|
|
142
|
+
export function referencedGlbResourcePaths(projectDir, outputPath) {
|
|
143
|
+
const file = openProjectFile(projectDir, outputPath);
|
|
144
|
+
try {
|
|
145
|
+
const json = parseGlbJson(readGlbJson(file.fd, file.stat.size));
|
|
146
|
+
const paths = externalResourceUris(json).map((uri) => resolve(dirname(outputPath), safeResourcePath(uri)));
|
|
147
|
+
assertSameFile(file.stat, fstatSync(file.fd));
|
|
148
|
+
return paths;
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
closeSync(file.fd);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Validate the resources actually named in a staged GLB, not the manifest's
|
|
156
|
+
* possibly stale `textures` or `dependencies` inspection metadata.
|
|
157
|
+
*/
|
|
158
|
+
export function checkGlbDependencies(projectDir, outputPath, asset) {
|
|
159
|
+
const { fd, stat } = openProjectFile(projectDir, outputPath);
|
|
160
|
+
let json;
|
|
161
|
+
let hash;
|
|
162
|
+
try {
|
|
163
|
+
const jsonBytes = readGlbJson(fd, stat.size);
|
|
164
|
+
hash = hashOpenFile(fd, stat);
|
|
165
|
+
json = parseGlbJson(jsonBytes);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
closeSync(fd);
|
|
169
|
+
}
|
|
170
|
+
const uris = externalResourceUris(json);
|
|
171
|
+
const failures = [];
|
|
172
|
+
const references = [];
|
|
173
|
+
if (uris.length === 0)
|
|
174
|
+
return { json, hash, failures, uris, references };
|
|
175
|
+
const digests = resolvedDependencyDigests(asset);
|
|
176
|
+
for (const uri of uris) {
|
|
177
|
+
const label = JSON.stringify(uri.length > 256 ? `${uri.slice(0, 253)}...` : uri);
|
|
178
|
+
let child;
|
|
179
|
+
let resourcePath;
|
|
180
|
+
try {
|
|
181
|
+
resourcePath = safeResourcePath(uri);
|
|
182
|
+
child = resolve(dirname(outputPath), resourcePath);
|
|
183
|
+
if (child === outputPath)
|
|
184
|
+
throw new Error("reference points to the GLB itself");
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
failures.push(`Invalid or unsafe GLB dependency for "${asset.id}": ${label} (${errorMessage(error)}).`);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// The typed model path always enables requireDependencies, including for
|
|
191
|
+
// legacy single-file manifests. A local file alone is not an admission.
|
|
192
|
+
const digest = digests.get(resolveResourceUrl(uri, asset.url));
|
|
193
|
+
if (!digest)
|
|
194
|
+
failures.push(`Missing required GLB dependency integrity for "${asset.id}": ${label}.`);
|
|
195
|
+
try {
|
|
196
|
+
const dependency = openProjectFile(projectDir, child);
|
|
197
|
+
let actual;
|
|
198
|
+
try {
|
|
199
|
+
actual = hashOpenFile(dependency.fd, dependency.stat);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
closeSync(dependency.fd);
|
|
203
|
+
}
|
|
204
|
+
references.push({ uri, path: resourcePath, hash: actual });
|
|
205
|
+
if (digest && actual !== digest) {
|
|
206
|
+
failures.push(`GLB dependency hash mismatch for "${asset.id}": ${label} (expected ${digest}, found ${actual}).`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
const code = error.code;
|
|
211
|
+
if (code === "ENOENT" || code === "ENOTDIR") {
|
|
212
|
+
failures.push(`Missing referenced asset dependency for "${asset.id}": ${label} (expected beside the staged GLB).`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
failures.push(`Invalid, unsafe, or unreadable GLB dependency for "${asset.id}": ${label} (${errorMessage(error)}).`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { json, hash, failures, uris, references };
|
|
220
|
+
}
|
|
221
|
+
function readGlbJson(fd, size) {
|
|
222
|
+
return readGlbJsonWith(size, (length, position) => readExactly(fd, length, position));
|
|
223
|
+
}
|
|
224
|
+
function readGlbJsonBytes(bytes) {
|
|
225
|
+
return readGlbJsonWith(bytes.length, (length, position) => bytes.subarray(position, position + length));
|
|
226
|
+
}
|
|
227
|
+
function readGlbJsonWith(size, read) {
|
|
228
|
+
if (size < 20)
|
|
229
|
+
throw new Error("GLB header is truncated.");
|
|
230
|
+
const header = read(12, 0);
|
|
231
|
+
if (header.readUInt32LE(0) !== 0x46546c67)
|
|
232
|
+
throw new Error("Invalid GLB magic.");
|
|
233
|
+
if (header.readUInt32LE(4) !== 2)
|
|
234
|
+
throw new Error("Unsupported GLB version (expected version 2).");
|
|
235
|
+
if (header.readUInt32LE(8) !== size)
|
|
236
|
+
throw new Error("GLB declared length does not match the file.");
|
|
237
|
+
let offset = 12;
|
|
238
|
+
let chunks = 0;
|
|
239
|
+
let json;
|
|
240
|
+
while (offset < size) {
|
|
241
|
+
if (++chunks > MAX_GLB_CHUNKS)
|
|
242
|
+
throw new Error("GLB has too many chunks.");
|
|
243
|
+
if (offset + 8 > size)
|
|
244
|
+
throw new Error("GLB chunk header is truncated.");
|
|
245
|
+
const chunkHeader = read(8, offset);
|
|
246
|
+
const length = chunkHeader.readUInt32LE(0);
|
|
247
|
+
const type = chunkHeader.readUInt32LE(4);
|
|
248
|
+
const start = offset + 8;
|
|
249
|
+
const end = start + length;
|
|
250
|
+
if (length % 4 !== 0 || end > size)
|
|
251
|
+
throw new Error("GLB chunk length is invalid.");
|
|
252
|
+
if (chunks === 1 && type !== JSON_CHUNK)
|
|
253
|
+
throw new Error("GLB first chunk must be JSON.");
|
|
254
|
+
if (type === JSON_CHUNK) {
|
|
255
|
+
if (json)
|
|
256
|
+
throw new Error("GLB contains more than one JSON chunk.");
|
|
257
|
+
if (length === 0 || length > MAX_GLB_JSON_BYTES) {
|
|
258
|
+
throw new Error(`GLB JSON chunk must be between 1 and ${MAX_GLB_JSON_BYTES} bytes.`);
|
|
259
|
+
}
|
|
260
|
+
json = read(length, start);
|
|
261
|
+
}
|
|
262
|
+
offset = end;
|
|
263
|
+
}
|
|
264
|
+
if (!json)
|
|
265
|
+
throw new Error("GLB is missing a JSON chunk.");
|
|
266
|
+
return json;
|
|
267
|
+
}
|
|
268
|
+
function parseGlbJson(jsonBytes) {
|
|
269
|
+
let parsed;
|
|
270
|
+
try {
|
|
271
|
+
const text = new TextDecoder("utf-8", { fatal: true }).decode(jsonBytes).replace(/[\u0000\s]+$/u, "");
|
|
272
|
+
parsed = JSON.parse(text);
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
throw new Error("GLB JSON chunk is not valid UTF-8 JSON.");
|
|
276
|
+
}
|
|
277
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
278
|
+
throw new Error("GLB JSON chunk must contain an object.");
|
|
279
|
+
}
|
|
280
|
+
return parsed;
|
|
281
|
+
}
|
|
282
|
+
function externalResourceUris(json) {
|
|
283
|
+
const uris = new Set();
|
|
284
|
+
let references = 0;
|
|
285
|
+
for (const field of ["images", "buffers"]) {
|
|
286
|
+
const resources = json[field];
|
|
287
|
+
if (resources === undefined)
|
|
288
|
+
continue;
|
|
289
|
+
if (!Array.isArray(resources))
|
|
290
|
+
throw new Error(`GLB ${field} must be an array.`);
|
|
291
|
+
references += resources.length;
|
|
292
|
+
if (references > MAX_RESOURCE_REFERENCES)
|
|
293
|
+
throw new Error("GLB has too many image and buffer references.");
|
|
294
|
+
for (const resource of resources) {
|
|
295
|
+
if (!resource || typeof resource !== "object" || Array.isArray(resource)) {
|
|
296
|
+
throw new Error(`GLB ${field} contains an invalid resource.`);
|
|
297
|
+
}
|
|
298
|
+
const item = resource;
|
|
299
|
+
const uri = item.uri;
|
|
300
|
+
if (uri !== undefined && typeof uri !== "string")
|
|
301
|
+
throw new Error(`GLB ${field} contains a non-string URI.`);
|
|
302
|
+
if (field === "images" && uri && item.bufferView !== undefined) {
|
|
303
|
+
throw new Error("GLB image cannot have both a URI and a bufferView.");
|
|
304
|
+
}
|
|
305
|
+
if (field === "images" && !uri && item.bufferView === undefined) {
|
|
306
|
+
throw new Error("GLB image must have a URI or a bufferView.");
|
|
307
|
+
}
|
|
308
|
+
// A buffer without a URI and an image in a bufferView are embedded.
|
|
309
|
+
// Data URIs are decoded in place by the runtime, not fetched as files.
|
|
310
|
+
if (typeof uri === "string" && uri && !uri.startsWith("data:"))
|
|
311
|
+
uris.add(uri);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return [...uris];
|
|
315
|
+
}
|
|
316
|
+
/** Prevent the metadata inspector's graph walks and array spreads from becoming unbounded. */
|
|
317
|
+
function assertExternalInspectionBudget(json) {
|
|
318
|
+
const pending = [json];
|
|
319
|
+
let values = 0;
|
|
320
|
+
while (pending.length) {
|
|
321
|
+
const value = pending.pop();
|
|
322
|
+
if (!value || typeof value !== "object")
|
|
323
|
+
continue;
|
|
324
|
+
if (Array.isArray(value)) {
|
|
325
|
+
if (value.length > MAX_INSPECTION_COLLECTION_ITEMS) {
|
|
326
|
+
throw new Error("Aura3D assets add failed: external GLB inspection collection exceeds its item budget.");
|
|
327
|
+
}
|
|
328
|
+
values += value.length;
|
|
329
|
+
if (values > MAX_INSPECTION_VALUES)
|
|
330
|
+
throw new Error("Aura3D assets add failed: external GLB metadata exceeds its inspection budget.");
|
|
331
|
+
for (const item of value)
|
|
332
|
+
if (item && typeof item === "object")
|
|
333
|
+
pending.push(item);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
for (const key in value) {
|
|
337
|
+
if (!Object.hasOwn(value, key))
|
|
338
|
+
continue;
|
|
339
|
+
if (++values > MAX_INSPECTION_VALUES)
|
|
340
|
+
throw new Error("Aura3D assets add failed: external GLB metadata exceeds its inspection budget.");
|
|
341
|
+
const item = value[key];
|
|
342
|
+
if (item && typeof item === "object")
|
|
343
|
+
pending.push(item);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (json.nodes === undefined)
|
|
348
|
+
return;
|
|
349
|
+
if (!Array.isArray(json.nodes))
|
|
350
|
+
throw new Error("Aura3D assets add failed: external GLB nodes must be an array.");
|
|
351
|
+
const nodes = json.nodes;
|
|
352
|
+
const children = [];
|
|
353
|
+
const parents = new Int32Array(nodes.length).fill(-1);
|
|
354
|
+
for (let index = 0; index < nodes.length; index++) {
|
|
355
|
+
const node = nodes[index];
|
|
356
|
+
if (!node || typeof node !== "object" || Array.isArray(node)) {
|
|
357
|
+
throw new Error("Aura3D assets add failed: external GLB node is invalid.");
|
|
358
|
+
}
|
|
359
|
+
const nodeChildren = node.children;
|
|
360
|
+
if (nodeChildren === undefined) {
|
|
361
|
+
children.push([]);
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (!Array.isArray(nodeChildren))
|
|
365
|
+
throw new Error("Aura3D assets add failed: external GLB node children must be an array.");
|
|
366
|
+
const list = [];
|
|
367
|
+
for (const child of nodeChildren) {
|
|
368
|
+
if (!Number.isInteger(child) || child < 0 || child >= nodes.length || parents[child] !== -1) {
|
|
369
|
+
throw new Error("Aura3D assets add failed: external GLB node graph has an invalid or multiply parented child.");
|
|
370
|
+
}
|
|
371
|
+
parents[child] = index;
|
|
372
|
+
list.push(child);
|
|
373
|
+
}
|
|
374
|
+
children.push(list);
|
|
375
|
+
}
|
|
376
|
+
const pendingNodes = [];
|
|
377
|
+
for (let index = 0; index < nodes.length; index++) {
|
|
378
|
+
if (parents[index] === -1)
|
|
379
|
+
pendingNodes.push({ index, depth: 1 });
|
|
380
|
+
}
|
|
381
|
+
let visited = 0;
|
|
382
|
+
while (pendingNodes.length) {
|
|
383
|
+
const node = pendingNodes.pop();
|
|
384
|
+
if (node.depth > MAX_SCENE_DEPTH)
|
|
385
|
+
throw new Error("Aura3D assets add failed: external GLB node graph exceeds the inspection depth budget.");
|
|
386
|
+
visited++;
|
|
387
|
+
for (const child of children[node.index])
|
|
388
|
+
pendingNodes.push({ index: child, depth: node.depth + 1 });
|
|
389
|
+
}
|
|
390
|
+
if (visited !== nodes.length)
|
|
391
|
+
throw new Error("Aura3D assets add failed: external GLB node graph contains a cycle.");
|
|
392
|
+
const sceneIndex = json.scene ?? 0;
|
|
393
|
+
const scenes = json.scenes;
|
|
394
|
+
const scene = Array.isArray(scenes) && typeof sceneIndex === "number" ? scenes[sceneIndex] : undefined;
|
|
395
|
+
const roots = scene && typeof scene === "object" && !Array.isArray(scene)
|
|
396
|
+
? scene.nodes
|
|
397
|
+
: undefined;
|
|
398
|
+
if (roots !== undefined) {
|
|
399
|
+
if (!Array.isArray(roots))
|
|
400
|
+
throw new Error("Aura3D assets add failed: external GLB scene nodes must be an array.");
|
|
401
|
+
const unique = new Set();
|
|
402
|
+
for (const root of roots) {
|
|
403
|
+
if (!Number.isInteger(root) || root < 0 || root >= nodes.length || unique.has(root)) {
|
|
404
|
+
throw new Error("Aura3D assets add failed: external GLB scene node roots are invalid or duplicated.");
|
|
405
|
+
}
|
|
406
|
+
unique.add(root);
|
|
407
|
+
}
|
|
408
|
+
for (const root of unique) {
|
|
409
|
+
for (let parent = parents[root]; parent !== -1; parent = parents[parent]) {
|
|
410
|
+
if (unique.has(parent))
|
|
411
|
+
throw new Error("Aura3D assets add failed: external GLB scene node roots overlap.");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/** The runtime requires an external buffer's declared and loaded lengths to agree exactly. */
|
|
417
|
+
function assertExternalBufferLengths(json, dependencies) {
|
|
418
|
+
if (dependencies.length === 0 || !Array.isArray(json.buffers))
|
|
419
|
+
return;
|
|
420
|
+
const byUri = new Map(dependencies.map((item) => [item.uri, item.bytes.length]));
|
|
421
|
+
for (const resource of json.buffers) {
|
|
422
|
+
const uri = resource.uri;
|
|
423
|
+
if (typeof uri !== "string" || !uri || uri.startsWith("data:"))
|
|
424
|
+
continue;
|
|
425
|
+
const length = resource.byteLength;
|
|
426
|
+
if (typeof length !== "number" || !Number.isSafeInteger(length) || length < 0 || byUri.get(uri) !== length) {
|
|
427
|
+
throw new Error(`Aura3D assets add failed: external GLB buffer ${JSON.stringify(uri)} has an invalid or mismatched byteLength.`);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
function safeResourcePath(uri) {
|
|
432
|
+
if (uri.length > MAX_RESOURCE_URI_LENGTH || uri.startsWith("/") || uri.startsWith(" ") || /[\u0000-\u001f\u007f\\?#]/u.test(uri) ||
|
|
433
|
+
/^[a-z][a-z0-9+.-]*:/i.test(uri)) {
|
|
434
|
+
throw new Error("expected a local relative URI without a query or fragment");
|
|
435
|
+
}
|
|
436
|
+
const parts = [];
|
|
437
|
+
for (const segment of uri.split("/")) {
|
|
438
|
+
if (!segment)
|
|
439
|
+
throw new Error("empty path segment");
|
|
440
|
+
let decoded;
|
|
441
|
+
try {
|
|
442
|
+
decoded = decodeURIComponent(segment);
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
throw new Error("invalid URI encoding");
|
|
446
|
+
}
|
|
447
|
+
if (decoded === "." && segment === ".")
|
|
448
|
+
continue;
|
|
449
|
+
if (decoded === "." || decoded === ".." || /[\u0000-\u001f\u007f\uD800-\uDFFF\\/%:?#<>"|*]/u.test(decoded) ||
|
|
450
|
+
decoded.endsWith(".") || decoded.endsWith(" ") || Buffer.byteLength(decoded, "utf8") > 255 ||
|
|
451
|
+
/^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(decoded)) {
|
|
452
|
+
throw new Error("path contains traversal, an encoded separator, or a nonportable name");
|
|
453
|
+
}
|
|
454
|
+
parts.push(decoded);
|
|
455
|
+
}
|
|
456
|
+
if (!parts.length)
|
|
457
|
+
throw new Error("empty resource path");
|
|
458
|
+
return parts.join("/");
|
|
459
|
+
}
|
|
460
|
+
function resolvedDependencyDigests(asset) {
|
|
461
|
+
const digests = new Map();
|
|
462
|
+
for (const [candidate, digest] of Object.entries(asset.integrity?.dependencies ?? {})) {
|
|
463
|
+
// A relative document URL has no known deployment origin. Do not equate
|
|
464
|
+
// an arbitrary absolute integrity key with the validator's dummy origin.
|
|
465
|
+
if (candidate.length > MAX_RESOURCE_URI_LENGTH ||
|
|
466
|
+
(/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(candidate) && !/^[a-z][a-z0-9+.-]*:\/\//i.test(asset.url)) ||
|
|
467
|
+
(candidate.startsWith("/") && !candidate.startsWith("//") &&
|
|
468
|
+
!asset.url.startsWith("/") && !/^[a-z][a-z0-9+.-]*:\/\//i.test(asset.url)))
|
|
469
|
+
continue;
|
|
470
|
+
try {
|
|
471
|
+
const key = resolveResourceUrl(candidate, asset.url);
|
|
472
|
+
// LoadContext picks the first matching manifest entry, not the best or
|
|
473
|
+
// last one. Preserve that ordering when equivalent URI keys collide.
|
|
474
|
+
if (!digests.has(key))
|
|
475
|
+
digests.set(key, digest.toLowerCase());
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
// An unrelated malformed manifest key cannot match a real resource.
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
return digests;
|
|
482
|
+
}
|
|
483
|
+
function resolveResourceUrl(uri, documentUrl) {
|
|
484
|
+
const base = new URL(documentUrl, "https://aura3d-validation.invalid/");
|
|
485
|
+
if (base.protocol !== "https:" && base.protocol !== "http:")
|
|
486
|
+
throw new Error("GLB URL must be HTTP(S) or relative.");
|
|
487
|
+
return new URL(uri, base).href;
|
|
488
|
+
}
|
|
489
|
+
function openProjectFile(projectDir, path) {
|
|
490
|
+
const project = resolve(projectDir);
|
|
491
|
+
const rel = relative(project, resolve(path));
|
|
492
|
+
if (!rel || rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
493
|
+
throw new Error("path is outside the project");
|
|
494
|
+
}
|
|
495
|
+
const anchor = realpathSync(project);
|
|
496
|
+
return openContainedSource(anchor, resolve(anchor, rel));
|
|
497
|
+
}
|
|
498
|
+
function openContainedSource(anchor, path) {
|
|
499
|
+
const rel = relative(anchor, path);
|
|
500
|
+
if (!rel || rel === ".." || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {
|
|
501
|
+
throw new Error("path is outside the GLB source directory");
|
|
502
|
+
}
|
|
503
|
+
const parts = rel.split(sep);
|
|
504
|
+
const components = [];
|
|
505
|
+
let cursor = anchor;
|
|
506
|
+
for (let index = 0; index < parts.length; index++) {
|
|
507
|
+
cursor = join(cursor, parts[index]);
|
|
508
|
+
const stat = lstatSync(cursor);
|
|
509
|
+
if (stat.isSymbolicLink())
|
|
510
|
+
throw new Error("path contains a symbolic link");
|
|
511
|
+
if (index < parts.length - 1 && !stat.isDirectory())
|
|
512
|
+
throw new Error("source parent is not a directory");
|
|
513
|
+
components.push({ path: cursor, stat });
|
|
514
|
+
}
|
|
515
|
+
const fd = openSync(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0));
|
|
516
|
+
try {
|
|
517
|
+
const stat = fstatSync(fd);
|
|
518
|
+
if (!stat.isFile() || !Number.isSafeInteger(stat.size))
|
|
519
|
+
throw new Error("path is not a regular file");
|
|
520
|
+
assertSameFile(components[components.length - 1].stat, stat);
|
|
521
|
+
// The descriptor is authoritative for bytes. Also refuse a path whose
|
|
522
|
+
// directory components were replaced while the descriptor was opened.
|
|
523
|
+
for (const component of components) {
|
|
524
|
+
const current = lstatSync(component.path);
|
|
525
|
+
if (current.isSymbolicLink() || current.dev !== component.stat.dev || current.ino !== component.stat.ino) {
|
|
526
|
+
throw new Error("source path changed while being opened");
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return { fd, stat };
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
closeSync(fd);
|
|
533
|
+
throw error;
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
function assertSameFile(before, after) {
|
|
537
|
+
if (after.size !== before.size || after.ino !== before.ino || after.dev !== before.dev ||
|
|
538
|
+
after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs) {
|
|
539
|
+
throw new Error("file changed while being read");
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
function digestBytes(bytes) {
|
|
543
|
+
return `sha256-${createHash("sha256").update(bytes).digest("hex")}`;
|
|
544
|
+
}
|
|
545
|
+
function readExactly(fd, length, position) {
|
|
546
|
+
const result = Buffer.allocUnsafe(length);
|
|
547
|
+
let read = 0;
|
|
548
|
+
while (read < length) {
|
|
549
|
+
const count = readSync(fd, result, read, length - read, position + read);
|
|
550
|
+
if (count === 0)
|
|
551
|
+
throw new Error("file changed while being read");
|
|
552
|
+
read += count;
|
|
553
|
+
}
|
|
554
|
+
return result;
|
|
555
|
+
}
|
|
556
|
+
function hashOpenFile(fd, before) {
|
|
557
|
+
const hash = createHash("sha256");
|
|
558
|
+
const block = Buffer.allocUnsafe(HASH_BLOCK_BYTES);
|
|
559
|
+
let offset = 0;
|
|
560
|
+
while (offset < before.size) {
|
|
561
|
+
const count = readSync(fd, block, 0, Math.min(block.length, before.size - offset), offset);
|
|
562
|
+
if (count === 0)
|
|
563
|
+
throw new Error("file changed while being hashed");
|
|
564
|
+
hash.update(block.subarray(0, count));
|
|
565
|
+
offset += count;
|
|
566
|
+
}
|
|
567
|
+
const after = fstatSync(fd);
|
|
568
|
+
assertSameFile(before, after);
|
|
569
|
+
return `sha256-${hash.digest("hex")}`;
|
|
570
|
+
}
|
|
571
|
+
function errorMessage(error) {
|
|
572
|
+
return error instanceof Error ? error.message : String(error);
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=glb-dependency-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glb-dependency-validation.js","sourceRoot":"","sources":["../src/glb-dependency-validation.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export { admitAssetForRole, rankAssetCandidatesForRole, HERO_MIN_RENDERED_AZIMUT
|
|
|
27
27
|
export type { AssetAdmissionCheck, AssetAdmissionInput, AssetAdmissionReport, AssetAdmissionRole, AssetAdmissionVerdict, AssetGeometryFacts, AssetProvenanceFacts, AssetRenderedFacts, AssetRoleRequirement } from "./asset-role-admission.js";
|
|
28
28
|
export { DEFAULT_AURA_ASSET_MANIFEST, DEFAULT_AURA_ASSET_OUTPUT_DIR, DEFAULT_AURA_ASSET_PUBLIC_PATH, DEFAULT_AURA_ASSET_TYPEGEN } from "./asset-constants.js";
|
|
29
29
|
export { listAssets, readAssetManifest, writeAssetManifest, writeTypedAssets } from "./asset-manifest.js";
|
|
30
|
-
export type { AddAssetOptions, AssetCliResult, AssetSourceTypedAssetUsage, AssetSourceValidationReport, AssetValidationOptions, AssetValidationResult, AuraAssetQuality, AuraCliAssetEntry, AuraCliAssetManifest, AuraCliAssetProvenance, AuraCliAudioMetadata, AuraCliGeneratedAssetProvenance, AuraCliAssetRole, AuraCliAssetType, AuraCliRenderedProbe, AuraCliRenderedProbeForegroundBounds, AuraCliRenderedProbeKind, AuraCliResolveCandidateProvenance, BindGameRouteEvidenceOptions, BindGameRouteEvidenceResult, CertifyGameGeometryOptions, CheckDeployOptions, GameGeometryCertificationResult, ReadRenderedProbeMetadataOptions } from "./asset-core-types.js";
|
|
30
|
+
export type { AddAssetOptions, AssetCliResult, AssetSourceTypedAssetUsage, AssetSourceValidationReport, AssetValidationOptions, AssetValidationResult, AuraAssetQuality, AuraCliAssetEntry, AuraCliAssetManifest, AuraCliAssetProvenance, AuraCliAudioMetadata, AuraCliModelInspection, AuraCliGeneratedAssetProvenance, AuraCliAssetRole, AuraCliAssetType, AuraCliRenderedProbe, AuraCliRenderedProbeForegroundBounds, AuraCliRenderedProbeKind, AuraCliResolveCandidateProvenance, BindGameRouteEvidenceOptions, BindGameRouteEvidenceResult, CertifyGameGeometryOptions, CheckDeployOptions, GameGeometryCertificationResult, ReadRenderedProbeMetadataOptions } from "./asset-core-types.js";
|
|
31
31
|
export { importMeshyAsset } from "./meshy/import.js";
|
|
32
32
|
export { createMeshyAdmissionReport, inferMeshyAssetProfile, inspectMeshyTextureDimensions } from "./meshy/admission.js";
|
|
33
33
|
export type { MeshyAdmissionCheck, MeshyAdmissionReport, MeshyAdmissionVerdict, MeshyAssetProfile } from "./meshy/admission.js";
|
|
@@ -36,7 +36,10 @@ export type { AssetInspectionReport, AuraCliAnimationClipInspection, AuraCliAnim
|
|
|
36
36
|
export type { AnimationEpisodeAssetReadiness, AnimationEpisodeAssetRole, AnimationEpisodeMouthReadinessMode, AnimationEpisodeReadinessReport, AssetReadinessAnimationClipMetadata, AssetReadinessAnimationMetadata, AssetReadinessAssetArtifacts, AssetReadinessAssetReport, AssetReadinessArtifacts, AssetReadinessOptions, AssetReadinessReport, AssetReadinessValidationContract, AssetReadinessValidatorEvidence, AuraAssetReadinessProfile, AuraAssetReadinessStatus, AuraGameAssetReadinessProfile } from "./asset-readiness-types.js";
|
|
37
37
|
export type { CharacterAssemblyPartInput, CharacterAssemblyPlanOptions, CharacterAssemblyPlanResult, CharacterAssemblyResolvedPart } from "./character-assembly-types.js";
|
|
38
38
|
export declare function readRenderedProbeMetadata(options: ReadRenderedProbeMetadataOptions): AuraCliRenderedProbe;
|
|
39
|
+
/** Synchronous admission remains available where inspection is synchronous. */
|
|
39
40
|
export declare function addAsset(options: AddAssetOptions): AssetCliResult;
|
|
41
|
+
/** Inspect asynchronous formats before publishing any asset, manifest or generated source. */
|
|
42
|
+
export declare function addAssetAsync(options: AddAssetOptions): Promise<AssetCliResult>;
|
|
40
43
|
export declare function bindGameRouteEvidence(options: BindGameRouteEvidenceOptions): BindGameRouteEvidenceResult;
|
|
41
44
|
export declare function certifyGameGeometry(options: CertifyGameGeometryOptions): Promise<GameGeometryCertificationResult>;
|
|
42
45
|
export declare function scanAssets(options: {
|