in SampleApp/Sources/FishyActorsDemo/main.swift [37:83]
mutating func run() throws {
LoggingSystem.bootstrap(PrettyDemoLogHandler.init)
let group = MultiThreadedEventLoopGroup(numberOfThreads: System.coreCount)
let otel = OTel(
serviceName: "chatroom",
eventLoopGroup: group,
processor: OTel.BatchSpanProcessor(
exportingTo: OtlpGRPCSpanExporter(config: OtlpGRPCSpanExporter.Config(eventLoopGroup: group)),
eventLoopGroup: group
)
)
try otel.start().wait()
InstrumentationSystem.bootstrap(otel.tracer())
var keepAlive: Set<Chatter> = []
// one node to keep the chat rooms:
let roomNode = try FishyTransport(host: "127.0.0.1", port: 8001, group: group, logLevel: transportLogLevel)
// multiple nodes for the regional chatters:
let firstNode = try FishyTransport(host: "127.0.0.1", port: 9002, group: group, logLevel: transportLogLevel)
let secondNode = try FishyTransport(host: "127.0.0.1", port: 9003, group: group, logLevel: transportLogLevel)
let room = ChatRoom(topic: "Cute Capybaras", transport: roomNode)
let alice = Chatter(transport: firstNode)
let bob = Chatter(transport: secondNode)
let charlie = Chatter(transport: secondNode)
for chatter in [alice, bob, charlie] {
keepAlive.insert(chatter)
Task {
// we resolve a reference to `room` using our `p.actorTransport`
// since all chatters are on other nodes than the chat room,
// this will always yield a remote reference.
let remoteRoom = try ChatRoom.resolve(room.id, using: chatter.actorTransport)
try await chatter.join(room: remoteRoom)
}
}
// normally transports will ofer `await .park()` functions, but for now just sleep:
sleep(1000)
_ = keepAlive
try otel.shutdown().wait()
try group.syncShutdownGracefully()
}