Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add extended-isupport #543

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions extensions/extended-isupport.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
title: "`extended-isupport` Extension"
layout: spec
copyrights:
-
name: "Simon Ser"
period: "2024"
email: "[email protected]"
---

## Notes for implementing work-in-progress version

This is a work-in-progress specification.

Software implementing this work-in-progress specification MUST NOT use the
unprefixed `extended-isupport` capability name. Instead, implementations SHOULD
use the `draft/extended-isupport` capability name to be interoperable with
other software implementing a compatible work-in-progress version. The final
version of the specification will use unprefixed capability names.

## Introduction

`RPL_ISUPPORT` is used to advertise metadata about the server as key-value
entries. However, `RPL_ISUPPORT` is only sent by servers after connection
registration. This undermines the usefulness of `RPL_ISUPPORT`: some of the
metadata would be useful to clients prior to connection registration. This
extension adds a mechanism to send `RPL_ISUPPORT` messages before connection
registration, as well as a dedicated command to request the `ISUPPORT` list and
a batch for `RPL_ISUPPORT` messages.

## Implementation

### `ISUPPORT` command

A new `ISUPPORT` command is introduced to request the full `RPL_ISUPPORT` list.
When receiving this command, the server MUST reply with one or more
`RPL_ISUPPORT` messages (grouped inside a `draft/isupport` batch if the `batch`
and `draft/extended-isupport` capabilities are enabled, see below).

### `draft/extended-isupport` capability

When the `draft/extended-isupport` capability is enabled by the client, the
server MUST accept `ISUPPORT` commands before connection registration
completes (ie, before the client sends `CAP END`, and before the server sends
`RPL_WELCOME`).

Before connection registration completes, while `draft/extended-isupport` is
enabled, the server MAY send updates to the key-value entries via subsequent
`RPL_ISUPPORT` messages (the same way it would after connection registration
completes without this extension).

The server MAY skip the `RPL_ISUPPORT` replies usually sent when connection
registration completes, if it already sent all information.

Before connection registration, the server MAY send only a subset of the full
`RPL_ISUPPORT` list. In that case, the server MUST send a `RPL_ISUPPORT` list
when connection registration completes with entries previously omitted.

### `draft/isupport` batch

The server MUST group all `RPL_ISUPPORT` messages inside a `draft/isupport`
batch when the [`batch`][] and `draft/extended-isupport` capabilities are
enabled. The server MUST NOT send any unbatched `RPL_ISUPPORT` message while
both of these capabilities are enabled. The order in which the capabilities are
enabled is not significant.

The batch MUST only contain one or more `RPL_ISUPPORT` messages, it MUST NOT
contain any other message.

As usual, servers can update or delete existing values by sending additional
`RPL_ISUPPORT` messages in a `draft/isupport` batch after the initial batch.

## Examples

Enabling the capability:

C: CAP LS 302
S: :irc.example.org CAP * LS :multi-prefix sasl batch draft/extended-isupport
C: CAP REQ batch draft/extended-isupport
S: :irc.example.org CAP * ACK :batch draft/extended-isupport
C: ISUPPORT
S: :irc.example.org BATCH +asdf draft/isupport
emersion marked this conversation as resolved.
Show resolved Hide resolved
S: @batch=asdf :irc.example.org 005 * NETWORK=Example NICKLEN=30 FOO=bar
S: :irc.example.org BATCH -asdf
C: NICK emersion
C: USER emersion 0 * :Simon Ser
C: CAP END
S: 001 emersion :어서 오세요

Sending a change:

S: :irc.example.org BATCH +asdf draft/isupport
S: @batch=asdf :irc.example.org 005 * CHANNELLEN=64 NICKLEN=42 -FOO
S: :irc.example.org BATCH -asdf