From 7fd8a440c3269eea5f45d2d8167b84e5c3d69c82 Mon Sep 17 00:00:00 2001 From: Jamie <113370520+jamiebuilds-signal@users.noreply.github.com> Date: Tue, 23 Dec 2025 09:50:43 -0800 Subject: [PATCH] Fix foreign key error pinning in-memory messages --- ts/messageModifiers/PinnedMessages.preload.ts | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/ts/messageModifiers/PinnedMessages.preload.ts b/ts/messageModifiers/PinnedMessages.preload.ts index 497815b4c0..3f6ea66be7 100644 --- a/ts/messageModifiers/PinnedMessages.preload.ts +++ b/ts/messageModifiers/PinnedMessages.preload.ts @@ -14,6 +14,8 @@ import { getPinnedMessagesLimit } from '../util/pinnedMessages.dom.js'; import { getPinnedMessageExpiresAt } from '../util/pinnedMessages.std.js'; import { pinnedMessagesCleanupService } from '../services/expiring/pinnedMessagesCleanupService.preload.js'; import { drop } from '../util/drop.std.js'; +import type { AppendPinnedMessageResult } from '../sql/server/pinnedMessages.std.js'; +import * as Errors from '../types/errors.std.js'; const { AccessRequired } = Proto.AccessControl; const { Role } = Proto.Member; @@ -37,9 +39,8 @@ export type PinnedMessageRemoveProps = Readonly<{ export async function onPinnedMessageAdd( props: PinnedMessageAddProps ): Promise { - const log = parentLog.child( - `onPinnedMessageAdd(timestamp=${props.targetSentTimestamp}, aci=${props.targetAuthorAci})` - ); + const logPrefix = `onPinnedMessageAdd(timestamp=${props.targetSentTimestamp}, aci=${props.targetAuthorAci})`; + const log = parentLog.child(logPrefix); const target = await findMessageModifierTarget( props.targetSentTimestamp, @@ -61,18 +62,34 @@ export async function onPinnedMessageAdd( const { targetMessage, targetConversation } = target; - const expiresAt = getPinnedMessageExpiresAt( - props.receivedAtTimestamp, - props.pinDuration - ); + const result = await targetConversation.queueJob(logPrefix, async () => { + const promises = targetConversation.getSavePromises(); + log.info(`Waiting for message saves (${promises.length} items)...`); + await Promise.all(promises); - const pinnedMessagesLimit = getPinnedMessagesLimit(); + const expiresAt = getPinnedMessageExpiresAt( + props.receivedAtTimestamp, + props.pinDuration + ); - const result = await DataWriter.appendPinnedMessage(pinnedMessagesLimit, { - conversationId: targetConversation.id, - messageId: targetMessage.id, - expiresAt, - pinnedAt: props.receivedAtTimestamp, + const pinnedMessagesLimit = getPinnedMessagesLimit(); + + let appendResult: AppendPinnedMessageResult; + try { + appendResult = await DataWriter.appendPinnedMessage(pinnedMessagesLimit, { + conversationId: targetConversation.id, + messageId: targetMessage.id, + expiresAt, + pinnedAt: props.receivedAtTimestamp, + }); + } catch (error) { + log.error( + `Failed to append pinned message: ${Errors.toLogFormat(error)}` + ); + throw error; + } + + return appendResult; }); if (result.change == null) {