88 lines
2.4 KiB
TypeScript
88 lines
2.4 KiB
TypeScript
![]() |
import * as encoding from 'lib0/encoding'
|
||
|
import * as decoding from 'lib0/decoding'
|
||
|
import { YWsProvider } from './y-socket';
|
||
|
import { YMessageType } from './types';
|
||
|
import * as awarenessProtocol from './y-awareness'
|
||
|
import * as syncProtocol from './y-sync'
|
||
|
import * as authProtocol from './y-auth'
|
||
|
export type MessageHandler = (encoder: encoding.Encoder, decoder: decoding.Decoder, provider: YWsProvider, emitSynced: boolean, messageType: number) => void;
|
||
|
|
||
|
export const messageHandlers: MessageHandler[] = []
|
||
|
|
||
|
messageHandlers[YMessageType.Sync] = (
|
||
|
encoder,
|
||
|
decoder,
|
||
|
provider,
|
||
|
emitSynced,
|
||
|
_messageType
|
||
|
) => {
|
||
|
// console.log('Handling YMessageType.Sync')
|
||
|
encoding.writeVarUint(encoder, YMessageType.Sync)
|
||
|
const syncMessageType = syncProtocol.readSyncMessage(
|
||
|
decoder,
|
||
|
encoder,
|
||
|
provider.doc,
|
||
|
provider
|
||
|
)
|
||
|
// console.debug(`Sync message type: ${syncMessageType}`)
|
||
|
if (
|
||
|
emitSynced && syncMessageType === syncProtocol.messageYjsSyncStep2 &&
|
||
|
!provider.synced
|
||
|
) {
|
||
|
// console.log('Setting provider.synced to true')
|
||
|
provider.synced = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
messageHandlers[YMessageType.QueryAwareness] = (
|
||
|
encoder,
|
||
|
_decoder,
|
||
|
provider,
|
||
|
_emitSynced,
|
||
|
_messageType
|
||
|
) => {
|
||
|
console.log('Handling messageQueryAwareness')
|
||
|
encoding.writeVarUint(encoder, YMessageType.Awareness)
|
||
|
encoding.writeVarUint8Array(
|
||
|
encoder,
|
||
|
awarenessProtocol.encodeAwarenessUpdate(
|
||
|
provider.awareness,
|
||
|
Array.from(provider.awareness.getStates().keys())
|
||
|
)
|
||
|
)
|
||
|
console.debug('Encoded awareness update for querying awareness state.')
|
||
|
}
|
||
|
|
||
|
messageHandlers[YMessageType.Awareness] = (
|
||
|
_encoder,
|
||
|
decoder,
|
||
|
provider,
|
||
|
_emitSynced,
|
||
|
_messageType
|
||
|
) => {
|
||
|
// console.log('Handling messageAwareness')
|
||
|
const awarenessUpdate = decoding.readVarUint8Array(decoder)
|
||
|
awarenessProtocol.applyAwarenessUpdate(
|
||
|
provider.awareness,
|
||
|
awarenessUpdate,
|
||
|
provider
|
||
|
)
|
||
|
}
|
||
|
|
||
|
messageHandlers[YMessageType.Auth] = (
|
||
|
_encoder,
|
||
|
decoder,
|
||
|
provider,
|
||
|
_emitSynced,
|
||
|
_messageType
|
||
|
) => {
|
||
|
console.log('Handling messageAuth')
|
||
|
authProtocol.readAuthMessage(
|
||
|
decoder,
|
||
|
provider.doc,
|
||
|
(_ydoc, reason) => permissionDeniedHandler(provider, reason)
|
||
|
)
|
||
|
}
|
||
|
const permissionDeniedHandler = (provider: YWsProvider, reason: string) =>
|
||
|
console.warn(`Permission denied to access ${provider.url}.\n${reason}`)
|