mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-23 11:37:02 -04:00
49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: 2022 The HedgeDoc developers (see AUTHORS file)
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
import { encodeAwarenessUpdateMessage } from '@hedgedoc/realtime';
|
|
import { Awareness } from 'y-protocols/awareness';
|
|
|
|
import { RealtimeNote } from './realtime-note';
|
|
|
|
export interface ClientIdUpdate {
|
|
added: number[];
|
|
updated: number[];
|
|
removed: number[];
|
|
}
|
|
|
|
/**
|
|
* This is the implementation of {@link Awareness YAwareness} which includes additional handlers for message sending and receiving.
|
|
*/
|
|
export class WebsocketAwareness extends Awareness {
|
|
constructor(private realtimeNote: RealtimeNote) {
|
|
super(realtimeNote.getYDoc());
|
|
this.setLocalState(null);
|
|
this.on('update', this.distributeAwarenessUpdate.bind(this));
|
|
}
|
|
|
|
/**
|
|
* Distributes the given awareness changes to all clients.
|
|
*
|
|
* @param added Properties that were added to the awareness state
|
|
* @param updated Properties that were updated in the awareness state
|
|
* @param removed Properties that were removed from the awareness state
|
|
* @param origin An object that is used as reference for the origin of the update
|
|
*/
|
|
private distributeAwarenessUpdate(
|
|
{ added, updated, removed }: ClientIdUpdate,
|
|
origin: unknown,
|
|
): void {
|
|
const binaryUpdate = encodeAwarenessUpdateMessage(this, [
|
|
...added,
|
|
...updated,
|
|
...removed,
|
|
]);
|
|
this.realtimeNote
|
|
.getConnections()
|
|
.filter((client) => client !== origin && client.isSynced())
|
|
.forEach((client) => client.send(binaryUpdate));
|
|
}
|
|
}
|