More Instant Messaging Interoperability (MIMI) message content

Added on Nov. 4, 2025Managed by lisa

Unnamed definition

mimiContent = [
  salt: bstr .size 16,
  replaces: null / MessageId,
  topicId: bstr,
  expires: null / Expiration,
  inReplyTo: null / MessageId,
  mimiExtensions: extensions,
  nestedPart: NestedPart
]

NestedPart = [
  disposition: baseDispos / $extDispos / unknownDispos,
  language: tstr,
  ( NullPart // SinglePart // ExternalPart // MultiPart)
]

NullPart = ( cardinality: nullpart )

SinglePart = (
    cardinality: single,
    contentType: tstr,
    content: bstr
)

ExternalPart = (
    cardinality: external,
    contentType: tstr,
    url: tstr,
    expires: uint .size 4,
    size: uint .size 8,
    encAlg: uint .size 2,
    key: bstr,
    nonce: bstr,
    aad: bstr,
    hashAlg: uint .size 1,
    contentHash: bstr,
    description: tstr,
    filename: tstr
)

MultiPart = (
    cardinality: multi,
    partSemantics: chooseOne / singleUnit / processAll,
    parts: [2* NestedPart]
)

Expiration = [
    relative: bool,
    time: uint .size 4
]

baseDispos = &(
    unspecified: 0,
    render: 1,
    reaction: 2,
    profile: 3,
    inline: 4,
    icon: 5,
    attachment: 6,
    session: 7,
    preview: 8
)
; Note: any ext_dispos take precedence
unknownDispos = &( unknown: 9..255 )

; MessageId is derived from SHA256 hash
MessageId = bstr .size 32

extensions = {
  ? &(senderUri: 1) ^ => tstr,
  ? &(roomUri: 2) ^ => tstr,
  * $$otherKnownExtensions,
  * unknownExtension
}

unknownExtension = (
   name => value
)
name = int / tstr .size (1..255)
value = any .size (0..4096)

nullpart = 0
single   = 1
external = 2
multi    = 3

chooseOne  = 0
singleUnit = 1
processAll = 2

View source