semaphore/src/routes/_actions/stream/processMessage.js

46 lines
1.7 KiB
JavaScript

import { mark, stop } from '../../_utils/marks.js'
import { deleteStatus } from '../deleteStatuses.js'
import { addStatusOrNotification } from '../addStatusOrNotification.js'
import { emit } from '../../_utils/eventBus.js'
const KNOWN_EVENTS = ['update', 'delete', 'notification', 'conversation', 'filters_changed']
export function processMessage (instanceName, timelineName, message) {
let { event, payload } = (message || {})
if (!KNOWN_EVENTS.includes(event)) {
console.warn('ignoring message from server', message)
return
}
mark('processMessage')
if (['update', 'notification', 'conversation'].includes(event)) {
payload = JSON.parse(payload) // only these payloads are JSON-encoded for some reason
}
switch (event) {
case 'delete':
deleteStatus(instanceName, payload)
break
case 'update':
addStatusOrNotification(instanceName, timelineName, payload)
break
case 'notification':
addStatusOrNotification(instanceName, 'notifications', payload)
if (payload.type === 'mention') {
addStatusOrNotification(instanceName, 'notifications/mentions', payload)
}
break
case 'conversation':
// This is a hack in order to mostly fit the conversation model into
// a timeline of statuses. To have a clean implementation we would need to
// reproduce what is done for statuses for the conversation.
//
// It will add new DMs as new conversations instead of updating existing threads
addStatusOrNotification(instanceName, timelineName, payload.last_status)
break
case 'filters_changed':
emit('wordFiltersChanged', instanceName)
break
}
stop('processMessage')
}