# channel-addresses-unique

Source: https://apigenie.pl/docs/linter/asyncapi/rules/channel-addresses-unique

This rule checks that no two channels of an AsyncAPI document share the same
address, including addresses that differ only by the names of their
parameters.

## Rule Details

In AsyncAPI 3.x the key of a channel in the `channels` map is only an
identifier; the actual topic, queue or routing key is given by the channel's
`address`. Two channels with the same address describe the same destination,
which is usually a copy-and-paste mistake and makes it unclear which of the
two definitions (and which set of messages) is authoritative.

The `channel-addresses-unique` rule compares the addresses of all channels
defined in the root `channels` map. Before comparing, the name of every
parameter expression is dropped, so `users.{userId}.events` and
`users.{id}.events` are considered duplicates, as they match exactly the same
set of concrete addresses.

The rule reports `Duplicate channel address found` on every channel whose
address duplicates the address of a channel defined earlier in the document.

Channels without an `address` (or with `address: null`, meaning the address
is dynamic or unknown) are ignored. Channels defined under
`components/channels` are not checked.

## Configuration

None.

## Examples

**Good**. Each channel has its own address.

```yaml
asyncapi: 3.0.0
info:
  title: Pet Events
  version: 1.0.0
channels:
  petCreated:
    address: pets.{petId}.created
    parameters:
      petId:
        description: Identifier of the pet.
  petDeleted:
    address: pets.{petId}.deleted
    parameters:
      petId:
        description: Identifier of the pet.
```

**Bad**. Both channels point to the same destination; they differ only by the
parameter name.

```yaml
asyncapi: 3.0.0
info:
  title: Pet Events
  version: 1.0.0
channels:
  petEvents:
    address: pets.{petId}.events
    parameters:
      petId:
        description: Identifier of the pet.
  animalEvents:
    address: pets.{animalId}.events
    parameters:
      animalId:
        description: Identifier of the animal.
```

## When Not to Use It

You may disable this rule if you intentionally describe the same destination
with several channels, for example when the channels are available on
different servers and carry different messages.

## Compatibility

This rule is compatible with AsyncAPI 3.x documents. AsyncAPI 2.x documents
are rejected by the reader and are not linted.
