# `Parrhesia.Subscriptions.Index`

ETS-backed subscription index used for fanout candidate narrowing.

Subscriptions are keyed by `{owner_pid, subscription_id}` and indexed by kind,
author pubkey, and single-letter tag values.

# `filter`

```elixir
@type filter() :: map()
```

# `owner`

```elixir
@type owner() :: pid()
```

# `subscription_id`

```elixir
@type subscription_id() :: String.t()
```

# `subscription_key`

```elixir
@type subscription_key() :: {owner(), subscription_id()}
```

# `candidate_subscription_keys`

```elixir
@spec candidate_subscription_keys(map()) :: [subscription_key()]
```

# `candidate_subscription_keys`

```elixir
@spec candidate_subscription_keys(GenServer.server(), map()) :: [subscription_key()]
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `fetch_filters`

```elixir
@spec fetch_filters(GenServer.server(), owner(), subscription_id()) ::
  {:ok, [filter()]} | :error
```

# `remove`

```elixir
@spec remove(owner(), subscription_id()) :: :ok
```

# `remove`

```elixir
@spec remove(GenServer.server(), owner(), subscription_id()) :: :ok
```

# `remove_owner`

```elixir
@spec remove_owner(owner()) :: :ok
```

# `remove_owner`

```elixir
@spec remove_owner(GenServer.server(), owner()) :: :ok
```

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start()
```

# `upsert`

```elixir
@spec upsert(owner(), subscription_id(), [filter()]) :: :ok | {:error, term()}
```

# `upsert`

```elixir
@spec upsert(GenServer.server(), owner(), subscription_id(), [filter()]) ::
  :ok | {:error, term()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
