LEMP is a new insfrastructure for instant messaging. Its packet format is based on JSON. It can be thought as a lighter alternative to XMPP (Extensible Messaging and Presence Protocol). It does not have any pretensions to be alternative of SIP, MQTT, AMQP vs. It defines its packet formats for its purposes. It is not a transport protocol indeed.
Presence of a client is determined by its authentication. No packet formats exist for controlling presence as in XMPP. If a client is authenticated to server then it is considered as "online". Store-Forward mechanism exists for messages of offline members. The messages sent to offline members are stored and they are forwarded to the client when it authenticates.
This project is a Java implementation of LEMP server. The server is implemeted to have websocket interface for packet flow. It uses Cassandra as the persistence layer and Apache Ignite as the cache layer.
There are 3 main datum types in LEMP.
- Request
- Information
- Message
Every request, except logout requests must have a response (Success or Error covered in section 1.9)
A response may have a content or may be empty (only success or error)
An authentication request is sent to the server after the persistence network connection is setup.
Type | Packet |
---|---|
Request | { rq:{id:"id",a:{i:"identity",t:"token"}} } |
Response | { rp:{id:"id", response:0/1} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", lo:{r:"reason"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", af:[{u:"f1",n:"nick1"},{u:"f2",n:"nick2"},{u:"f2",n:"nick2"}]} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", rf:["f1","f2"]} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", uf:[{u:"f1",n:"nick1"},{u:"f2",n:"nick2"},{u:"f2",n:"nick2"}]} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", s:{u:"username"}} } |
Response | { rp:{id:"id", s:{u:"username", v:"0/unixtime"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", p:{t:"s", v:"picUrl"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", p:{t:"g", u:"username"}} } |
Response | { rp:{id:"id", p:{u:"username", v:"picUrl"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", st:{t:"s", s:"status"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", st:{t:"g", u:"username"}} } |
Response | { rp:{id:"id", st:{u:"username", s:"status"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", b:{u:"username"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", ub:{u:"username"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", get:{o:"pr"}} } |
Response | { rp:{id:"id", pr:["user1","user2","user"3]} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"c", i:"id",n:"groupname", p:"picture", m:["member1", "member2", "member3"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"a", i:"id",m:["member1", "member2", "member3"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"b",i:"id",m:["member1", "member2", "member3"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"l", i:"id"}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"t", i:"id"}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"i", i:"id"}}} |
Response | { rp:{id:"id", g:{i:"id",c:"creationdate",mt:"mutetill",m:["member1", "member2","member3"]}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"aad", i:"id", ad:["member1","member2"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", g:{t:"ad", i:"id"}}} |
Response | { rp:{id:"id", g:{i:"id",ad:["member1", "member2","member3"]}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", p:{t:"s", i:"id", v:"base64value"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", p:{t:"g", i:"id"}} } |
Response | { rp:{id:"id", p:{i:"id", v:"base64value"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", n:{t:"s", i:"id", n:"name"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", n:{t:"g", i:"id"}} } |
Response | { rp:{id:"id", n:{i:"id", n:"groupname"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", mt:{i:"id",t:"mutetill"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", umt:{i:"id"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", br:{t:"c", i:"id",n:"broadcastname", p:"picture", m:["member1", "member2", "member3"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", br:{t:"a", i:"id",m:["member1", "member2", "member3"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", br:{t:"b",i:"id",m:["member1", "member2", "member3"]}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", br:{t:"t", i:"id"}}} |
Type | Packet |
---|---|
Request | { rq:{id:"id", br:{t:"i", i:"id"}}} |
Response | { rp:{id:"id", br:{i:"id",c:"creationdate",n:"name",m:["member1", "member2","member3"]}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", p:{t:"s", b:"id", v:"base64value"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", p:{t:"g", b:"id"}} } |
Response | { rp:{id:"id", p:{b:"id", v:"base64value"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", n:{t:"s", b:"id", n:"name"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", n:{t:"g", b:"id"}} } |
Response | { rp:{id:"id", n:{b:"id", n:"broadcastname"}} } |
Type | Packet |
---|---|
Request | {srq:{id:"id",t:"t"}} |
Response | { srp:{id:"id", t:"t", tm:"serverunixtime"}, o:-2 } |
Type | Packet |
---|---|
Request | {srq:{id:"id",t:"k"}} |
Response | { srp:{id:"id", t:"k"} } |
Id of the response must be same as the id of the request.
Type | Packet |
---|---|
Response | { rp:{id:"id"} } |
Type | Packet |
---|---|
Response | { rp:{id:"id", e:{c:"code",d:"description"}} } |
Type | Packet |
---|---|
Request | { rq:{id:"id", ad:{c:"cr/del", i:"identity", t:"token", ty:"0/1"}}} |
-
Commands (c)
- cr : create
- del: delete
-
User Types (ty)
- 0: user
- 1: admin
Type | Packet |
---|---|
Info | { i:{id:"id", li:"username"} } |
Type | Packet |
---|---|
Info | { i:{id:"id", lo:"username"} } |
Type | Packet |
---|---|
Info | { i:{id:"id", g:{t:"c",i:"id",n:"name"} } } |
Type | Packet |
---|---|
Info | { i:{id:"id", g:{t:"a",i:"id",m:["member1", "member2", "member3"]} } } |
Type | Packet |
---|---|
Info | { i:{id:"id", g:{t:"b",i:"id",m:"member1"} } } |
Type | Packet |
---|---|
Info | { i:{id:"id", g:{t:"t"} } } |
Type | Packet |
---|---|
Info | { i:{id:"id", g:{t:"p"} } } |
Type | Packet |
---|---|
Info | { i:{id:"id", g:{t:"n"} } } |
Type | Packet |
---|---|
Message | { m:{id:"id", s:"sender", r:"receiver", t:"t/p/v/a/l", c:"content", st:sent_time, p:"0/1", sc:"0/1", pc:"0/1"} } |
-
Message Types (t)
- t: text
- p: photo
- v: video
- a: audio
- l: location
-
Persistency (p)
- 0: do not persist if the receiver is offline
- 1: persist the message if the receiver is offline (default)
-
Server Receipt (sc)
- 0: the server does not sent message received message
- 1: the server sents message received message (default)
-
Peer Receipt (pc)
- 0: the peer does not sent message received message
- 1: the peer sents message received message (default)
Server receipt message is sent for all messages delivered to the server.
Type | Packet |
---|---|
Message | { m:{id:"id", sr:{id:"sent_messageId"} } } |
Type | Packet |
---|---|
Message | { m:{id:"id", st:sent_time, dm:{id:"received_messageId"} } } |
Type | Packet |
---|---|
Message | { m:{id:"id", st:sent_time, nm:{id:"noticed_messageId"} } } |