Request

The payload of the channel request the server sends: the connection as JSON, with no tag.

[connection JSON …]
  • No tag. The server opens one kind of channel on an accept scope, so its channel request carries no tag: the payload is the connection as JSON, read as Notation provides.
  • connection_id. The id the server minted for the connection, an integer. The acceptor quotes it, as four bytes big-endian, in the channel request of its half.
  • identity. The identity of the connection the connect scope was opened on, as the authorization established it.
  • address. The peer IP address of that connection, as the server observed it.
  • mode. The connector’s mode, verbatim: one object whose one member names the mode, unbrokered, whose value carries the credential the connector presents to the acceptor.

The channel request is defined by diverge-sdk-rs/src/provider/endpoints/daemons/accept/server/channel_request/frame.rs:

//! What a server's channel request frame carries on an accept scope.

use crate::shared::daemons::Connection;
use crate::wire::decode::Decode;
use crate::wire::encode::{Encode, Writer};

/// A connector arrived: the provider's half of its connection.
///
/// What arrives on the channel is the daemon's answer — its server
/// frames, one per channel response — and the daemon finishing the
/// channel is the daemon hanging up; a finish with nothing before it
/// is the daemon declining. The daemon's own half is a channel it
/// opens, quoting the id this carries.
///
/// # A struct, and no tag
///
/// One thing to ask is a struct; an enum of one variant would be a
/// discriminant with nothing to discriminate — and a tag byte is that
/// discriminant written on the wire, so it goes for the same reason.
/// The payload is the [`Connection`] as JSON.
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Frame(
    /// Who, from where, under which id, and how they say they are let
    /// in.
    pub Connection,
);

impl Encode for Frame {
    /// The ordinary JSON failure.
    type Error = serde_json::Error;

    fn encode(&self, out: &mut Writer<'_>) -> Result<(), Self::Error> {
        serde_json::to_writer(out, &self.0)
    }
}

impl Decode<'_> for Frame {
    /// The ordinary JSON failure.
    type Error = serde_json::Error;

    fn decode(bytes: &[u8]) -> Result<Self, Self::Error> {
        serde_json::from_slice(bytes).map(Frame)
    }
}

and by diverge-sdk-rs/src/shared/daemons/connection.rs:

//! One daemon connection, as the provider tells the acceptor of it.

use std::net::IpAddr;

use serde::{Deserialize, Serialize};

use super::Mode;

/// A connector arriving: what the provider says of it when it opens
/// the acceptor's half of the connection. The id correlates the two
/// channels the connection is, as a container program's daemon
/// connection is correlated; the identity and the address are the
/// provider's own word — the identity it authorized the connector's
/// connection under, the peer address it saw that connection come
/// from — and the mode is what the connector asserted, relayed
/// unread, for the acceptor to judge.
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct Connection {
    /// The connection, by the id the provider minted: what the
    /// acceptor quotes when it opens its own half.
    pub connection_id: u32,
    /// The identity the provider authorized the connector under.
    pub identity: String,
    /// Where the connector's connection to the provider came from, as
    /// the provider saw it. What an account's address, if it names
    /// one, is compared with.
    pub address: IpAddr,
    /// How the connector authenticates to the acceptor: see [`Mode`].
    pub mode: Mode,
}

and by diverge-sdk-rs/src/shared/daemons/mode.rs:

//! How a connecting daemon authenticates to the daemon it connects
//! to.

use serde::{Deserialize, Serialize};

/// The connector's way in: what it would present as the first frame
/// of a daemon connection, carried here instead, since a connection
/// relayed through a provider has no `Auth` frame of its own. One
/// object whose one member is the mode, by name:
/// `{"unbrokered":{"credential":…}}`. One mode today; a brokered mode
/// is a second member when the wire defines it, and nothing moves.
/// The provider relays it to the acceptor unread, and the acceptor
/// judges it as it judges a credential presented on a socket.
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Mode {
    /// The two daemons already know each other: the connector
    /// presents a credential of an account it holds on the acceptor.
    Unbrokered {
        /// The credential, as the connector would present it in an
        /// `Auth::Unbrokered`: the key the acceptor minted for the
        /// account, byte for byte.
        credential: String,
    },
}