Changeset View
Changeset View
Standalone View
Standalone View
keyserver/src/creators/message-creator.js
Show All 32 Lines | import { | ||||
mergeOrConditions, | mergeOrConditions, | ||||
} from '../database/database.js'; | } from '../database/database.js'; | ||||
import { | import { | ||||
fetchMessageInfoForLocalID, | fetchMessageInfoForLocalID, | ||||
fetchMessageInfoByID, | fetchMessageInfoByID, | ||||
} from '../fetchers/message-fetchers.js'; | } from '../fetchers/message-fetchers.js'; | ||||
import { fetchOtherSessionsForViewer } from '../fetchers/session-fetchers.js'; | import { fetchOtherSessionsForViewer } from '../fetchers/session-fetchers.js'; | ||||
import { fetchServerThreadInfos } from '../fetchers/thread-fetchers.js'; | import { fetchServerThreadInfos } from '../fetchers/thread-fetchers.js'; | ||||
import { sendPushNotifs } from '../push/send.js'; | import { sendPushNotifs, sendRescindNotifs } from '../push/send.js'; | ||||
import { handleAsyncPromise } from '../responders/handlers.js'; | import { handleAsyncPromise } from '../responders/handlers.js'; | ||||
import type { Viewer } from '../session/viewer.js'; | import type { Viewer } from '../session/viewer.js'; | ||||
import { earliestFocusedTimeConsideredExpired } from '../shared/focused-times.js'; | import { earliestFocusedTimeConsideredExpired } from '../shared/focused-times.js'; | ||||
import { publisher } from '../socket/redis.js'; | import { publisher } from '../socket/redis.js'; | ||||
import { creationString } from '../utils/idempotent.js'; | import { creationString } from '../utils/idempotent.js'; | ||||
type UserThreadInfo = { | type UserThreadInfo = { | ||||
+devices: Map< | +devices: Map< | ||||
▲ Show 20 Lines • Show All 338 Lines • ▼ Show 20 Lines | for (const row of result) { | ||||
if (!focusedUser) { | if (!focusedUser) { | ||||
thisUserInfo.notFocusedThreadIDs.add(threadID); | thisUserInfo.notFocusedThreadIDs.add(threadID); | ||||
} | } | ||||
} | } | ||||
const messageInfosPerUser = {}; | const messageInfosPerUser = {}; | ||||
const latestMessagesPerUser: LatestMessagesPerUser = new Map(); | const latestMessagesPerUser: LatestMessagesPerUser = new Map(); | ||||
const userPushInfoPromises = {}; | const userPushInfoPromises = {}; | ||||
const userRescindInfoPromises = {}; | |||||
for (const pair of perUserInfo) { | for (const pair of perUserInfo) { | ||||
const [userID, preUserPushInfo] = pair; | const [userID, preUserPushInfo] = pair; | ||||
const userMessageInfos = []; | const userMessageInfos = []; | ||||
for (const threadID of preUserPushInfo.threadIDs) { | for (const threadID of preUserPushInfo.threadIDs) { | ||||
const messageIndices = threadsToMessageIndices.get(threadID); | const messageIndices = threadsToMessageIndices.get(threadID); | ||||
invariant(messageIndices, `indices should exist for thread ${threadID}`); | invariant(messageIndices, `indices should exist for thread ${threadID}`); | ||||
for (const messageIndex of messageIndices) { | for (const messageIndex of messageIndices) { | ||||
▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | const generateNotifUserInfoPromise = async (pushType: PushType) => { | ||||
return { | return { | ||||
devices: userDevices, | devices: userDevices, | ||||
messageInfos: filteredNotifMessageInfos, | messageInfos: filteredNotifMessageInfos, | ||||
}; | }; | ||||
}; | }; | ||||
const userPushInfoPromise = generateNotifUserInfoPromise(pushTypes.NOTIF); | const userPushInfoPromise = generateNotifUserInfoPromise(pushTypes.NOTIF); | ||||
const userRescindInfoPromise = generateNotifUserInfoPromise( | |||||
pushTypes.RESCIND, | |||||
); | |||||
userPushInfoPromises[userID] = userPushInfoPromise; | userPushInfoPromises[userID] = userPushInfoPromise; | ||||
userRescindInfoPromises[userID] = userRescindInfoPromise; | |||||
} | } | ||||
const latestMessages = flattenLatestMessagesPerUser(latestMessagesPerUser); | const latestMessages = flattenLatestMessagesPerUser(latestMessagesPerUser); | ||||
const [pushInfo] = await Promise.all([ | const [pushInfo, rescindInfo] = await Promise.all([ | ||||
promiseAll(userPushInfoPromises), | promiseAll(userPushInfoPromises), | ||||
promiseAll(userRescindInfoPromises), | |||||
createReadStatusUpdates(latestMessages), | createReadStatusUpdates(latestMessages), | ||||
redisPublish(viewer, messageInfosPerUser, updatesForCurrentSession), | redisPublish(viewer, messageInfosPerUser, updatesForCurrentSession), | ||||
updateLatestMessages(latestMessages), | updateLatestMessages(latestMessages), | ||||
]); | ]); | ||||
await sendPushNotifs(_pickBy(Boolean)(pushInfo)); | await Promise.all([ | ||||
sendPushNotifs(_pickBy(Boolean)(pushInfo)), | |||||
sendRescindNotifs(_pickBy(Boolean)(rescindInfo)), | |||||
]); | |||||
} | } | ||||
async function redisPublish( | async function redisPublish( | ||||
viewer: Viewer, | viewer: Viewer, | ||||
messageInfosPerUser: { [userID: string]: $ReadOnlyArray<RawMessageInfo> }, | messageInfosPerUser: { [userID: string]: $ReadOnlyArray<RawMessageInfo> }, | ||||
updatesForCurrentSession: UpdatesForCurrentSession, | updatesForCurrentSession: UpdatesForCurrentSession, | ||||
) { | ) { | ||||
const avoidBroadcastingToCurrentSession = | const avoidBroadcastingToCurrentSession = | ||||
▲ Show 20 Lines • Show All 168 Lines • Show Last 20 Lines |