Socket
Socket
Sign inDemoInstall

@hocuspocus/server

Package Overview
Dependencies
Maintainers
4
Versions
114
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@hocuspocus/server - npm Package Compare versions

Comparing version 2.1.0-alpha.0 to 2.1.0

dist/packages/server/src/DirectConnection.d.ts

4

dist/packages/common/src/auth.d.ts

@@ -5,3 +5,3 @@ import * as encoding from 'lib0/encoding';

export declare const writePermissionDenied: (encoder: encoding.Encoder, reason: string) => void;
export declare const writeAuthenticated: (encoder: encoding.Encoder) => void;
export declare const readAuthMessage: (decoder: decoding.Decoder, permissionDeniedHandler: (reason: string) => void, authenticatedHandler: () => void) => void;
export declare const writeAuthenticated: (encoder: encoding.Encoder, scope: 'readonly' | 'read-write') => void;
export declare const readAuthMessage: (decoder: decoding.Decoder, permissionDeniedHandler: (reason: string) => void, authenticatedHandler: (scope: string) => void) => void;
export declare const awarenessStatesToArray: (states: Map<number, Record<string, any>>) => {
clientId: number;
}[];

@@ -0,0 +0,0 @@ export interface CloseEvent {

@@ -1,4 +0,4 @@

export * from './auth';
export * from './CloseEvents';
export * from './awarenessStatesToArray';
export * from './types';
export * from './auth.js';
export * from './CloseEvents.js';
export * from './awarenessStatesToArray.js';
export * from './types.js';

@@ -0,0 +0,0 @@ import { Extension, onChangePayload, onLoadDocumentPayload, storePayload, fetchPayload } from '@hocuspocus/server';

@@ -1,1 +0,1 @@

export * from './Database';
export * from './Database.js';

@@ -1,1 +0,1 @@

export * from './Logger';
export * from './Logger.js';

@@ -0,0 +0,0 @@ import { Extension, onChangePayload, onConfigurePayload, onConnectPayload, onLoadDocumentPayload, onDestroyPayload, onDisconnectPayload, onRequestPayload, onUpgradePayload } from '@hocuspocus/server';

@@ -1,1 +0,1 @@

export * from './Redis';
export * from './Redis.js';

@@ -1,4 +0,5 @@

import RedisClient, { ClusterNode, ClusterOptions, RedisOptions, Cluster as RedisClusterClient } from 'ioredis';
import { Extension, afterLoadDocumentPayload, onDisconnectPayload, onAwarenessUpdatePayload, onChangePayload, Debugger, onConfigurePayload, beforeBroadcastStatelessPayload, Hocuspocus } from '@hocuspocus/server';
export type RedisInstance = RedisClient | RedisClusterClient;
import RedisClient, { ClusterNode, ClusterOptions, RedisOptions } from 'ioredis';
import Redlock from 'redlock';
import { Extension, afterLoadDocumentPayload, afterStoreDocumentPayload, onDisconnectPayload, onStoreDocumentPayload, onAwarenessUpdatePayload, onChangePayload, Debugger, onConfigurePayload, beforeBroadcastStatelessPayload, Hocuspocus } from '@hocuspocus/server';
export type RedisInstance = RedisClient.Cluster | RedisClient.Redis;
export interface Configuration {

@@ -41,2 +42,6 @@ /**

/**
* The maximum time for the Redis lock in ms (in case it can’t be released).
*/
lockTimeout: number;
/**
* A delay before onDisconnect is executed. This allows last minute updates'

@@ -58,2 +63,4 @@ * sync messages to be received by the subscription before it's closed.

instance: Hocuspocus;
redlock: Redlock;
locks: Map<string, Redlock.Lock>;
logger: Debugger;

@@ -65,2 +72,3 @@ constructor(configuration: Partial<Configuration>);

private subKey;
private lockKey;
/**

@@ -79,2 +87,11 @@ * Once a document is laoded, subscribe to the channel in Redis.

/**
* Before the document is stored, make sure to set a lock in Redis.
* That’s meant to avoid conflicts with other instances trying to store the document.
*/
onStoreDocument({ documentName }: onStoreDocumentPayload): Promise<unknown>;
/**
* Release the Redis lock, so other instances can store documents.
*/
afterStoreDocument({ documentName }: afterStoreDocumentPayload): Promise<void>;
/**
* Handle awareness update messages received directly by this Hocuspocus instance.

@@ -99,2 +116,6 @@ */

beforeBroadcastStateless(data: beforeBroadcastStatelessPayload): Promise<number>;
/**
* Kill the Redlock connection immediately.
*/
onDestroy(): Promise<void>;
}

@@ -1,1 +0,1 @@

export * from './SQLite';
export * from './SQLite.js';

@@ -0,0 +0,0 @@ import { Database, DatabaseConfiguration } from '@hocuspocus/extension-database';

@@ -0,0 +0,0 @@ /// <reference types="node" />

@@ -0,0 +0,0 @@ /// <reference types="node" />

@@ -0,0 +0,0 @@ export default class EventEmitter {

@@ -5,6 +5,5 @@ import * as Y from 'yjs';

import type { CloseEvent, Event, MessageEvent } from 'ws';
import EventEmitter from './EventEmitter';
import { ConstructableOutgoingMessage, onAuthenticationFailedParameters, onCloseParameters, onDisconnectParameters, onMessageParameters, onOpenParameters, onOutgoingMessageParameters, onStatelessParameters, onStatusParameters, onSyncedParameters, WebSocketStatus } from './types';
import { CompleteHocuspocusProviderWebsocketConfiguration, HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket';
import { onAwarenessChangeParameters, onAwarenessUpdateParameters } from '.';
import EventEmitter from './EventEmitter.js';
import { ConstructableOutgoingMessage, onAuthenticationFailedParameters, onCloseParameters, onDisconnectParameters, onMessageParameters, onOpenParameters, onOutgoingMessageParameters, onStatelessParameters, onStatusParameters, onSyncedParameters, WebSocketStatus, onAwarenessChangeParameters, onAwarenessUpdateParameters } from './types.js';
import { CompleteHocuspocusProviderWebsocketConfiguration, HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket.js';
export type HocuspocusProviderConfiguration = Required<Pick<CompleteHocuspocusProviderConfiguration, 'name'>> & Partial<CompleteHocuspocusProviderConfiguration> & (Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, 'url'>> | Required<Pick<CompleteHocuspocusProviderConfiguration, 'websocketProvider'>>);

@@ -72,2 +71,3 @@ export interface CompleteHocuspocusProviderConfiguration {

isAuthenticated: boolean;
authorizedScope: string | undefined;
mux: mutex.mutex;

@@ -104,3 +104,3 @@ intervals: any;

permissionDeniedHandler(reason: string): void;
authenticatedHandler(): void;
authenticatedHandler(scope: string): void;
get broadcastChannel(): string;

@@ -107,0 +107,0 @@ boundBroadcastChannelSubscriber: (data: ArrayBuffer) => void;

import * as mutex from 'lib0/mutex';
import type { MessageEvent } from 'ws';
import { Event } from 'ws';
import EventEmitter from './EventEmitter';
import { onCloseParameters, onDisconnectParameters, onMessageParameters, onOpenParameters, onOutgoingMessageParameters, onStatusParameters, WebSocketStatus } from './types';
import { HocuspocusProvider, onAwarenessChangeParameters, onAwarenessUpdateParameters } from '.';
import EventEmitter from './EventEmitter.js';
import { onCloseParameters, onDisconnectParameters, onMessageParameters, onOpenParameters, onOutgoingMessageParameters, onStatusParameters, WebSocketStatus, onAwarenessChangeParameters, onAwarenessUpdateParameters } from './types.js';
import { HocuspocusProvider } from './HocuspocusProvider.js';
export type HocuspocusProviderWebsocketConfiguration = Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, 'url'>> & Partial<CompleteHocuspocusProviderWebsocketConfiguration>;

@@ -8,0 +8,0 @@ export interface CompleteHocuspocusProviderWebsocketConfiguration {

import { Decoder } from 'lib0/decoding';
import { Encoder } from 'lib0/encoding';
import { MessageType } from './types';
import { MessageType } from './types.js';
export declare class IncomingMessage {

@@ -5,0 +5,0 @@ data: any;

@@ -1,5 +0,5 @@

export * from './HocuspocusProvider';
export * from './TiptapCollabProvider';
export * from './TiptapCollabProviderWebsocket';
export * from './HocuspocusProviderWebsocket';
export * from './types';
export * from './HocuspocusProvider.js';
export * from './TiptapCollabProvider.js';
export * from './TiptapCollabProviderWebsocket.js';
export * from './HocuspocusProviderWebsocket.js';
export * from './types.js';

@@ -1,3 +0,3 @@

import { HocuspocusProvider } from './HocuspocusProvider';
import { IncomingMessage } from './IncomingMessage';
import { HocuspocusProvider } from './HocuspocusProvider.js';
import { IncomingMessage } from './IncomingMessage.js';
export declare class MessageReceiver {

@@ -4,0 +4,0 @@ message: IncomingMessage;

import { Encoder } from 'lib0/encoding';
import { ConstructableOutgoingMessage } from './types';
import { ConstructableOutgoingMessage } from './types.js';
export declare class MessageSender {

@@ -4,0 +4,0 @@ encoder: Encoder;

import { Encoder } from 'lib0/encoding';
import { MessageType, OutgoingMessageArguments, OutgoingMessageInterface } from './types';
import { MessageType, OutgoingMessageArguments, OutgoingMessageInterface } from './types.js';
export declare class OutgoingMessage implements OutgoingMessageInterface {

@@ -4,0 +4,0 @@ encoder: Encoder;

@@ -1,3 +0,3 @@

import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class AuthenticationMessage extends OutgoingMessage {

@@ -4,0 +4,0 @@ type: MessageType;

import * as encoding from 'lib0/encoding';
import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class AwarenessMessage extends OutgoingMessage {

@@ -5,0 +5,0 @@ type: MessageType;

import * as encoding from 'lib0/encoding';
import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class CloseMessage extends OutgoingMessage {

@@ -5,0 +5,0 @@ type: MessageType;

import * as encoding from 'lib0/encoding';
import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class QueryAwarenessMessage extends OutgoingMessage {

@@ -5,0 +5,0 @@ type: MessageType;

@@ -1,3 +0,3 @@

import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class StatelessMessage extends OutgoingMessage {

@@ -4,0 +4,0 @@ type: MessageType;

import * as encoding from 'lib0/encoding';
import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class SyncStepOneMessage extends OutgoingMessage {

@@ -5,0 +5,0 @@ type: MessageType;

import * as encoding from 'lib0/encoding';
import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class SyncStepTwoMessage extends OutgoingMessage {

@@ -5,0 +5,0 @@ type: MessageType;

@@ -1,3 +0,3 @@

import { MessageType, OutgoingMessageArguments } from '../types';
import { OutgoingMessage } from '../OutgoingMessage';
import { MessageType, OutgoingMessageArguments } from '../types.js';
import { OutgoingMessage } from '../OutgoingMessage.js';
export declare class UpdateMessage extends OutgoingMessage {

@@ -4,0 +4,0 @@ type: MessageType;

@@ -1,2 +0,2 @@

import { HocuspocusProvider, HocuspocusProviderConfiguration } from './HocuspocusProvider';
import { HocuspocusProvider, HocuspocusProviderConfiguration } from './HocuspocusProvider.js';
export type TiptapCollabProviderConfiguration = Required<Pick<HocuspocusProviderConfiguration, 'name'>> & Partial<HocuspocusProviderConfiguration> & AdditionalTiptapCollabProviderConfiguration;

@@ -3,0 +3,0 @@ export interface AdditionalTiptapCollabProviderConfiguration {

@@ -1,2 +0,2 @@

import { CompleteHocuspocusProviderWebsocketConfiguration, HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket';
import { CompleteHocuspocusProviderWebsocketConfiguration, HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket.js';
export type TiptapCollabProviderWebsocketConfiguration = Partial<CompleteHocuspocusProviderWebsocketConfiguration> & AdditionalTiptapCollabProviderWebsocketConfiguration;

@@ -3,0 +3,0 @@ export interface AdditionalTiptapCollabProviderWebsocketConfiguration {

@@ -5,10 +5,10 @@ import { Awareness } from 'y-protocols/awareness';

import type { Event, CloseEvent, MessageEvent } from 'ws';
import { AuthenticationMessage } from './OutgoingMessages/AuthenticationMessage';
import { AwarenessMessage } from './OutgoingMessages/AwarenessMessage';
import { QueryAwarenessMessage } from './OutgoingMessages/QueryAwarenessMessage';
import { SyncStepOneMessage } from './OutgoingMessages/SyncStepOneMessage';
import { SyncStepTwoMessage } from './OutgoingMessages/SyncStepTwoMessage';
import { UpdateMessage } from './OutgoingMessages/UpdateMessage';
import { IncomingMessage } from './IncomingMessage';
import { OutgoingMessage } from './OutgoingMessage';
import { AuthenticationMessage } from './OutgoingMessages/AuthenticationMessage.js';
import { AwarenessMessage } from './OutgoingMessages/AwarenessMessage.js';
import { QueryAwarenessMessage } from './OutgoingMessages/QueryAwarenessMessage.js';
import { SyncStepOneMessage } from './OutgoingMessages/SyncStepOneMessage.js';
import { SyncStepTwoMessage } from './OutgoingMessages/SyncStepTwoMessage.js';
import { UpdateMessage } from './OutgoingMessages/UpdateMessage.js';
import { IncomingMessage } from './IncomingMessage.js';
import { OutgoingMessage } from './OutgoingMessage.js';
export declare enum MessageType {

@@ -15,0 +15,0 @@ Sync = 0,

@@ -7,5 +7,5 @@ /// <reference types="node" />

import { CloseEvent } from '@hocuspocus/common';
import Document from './Document';
import { Debugger } from './Debugger';
import { onStatelessPayload } from './types';
import Document from './Document.js';
import { Debugger } from './Debugger.js';
import { onStatelessPayload } from './types.js';
export declare class Connection {

@@ -12,0 +12,0 @@ webSocket: WebSocket;

@@ -0,0 +0,0 @@ export declare class Debugger {

@@ -5,4 +5,4 @@ import WebSocket from 'ws';

import { mutex } from 'lib0/mutex.js';
import Connection from './Connection';
import { Debugger } from './Debugger';
import Connection from './Connection.js';
import { Debugger } from './Debugger.js';
export declare class Document extends Doc {

@@ -18,2 +18,3 @@ awareness: Awareness;

}>;
directConnectionsCount: number;
name: string;

@@ -56,2 +57,4 @@ mux: mutex;

removeConnection(connection: Connection): Document;
addDirectConnection(): Document;
removeDirectConnection(): Document;
/**

@@ -58,0 +61,0 @@ * Get the number of active connections for this document

@@ -5,5 +5,6 @@ /// <reference types="node" />

import WebSocket, { AddressInfo, WebSocketServer } from 'ws';
import { Configuration, HookName, HookPayload, onListenPayload } from './types';
import Document from './Document';
import { Debugger } from './Debugger';
import { Configuration, HookName, HookPayload, onListenPayload, onStoreDocumentPayload } from './types.js';
import Document from './Document.js';
import { Debugger } from './Debugger.js';
import { DirectConnection } from './DirectConnection.js';
export declare const defaultConfiguration: {

@@ -93,2 +94,3 @@ name: null;

private createConnection;
storeDocumentHooks(document: Document, hookPayload: onStoreDocumentPayload): void;
/**

@@ -109,3 +111,4 @@ * Run the given hook on all configured extensions.

getMessageLogs(): any[];
openDirectConnection(documentName: string, context?: any): Promise<DirectConnection>;
}
export declare const Server: Hocuspocus;
import { Decoder } from 'lib0/decoding';
import { Encoder } from 'lib0/encoding';
import { MessageType } from './types';
import { MessageType } from './types.js';
export declare class IncomingMessage {

@@ -5,0 +5,0 @@ /**

@@ -1,8 +0,8 @@

export * from './Connection';
export * from './Debugger';
export * from './Document';
export * from './Hocuspocus';
export * from './IncomingMessage';
export * from './MessageReceiver';
export * from './OutgoingMessage';
export * from './types';
export * from './Connection.js';
export * from './Debugger.js';
export * from './Document.js';
export * from './Hocuspocus.js';
export * from './IncomingMessage.js';
export * from './MessageReceiver.js';
export * from './OutgoingMessage.js';
export * from './types.js';

@@ -1,5 +0,5 @@

import Connection from './Connection';
import { IncomingMessage } from './IncomingMessage';
import { Debugger } from './Debugger';
import Document from './Document';
import Connection from './Connection.js';
import { IncomingMessage } from './IncomingMessage.js';
import { Debugger } from './Debugger.js';
import Document from './Document.js';
export declare class MessageReceiver {

@@ -6,0 +6,0 @@ message: IncomingMessage;

import { Encoder } from 'lib0/encoding';
import { Awareness } from 'y-protocols/awareness';
import Document from './Document';
import Document from './Document.js';
export declare class OutgoingMessage {

@@ -13,3 +13,3 @@ encoder: Encoder;

writeQueryAwareness(): OutgoingMessage;
writeAuthenticated(): OutgoingMessage;
writeAuthenticated(readonly: boolean): OutgoingMessage;
writePermissionDenied(reason: string): OutgoingMessage;

@@ -16,0 +16,0 @@ writeFirstSyncStepFor(document: Document): OutgoingMessage;

@@ -7,5 +7,5 @@ /// <reference types="node" />

import { Awareness } from 'y-protocols/awareness';
import Document from './Document';
import { Hocuspocus } from './Hocuspocus';
import Connection from './Connection';
import Document from './Document.js';
import { Hocuspocus } from './Hocuspocus.js';
import Connection from './Connection.js';
export declare enum MessageType {

@@ -131,2 +131,3 @@ Unknown = -1,

export interface connectedPayload {
context: any;
documentName: string;

@@ -139,2 +140,3 @@ instance: Hocuspocus;

connection: ConnectionConfiguration;
connectionInstance: Connection;
}

@@ -141,0 +143,0 @@ export interface onLoadDocumentPayload {

@@ -1,3 +0,3 @@

export * from './Prosemirror';
export * from './Tiptap';
export * from './types';
export * from './Prosemirror.js';
export * from './Tiptap.js';
export * from './types.js';
import { Doc } from 'yjs';
import { Schema } from '@tiptap/pm/model';
import { Transformer } from './types';
import { Transformer } from './types.js';
declare class Prosemirror implements Transformer {

@@ -5,0 +5,0 @@ defaultSchema: Schema;

import { Doc } from 'yjs';
import { Extensions } from '@tiptap/core';
import { Transformer } from './types';
import { Transformer } from './types.js';
export declare class Tiptap implements Transformer {

@@ -5,0 +5,0 @@ defaultExtensions: Extensions;

@@ -0,0 +0,0 @@ import { Doc } from 'yjs';

declare const _default: import("vite").UserConfigExport;
export default _default;
export declare const createDirectory: (dir: string) => void;
export declare const flushRedis: () => Promise<string>;

@@ -1,9 +0,9 @@

export * from './createDirectory';
export * from './flushRedis';
export * from './newHocuspocus';
export * from './newHocuspocusProvider';
export * from './newHocuspocusProviderWebsocket';
export * from './randomInteger';
export * from './redisConnectionSettings';
export * from './removeDirectory';
export * from './sleep';
export * from './createDirectory.js';
export * from './flushRedis.js';
export * from './newHocuspocus.js';
export * from './newHocuspocusProvider.js';
export * from './newHocuspocusProviderWebsocket.js';
export * from './randomInteger.js';
export * from './redisConnectionSettings.js';
export * from './removeDirectory.js';
export * from './sleep.js';
import { Hocuspocus, Configuration } from '@hocuspocus/server';
export declare const newHocuspocus: (options?: Partial<Configuration>) => Promise<Hocuspocus>;
import { HocuspocusProvider, HocuspocusProviderConfiguration, HocuspocusProviderWebsocketConfiguration } from '@hocuspocus/provider';
import { Hocuspocus } from '@hocuspocus/server';
export declare const newHocuspocusProvider: (server: Hocuspocus, options?: Partial<HocuspocusProviderConfiguration>, websocketOptions?: Partial<HocuspocusProviderWebsocketConfiguration>) => HocuspocusProvider;
import { HocuspocusProviderWebsocket, HocuspocusProviderWebsocketConfiguration } from '@hocuspocus/provider';
import { Hocuspocus } from '@hocuspocus/server';
export declare const newHocuspocusProviderWebsocket: (server: Hocuspocus, options?: Partial<Omit<HocuspocusProviderWebsocketConfiguration, 'url'>>) => HocuspocusProviderWebsocket;
export declare const randomInteger: (min: number, max: number) => number;

@@ -0,0 +0,0 @@ export declare const redisConnectionSettings: {

export declare const removeDirectory: (dir: string) => void;
import { ExecutionContext } from 'ava';
export declare const retryableAssertion: (t: ExecutionContext, recoverableTry: (tt: ExecutionContext) => void) => Promise<void>;
export declare const sleep: (time: number) => Promise<unknown>;
{
"name": "@hocuspocus/server",
"description": "plug & play collaboration backend",
"version": "2.1.0-alpha.0",
"version": "2.1.0",
"homepage": "https://hocuspocus.dev",

@@ -23,3 +23,4 @@ "keywords": [

"import": "./dist/hocuspocus-server.esm.js",
"require": "./dist/hocuspocus-server.cjs"
"require": "./dist/hocuspocus-server.cjs",
"types": "./dist/packages/server/src/index.d.ts"
}

@@ -32,3 +33,3 @@ },

"dependencies": {
"@hocuspocus/common": "^2.1.0-alpha.0",
"@hocuspocus/common": "^2.1.0",
"async-lock": "^1.3.1",

@@ -35,0 +36,0 @@ "kleur": "^4.1.4",

@@ -7,8 +7,8 @@ import { IncomingMessage as HTTPIncomingMessage } from 'http'

} from '@hocuspocus/common'
import Document from './Document'
import { IncomingMessage } from './IncomingMessage'
import { OutgoingMessage } from './OutgoingMessage'
import { MessageReceiver } from './MessageReceiver'
import { Debugger } from './Debugger'
import { onStatelessPayload } from './types'
import Document from './Document.js'
import { IncomingMessage } from './IncomingMessage.js'
import { OutgoingMessage } from './OutgoingMessage.js'
import { MessageReceiver } from './MessageReceiver.js'
import { Debugger } from './Debugger.js'
import { onStatelessPayload } from './types.js'

@@ -15,0 +15,0 @@ export class Connection {

// import * as time from 'lib0/time'
import { MessageType } from './types'
import { MessageType } from './types.js'

@@ -4,0 +4,0 @@ export class Debugger {

@@ -5,6 +5,6 @@ import WebSocket from 'ws'

import { mutex, createMutex } from 'lib0/mutex.js'
import { AwarenessUpdate } from './types'
import Connection from './Connection'
import { OutgoingMessage } from './OutgoingMessage'
import { Debugger } from './Debugger'
import { AwarenessUpdate } from './types.js'
import Connection from './Connection.js'
import { OutgoingMessage } from './OutgoingMessage.js'
import { Debugger } from './Debugger.js'

@@ -26,2 +26,5 @@ export class Document extends Doc {

// The number of direct (non-websocket) connections to this document
directConnectionsCount = 0
name: string

@@ -126,2 +129,16 @@

addDirectConnection(): Document {
this.directConnectionsCount += 1
return this
}
removeDirectConnection(): Document {
if (this.directConnectionsCount > 0) {
this.directConnectionsCount -= 1
}
return this
}
/**

@@ -131,3 +148,3 @@ * Get the number of active connections for this document

getConnectionsCount(): number {
return this.connections.size
return this.connections.size + this.directConnectionsCount
}

@@ -134,0 +151,0 @@

@@ -17,3 +17,3 @@ import { createServer, IncomingMessage, Server as HTTPServer } from 'http'

import meta from '../package.json' assert {type: 'json'}
import { IncomingMessage as SocketIncomingMessage } from './IncomingMessage'
import { IncomingMessage as SocketIncomingMessage } from './IncomingMessage.js'
import {

@@ -29,7 +29,9 @@ MessageType,

onListenPayload,
} from './types'
import Document from './Document'
import Connection from './Connection'
import { OutgoingMessage } from './OutgoingMessage'
import { Debugger } from './Debugger'
onStoreDocumentPayload,
} from './types.js'
import Document from './Document.js'
import Connection from './Connection.js'
import { OutgoingMessage } from './OutgoingMessage.js'
import { Debugger } from './Debugger.js'
import { DirectConnection } from './DirectConnection.js'

@@ -441,3 +443,8 @@ export const defaultConfiguration = {

this.hooks('connected', { ...hookPayload, documentName })
this.hooks('connected', {
...hookPayload,
documentName,
context,
connectionInstance: instance,
})
}

@@ -482,3 +489,3 @@

// Let the client know that authentication was successful.
const message = new OutgoingMessage(documentName).writeAuthenticated()
const message = new OutgoingMessage(documentName).writeAuthenticated(connection.readOnly)

@@ -593,5 +600,5 @@ this.debugger.log({

documentName: document.name,
requestHeaders: request?.headers,
requestHeaders: request?.headers ?? {},
requestParameters: Hocuspocus.getParameters(request),
socketId: connection?.socketId,
socketId: connection?.socketId ?? '',
update,

@@ -612,11 +619,3 @@ }

this.debounce(`onStoreDocument-${document.name}`, () => {
this.hooks('onStoreDocument', hookPayload)
.catch(error => {
if (error?.message) {
throw error
}
})
.then(() => {
this.hooks('afterStoreDocument', hookPayload)
})
this.storeDocumentHooks(document, hookPayload)
})

@@ -663,3 +662,3 @@ }

*/
private async createDocument(documentName: string, request: IncomingMessage, socketId: string, connection: ConnectionConfiguration, context?: any): Promise<Document> {
private async createDocument(documentName: string, request: Partial<Pick<IncomingMessage, 'headers' | 'url'>>, socketId: string, connection: ConnectionConfiguration, context?: any): Promise<Document> {
if (this.documents.has(documentName)) {

@@ -777,20 +776,3 @@ const document = this.documents.get(documentName)

this.debounce(`onStoreDocument-${document.name}`, () => {
this.hooks('onStoreDocument', hookPayload)
.catch(error => {
if (error?.message) {
throw error
}
})
.then(() => {
this.hooks('afterStoreDocument', hookPayload).then(() => {
// Remove document from memory.
if (document.getConnectionsCount() > 0) {
return
}
this.documents.delete(document.name)
document.destroy()
})
})
this.storeDocumentHooks(document, hookPayload)
}, true)

@@ -845,2 +827,23 @@

storeDocumentHooks(document: Document, hookPayload: onStoreDocumentPayload) {
this.hooks('onStoreDocument', hookPayload)
.catch(error => {
if (error?.message) {
throw error
}
})
.then(() => {
this.hooks('afterStoreDocument', hookPayload).then(() => {
// Remove document from memory.
if (document.getConnectionsCount() > 0) {
return
}
this.documents.delete(document.name)
document.destroy()
})
})
}
/**

@@ -884,3 +887,3 @@ * Run the given hook on all configured extensions.

*/
private static getParameters(request?: IncomingMessage): URLSearchParams {
private static getParameters(request?: Pick<IncomingMessage, 'url'>): URLSearchParams {
const query = request?.url?.split('?') || []

@@ -916,4 +919,22 @@ return new URLSearchParams(query[1] ? query[1] : '')

}
async openDirectConnection(documentName: string, context?: any): Promise<DirectConnection> {
const connectionConfig: ConnectionConfiguration = {
isAuthenticated: true,
readOnly: false,
requiresAuthentication: true,
}
const document: Document = await this.createDocument(
documentName,
{}, // direct connection has no request params
uuid(),
connectionConfig,
context,
)
return new DirectConnection(document, this, context)
}
}
export const Server = new Hocuspocus()

@@ -16,3 +16,3 @@ import {

} from 'lib0/encoding'
import { MessageType } from './types'
import { MessageType } from './types.js'

@@ -19,0 +19,0 @@ export class IncomingMessage {

@@ -1,8 +0,8 @@

export * from './Connection'
export * from './Debugger'
export * from './Document'
export * from './Hocuspocus'
export * from './IncomingMessage'
export * from './MessageReceiver'
export * from './OutgoingMessage'
export * from './types'
export * from './Connection.js'
export * from './Debugger.js'
export * from './Document.js'
export * from './Hocuspocus.js'
export * from './IncomingMessage.js'
export * from './MessageReceiver.js'
export * from './OutgoingMessage.js'
export * from './types.js'

@@ -11,8 +11,8 @@ import {

import { readVarString } from 'lib0/decoding'
import { MessageType } from './types'
import Connection from './Connection'
import { IncomingMessage } from './IncomingMessage'
import { OutgoingMessage } from './OutgoingMessage'
import { Debugger } from './Debugger'
import Document from './Document'
import { MessageType } from './types.js'
import Connection from './Connection.js'
import { IncomingMessage } from './IncomingMessage.js'
import { OutgoingMessage } from './OutgoingMessage.js'
import { Debugger } from './Debugger.js'
import Document from './Document.js'

@@ -19,0 +19,0 @@ export class MessageReceiver {

@@ -13,4 +13,4 @@ import {

import { writeAuthenticated, writePermissionDenied } from '@hocuspocus/common'
import { MessageType } from './types'
import Document from './Document'
import { MessageType } from './types.js'
import Document from './Document.js'

@@ -71,3 +71,3 @@ export class OutgoingMessage {

writeAuthenticated(): OutgoingMessage {
writeAuthenticated(readonly: boolean): OutgoingMessage {
this.type = MessageType.Auth

@@ -77,3 +77,3 @@ this.category = 'Authenticated'

writeVarUint(this.encoder, MessageType.Auth)
writeAuthenticated(this.encoder)
writeAuthenticated(this.encoder, readonly ? 'readonly' : 'read-write')

@@ -80,0 +80,0 @@ return this

@@ -6,5 +6,5 @@ import {

import { Awareness } from 'y-protocols/awareness'
import Document from './Document'
import { Hocuspocus } from './Hocuspocus'
import Connection from './Connection'
import Document from './Document.js'
import { Hocuspocus } from './Hocuspocus.js'
import Connection from './Connection.js'

@@ -158,2 +158,4 @@ export enum MessageType {

// @todo Change 'connection' to 'connectionConfig' in next major release
// see https://github.com/ueberdosis/hocuspocus/pull/607#issuecomment-1553559805
export interface onAuthenticatePayload {

@@ -169,2 +171,4 @@ documentName: string,

// @todo Change 'connection' to 'connectionConfig' in next major release
// see https://github.com/ueberdosis/hocuspocus/pull/607#issuecomment-1553559805
export interface onConnectPayload {

@@ -180,3 +184,6 @@ documentName: string,

// @todo Change 'connection' to 'connectionConfig', and 'connectionInstance' to 'connection' in next major release
// see https://github.com/ueberdosis/hocuspocus/pull/607#issuecomment-1553559805
export interface connectedPayload {
context: any,
documentName: string,

@@ -188,5 +195,8 @@ instance: Hocuspocus,

socketId: string,
connection: ConnectionConfiguration
connection: ConnectionConfiguration,
connectionInstance: Connection
}
// @todo Change 'connection' to 'connectionConfig' in next major release
// see https://github.com/ueberdosis/hocuspocus/pull/607#issuecomment-1553559805
export interface onLoadDocumentPayload {

@@ -203,2 +213,4 @@ context: any,

// @todo Change 'connection' to 'connectionConfig' in next major release
// see https://github.com/ueberdosis/hocuspocus/pull/607#issuecomment-1553559805
export interface afterLoadDocumentPayload {

@@ -278,2 +290,4 @@ context: any,

// @todo Change 'connection' to 'connectionConfig' in next major release
// see https://github.com/ueberdosis/hocuspocus/pull/607#issuecomment-1553559805
export interface fetchPayload {

@@ -280,0 +294,0 @@ context: any,

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc