mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-23 03:27:05 -04:00

The package caused some issues while working on other features. Mostly because bundlers have been unable to determine the correct websocket constructor. So I replaced it with a more object-oriented approach. Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
/*
|
|
* SPDX-FileCopyrightText: 2023 The HedgeDoc developers (see AUTHORS file)
|
|
*
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
import { RealtimeDoc } from '../y-doc-sync/index.js'
|
|
import { ConnectionState } from './message-transporter.js'
|
|
import { Message, MessageType } from './message.js'
|
|
import { TransportAdapter } from './transport-adapter.js'
|
|
|
|
/**
|
|
* Provides a transport adapter that simulates a connection with a real HedgeDoc realtime backend.
|
|
*/
|
|
export class MockedBackendTransportAdapter implements TransportAdapter {
|
|
private readonly doc: RealtimeDoc
|
|
|
|
private connected = true
|
|
|
|
private closeHandler: undefined | (() => void)
|
|
|
|
private messageHandler: undefined | ((value: Message<MessageType>) => void)
|
|
|
|
constructor(initialContent: string) {
|
|
this.doc = new RealtimeDoc(initialContent)
|
|
}
|
|
|
|
bindOnCloseEvent(handler: () => void): () => void {
|
|
this.closeHandler = handler
|
|
return () => {
|
|
this.connected = false
|
|
this.closeHandler = undefined
|
|
}
|
|
}
|
|
|
|
bindOnConnectedEvent(handler: () => void): () => void {
|
|
handler()
|
|
return () => {
|
|
//empty on purpose
|
|
}
|
|
}
|
|
|
|
bindOnErrorEvent(): () => void {
|
|
return () => {
|
|
//empty on purpose
|
|
}
|
|
}
|
|
|
|
bindOnMessageEvent(
|
|
handler: (value: Message<MessageType>) => void
|
|
): () => void {
|
|
this.messageHandler = handler
|
|
return () => {
|
|
this.messageHandler = undefined
|
|
}
|
|
}
|
|
|
|
disconnect(): void {
|
|
if (!this.connected) {
|
|
return
|
|
}
|
|
this.connected = false
|
|
this.closeHandler?.()
|
|
}
|
|
|
|
getConnectionState(): ConnectionState {
|
|
return this.connected
|
|
? ConnectionState.CONNECTED
|
|
: ConnectionState.DISCONNECTED
|
|
}
|
|
|
|
send(value: Message<MessageType>): void {
|
|
if (value.type === MessageType.NOTE_CONTENT_STATE_REQUEST) {
|
|
new Promise(() => {
|
|
this.messageHandler?.({
|
|
type: MessageType.NOTE_CONTENT_UPDATE,
|
|
payload: this.doc.encodeStateAsUpdate(value.payload)
|
|
})
|
|
}).catch((error: Error) => console.error(error))
|
|
} else if (value.type === MessageType.READY) {
|
|
new Promise(() => {
|
|
this.messageHandler?.({
|
|
type: MessageType.READY
|
|
})
|
|
}).catch((error: Error) => console.error(error))
|
|
}
|
|
}
|
|
}
|