88 lines
2.1 KiB
Plaintext
Raw Normal View History

2025-07-30 06:56:55 +02:00
// socket.wren
2025-07-29 14:35:38 +02:00
foreign class Socket {
2025-07-30 06:56:55 +02:00
// Asynchronous static methods that perform raw socket operations.
// These are the direct bindings to the C backend.
foreign static connect_(host, port, callback)
foreign static new_(callback)
foreign static bind_(sock, host, port, callback)
foreign static listen_(sock, backlog, callback)
foreign static accept_(sock, callback)
foreign static read_(sock, length, callback)
foreign static write_(sock, data, callback)
// Additional raw functions can be added here following the pattern.
}
class SocketInstance {
construct new(socketFd) {
_sock = socketFd
}
// Instance methods providing a more convenient API.
accept() {
var fiber = Fiber.current
Socket.accept_(_sock) { |err, newSock|
fiber.transfer([err, newSock])
}
return Fiber.yield()
}
read(length) {
var fiber = Fiber.current
Socket.read_(_sock, length) { |err, data|
fiber.transfer([err, data])
}
return Fiber.yield()
}
write(data) {
var fiber = Fiber.current
Socket.write_(_sock, data) { |err, nothing|
fiber.transfer(err)
}
return Fiber.yield()
}
// Static methods for creating client and server sockets.
static connect(host, port) {
var fiber = Fiber.current
Socket.connect_(host, port) { |err, sock|
if (err) {
fiber.transfer([err, null])
} else {
fiber.transfer([null, SocketInstance.new(sock)])
}
}
return Fiber.yield()
}
static new() {
var fiber = Fiber.current
Socket.new_() { |err, sock|
if (err) {
fiber.transfer([err, null])
} else {
fiber.transfer([null, SocketInstance.new(sock)])
2025-07-29 14:35:38 +02:00
}
}
2025-07-30 06:56:55 +02:00
return Fiber.yield()
2025-07-29 14:35:38 +02:00
}
2025-07-30 06:56:55 +02:00
bind(host, port) {
var fiber = Fiber.current
Socket.bind_(_sock, host, port) { |err, success|
fiber.transfer([err, success])
}
return Fiber.yield()
}
listen(backlog) {
var fiber = Fiber.current
Socket.listen_(_sock, backlog) { |err, success|
fiber.transfer([err, success])
}
return Fiber.yield()
}
2025-07-29 14:35:38 +02:00
}
2025-07-30 06:56:55 +02:00