All files / web/src/lib/notifications/channels socketio-channel.ts

0% Statements 0/39
0% Branches 0/1
0% Functions 0/1
0% Lines 0/39

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40                                                                               
import type {
  NotificationChannel,
  DeliveryTarget,
  NotificationEvent,
  DeliveryResult,
} from '../types'
import { formatNotificationContent } from '../types'
import { getSocketIO } from '@/lib/socket-io'

/**
 * Socket.IO in-app notification channel.
 *
 * Emits a typed notification event to the user's Socket.IO room
 * so that connected clients can show an in-app toast/banner.
 */
export const socketIOChannel: NotificationChannel = {
  name: 'inApp',

  canDeliver(target: DeliveryTarget): boolean {
    return target.channels.inApp && !!target.userId
  },

  async deliver(target: DeliveryTarget, event: NotificationEvent): Promise<DeliveryResult> {
    const io = await getSocketIO()
    if (!io) {
      return { success: false, error: 'Socket.IO server not available' }
    }

    const content = formatNotificationContent(event)

    io.to(`user:${target.userId}`).emit('notification', {
      type: event.type,
      ...content,
      data: event.data,
    })

    return { success: true }
  },
}