[Srv->Client]
*event init:

{"logs":[Logobj, Logobj, ...](time desc)}

*event users:

{"users":[Userobj, Userobj, ...],"roms":Number,"actives":Number}

*event inout:
{"rom":Boolean, "id":Id,"name":String}

*event newuser:
Userobj

*event deluser:
Id

*event log:
Logobj

*event userinfo:
{"name":String,"rom":Boolean}

[Client->Srv]
*event register:
 {"mode":"client"}
 
*event say:

{"comment":SayingObject}

SayingObject:
    | String
    | Number (Unicode codepoint: must be >=0x10000)
    | [SayingObject, SayingObject, ...]

*event inout:

{"name":String/null}

*event find:
{"channel"?:String,"id"?:String,"number"?:Number},function(arr){}

*event users:
function(usersdata){}

[LogViewer->Srv]
*event register:
 {"mode":"chalog"}

*event query:
 {Query...}

[Srv->LogViewer]
*event result:
 {"logs":[Logobj, Logobj, ...](time desc)}
 
[UserList->Srv]
*event regist:
 {"mode":"userlist"}



*object Logobj:
{
"name":String,
"time":Number(ms)
"comment":LogString,
"ip":String,
("syslog":Boolean),
("response":Id),
}

*object Userobj:
{
"id":Id,
"name":String,
"ip":String,
"rom":Boolean,
"ua":String,
}

*LogString:
one of:
  +String
  +[LogString, LogString, ...]
  +{ //HTMLElement
    "name":String,
    "attributes":{},
    "style":{},
    "child":LogString
   }


[HTTP]
/chalog
*query
 page
 value
 starttime(ms)
 endtime(ms)
 name
 ip(String)
 comment(String)

+response:

{"logs":[Logobj, Logobj, ...](time desc),
}

/api
*query
   login=String
or logout=任意
or comment=String
