From 71487f7881caa280ed0504f4ba8a563a24846ed7 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Jul 2025 19:21:19 -0400 Subject: [PATCH] render Update(*) activities with deterministic IDs --- packages/backend/src/core/activitypub/ApRendererService.ts | 6 ++++-- packages/backend/src/core/activitypub/type.ts | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/core/activitypub/ApRendererService.ts b/packages/backend/src/core/activitypub/ApRendererService.ts index 9f55be11ac..800b00f8a7 100644 --- a/packages/backend/src/core/activitypub/ApRendererService.ts +++ b/packages/backend/src/core/activitypub/ApRendererService.ts @@ -750,9 +750,11 @@ export class ApRendererService { } @bindThis - public renderUpdate(object: string | IObject, user: { id: MiUser['id'] }): IUpdate { + public renderUpdate(object: IObject, user: { id: MiUser['id'] }): IUpdate { + // Deterministic activity IDs to allow de-duplication by remote instances + const updatedAt = object.updated ? new Date(object.updated).getTime() : Date.now(); return { - id: `${this.config.url}/users/${user.id}#updates/${new Date().getTime()}`, + id: `${this.config.url}/users/${user.id}#updates/${updatedAt}`, actor: this.userEntityService.genLocalUserUri(user.id), type: 'Update', to: ['https://www.w3.org/ns/activitystreams#Public'], diff --git a/packages/backend/src/core/activitypub/type.ts b/packages/backend/src/core/activitypub/type.ts index 5d4b2b01c5..abe142e812 100644 --- a/packages/backend/src/core/activitypub/type.ts +++ b/packages/backend/src/core/activitypub/type.ts @@ -28,8 +28,9 @@ export interface IObject { inReplyTo?: any; replies?: ICollection | IOrderedCollection | string; content?: string | null; - startTime?: Date; - endTime?: Date; + startTime?: Date; // TODO these are wrong - should be string + endTime?: Date; // TODO these are wrong - should be string + updated?: string; icon?: any; image?: any; mediaType?: string; @@ -216,7 +217,6 @@ export interface IPost extends IObject { quoteUrl?: string; quoteUri?: string; quote?: string; - updated?: string; } export interface IQuestion extends IObject {