Skip to content

DF0037: Duplicate Service Provider

Message

A service is already provided under "{id}".

Cause

ctx.services holds exactly one provider per service id. A second provide() under the same id throws instead of silently replacing a service another integration may already hold a reference to.

Example

ts
// ✗ Bad — provided twice
ctx.services.provide('my-plugin:sources', hostA)
ctx.services.provide('my-plugin:sources', hostB)

// ✓ Good — revoke the previous provider first
const revoke = ctx.services.provide('my-plugin:sources', hostA)
revoke()
ctx.services.provide('my-plugin:sources', hostB)

Fix

  • Revoke the existing provider first — provide() returns a revoke function.
  • If the collision is between two unrelated integrations, namespace the id with your plugin id (<plugin-id>:<service>), the same rule RPC function names follow.
  • Guard idempotent setup paths with ctx.services.has(id).

Source

Released under the MIT License.