apache/beam · error · Error

Data should not come in via process.

Error message

Data should not come in via process.

What it means

This operator processes data only through its own data channel; its process() entry point is deliberately unimplemented. Any windowed value delivered via process is an internal invariant violation and throws immediately.

Solutions

  1. Verify the bundle descriptor / instruction wiring maps PCollections to the correct operator.
  2. Update the Beam runner and TypeScript SDK to matching versions.
  3. Report/inspect as a worker bug if reproducible with a simple pipeline.
Defensive patterns

Strategy: validation

Validate before calling

// validate bundle descriptor wiring: every PCollection id maps to an operator with a data channel
for (const d of descriptor.infos) {
  if (!d.transformId) throw new Error("Bad operator wiring in bundle descriptor");
}

Try / catch

try {
  operator.process(value);
} catch (e) {
  if (e.message.includes("Data should not come in via process")) {
    // log descriptor wiring and file a worker bug
  }
}

Prevention

When it happens

Trigger: The Beam Fn API dispatch layer routes an element to this operator's process() method instead of its configured data channel (e.g. a wiring/mapping mismatch in the bundle descriptor).

Common situations: Runner/worker protocol mismatch; malformed process bundle descriptor mapping a PCollection to the wrong operator; bugs in the experimental TypeScript worker integration.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of apache/beam@12126d8942 (2026-09-13). Data as JSON: /api/errors/e40bafa6b0836aba. Report an issue: GitHub.

Appendix: source

Thrown at sdks/typescript/src/apache_beam/worker/operators.ts:257

              lastYield = new Date().getTime();
            }
          }
        },
        sendTimers: async function (timerFamilyId: string, timers: Uint8Array) {
          throw Error("Not expecting timers.");
        },
        close: function () {
          endOfDataResolve();
        },
        onError: function (error: Error) {
          endOfDataReject(error);
        },
      },
    );
  }

  process(wvalue: WindowedValue<unknown>): ProcessResult {
    throw Error("Data should not come in via process.");
  }

  split(
    desiredSplit: fnApi.ProcessBundleSplitRequest_DesiredSplit,
  ): fnApi.ProcessBundleSplitResponse_ChannelSplit | undefined {
    if (!this.started) {
      return undefined;
    }
    // If we've already split, we know where the end of this bundle is.
    // Otherwise, use the estimate the runner sent us (which is how much
    // it expects to send us) as the end.
    const end =
      this.lastToProcessElement < Infinity
        ? this.lastToProcessElement
        : Number(desiredSplit.estimatedInputElements) - 1;
    if (this.lastProcessedElement >= end) {
      return undefined;
    }

View on GitHub (pinned to 12126d8942)