112 lines
2.7 KiB
Plaintext
112 lines
2.7 KiB
Plaintext
public open(url: Text, tls: dever.system.ClientTls, limits: Limits) (
|
|
socket: dever.system.WebSocket
|
|
) {
|
|
socket = connected(dever.system.ws_open(url, tls, limits))
|
|
}
|
|
|
|
public type Limits {
|
|
message_bytes: Int
|
|
idle_ms: Int
|
|
write_ms: Int
|
|
}
|
|
|
|
public type Message {
|
|
Text(value: Text)
|
|
Binary(value: Bytes)
|
|
Ping(value: Bytes)
|
|
Pong(value: Bytes)
|
|
}
|
|
|
|
public type ConnectResult {
|
|
Connected(socket: dever.system.WebSocket)
|
|
error Failed(message: Text)
|
|
}
|
|
|
|
public type ReceiveState {
|
|
Read(message: Message)
|
|
End
|
|
}
|
|
|
|
public type ReceiveResult {
|
|
Done(state: ReceiveState)
|
|
error Failed(message: Text)
|
|
}
|
|
|
|
type SystemReceiveResult {
|
|
Read(message: Message)
|
|
End
|
|
error Failed(message: Text)
|
|
}
|
|
|
|
public type MessageEvent {
|
|
Read(message: Message)
|
|
error Failed(message: Text)
|
|
}
|
|
|
|
public default_limits() (result: Limits) {
|
|
result = Limits {
|
|
message_bytes = 1048576
|
|
idle_ms = 60000
|
|
write_ms = 5000
|
|
}
|
|
}
|
|
|
|
public accept(reply: dever.system.HttpReply, limits: Limits) (socket: dever.system.WebSocket) {
|
|
socket = connected(dever.system.ws_accept(reply, limits))
|
|
}
|
|
|
|
public connect(address: Text, port: Int, target: Text, limits: Limits) (
|
|
socket: dever.system.WebSocket
|
|
) {
|
|
socket = connected(dever.system.ws_connect(address, port, target, limits))
|
|
}
|
|
|
|
connected(result: ConnectResult.Connected(socket)) (value: dever.system.WebSocket) {
|
|
value = socket
|
|
}
|
|
|
|
connected(result: ConnectResult.Failed(message)) (value: dever.system.WebSocket) {
|
|
fail(ConnectResult.Failed(message))
|
|
}
|
|
|
|
public send(socket: dever.system.WebSocket, message: Message) () {
|
|
wrote(dever.system.ws_send(socket, message))
|
|
}
|
|
|
|
wrote(result: dever.io.WriteResult.Done) () {}
|
|
|
|
wrote(result: dever.io.WriteResult.Failed(message)) () {
|
|
fail(dever.io.WriteResult.Failed(message))
|
|
}
|
|
|
|
public receive(socket: dever.system.WebSocket) (state: ReceiveState) {
|
|
state = receive_state(dever.system.ws_receive(socket))
|
|
}
|
|
|
|
receive_state(result: SystemReceiveResult.Read(message)) (state: ReceiveState) {
|
|
state = ReceiveState.Read(message)
|
|
}
|
|
|
|
receive_state(result: SystemReceiveResult.End) (state: ReceiveState) {
|
|
state = ReceiveState.End
|
|
}
|
|
|
|
receive_state(result: SystemReceiveResult.Failed(message)) (state: ReceiveState) {
|
|
fail(ReceiveResult.Failed(message))
|
|
}
|
|
|
|
# 拉取时处理协议控制帧;自然关闭结束序列,协议故障产生最后一个 Failed。
|
|
public messages(socket: dever.system.WebSocket) (result: AsyncStream<MessageEvent>) {
|
|
result = dever.system.ws_messages(socket)
|
|
}
|
|
|
|
public close(socket: dever.system.WebSocket, code: Int, reason: Text) () {
|
|
closed(dever.system.ws_close(socket, code, reason))
|
|
}
|
|
|
|
closed(result: dever.io.CloseResult.Closed) () {}
|
|
|
|
closed(result: dever.io.CloseResult.Failed(message)) () {
|
|
fail(dever.io.CloseResult.Failed(message))
|
|
}
|