BabylonJS/Babylon.js · error · Error

Could not find signal input with name ${name} in block ${cla

Error message

Could not find signal input with name ${name} in block ${className}

What it means

Thrown during FlowGraphExecutionBlock.deserialize when the serialization object lists a signal input whose name no longer matches any signal input on the block. It indicates the serialized data is out of sync with the block's actual inputs.

Source

Thrown at packages/dev/core/src/FlowGraph/flowGraphExecutionBlock.ts:138

        }
        for (const output of this.signalOutputs) {
            const serializedOutput: any = {};
            output.serialize(serializedOutput);
            serializationObject.signalOutputs.push(serializedOutput);
        }
    }

    /**
     * Deserializes from an object
     * @param serializationObject the object to deserialize from
     */
    public override deserialize(serializationObject: any) {
        for (let i = 0; i < serializationObject.signalInputs.length; i++) {
            const signalInput = this.getSignalInput(serializationObject.signalInputs[i].name);
            if (signalInput) {
                signalInput.deserialize(serializationObject.signalInputs[i]);
            } else {
                throw new Error("Could not find signal input with name " + serializationObject.signalInputs[i].name + " in block " + serializationObject.className);
            }
        }
        for (let i = 0; i < serializationObject.signalOutputs.length; i++) {
            const signalOutput = this.getSignalOutput(serializationObject.signalOutputs[i].name);
            if (signalOutput) {
                signalOutput.deserialize(serializationObject.signalOutputs[i]);
            } else {
                throw new Error("Could not find signal output with name " + serializationObject.signalOutputs[i].name + " in block " + serializationObject.className);
            }
        }
    }

    /**
     * @returns the class name
     */
    public override getClassName(): string {
        return "FlowGraphExecutionBlock";
    }

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Regenerate the serialization from the current library version so names match
  2. Ensure the correct block class is instantiated before deserializing (className must match)
  3. Update or migrate old serialized payloads after block input renames
  4. Remove stale signal input entries from the serialized JSON

Example fix

// before (renamed input 'out' -> 'onDone')
serializationObject.signalInputs = [{ name: 'out' }];
// after
serializationObject.signalInputs = [{ name: 'onDone' }];
Defensive patterns

Strategy: try-catch

Validate before calling

const missing = serializationObject.signalInputs?.filter(
  (si: any) => !block.getSignalInput(si.name)
) ?? [];
if (missing.length) throw new Error('Unknown signal inputs: ' + missing.map((m: any) => m.name).join(','));
block.deserialize(serializationObject);

Type guard

function hasAllSignalInputs(block: FlowGraphExecutionBlock, ser: any): boolean {
  return (ser?.signalInputs ?? []).every((si: any) => !!block.getSignalInput(si.name));
}

Try / catch

try {
  block.deserialize(serializationObject);
} catch (e) {
  if (String(e.message).startsWith('Could not find signal input')) {
    // payload version mismatch: re-serialize or migrate names
  }
}

Prevention

When it happens

Trigger: Calling block.deserialize(serializationObject) where serializationObject.signalInputs[i].name does not match any name returned by getSignalInput on the block.

Common situations: See trigger scenarios.

Related errors


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/8c25c9803e684f20. Report an issue: GitHub.