peers
2.3 KiB
NIP-100 WebRTC
draft
optional
author:jacany
This NIP defines how to do WebRTC communication over nostr.
Defining Rooms
Rooms are essentially the space that you will be connected to. This must be defined by a r
tag following the pubkey of the person you are connected to or some other identifier (maybe a lobby id for a joinable voice channel, etc.)
Peers
Who the client connects to can be chosen by the client. Ex: you can connect to everyone peer-to-peer or a WebRTC media server that is listening on nostr relays.
Encryption
The content
field and r
tag of types offer
, answer
, and candidate
should be encrypted, similarly to NIP-04
.
Clients MUST listen for the p
tag containing their pubkey so they know that event is intended for them
⚠️ content
FIELDS SHOULD BE JSON STRINGIFIED, AND THEN ENCRYPTED. ⚠️
Broadcasting that you are present
Announces that the client is ready to connect to others. The connection ID is inferred from the provided pubkey.
{
"kind": 25050,
"pubkey": "<sender pubkey>",
"tags": [
["type", "connect"],
["r", "<plaintext room id>"]
]
}
Closing
This is used when disconnecting from everybody else. Ex: when browser tab is closed.
{
"kind": 25050,
"pubkey": "<sender pubkey>",
"tags": [
["type", "disconnect"],
["r", "<plaintext room id>"]
]
}
Offering to connect
Used when responding to a type:connect
. Offering to connect to that peer.
{
"kind": 25050,
"pubkey": "<sender pubkey>",
"tags": [
["type", "offer"],
["p", "<reciever pubkey>"],
["r", "<encrypted room id>"]
],
"content": {
"offer": "<offer>",
"type": "offer"
}
}
Answering an Offer
{
"kind": 25050,
"pubkey": "<sender pubkey>",
"tags": [
["type", "answer"],
["p", "<reciever pubkey>"],
["r", "<encrypted room id>"]
],
"content": {
"sdp": "<sdp>",
"type": "answer"
}
}
Broadcasting ICE Candidate
{
"kind": 25050,
"pubkey": "<sender pubkey>",
"tags": [
["type", "candidate"],
["p", "<reciever pubkey>"],
["r", "<encrypted room id>"]
],
"content": {
"candidate": "<sdp>",
<misc>
}
}