private Mono<Set<Long>> forwardClientMessageToNodes(
            @NotNull ByteBuf messageData,
            @NotNull Set<String> nodeIds,
            @NotNull Long recipientId,
            @NotNull Set<UserSessionId> excludedUserSessionIds,
            @Nullable DeviceType excludedDeviceType) {
        int nodeCount = nodeIds.size();
        if (nodeCount == 0) {
            messageData.release();
            return Mono.just(Set.of(recipientId));
        }
        if (nodeCount == 1) {
            return forwardClientMessageToNode(messageData,
                    nodeIds.iterator()
                            .next(),
                    Set.of(recipientId),
                    excludedUserSessionIds,
                    excludedDeviceType);
        }
        SendNotificationRequest request = new SendNotificationRequest(
                messageData,
                Set.of(recipientId),
                excludedUserSessionIds,
                excludedDeviceType);
        messageData.retain(nodeCount);
        List<Mono<Set<Long>>> sendNotificationRequests = new ArrayList<>(nodeCount);
        for (String nodeId : nodeIds) {
            sendNotificationRequests.add(node.getRpcService()
                    .requestResponse(nodeId, request));
        }
        return collectOfflineRecipientIds(sendNotificationRequests)
                .doFinally(signal -> messageData.release());
    }
@return offline user IDs
@implNote Return {@code Set<Long>} instead of {@code Long} for consistency.
turms-server-common/src/main/java/im/turms/server/common/infra/message/OutboundMessageManager.java