UNPKG

@hocuspocus/common

Version:

shared code for multiple Hocuspocus packages

328 lines (327 loc) 10.5 kB
import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http'; import type { URLSearchParams } from 'url'; import type { Awareness } from 'y-protocols/awareness'; import type Connection from './Connection.ts'; import type Document from './Document.ts'; import type { Hocuspocus } from './Hocuspocus.ts'; export declare enum MessageType { Unknown = -1, Sync = 0, Awareness = 1, Auth = 2, QueryAwareness = 3, SyncReply = 4,// same as Sync, but won't trigger another 'SyncStep1' Stateless = 5, BroadcastStateless = 6, CLOSE = 7, SyncStatus = 8 } export interface AwarenessUpdate { added: Array<any>; updated: Array<any>; removed: Array<any>; } export interface ConnectionConfiguration { readOnly: boolean; isAuthenticated: boolean; } export interface Extension { priority?: number; extensionName?: string; onConfigure?(data: onConfigurePayload): Promise<any>; onListen?(data: onListenPayload): Promise<any>; onUpgrade?(data: onUpgradePayload): Promise<any>; onConnect?(data: onConnectPayload): Promise<any>; connected?(data: connectedPayload): Promise<any>; onAuthenticate?(data: onAuthenticatePayload): Promise<any>; onCreateDocument?(data: onCreateDocumentPayload): Promise<any>; onLoadDocument?(data: onLoadDocumentPayload): Promise<any>; afterLoadDocument?(data: afterLoadDocumentPayload): Promise<any>; beforeHandleMessage?(data: beforeHandleMessagePayload): Promise<any>; beforeSync?(data: beforeSyncPayload): Promise<any>; beforeBroadcastStateless?(data: beforeBroadcastStatelessPayload): Promise<any>; onStateless?(payload: onStatelessPayload): Promise<any>; onChange?(data: onChangePayload): Promise<any>; onStoreDocument?(data: onStoreDocumentPayload): Promise<any>; afterStoreDocument?(data: afterStoreDocumentPayload): Promise<any>; onAwarenessUpdate?(data: onAwarenessUpdatePayload): Promise<any>; onRequest?(data: onRequestPayload): Promise<any>; onDisconnect?(data: onDisconnectPayload): Promise<any>; beforeUnloadDocument?(data: beforeUnloadDocumentPayload): Promise<any>; afterUnloadDocument?(data: afterUnloadDocumentPayload): Promise<any>; onDestroy?(data: onDestroyPayload): Promise<any>; } export type HookName = 'onConfigure' | 'onListen' | 'onUpgrade' | 'onConnect' | 'connected' | 'onAuthenticate' | 'onCreateDocument' | 'onLoadDocument' | 'afterLoadDocument' | 'beforeHandleMessage' | 'beforeBroadcastStateless' | 'beforeSync' | 'onStateless' | 'onChange' | 'onStoreDocument' | 'afterStoreDocument' | 'onAwarenessUpdate' | 'onRequest' | 'onDisconnect' | 'beforeUnloadDocument' | 'afterUnloadDocument' | 'onDestroy'; export type HookPayloadByName = { onConfigure: onConfigurePayload; onListen: onListenPayload; onUpgrade: onUpgradePayload; onConnect: onConnectPayload; connected: connectedPayload; onAuthenticate: onAuthenticatePayload; onCreateDocument: onCreateDocumentPayload; onLoadDocument: onLoadDocumentPayload; afterLoadDocument: afterLoadDocumentPayload; beforeHandleMessage: beforeHandleMessagePayload; beforeBroadcastStateless: beforeBroadcastStatelessPayload; beforeSync: beforeSyncPayload; onStateless: onStatelessPayload; onChange: onChangePayload; onStoreDocument: onStoreDocumentPayload; afterStoreDocument: afterStoreDocumentPayload; onAwarenessUpdate: onAwarenessUpdatePayload; onRequest: onRequestPayload; onDisconnect: onDisconnectPayload; afterUnloadDocument: afterUnloadDocumentPayload; beforeUnloadDocument: beforeUnloadDocumentPayload; onDestroy: onDestroyPayload; }; export interface Configuration extends Extension { /** * A name for the instance, used for logging. */ name: string | null; /** * A list of hocuspocus extensions. */ extensions: Array<Extension>; /** * Defines in which interval the server sends a ping, and closes the connection when no pong is sent back. */ timeout: number; /** * Debounces the call of the `onStoreDocument` hook for the given amount of time in ms. * Otherwise every single update would be persisted. */ debounce: number; /** * Makes sure to call `onStoreDocument` at least in the given amount of time (ms). */ maxDebounce: number; /** * By default, the servers show a start screen. If passed false, the server will start quietly. */ quiet: boolean; /** * If set to false, respects the debounce time of `onStoreDocument` before unloading a document. * Otherwise, the document will be unloaded immediately. * * This prevents a client from DOSing the server by repeatedly connecting and disconnecting when * your onStoreDocument is rate-limited. */ unloadImmediately: boolean; /** * options to pass to the ydoc document */ yDocOptions: { gc: boolean; gcFilter: () => boolean; }; } export interface onStatelessPayload { connection: Connection; documentName: string; document: Document; payload: string; } export interface onAuthenticatePayload { context: any; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; request: IncomingMessage; socketId: string; token: string; connectionConfig: ConnectionConfiguration; } export interface onCreateDocumentPayload { context: any; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; connectionConfig: ConnectionConfiguration; } export interface onConnectPayload { context: any; documentName: string; instance: Hocuspocus; request: IncomingMessage; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; connectionConfig: ConnectionConfiguration; } export interface connectedPayload { context: any; documentName: string; instance: Hocuspocus; request: IncomingMessage; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; connectionConfig: ConnectionConfiguration; connection: Connection; } export interface onLoadDocumentPayload { context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; connectionConfig: ConnectionConfiguration; } export interface afterLoadDocumentPayload { context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; connectionConfig: ConnectionConfiguration; } export interface onChangePayload { clientsCount: number; context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; update: Uint8Array; socketId: string; transactionOrigin: any; } export interface beforeHandleMessagePayload { clientsCount: number; context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; update: Uint8Array; socketId: string; connection: Connection; } export interface beforeSyncPayload { clientsCount: number; context: any; document: Document; documentName: string; connection: Connection; /** * The y-protocols/sync message type * @example * 0: SyncStep1 * 1: SyncStep2 * 2: YjsUpdate * * @see https://github.com/yjs/y-protocols/blob/master/sync.js#L13-L40 */ type: number; /** * The payload of the y-sync message. */ payload: Uint8Array; } export interface beforeBroadcastStatelessPayload { document: Document; documentName: string; payload: string; } export interface onStoreDocumentPayload { clientsCount: number; context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; transactionOrigin?: any; } export interface afterStoreDocumentPayload extends onStoreDocumentPayload { } export interface onAwarenessUpdatePayload { context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; added: number[]; updated: number[]; removed: number[]; awareness: Awareness; states: StatesArray; } export type StatesArray = { clientId: number; [key: string | number]: any; }[]; export interface fetchPayload { context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; connectionConfig: ConnectionConfiguration; } export interface storePayload extends onStoreDocumentPayload { state: Buffer; } export interface onDisconnectPayload { clientsCount: number; context: any; document: Document; documentName: string; instance: Hocuspocus; requestHeaders: IncomingHttpHeaders; requestParameters: URLSearchParams; socketId: string; } export interface onRequestPayload { request: IncomingMessage; response: ServerResponse; instance: Hocuspocus; } export interface onUpgradePayload { request: IncomingMessage; socket: any; head: any; instance: Hocuspocus; } export interface onListenPayload { instance: Hocuspocus; configuration: Configuration; port: number; } export interface onDestroyPayload { instance: Hocuspocus; } export interface onConfigurePayload { instance: Hocuspocus; configuration: Configuration; version: string; } export interface afterUnloadDocumentPayload { instance: Hocuspocus; documentName: string; } export interface beforeUnloadDocumentPayload { instance: Hocuspocus; documentName: string; } export interface DirectConnection { transact(transaction: (document: Document) => void): Promise<void>; disconnect(): void; }