$socket 长连接

$socket可以让服务器主动推送数据给客户端,实现多个在线用户之间及时传递消息

$socket.open(channel, onExp, option) 打开长连接

channel:频道,希望接受到哪些频道的消息。可以是字符串或数组。
onExp:事件响应表达式可包含如下选项
onConn:连接上(connect)服务器后执行的表达式。重连或订阅新频道也会再次执行。
onData:收到消息后执行的表达式。
onHeartbeat:响应心跳表达式。为了保持长连接,客户端和服务器每30秒内就会同步一次心跳。变量connected表示连接状态,date表示心跳时间,date() - date - 30000表示断开连接多久了。
onError:发生错误后执行的表达式。
option:有若干选项
login0:无需登录(将忽略saveToDB);1:要登录且只能有一个会话(session),多处登录会断开前面的连接;2:要登录并允许多个会话(可多端登录的同一用户能接受到相同的消息)。默认为1。
saveToDB:是否把消息保存到数据库*
autoResend:重连后是否自动重发断连期间未能发送的消息。
online:是否响应用户上线消息,有用户上线时将收到{type: "online", session: _id, x: user_id}
offline:是否响应用户下线消息,有用户下线时将收到{type: "offline", session: _id, x: user_id}

$socket.send(to, type, x) 发送消息

可以发给某人(当to是用户_id时)或广播给某个频道里的所有人(当to是channel时)。用type指定消息类型,以便onData表达式据此分类处理。x可以是任意格式的消息详情。
此API是异步函数,不等待发送结果就执行下一表达式(因此无$r),发送结果转而由onData接收,格式如下:

{ 
    d: Number,         // 发送时间,即new Date().getTime()
    from: User,        // 发送人ID
    session: _id,      // 发送人的会话ID
    to: User/String,   // 接收人ID或频道名
    type: String,      // 消息类型type 
    x: Any             // 消息详情x
}

typezchannel是特殊类型,用在已打开连接要订阅新频道时,比如加入新群聊,在新群发消息前先订阅一下$socket.send(群_id, "zchannel")才能收到此群的消息。如果不想再收到此群消息则可通过$socket.send(群_id, "zchannel", -1)退订。

$socket.online(channel) 在线用户

查询当前指定频道的在线用户。返回 { session: [], user: [], map: {} },map存放的是user及其session数组的映射关系。

* saveToDB开启后会把消息保存到type为”zsocket”的xdb中;群聊的话它的key为频道ID,私聊的话它的key是聊天双方用下划线拼接的用户ID;x是消息对象数组 [{ type, from, d, x }],其中d是数值格式的消息发送时间,x是消息内容。例:
查找”我的“私聊消息历史:$xdb.search("私聊消息", { type: "zsocket", key: { $regex: $c.me._id } })
查找某个群聊消息历史:$xdb.search("群聊消息", { type: "zsocket", key: { $in: 群ID } })
删除某人某次时间发的消息:$xdb.modify(消息ID, { $pull: { x: { from, d } } })
删除整个聊天消息:$xdb.delete(消息ID)

由众触低代码平台生成和驱动