Files
musicplayer/src/ipc.gleam
Alexander Heldt 0fa2ce4d0e Add ipc module
2025-11-10 08:45:58 +01:00

60 lines
1.2 KiB
Gleam

import gleam/bytes_tree
pub type Socket
// https://www.erlang.org/doc/apps/kernel/inet#t:address_family/0
// local socket
type Local {
Local(socket_path: String)
}
type ModeValue {
Binary
}
type IPCOption {
Active(Bool)
Mode(ModeValue)
}
pub type IPCError {
IPCError(reason: String)
}
pub fn connect(socket_path: String) -> Result(Socket, IPCError) {
let options = [Mode(Binary), Active(False)]
// timeout in ms
let timeout = 1000
gen_tcp_connect(Local(socket_path), 0, options, timeout)
}
pub fn send(socket: Socket, message: String) -> Result(Nil, IPCError) {
gen_tcp_send(socket, bytes_tree.from_string(message))
}
pub fn close(socket: Socket) -> Nil {
gen_tcp_close(socket)
}
// https://www.erlang.org/doc/apps/kernel/gen_tcp.html#connect/4
@external(erlang, "gen_tcp", "connect")
fn gen_tcp_connect(
address: Local,
port: Int,
options: List(IPCOption),
timeout: Int,
) -> Result(Socket, IPCError)
// https://www.erlang.org/doc/apps/kernel/gen_tcp.html#send/2
@external(erlang, "ipc_ffi", "send")
fn gen_tcp_send(
socket: Socket,
packet: bytes_tree.BytesTree,
) -> Result(Nil, IPCError)
// https://www.erlang.org/doc/apps/kernel/gen_tcp.html#close/1
@external(erlang, "gen_tcp", "close")
fn gen_tcp_close(socket: Socket) -> Nil