collect(event: dever.io.ReadEvent.Chunk(bytes), state: Bytes) (next: Bytes, stop: Bool) { next = dever.bytes.concat(state, bytes) stop = dever.bytes.length(next) >= 4 } collect(event: dever.io.ReadEvent.Failed(message), state: Bytes) (next: Bytes, stop: Bool) { fail(dever.io.ReadEvent.Failed(message)) } serve(listener: dever.system.Listener) () { socket = dever.net.accept(listener) dever.net.timeout(socket, 1000) bytes = reduceUntil(collect, dever.net.chunks(socket, 4), dever.bytes.fromText("")) dever.net.write(socket, bytes) dever.net.close(socket) } echo() (answer: Bool) { listener = dever.net.listen("127.0.0.1", 0) pending = run(serve(listener)) socket = dever.net.connectTimeout("127.0.0.1", dever.net.port(listener), 1000) dever.net.timeout(socket, 1000) dever.net.write(socket, dever.bytes.fromText("ping")) bytes = reduceUntil(collect, dever.net.chunks(socket, 4), dever.bytes.fromText("")) dever.net.close(socket) wait(pending) dever.net.closeListener(listener) answer = bytes == dever.bytes.fromText("ping") } accepted(result: dever.net.ConnectResult.Connected(socket), count: Int) (next: Int, stop: Bool) { dever.net.close(socket) next = count + 1 stop = true } accepted(result: dever.net.ConnectResult.Failed(message), count: Int) (next: Int, stop: Bool) { fail(dever.net.ConnectResult.Failed(message)) } connections() (answer: Bool) { listener = dever.net.listen("127.0.0.1", 0) port = dever.net.port(listener) values = dever.net.connections(listener) socket = dever.net.connectTimeout("127.0.0.1", port, 1000) count = reduceUntil(accepted, values, 0) remaining = reduceUntil(accepted, values, 0) still_open = dever.net.port(listener) == port dever.net.close(socket) dever.net.closeListener(listener) answer = count == 1 and remaining == 0 and still_open } pair() (client: dever.system.Socket, server: dever.system.Socket) { listener = dever.net.listen("127.0.0.1", 0) client = dever.net.connectTimeout("127.0.0.1", dever.net.port(listener), 1000) server = dever.net.accept(listener) dever.net.closeListener(listener) } reader(socket: dever.system.Socket, signal: Channel) () { send(signal, 1) value = dever.net.read(socket, 1) } byteRead(value: dever.io.ReadState.Read(bytes)) (answer: Bool) { answer = bytes == dever.bytes.fromText("x") } byteRead(value: dever.io.ReadState.End) (answer: Bool) { answer = false } cancelVerify() (answer: Bool) { sockets = pair() dever.net.timeout(sockets.client, 1000) signal = channel(Int, 1) pending = run(reader(sockets.client, signal)) started = receive(signal) stop(pending) dever.net.write(sockets.server, dever.bytes.fromText("x")) received = byteRead(dever.net.read(sockets.client, 1)) dever.net.close(sockets.client) dever.net.close(sockets.server) answer = started == 1 and received } writeFailed(value: dever.io.WriteResult.Done) (answer: Bool) recover("观察关闭别名") { answer = false } writeFailed(value: dever.io.WriteResult.Failed(message)) (answer: Bool) recover("观察关闭别名") { answer = length(message) > 0 } aliasClose() (answer: Bool) { sockets = pair() alias = sockets.client dever.net.close(alias) answer = writeFailed(result(dever.net.write(sockets.client, dever.bytes.fromText("x")))) dever.net.close(sockets.server) } nullable() (socket: dever.system.Socket?) { socket = null } invalid() () { socket = dever.net.connectTimeout("localhost", 80, 1000) }