in Sources/DistributedActors/_Mailbox.swift [112:158]
func sendMessage(envelope: Payload, file: String, line: UInt) {
if self.serializeAllMessages {
var messageDescription = "[\(envelope.payload)]"
do {
if case .message(let message) = envelope.payload {
messageDescription = "[\(message)]:\(type(of: message))"
try self.shell?.system.serialization.verifySerializable(message: message as! Message)
}
} catch {
fatalError("Serialization check failed for message \(messageDescription) sent at \(file):\(line). " +
"Make sure this type has either a serializer registered OR is marked as `NonTransportableActorMessage`. " +
"This check was performed since `settings.serialization.serializeLocalMessages` was enabled.")
}
}
func sendAndDropAsDeadLetter() {
self.deadLetters.tell(DeadLetter(envelope.payload, recipient: self.address, sentAtFile: file, sentAtLine: line))
}
switch self.enqueueUserMessage(envelope) {
case .needsScheduling:
traceLog_Mailbox(self.address.path, "Enqueued message \(envelope.payload), scheduling for execution")
guard let shell = self.shell else {
traceLog_Mailbox(self.address.path, "_ActorShell was released! Unable to complete sendMessage, dropping: \(envelope)")
self.deadLetters.tell(DeadLetter(envelope.payload, recipient: self.address, sentAtFile: file, sentAtLine: line))
break
}
shell._dispatcher.execute(self.run)
case .alreadyScheduled:
traceLog_Mailbox(self.address.path, "Enqueued message \(envelope.payload), someone scheduled already")
case .mailboxTerminating:
// TODO: soundness check; we can't immediately send it to dead letters just yet since first all user messages
// already enqueued must be dropped. This is done by the "tombstone run". After it mailbox becomes closed
// and we can immediately send things to dead letters then.
sendAndDropAsDeadLetter()
case .mailboxClosed:
traceLog_Mailbox(self.address.path, "is CLOSED, dropping message \(envelope)")
sendAndDropAsDeadLetter()
case .mailboxFull:
traceLog_Mailbox(self.address.path, "is full, dropping message \(envelope)")
sendAndDropAsDeadLetter() // TODO: "Drop" rather than DeadLetter
}
}