BabylonJS/Babylon.js · error
GaussianSplattingStream: streaming part was not reserved.
Error message
GaussianSplattingStream: streaming part was not reserved.
What it means
GaussianSplatting streaming requires reserving a streaming part before a controller can be attached; the part is exposed via streamingPartProxy. If the proxy is absent after the stream was created and prepared, the reservation never happened (or was released), so the function disposes the stream and throws. This is an internal invariant check protecting against downloading/decoding into a part that does not exist.
Source
Thrown at packages/dev/loaders/src/SPLAT/gaussianSplattingStream.ts:2781
*/
export async function AddGaussianSplattingStreamPartAsync(
compound: GaussianSplattingMesh,
name: string,
metadata: ISOGLODMetadata,
rootUrl: string,
options: IGaussianSplattingStreamOptions = {}
): Promise<GaussianSplattingPartProxyMesh> {
const stream = new GaussianSplattingStream(name, metadata, rootUrl, compound.getScene(), { ...options, hostCompound: compound });
try {
await stream.whenPartReadyAsync();
} catch (e) {
stream.dispose();
throw e;
}
const proxy = stream.streamingPartProxy;
if (!proxy) {
stream.dispose();
throw new Error("GaussianSplattingStream: streaming part was not reserved.");
}
// The controller already binds its own lifetime to the part (removePart / compound disposal dispose the stream,
// and stream disposal releases the reserved part) — wired at reservation inside the stream, so it also covers the
// download/decode window before this promise resolves. Nothing to register here.
return proxy;
}
View on GitHub (pinned to 0592b347b8)
Solutions
- Reserve the streaming part on the stream before obtaining streamingPartProxy.
- Do not dispose or release the reserved part between reservation and this call.
- Use the library's public streaming API (which handles reservation internally) instead of touching the stream directly.
- Check for early disposal in your lifecycle code (mesh/scene dispose) that could release the part.
Example fix
// before const stream = new GaussianSplattingStream(...); const proxy = getStreamingProxy(stream); // throws: part not reserved // after const stream = new GaussianSplattingStream(...); stream.reserveStreamingPart(size); // reserve first const proxy = getStreamingProxy(stream);
Defensive patterns
Strategy: validation
Validate before calling
const proxy = stream.streamingPartProxy;
if (!proxy) {
throw new Error("Call reserveStreamingPart() before requesting the streaming proxy");
} Type guard
function hasReservedPart(stream: GaussianSplattingStream): boolean {
return stream.streamingPartProxy != null;
} Try / catch
try {
const proxy = acquireStreamingProxy(stream);
} catch (e) {
if (String(e.message).includes("streaming part was not reserved")) {
stream.reserveStreamingPart(requiredSize);
return acquireStreamingProxy(stream);
}
throw e;
} Prevention
- Always reserve the streaming part before reading streamingPartProxy.
- Avoid disposing the stream between reservation and proxy acquisition.
- Prefer the high-level streaming API that manages reservation internally.
- Audit custom stream code for double-consumption of a single reserved part.
When it happens
Trigger: Requesting a streaming splat controller when the stream's streaming part was not reserved beforehand — e.g. calling the streaming setup path without first reserving capacity, or after the part was consumed/released.
Common situations: Custom streaming code that creates a GaussianSplattingStream directly and skips the reservation step; double-consuming a reserved part; earlier dispose() releasing the part before this call.
Related errors
- GaussianSplattingDownloadManager has been disposed.
- There is no NavMesh generated.
- There is no TileCache generated.
- No volume subnode
- Disconnect failed
AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30).
Data as JSON: /api/errors/4ef688b132306ff9.
Report an issue: GitHub.