docs: SimpleX Chat Protocol (#906)
* docs: SimpleX Chat Protocol * chat message JTD schema, protocol draft * update protocol, group diagram * update heading * add protocol reference to readme * skip async group test
This commit is contained in:
committed by
GitHub
parent
bd3d4467c7
commit
7f959103c1
476
docs/protocol/simplex-chat.schema.json
Normal file
476
docs/protocol/simplex-chat.schema.json
Normal file
@@ -0,0 +1,476 @@
|
||||
{
|
||||
"metadata": {
|
||||
"description": "JTD schema for SimpleX Chat Protocol messages for chat functions"
|
||||
},
|
||||
"definitions": {
|
||||
"profile": {
|
||||
"properties": {
|
||||
"displayName": {
|
||||
"type": "string",
|
||||
"metadata": {
|
||||
"format": "non-empty string without spaces, the first character must not be # or @"
|
||||
}
|
||||
},
|
||||
"fullName": {"type": "string"}
|
||||
},
|
||||
"optionalProperties": {
|
||||
"image": {
|
||||
"type": "string",
|
||||
"metadata": {
|
||||
"format": "data URI format for base64 encoded image"
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": true
|
||||
},
|
||||
"msgContainer": {
|
||||
"properties": {
|
||||
"content": {"ref": "msgContent"}
|
||||
},
|
||||
"optionalProperties": {
|
||||
"file": {"ref": "fileInvitation"},
|
||||
"quote": {
|
||||
"properties": {
|
||||
"msgRef": {"ref": "msgRef"},
|
||||
"content": {"ref": "msgContent"}
|
||||
}
|
||||
},
|
||||
"forward": {"type": "boolean"}
|
||||
},
|
||||
"metadata": {
|
||||
"comment": "optional properties `quote` and `forward` are mutually exclusive"
|
||||
}
|
||||
},
|
||||
"msgContent": {
|
||||
"discriminator": "type",
|
||||
"mapping": {
|
||||
"text": {
|
||||
"properties": {
|
||||
"text": {"type": "string", "metadata": {"comment": "non-empty"}}
|
||||
}
|
||||
},
|
||||
"link": {
|
||||
"properties": {
|
||||
"text": {"type": "string", "metadata": {"comment": "non-empty"}},
|
||||
"preview": {"ref": "linkPreview"}
|
||||
}
|
||||
},
|
||||
"image": {
|
||||
"text": {"type": "string", "metadata": {"comment": "can be empty"}},
|
||||
"image": {"ref": "base64url"}
|
||||
},
|
||||
"file": {
|
||||
"text": {"type": "string", "metadata": {"comment": "can be empty"}}
|
||||
}
|
||||
},
|
||||
"metadata": {
|
||||
"comment": "it is RECOMMENDED that the clients support other values in `type` properties showing them as text messages in case `text` property is present"
|
||||
}
|
||||
},
|
||||
"msgRef": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"sentAt": {
|
||||
"type": "string",
|
||||
"metadata": {
|
||||
"format": "ISO8601 UTC time of the message"
|
||||
}
|
||||
},
|
||||
"sent": {"type": "boolean"}
|
||||
},
|
||||
"optionalProperties": {
|
||||
"memberId": {"ref": "base64url"},
|
||||
"metadata": {
|
||||
"comment": "memberId must be present in all group message references, both for sent and received"
|
||||
}
|
||||
}
|
||||
},
|
||||
"fileInvitation": {
|
||||
"properties": {
|
||||
"fileName": {"type": "string"},
|
||||
"fileSize": {"type": "uint32"}
|
||||
},
|
||||
"optionalProperties": {
|
||||
"fileConnReq": {"ref": "connReqUri"}
|
||||
}
|
||||
},
|
||||
"linkPreview": {
|
||||
"properties": {
|
||||
"uri": {"type": "string"},
|
||||
"title": {"type": "string"},
|
||||
"description": {"type": "string"},
|
||||
"image": {"ref": "base64url"}
|
||||
}
|
||||
},
|
||||
"groupInvitation": {
|
||||
"properties": {
|
||||
"fromMember": {"ref": "memberIdRole"},
|
||||
"invitedMember": {"ref": "memberIdRole"},
|
||||
"connRequest": {"ref": "connReqUri"},
|
||||
"groupProfile": {"ref": "profile"}
|
||||
}
|
||||
},
|
||||
"memberIdRole": {
|
||||
"properties": {
|
||||
"memberId": {"ref": "base64url"},
|
||||
"memberRole": {"ref": "groupMemberRole"}
|
||||
}
|
||||
},
|
||||
"memberInfo": {
|
||||
"properties": {
|
||||
"memberId": {"ref": "base64url"},
|
||||
"memberRole": {"ref": "groupMemberRole"},
|
||||
"profile": {"ref": "profile"}
|
||||
}
|
||||
},
|
||||
"introInvitation": {
|
||||
"properties": {
|
||||
"groupConnReq": {"ref": "connReqUri"},
|
||||
"directConnReq": {"ref": "connReqUri"}
|
||||
}
|
||||
},
|
||||
"callInvitation": {
|
||||
"properties": {
|
||||
"callType": {"ref": "callType"}
|
||||
},
|
||||
"optionalProperties": {
|
||||
"callDhPubKey": {"ref": "base64url"}
|
||||
}
|
||||
},
|
||||
"callOffer": {
|
||||
"properties": {
|
||||
"callType": {"ref": "callType"},
|
||||
"rtcSession": {"ref": "webRTCSession"}
|
||||
},
|
||||
"optionalProperties": {
|
||||
"callDhPubKey": {"ref": "base64url"}
|
||||
}
|
||||
},
|
||||
"callAnswer": {
|
||||
"properties": {
|
||||
"rtcSession": {"ref": "webRTCSession"}
|
||||
}
|
||||
},
|
||||
"callExtraInfo": {
|
||||
"properties": {
|
||||
"rtcExtraInfo": {
|
||||
"properties": {
|
||||
"rtcIceCandidates": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"callType": {
|
||||
"properties": {
|
||||
"media": {"enum": ["audio", "video"]},
|
||||
"capabilities": {
|
||||
"properties": {
|
||||
"encryption": {"type": "boolean"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"webRTCSession": {
|
||||
"properties": {
|
||||
"rtcSession": {"type": "string"},
|
||||
"rtcIceCandidates": {"type": "string"}
|
||||
}
|
||||
},
|
||||
"base64url": {
|
||||
"type": "string",
|
||||
"metadata": {
|
||||
"format": "base64url encoded string"
|
||||
}
|
||||
},
|
||||
"connReqUri": {
|
||||
"type": "string",
|
||||
"metadata": {
|
||||
"format": "URI for connection request"
|
||||
}
|
||||
}
|
||||
},
|
||||
"discriminator": "event",
|
||||
"mapping": {
|
||||
"x.contact": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"profile": {"ref": "profile"},
|
||||
"contactReqId": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.info": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"profile": {"ref": "profile"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.info.probe": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"probe": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.info.probe.check": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"probeHash": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.info.probe.ok": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"probe": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.msg.new": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {"ref": "msgContainer"}
|
||||
}
|
||||
},
|
||||
"x.msg.update": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"content": {"ref": "msgContent"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.msg.del": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.file.acpt": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"fileName": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.file.acpt.inv": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"fileConnReq": {"ref": "connReqUri"},
|
||||
"fileName": {"type": "string"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.file.cancel": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.inv": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"groupInvitation": {"ref": "groupInvitation"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.acpt": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberId": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.mem.new": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberInfo": {"ref": "memberInfo"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.mem.intro": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberInfo": {"ref": "memberInfo"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.mem.inv": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberId": {"ref": "base64url"},
|
||||
"memberIntro": {"ref": "introInvitation"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.mem.fwd": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberInfo": {"ref": "memberInfo"},
|
||||
"memberIntro": {"ref": "introInvitation"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.mem.info": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberId": {"ref": "base64url"},
|
||||
"profile": {"ref": "profile"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.mem.del": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"memberId": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.leave": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.del": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.grp.info": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"groupProfile": {"ref": "profile"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.call.inv": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"callId": {"ref": "base64url"},
|
||||
"invitation": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.call.offer": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"callId": {"ref": "base64url"},
|
||||
"offer": {"ref": "callOffer"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.call.answer": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"callId": {"ref": "base64url"},
|
||||
"answer": {"ref": "callAnswer"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.call.extra": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"callId": {"ref": "base64url"},
|
||||
"extra": {"ref": "callExtraInfo"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.call.end": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {
|
||||
"callId": {"ref": "base64url"}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x.ok": {
|
||||
"properties": {
|
||||
"msgId": {"ref": "base64url"},
|
||||
"params": {
|
||||
"properties": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user