amark/gun · error · Error

can't create reactive setter (for '${debugName}') inside rea

Error message

can't create reactive setter (for '${debugName}') inside reactive context

What it means

Nesting guard in the wave reactive system: initSetter() sets an inInitCall flag while it runs a setter to compute a reactive value. If creating a new reactive setter is attempted while that flag is set — i.e. a reactive initialization itself tries to declare another reactive — this throws, because nested reactive creation would corrupt the dependency tracking (dependsOn of the outer setter).

Source

Thrown at lib/wave.js:283

  setLinks = edide.keep(new Map); // for reactiveGraph, show setters inside reactive/setter:s

  debugging = false; //edide.editorModule?

  depsRequired = new Map; // varName : dependsOn

  inInitCall = false; // TODO use dependsOn? instead

  dependsOn = new Set(); // remove

  initSetter = (name, setter) => {
    var debugName, err, parent, ref, val;
    debugName = (ref = setter.type) != null ? ref : name;
    if ((setters.get(name)) != null) {
      throw Error(`Reactive for '${debugName}' already exists`);
    }
    setters.set(name, setter);
    if (inInitCall) {
      throw Error(`can't create reactive setter (for '${debugName}') inside reactive context`);
    }
    inInitCall = name;
    dependsOn.clear(); // TODO clear => new Set
    try {
      val = setter(); // TODO: some day add revar and unvar as params; helps with multiple reactives to keep the separated
    } catch (error) {
      err = error;
      inInitCall = false;
      err.message = `Reactive initialization of '${debugName}' failed: ${err.message}`;
      throw err;
    }
    parent = null;
    dependsOn.forEach((depName) => {
      var deps;
      if ((deps = dependees.get(depName)) == null) {
        dependees.set(depName, deps = new Set);
      }
      return deps.add(name);

View on GitHub (pinned to 552227599d)

Solutions

  1. Move reactive declarations out of reactive setter bodies to top level of the reactive block
  2. Defer the nested creation until after initialization completes (e.g. schedule it, don't call it synchronously inside the setter)
  3. Restructure so the inner reactive is created before the outer one and only referenced by it
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at lib/wave.js:283 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of amark/gun@552227599d (2026-09-02). Data as JSON: /api/errors/08c81b859e6d897b. Report an issue: GitHub.