Stream
DEFINITIONS
AUTOMATIC TAGS ::=
BEGIN

IMPORTS
    UInt8,
    UInt96,
    UInt128,
    VarUInt,
    VarBytes
    FROM GenericTypes

    Address
    FROM InterledgerTypes

    Receipt
    FROM StreamReceipt
;

StreamEncryptionEnvelope ::= SEQUENCE {
    -- Random nonce
    initializationVector UInt96,

    -- Authentication tag (output of AES-GCM encryption)
    authenticationTag UInt128,

    -- Encrypted STREAM Packet
    -- Note: This is NOT encoded as a variable length (length-prefixed)
    -- octet string. The size is constrained by the length of the data
    -- field in the InterledgerPrepare, InterledgerFulfill, or InterledgerReject
    -- packet containing this StreamEncryptionEnvelope
    cipherText OCTET STRING (SIZE (0..32739))
}

StreamPacket ::= SEQUENCE {
  -- Always 1 for now
  version UInt8,

  -- ILP Packet type this STREAM packet must be carried upon
  ilpPacketType UInt8,

  -- Packet ID
  sequence VarUInt,

  -- If attached to a Prepare packet, minimum amount that the receiver should accept
  -- If attached to a Fulfill or Reject packet, amount that arrived at the receiver
  prepareAmount VarUInt,

  -- Array of Frames
  frames SEQUENCE OF StreamFrame
}

FRAME ::= CLASS {
  &typeId UInt8 UNIQUE,
  &Type
} WITH SYNTAX {&typeId &Type}

FrameSet FRAME ::= {
  {1 ConnectionError} |
  {2 ConnectionNewAddress} |
  {3 ConnectionMaxData} |
  {4 ConnectionDataBlocked} |
  {5 ConnectionMaxStreamId} |
  {6 ConnectionStreamIdBlocked} |

  {16 StreamClose} |
  {17 StreamMoney} |
  {18 StreamMaxMoney} |
  {19 StreamMoneyBlocked} |
  {20 StreamData} |
  {21 StreamMaxData} |
  {22 StreamDataBlocked} |
  {23 StreamReceipt}
}

StreamFrame ::= SEQUENCE {
  type FRAME.&typeId ({FrameSet}),
  data FRAME.&Type ({FrameSet}{@type})
}

ConnectionError ::= SEQUENCE {
  -- Numeric error code
  code UInt8,

  -- Human-readable error message
  message UTF8String
}

ConnectionNewAddress ::= SEQUENCE {
  -- ILP Address of the party that sends the frame
  address Address
}

ConnectionMaxData ::= SEQUENCE {
  maxOffset VarUInt
}

ConnectionDataBlocked ::= SEQUENCE {
  maxOffset VarUInt
}

ConnectionMaxStreamId ::= SEQUENCE {
  maxStreamId VarUInt
}

ConnectionStreamIdBlocked ::= SEQUENCE {
  maxStreamId VarUInt
}

StreamClose ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- Numeric error code
  code UInt8,

  -- Human-readable error message
  message UTF8String
}

StreamMoney ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- The proportion of the Prepare amount that should go to this stream
  -- i.e. the amount for a given stream = prepare amount * shares / (sum of shares from all StreamMoney frames in the packet)
  shares VarUInt
}

StreamMaxMoney ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- Maximum amount the stream can receive
  receiveMax VarUInt,

  -- Total amount the stream has received so far
  totalReceived VarUInt
}

StreamMoneyBlocked ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- Maximum amount the stream can send
  sendMax VarUInt,

  -- Total amount the stream has sent so far
  totalSent VarUInt
}

StreamData ::= SEQUENCE {
  -- Identifier of the DataStream
  streamId VarUInt,

  -- Byte number of the first byte in this frame within the whole DataStream
  -- (the first StreamData frame sent for a given DataStream will have an offset of 0)
  offset VarUInt,

  -- Application data
  data VarBytes
}

StreamMaxData ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- Maximum number of bytes the endpoint is willing to receive on this stream
  maxOffset VarUInt
}

StreamDataBlocked ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- Maximum number of bytes the endpoint wants to send on this stream
  maxOffset VarUInt
}

StreamReceipt ::= SEQUENCE {
  -- Identifier of the stream
  streamId VarUInt,

  -- Length-prefixed Receipt for verifying the total amount received on this stream
  -- The sender is not expected to decode the Receipt fields but must be able to decode the
  -- receipt string in the frame, even if it represents an unsupported Receipt version
  receipt Receipt
}

END