Reference implementation of Bebop RPC using Apple XPC as the transport. Supports all four method types: unary, server streaming, client streaming, and duplex.
Build a router from generated handler protocols and start listening:
let builder = BebopRouterBuilder<XPCCallContext>()
builder.register(greeter: MyGreeter())
let router = builder.build()
let server = XPCBebopServer(router: router)
// Named Mach service (requires launchd plist with MachServices key)
try server.listen(machService: "com.example.greeter")
// Or anonymous, for in-process testing
let endpoint = try server.listenAnonymous()Connect by Mach service name or anonymous endpoint:
let channel = try XPCBebopChannel(machService: "com.example.greeter")
let client = GreeterClient(channel: channel)
let reply = try await client.sayHello(name: "World")The generated client has typed methods for each RPC. XPCBebopChannel conforms to BebopChannel, so any generated client works with it.
Peer validation via code-signing requirements:
let server = XPCBebopServer(router: router, security: .sameTeam())
let channel = try XPCBebopChannel(machService: name, security: .sameTeam())Options: .none, .sameTeam(), .platformBinary(), .hasEntitlement("com.example.access").
The channel exposes lifecycle events:
for await event in channel.events {
switch event {
case .connected: ...
case .disconnected(let reason): ...
case .failed(let reason): ...
}
}See Examples/ExifService -- an EXIF metadata reader running as a launchd agent.