writeToMailbox function

Future<void> writeToMailbox(
  1. String recipientName,
  2. TeammateMessage message, {
  3. String? teamName,
})

Write a message to a teammate's inbox. Uses file locking via a .lock file sentinel to prevent race conditions.

Implementation

Future<void> writeToMailbox(
  String recipientName,
  TeammateMessage message, {
  String? teamName,
}) async {
  await _ensureInboxDir(teamName: teamName);

  final inboxPath = getInboxPath(recipientName, teamName: teamName);
  final lockFilePath = '$inboxPath.lock';

  // Ensure the inbox file exists before locking.
  final inboxFile = File(inboxPath);
  if (!inboxFile.existsSync()) {
    try {
      await inboxFile.writeAsString('[]');
    } catch (_) {}
  }

  final lock = File(lockFilePath);
  try {
    await _acquireLock(lock);

    final messages = await readMailbox(recipientName, teamName: teamName);
    final newMessage = TeammateMessage(
      from: message.from,
      text: message.text,
      timestamp: message.timestamp,
      read: false,
      color: message.color,
      summary: message.summary,
    );
    messages.add(newMessage);

    final encoder = const JsonEncoder.withIndent('  ');
    await inboxFile.writeAsString(
      encoder.convert(messages.map((m) => m.toJson()).toList()),
    );
  } catch (e) {
    // Silently fail — the message will be lost but the process continues.
  } finally {
    await _releaseLock(lock);
  }
}