in FishyTransport/Sources/FishyActorTransport/FishyTransport.swift [247:282]
func deliver(envelope: Envelope) async throws -> Data {
var baggage = Baggage.current ?? .topLevel
InstrumentationSystem.instrument.extract(
envelope.metadata,
into: &baggage,
using: MessageEnvelopeMetadataExtractor()
)
return try await Baggage.$current.withValue(baggage) {
log.debug("Deliver to \(envelope.recipient)")
guard let known = resolveRecipient(of: envelope) else {
throw handleDeadLetter(envelope)
}
log.debug("Delivering to local instance: \(known)", metadata: [
"envelope": "\(envelope)",
"recipient": "\(known)",
])
// In a real implementation coders would often be configurable on transport level.
//
// The transport must ensure to store itself in the user info offered to receive
// as it may need to attempt to decode actor references.
let encoder = JSONEncoder()
let decoder = JSONDecoder()
encoder.userInfo[.actorTransportKey] = self
decoder.userInfo[.actorTransportKey] = self
do {
return try await known._receiveAny(envelope: envelope, encoder: encoder, decoder: decoder)
} catch {
fatalError("Failed to deliver: \(error)")
}
}
}