2026-03-23 22:29:04 +01:00
---
title: RELIABLE-CHANNEL-API
name: Reliable Channel API definition
category: Standards Track
status: raw
tags: [reliability, application, api, sds, segmentation]
editor: Logos Messaging Team
---
## Table of contents
<!-- TOC -->
* [Table of contents ](#table-of-contents )
* [Abstract ](#abstract )
* [Motivation ](#motivation )
* [Syntax ](#syntax )
* [API design ](#api-design )
* [IDL ](#idl )
* [Architectural position ](#architectural-position )
* [The Reliable Channel API ](#the-reliable-channel-api )
2026-04-24 00:28:42 +02:00
* [Type definitions ](#type-definitions )
* [Channel lifecycle ](#channel-lifecycle )
* [Channel usage ](#channel-usage )
2026-03-23 22:29:04 +01:00
* [Components ](#components )
* [Segmentation ](#segmentation )
* [Scalable Data Sync (SDS) ](#scalable-data-sync-sds )
* [Rate Limit Manager ](#rate-limit-manager )
* [Encryption Hook ](#encryption-hook )
* [Security/Privacy Considerations ](#securityprivacy-considerations )
* [Copyright ](#copyright )
<!-- TOC -->
## Abstract
This document specifies the **Reliable Channel API** ,
2026-04-23 21:47:51 +02:00
an application-level interface that sits between the application layer and the [MESSAGING-API ](/standards/application/messaging-api.md ) plus [P2P-RELIABILITY ](/standards/application/p2p-reliability.md ), i.e., `application` < - > **reliable-channel-api** < - > `messaging-api/p2p-reliability` .
2026-03-23 22:29:04 +01:00
It bundles segmentation, end-to-end reliability via [Scalable Data Sync (SDS) ](https://lip.logos.co/ift-ts/raw/sds.html ), rate limit management, and a pluggable encryption hook
into a single interface for sending and receiving messages reliably.
## Motivation
The [MESSAGING-API ](/standards/application/messaging-api.md ) provides peer-to-peer reliability via [P2P-RELIABILITY ](/standards/application/p2p-reliability.md ),
but does not provide high end-to-end delivery guarantees from sender to recipient.
This API addresses that gap by introducing:
2026-04-24 09:28:49 +02:00
- **[SEGMENTATION-API ](/standards/application/segmentation-api.md )** to handle large messages exceeding network size limits.
- **[SDS ](https://lip.logos.co/ift-ts/raw/sds.html )** to provide causal-history-based end-to-end acknowledgement and retransmission.
2026-03-23 22:29:04 +01:00
- **Rate Limit Manager** to comply with [RLN ](https://lip.logos.co/messaging/standards/core/17/rln-relay.html ) constraints when sending segmented messages.
2026-04-23 21:47:51 +02:00
- **Encryption Hook** to allow upper layers to provide a pluggable encryption mechanism. The main motivation for encryption is to protect the payload and content_topic from MessageEnvelope, defined in [MESSAGING-API ](/standards/application/messaging-api.md ).
2026-03-23 22:29:04 +01:00
The separation between Reliable Channels and encryption ensures the API remains agnostic to identity and key management concerns,
which are handled by higher layers.
## Syntax
The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT",
"RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119 ](https://www.ietf.org/rfc/rfc2119.txt ).
## API design
### IDL
A custom Interface Definition Language (IDL) in YAML is used, consistent with [MESSAGING-API ](/standards/application/messaging-api.md ).
### Architectural position
2026-04-23 21:47:51 +02:00
The Reliable Channel API sits between the application layer and the Messaging API, as follows:
2026-03-23 22:29:04 +01:00
```
┌────────────────────────────────────────────────────────────┐
2026-04-23 21:47:51 +02:00
│ Application Layer │
2026-03-23 22:29:04 +01:00
└───────────────────────────┬────────────────────────────────┘
│
┌───────────────────────────▼────────────────────────────────┐
│ Reliable Channel API │
│ ┌──────────────┐ ┌─────┐ ┌───────────────┐ ┌──────────┐ │
│ │ Segmentation │ │ SDS │ │ Rate Limit Mgr│ │Encryption│ │
│ │ │ │ │ │ │ │ Hook │ │
│ └──────────────┘ └─────┘ └───────────────┘ └──────────┘ │
└───────────────────────────┬────────────────────────────────┘
│
┌───────────────────────────▼────────────────────────────────┐
│ Messaging API │
│ (P2P Reliability, Relay, Filter, Lightpush, Store) │
└────────────────────────────────────────────────────────────┘
```
## The Reliable Channel API
2026-04-24 00:28:42 +02:00
This API considers the types defined by [MESSAGING-API ](/standards/application/messaging-api.md ) plus the following.
2026-03-23 22:29:04 +01:00
2026-04-24 00:28:42 +02:00
### Type definitions
2026-03-23 22:29:04 +01:00
```yaml
types:
IEncryption:
type: object
2026-04-08 16:05:32 +02:00
description: "Interface for a pluggable encryption mechanism.
2026-04-09 22:41:53 +02:00
When provided, see ReliableChannelConfig, the API consumer MUST implement both encrypt and decrypt operations.
Implementations MAY use different signatures than those described below, as long as each operation accepts a byte array and returns a byte array."
2026-03-23 22:29:04 +01:00
fields:
encrypt:
type: function
description: "Encrypts a byte payload. Returns the encrypted payload."
parameters:
2026-04-23 21:54:29 +02:00
- name: content
2026-03-23 22:29:04 +01:00
type: array< byte >
returns:
type: result< array < byte > , error>
decrypt:
type: function
description: "Decrypts a byte payload. Returns the decrypted payload."
parameters:
2026-04-23 23:05:59 +02:00
- name: payload
2026-03-23 22:29:04 +01:00
type: array< byte >
returns:
type: result< array < byte > , error>
2026-04-23 22:56:46 +02:00
IPersistence:
type: object
description: "Interface for a pluggable SDS persistence backend.
2026-04-24 09:28:49 +02:00
Implementations MUST provide all functions required to save and retrieve SDS state per channel. Implementations MUST also provide the persistence method of interest, e.g., SQLite, custom encrypted storage, etc.
2026-04-23 22:56:46 +02:00
Refer to the [SDS spec ](https://lip.logos.co/ift-ts/raw/sds.html ) for the full definition of what state must be persisted."
2026-03-23 22:29:04 +01:00
ReliableEnvelope:
type: object
2026-04-24 00:10:43 +02:00
description: "Wraps a MessageEnvelope (defined in [MESSAGING-API ](/standards/application/messaging-api.md )) with a reliable channel identifier.
An empty channelId marks the message as ephemeral; a non-empty value routes it through the named reliable channel for segmentation, SDS tracking, and encryption."
2026-03-23 22:29:04 +01:00
fields:
messageEnvelope:
type: MessageEnvelope
2026-04-24 00:10:43 +02:00
description: "The message payload and metadata. Refer to [MESSAGING-API ](/standards/application/messaging-api.md ) for details."
2026-03-23 22:29:04 +01:00
channelId:
type: string
default: ""
description: "Reliable channel identifier.
2026-04-24 00:10:43 +02:00
If empty, the message is ephemeral: not tracked by SDS, never retransmitted, and NEVER segmented.
2026-04-09 21:44:49 +02:00
Ephemeral payloads exceeding the network size limit MUST be rejected with an error.
When the rate limit is approached, ephemeral messages are dropped immediately rather than queued.
2026-04-24 00:10:43 +02:00
If non-empty, the messageEnvelope is segmented, registered with SDS, and encrypted under the named reliable channel."
2026-03-23 22:29:04 +01:00
ReliableChannel:
type: object
2026-03-31 21:38:59 +02:00
description: "An entity that guarantees message delivery among all participants on a single content topic."
2026-03-23 22:29:04 +01:00
fields:
channelId:
type: string
2026-03-31 21:38:59 +02:00
description: "Unique identifier"
2026-03-23 22:29:04 +01:00
messageEvents:
2026-04-23 22:05:41 +02:00
type: MessageEvents
2026-03-23 22:29:04 +01:00
description: "Event emitter for message-related events on this channel"
ReliableChannelConfig:
type: object
fields:
segmentationConfig:
type: SegmentationConfig
2026-04-23 23:37:01 +02:00
description: "Configuration for message segmentation. Refer to [SEGMENTATION-API ](./segmentation-api.md ) for details."
2026-03-23 22:29:04 +01:00
sdsConfig:
type: SdsConfig
description: "Configuration for Scalable Data Sync."
rateLimitConfig:
type: RateLimitConfig
default: DefaultRateLimitConfig
description: "Configuration for rate limit management."
encryption:
2026-03-31 21:24:29 +02:00
type: optional< IEncryption >
2026-03-23 22:29:04 +01:00
default: none
description: "Optional pluggable encryption implementation. If none, messages are sent unencrypted."
SdsConfig:
type: object
fields:
2026-04-23 21:58:17 +02:00
persistence:
2026-04-23 22:56:46 +02:00
type: IPersistence
description: "Backend for persisting the SDS local history. Implementations MAY support custom backends."
2026-03-23 22:29:04 +01:00
acknowledgementTimeoutMs:
type: uint
default: 5000
description: "Time in milliseconds to wait for acknowledgement before retransmitting."
maxRetransmissions:
type: uint
default: 5
description: "Maximum number of retransmission attempts before considering delivery failed."
causalHistorySize:
type: uint
default: 2
description: "Number of message IDs to consider in the causal history. With longer value, a stronger correctness is guaranteed but it requires higher bandwidth and memory."
RateLimitConfig:
type: object
fields:
enabled:
type: bool
default: true
description: "Whether rate limiting is enforced. SHOULD be true when RLN is active."
epochSizeMs:
type: uint
default: 600000 # 10 minutes
2026-04-23 23:27:12 +02:00
description: "The epoch size used by the RLN relay, in milliseconds."
2026-03-23 22:29:04 +01:00
2026-04-23 22:05:41 +02:00
EventMessageReceived:
2026-03-23 22:29:04 +01:00
type: object
description: "Event emitted when a complete message has been received and reassembled."
fields:
requestId:
type: RequestId
2026-04-23 22:11:08 +02:00
description: "Identifier of the `send` operation that initiated the message sending. `RequestId` is defined in [MESSAGING-API ](./messaging-api.md )."
2026-04-24 00:10:43 +02:00
envelope:
type: ReliableEnvelope
description: "The reassembled message and its channel context. `envelope.messageEnvelope.payload` contains the fully reassembled content; `envelope.channelId` identifies the channel on which it arrived."
2026-03-23 22:29:04 +01:00
2026-04-23 22:05:41 +02:00
EventReliableMessageSent:
2026-03-23 22:29:04 +01:00
type: object
description: "Event emitted when all chunks of a message have been acknowledged by the network."
fields:
requestId:
type: RequestId
2026-04-23 22:11:08 +02:00
description: "The request ID associated with the sent message. `RequestId` is defined in [MESSAGING-API ](./messaging-api.md )."
2026-03-23 22:29:04 +01:00
2026-04-23 22:05:41 +02:00
EventMessageSendError:
2026-03-23 22:29:04 +01:00
type: object
description: "Event emitted when a message send operation fails after exhausting retransmission attempts."
fields:
requestId:
type: RequestId
2026-04-23 22:11:08 +02:00
description: "The request ID associated with the failed message. `RequestId` is defined in [MESSAGING-API ](./messaging-api.md )."
2026-03-23 22:29:04 +01:00
error:
type: string
description: "Error message describing what went wrong"
2026-04-23 22:05:41 +02:00
MessageEvents:
2026-03-23 22:29:04 +01:00
type: event_emitter
description: "Event source for reliable message events on a channel"
events:
"reliable:message:received":
2026-04-23 22:05:41 +02:00
type: EventMessageReceived
2026-03-23 22:29:04 +01:00
"reliable:message:sent":
2026-04-23 22:05:41 +02:00
type: EventMessageSent
2026-03-23 22:29:04 +01:00
"reliable:message:send-error":
2026-04-23 22:05:41 +02:00
type: EventMessageSendError
2026-03-23 22:29:04 +01:00
```
2026-04-24 00:28:42 +02:00
### Channel lifecycle
```yaml
functions:
createReliableChannel:
description: "Opens a reliable channel. Sets up the required SDS state, segmentation, and encryption."
parameters:
- name: channelConfig
type: ReliableChannelConfig
description: "Configuration for the channel."
2026-04-24 00:40:49 +02:00
- name: senderId
type: string
description: "An identifier for this sender. SHOULD be unique and persisted between sessions."
2026-04-24 00:28:42 +02:00
returns:
type: result< ReliableChannel , error >
closeChannel:
description: "Closes a reliable channel and releases all associated resources and internal state."
parameters:
- name: channel
type: ReliableChannel
description: "The channel to close."
returns:
type: result< void , error >
```
**State management**:
2026-04-24 09:28:49 +02:00
Each `ReliableChannel` MUST maintain internal state for [SDS ](https://lip.logos.co/ift-ts/raw/sds.html ). This state MAY be persisted within SDS implementation layer and includes:
2026-04-24 00:28:42 +02:00
- A committed message log recording sent messages and their acknowledgement status.
- An outgoing buffer of unacknowledged message chunks pending confirmation.
- An incoming buffer for partially received segmented messages awaiting full reassembly.
2026-04-24 09:28:49 +02:00
The state MUST be persisted using to the `persistence` tool specified in `SdsConfig` .
2026-04-24 00:28:42 +02:00
The default `memory` backend does not survive process restarts; implementors providing persistence SHOULD use a durable backend.
**Encryption**:
The `encryption` field in `ReliableChannelConfig` is intentionally optional.
The Reliable Channel API is agnostic to encryption mechanisms.
When an `IEncryption` implementation is provided, it MUST be applied as described in [Channel usage ](#channel-usage ).
### Channel usage
2026-03-23 22:29:04 +01:00
```yaml
functions:
send:
2026-04-24 00:10:43 +02:00
description: "Send a message through the reliable channel API. Routing and guarantees are determined by the envelope's channelId: empty means ephemeral; non-empty applies segmentation, SDS, and encryption (if configured) before dispatching."
2026-03-23 22:29:04 +01:00
parameters:
2026-04-24 00:10:43 +02:00
- name: envelope
type: ReliableEnvelope
description: "The envelope containing the message and channel routing information."
2026-03-23 22:29:04 +01:00
returns:
type: result< RequestId , error >
2026-04-23 22:11:08 +02:00
description: "`RequestId` is defined in [MESSAGING-API ](./messaging-api.md )."
2026-03-23 22:29:04 +01:00
```
2026-04-24 00:28:42 +02:00
Incoming events are emitted on `ReliableChannel.messageEvents` as defined by `MessageEvents` .
2026-03-23 22:29:04 +01:00
**Outgoing message processing order**:
2026-04-24 00:10:43 +02:00
When `send` is called with a `ReliableEnvelope` whose `channelId` is non-empty, the implementation MUST process `envelope.messageEnvelope.payload` in the following order:
2026-03-23 22:29:04 +01:00
2026-04-23 23:37:01 +02:00
1. **Segment** : Split the payload into chunks as defined in [SEGMENTATION-API ](./segmentation-api.md ).
2026-04-24 09:28:49 +02:00
2. **Apply [SDS](https://lip.logos.co/ift-ts/raw/sds.html)** : Register each chunk with the SDS layer to track acknowledgements and enable retransmission.
2026-03-23 22:29:04 +01:00
3. **Encrypt** : If an `IEncryption` implementation is provided, encrypt each chunk before transmission.
2026-04-24 09:28:49 +02:00
4. **Dispatch** : Send each chunk via the underlying [MESSAGING-API ](/standards/application/messaging-api.md ).
2026-03-23 22:29:04 +01:00
**Incoming message processing order**:
When a chunk is received from the network, the implementation MUST process it in the following order:
1. **Decrypt** : If an `IEncryption` implementation is provided, decrypt the chunk.
2026-04-24 09:28:49 +02:00
2. **Apply [SDS](https://lip.logos.co/ift-ts/raw/sds.html)** : Deliver the chunk to the SDS layer, which emits acknowledgements and detects gaps.
2026-03-23 22:29:04 +01:00
3. **Reassemble** : Once all chunks for a message have been received, reassemble and emit a `reliable:message:received` event.
**Retransmission**:
2026-04-24 09:28:49 +02:00
A certain Reliable Channel MUST retransmit unacknowledged chunks after `acknowledgementTimeoutMs` ,
according to the [SDS ](https://lip.logos.co/ift-ts/raw/sds.html ) channel state,
2026-03-23 22:29:04 +01:00
up to `maxRetransmissions` times.
If a chunk is not acknowledged after all retransmission attempts, a `reliable:message:send-error` event MUST be emitted.
**Rate limiting**:
When `RateLimitConfig.enabled` is `true` , the implementation MUST space chunk transmissions
2026-04-24 09:28:49 +02:00
to comply with the [RLN ](https://lip.logos.co/messaging/standards/core/17/rln-relay.html ) epoch constraints defined in `epochSizeMs` .
2026-03-23 22:29:04 +01:00
Chunks MUST NOT be sent at a rate that would violate the RLN message rate limit for the active epoch.
## Components
### Segmentation
2026-04-23 23:37:01 +02:00
See [SEGMENTATION-API ](./segmentation-api.md ).
2026-03-23 22:29:04 +01:00
### Scalable Data Sync (SDS)
2026-04-24 09:28:49 +02:00
[SDS ](https://lip.logos.co/ift-ts/raw/sds.html ) provides end-to-end delivery guarantees using causal history tracking.
2026-03-23 22:29:04 +01:00
- Each sent chunk is registered in an outgoing buffer.
- The recipient sends acknowledgements back to the sender upon receiving chunks.
- The sender removes acknowledged chunks from the outgoing buffer.
- Unacknowledged chunks are retransmitted after `acknowledgementTimeoutMs` .
- SDS state MUST be persisted in the configured `historyBackend` .
### Rate Limit Manager
The Rate Limit Manager ensures compliance with [RLN ](https://lip.logos.co/messaging/standards/core/17/rln-relay.html ) rate constraints.
- It tracks how many messages have been sent in the current epoch (only the first chunk of each message counts toward the rate limit; subsequent chunks are exempt).
- When the limit is approached, chunk dispatch MUST be delayed to the next epoch.
- The epoch size MUST match the `epochSizeMs` configured in `RateLimitConfig` .
### Encryption Hook
The Encryption Hook provides a pluggable interface for upper layers to inject encryption.
2026-04-24 09:28:49 +02:00
- The hook is optional; when not provided, messages are sent unencrypted.
2026-03-23 22:29:04 +01:00
- Encryption is applied per chunk, after segmentation and SDS registration.
- Decryption is applied per chunk, before SDS delivery.
2026-04-23 21:47:51 +02:00
- The `IEncryption` interface MUST be implemented by the caller.
2026-03-23 22:29:04 +01:00
- The Reliable Channel API MUST NOT impose any specific encryption scheme.
## Security/Privacy Considerations
- This API does not provide confidentiality by default. An `IEncryption` implementation MUST be supplied when confidentiality is required.
- Chunk metadata (message ID, chunk index, total chunks) is visible to network observers unless encrypted by the hook.
- SDS acknowledgement messages are sent over the same content topic and are subject to the same confidentiality concerns.
- Rate limiting compliance is required to avoid exclusion from the network by RLN-enforcing relays.
## Copyright
Copyright and related rights waived via [CC0 ](https://creativecommons.org/publicdomain/zero/1.0/ ).