Skip to content

Extension Interactions

The extension interactions specification defines how OJS extensions interact when multiple extensions are enabled simultaneously. It identifies conflicts, coordination requirements, and canonical ordering.

SymbolMeaning
Compatible — No special handling needed
⚙️Coordination Required — Extensions work together but need specific ordering or configuration
⚠️Conflict Potential — Extensions can conflict; specific rules apply
Independent — Extensions do not interact

Unique key computation MUST happen on plaintext args before encryption. If encryption runs first, two identical jobs would produce different ciphertext and bypass deduplication.

Resolution: Middleware chain ordering ensures unique middleware runs before encryption middleware.

Span attributes MUST NOT include encrypted args. The Codec Server provides authorized decryption for tools that need visibility.

Rate limits SHOULD be partitioned by tenant. A composite key {tenant_id}:{rate_limit_key} prevents one tenant’s rate limit from affecting another.

DLQ queries MUST be filtered by tenant_id. A tenant MUST NOT be able to view or retry another tenant’s dead letter jobs.

Both retried and new jobs count against rate limits. Backends MAY prioritize retried jobs over new jobs within the rate limit budget.

Jobs move to the DLQ only after all retries are exhausted. Events are emitted in order: job.failedjob.retrying (for each retry) → job.discarded or job.dead_lettered.

On restart after shutdown, workflows resume from the last completed step. In-progress steps are retried.

Each workflow step can have its own version. Transformations between versions are supported at step boundaries.

The cron overlap policy is evaluated before unique job conflict policy. If the cron trigger is skipped due to overlap policy, the unique job check is never reached.

When multiple extensions contribute middleware, they MUST be ordered consistently:

1. Trace context injection
2. Authentication / authorization
3. Input validation
4. Unique job check
5. Rate limit check
6. Encryption
7. Backend submission
1. Trace context extraction
2. Logging
3. Metrics
4. Timeout enforcement
5. Decryption
6. Handler execution

Implementations supporting multiple extensions MUST:

  • Apply middleware in the canonical order
  • Compute unique keys before encryption
  • Scope tenant-aware extensions by tenant_id
  • Emit events in the correct order for retry → DLQ transitions
  • Resume workflows from last completed step after restart