medusajs/medusa · error · Error
Method 'scheduleStepTimeout' not implemented.
Error message
Method 'scheduleStepTimeout' not implemented.
What it means
AbstractTransactionStore.scheduleStepTimeout is an optional hook used by the workflow engine to schedule per-step timeouts (e.g. for async waitFor steps or long-running steps with a timeout configured). The abstract base throws to force custom storage adapters to explicitly opt in to timeout scheduling.
Source
Thrown at packages/core/orchestration/src/transaction/datastore/abstract-storage.ts:139
timestamp: number,
interval: number
): Promise<void> {
throw new Error("Method 'scheduleTransactionTimeout' not implemented.")
}
async clearTransactionTimeout(
transaction: DistributedTransactionType
): Promise<void> {
throw new Error("Method 'clearTransactionTimeout' not implemented.")
}
async scheduleStepTimeout(
transaction: DistributedTransactionType,
step: TransactionStep,
timestamp: number,
interval: number
): Promise<void> {
throw new Error("Method 'scheduleStepTimeout' not implemented.")
}
async clearStepTimeout(
transaction: DistributedTransactionType,
step: TransactionStep
): Promise<void> {
throw new Error("Method 'clearStepTimeout' not implemented.")
}
async clearExpiredExecutions(): Promise<void> {
throw new Error("Method 'clearExpiredExecutions' not implemented.")
}
}
View on GitHub (pinned to 5e06e544a2)
Solutions
- Implement scheduleStepTimeout in your storage adapter (store the timestamp/interval and schedule the timeout check, e.g. via Redis key expiry or a scheduler)
- Disable/avoid step-level timeouts if your storage cannot support them
- Switch to the official Redis storage which implements timeout scheduling
- Update your adapter after upgrading orchestration to pick up new abstract members
Example fix
// before
async scheduleStepTimeout(transaction, step, timestamp, interval) {
throw new Error("not implemented")
}
// after
async scheduleStepTimeout(transaction, step, timestamp, interval) {
await this.redis.set(
`stepTimeout:${transaction.transactionId}:${step.id}`,
String(timestamp),
"PX", Math.max(0, timestamp - Date.now())
)
} Defensive patterns
Strategy: validation
Validate before calling
if (storage.scheduleStepTimeout === AbstractTransactionStore.prototype.scheduleStepTimeout) {
throw new Error('Step timeouts unsupported by this storage; remove step timeout config')
} Prevention
- Do not configure per-step timeouts unless your storage adapter implements scheduling
- Keep schedule/clear timeout implementations paired in the adapter
When it happens
Trigger: A workflow step defines a timeout (e.g. createStep with timeout config, or a step that transitions to WAITING with a scheduled timeout) and the configured workflow storage does not override scheduleStepTimeout. The engine calls it via TransactionOrchestrator when scheduling the step's timeout timestamp.
Common situations: Custom Redis/DB storage adapter implementing only persistence methods; version upgrade that introduced step timeout scheduling; using steps with timeout: <seconds> against an outdated community storage adapter.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- Method 'clearStepTimeout' not implemented.
- Method 'clearTransactionTimeout' not implemented.
- Method 'clearExpiredExecutions' not implemented.
- Unable to serialize context object. Please make sure the wor
- TransactionModel "${transaction.modelId}" cannot be orchestr
AI-assisted analysis of medusajs/medusa@5e06e544a2 (2026-08-27).
Data as JSON: /api/errors/9a2d361cf97485f2.
Report an issue: GitHub.