func sendMessage()

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
        }
    }