From 53791229bc0001962b1ab20103a847ddb25717d8 Mon Sep 17 00:00:00 2001 From: ingeniumed Date: Thu, 5 Feb 2026 16:22:36 +0100 Subject: [PATCH] Remove the client from the awareness state when they disconnect --- packages/core-data/src/awareness/awareness-state.ts | 4 ++-- .../src/providers/http-polling/polling-manager.ts | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/core-data/src/awareness/awareness-state.ts b/packages/core-data/src/awareness/awareness-state.ts index f8db6c976c586b..2bb4b051ac0a9c 100644 --- a/packages/core-data/src/awareness/awareness-state.ts +++ b/packages/core-data/src/awareness/awareness-state.ts @@ -165,6 +165,8 @@ export abstract class AwarenessState< this.hasSetupRun = true; + this.onSetUp(); + this.on( 'change', ( { added, removed, updated }: AwarenessStateChange ) => { @@ -186,8 +188,6 @@ export abstract class AwarenessState< this.updateSubscribers(); } ); - - this.onSetUp(); }; /** diff --git a/packages/sync/src/providers/http-polling/polling-manager.ts b/packages/sync/src/providers/http-polling/polling-manager.ts index ab1e7cd2fbca34..cdc8f57c10d19f 100644 --- a/packages/sync/src/providers/http-polling/polling-manager.ts +++ b/packages/sync/src/providers/http-polling/polling-manager.ts @@ -5,6 +5,7 @@ import * as Y from 'yjs'; import * as encoding from 'lib0/encoding'; import * as decoding from 'lib0/decoding'; import type { Awareness } from 'y-protocols/awareness'; +import { removeAwarenessStates } from 'y-protocols/awareness'; import * as syncProtocol from 'y-protocols/sync'; /** @@ -162,15 +163,22 @@ function processAwarenessUpdate( } } ); - if ( added.size + updated.size + removed.size > 0 ) { + if ( added.size + updated.size > 0 ) { awareness.emit( 'change', [ { added: Array.from( added ), updated: Array.from( updated ), - removed: Array.from( removed ), }, ] ); } + + if ( removed.size > 0 ) { + removeAwarenessStates( + awareness, + Array.from( removed ), + POLLING_MANAGER_ORIGIN + ); + } } /**