From d9bffef1b21426af3c5c93ef5f891d84e52806b7 Mon Sep 17 00:00:00 2001 From: Erik Olsson Date: Fri, 18 Oct 2024 09:55:53 +0200 Subject: [PATCH 1/2] avoid cached scrollbacks if stream contains a renderable event --- packages/sdk/src/syncedStream.ts | 43 +++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/sdk/src/syncedStream.ts b/packages/sdk/src/syncedStream.ts index 53eeb305a..1f5ccfddb 100644 --- a/packages/sdk/src/syncedStream.ts +++ b/packages/sdk/src/syncedStream.ts @@ -9,7 +9,7 @@ import { StreamEvents } from './streamEvents' import { isChannelStreamId, isDMChannelStreamId, isGDMChannelStreamId } from './id' import { ISyncedStream } from './syncedStreamsLoop' -const CACHED_SCROLLBACK_COUNT = 3 +const MAX_CACHED_SCROLLBACK_COUNT = 3 export class SyncedStream extends Stream implements ISyncedStream { log: DLogger isUpToDate = false @@ -46,10 +46,12 @@ export class SyncedStream extends Stream implements ISyncedStream { return false } - const prependedMiniblocks = await this.cachedScrollback( - miniblocks[0].header.prevSnapshotMiniblockNum, - miniblocks[0].header.miniblockNum, - ) + const prependedMiniblocks = hasTopLevelRenderableEvent(miniblocks) + ? [] + : await this.cachedScrollback( + miniblocks[0].header.prevSnapshotMiniblockNum, + miniblocks[0].header.miniblockNum, + ) const snapshotEventIds = eventIdsFromSnapshot(snapshot) const eventIds = miniblocks.flatMap((mb) => mb.events.map((e) => e.hashStr)) @@ -210,7 +212,7 @@ export class SyncedStream extends Stream implements ISyncedStream { return [] } let miniblocks: ParsedMiniblock[] = [] - for (let i = 0; i < CACHED_SCROLLBACK_COUNT; i++) { + for (let i = 0; i < MAX_CACHED_SCROLLBACK_COUNT; i++) { if (toExclusive <= 0n) { break } @@ -223,6 +225,9 @@ export class SyncedStream extends Stream implements ISyncedStream { miniblocks = [...result, ...miniblocks] fromInclusive = result[0].header.prevSnapshotMiniblockNum toExclusive = result[0].header.miniblockNum + if (hasTopLevelRenderableEvent(miniblocks)) { + break + } } else { break } @@ -261,3 +266,29 @@ function eventIdsFromSnapshot(snapshot: Snapshot): string[] { return [...usernameEventIds, ...displayNameEventIds] } } + +function hasTopLevelRenderableEvent(miniblocks: ParsedMiniblock[]): boolean { + for (const mb of miniblocks) { + if (topLevelRenderableEventInMiniblock(mb)) { + return true + } + } + return false +} + +function topLevelRenderableEventInMiniblock(miniblock: ParsedMiniblock): boolean { + for (const e of miniblock.events) { + switch (e.event.payload.case) { + case 'channelPayload': + case 'gdmChannelPayload': + case 'dmChannelPayload': + switch (e.event.payload.value.content.case) { + case 'message': + if (!e.event.payload.value.content.value.refEventId) { + return true + } + } + } + } + return false +} From a1ddc74ef875d6f15a0ca3b3b10f3d3ca1a261c8 Mon Sep 17 00:00:00 2001 From: Erik Olsson Date: Fri, 18 Oct 2024 10:27:39 +0200 Subject: [PATCH 2/2] only check channel streams --- packages/sdk/src/syncedStream.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/sdk/src/syncedStream.ts b/packages/sdk/src/syncedStream.ts index 1f5ccfddb..d3aae0c92 100644 --- a/packages/sdk/src/syncedStream.ts +++ b/packages/sdk/src/syncedStream.ts @@ -46,12 +46,18 @@ export class SyncedStream extends Stream implements ISyncedStream { return false } - const prependedMiniblocks = hasTopLevelRenderableEvent(miniblocks) - ? [] - : await this.cachedScrollback( - miniblocks[0].header.prevSnapshotMiniblockNum, - miniblocks[0].header.miniblockNum, - ) + const isChannelStream = + isChannelStreamId(this.streamId) || + isDMChannelStreamId(this.streamId) || + isGDMChannelStreamId(this.streamId) + const prependedMiniblocks = isChannelStream + ? hasTopLevelRenderableEvent(miniblocks) + ? [] + : await this.cachedScrollback( + miniblocks[0].header.prevSnapshotMiniblockNum, + miniblocks[0].header.miniblockNum, + ) + : [] const snapshotEventIds = eventIdsFromSnapshot(snapshot) const eventIds = miniblocks.flatMap((mb) => mb.events.map((e) => e.hashStr))