@hocuspocus/provider 2.0.0-alpha.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { IncomingMessage, ServerResponse } from 'http';
3
4
  import { Socket } from 'net';
4
5
  import WebSocket, { WebSocketServer } from 'ws';
@@ -1,7 +1,7 @@
1
1
  import RedisClient, { ClusterNode, ClusterOptions, RedisOptions } from 'ioredis';
2
2
  import Redlock from 'redlock';
3
3
  import { Document, Extension, afterLoadDocumentPayload, afterStoreDocumentPayload, onDisconnectPayload, onStoreDocumentPayload, onAwarenessUpdatePayload, onChangePayload, Debugger, onConfigurePayload, onListenPayload, beforeBroadcastStatelessPayload } from '@hocuspocus/server';
4
- export declare type RedisInstance = RedisClient.Cluster | RedisClient.Redis;
4
+ export type RedisInstance = RedisClient.Cluster | RedisClient.Redis;
5
5
  export interface Configuration {
6
6
  /**
7
7
  * Redis port
@@ -2,7 +2,6 @@
2
2
  import { Extension, onChangePayload, onConnectPayload, onLoadDocumentPayload, onDisconnectPayload } from '@hocuspocus/server';
3
3
  import { Doc } from 'yjs';
4
4
  import { Transformer } from '@hocuspocus/transformer';
5
- import { AxiosResponse } from 'axios';
6
5
  export declare enum Events {
7
6
  onChange = "change",
8
7
  onConnect = "connect",
@@ -41,7 +40,7 @@ export declare class Webhook implements Extension {
41
40
  /**
42
41
  * Send a request to the given url containing the given data
43
42
  */
44
- sendRequest(event: Events, payload: any): Promise<AxiosResponse<any, any>>;
43
+ sendRequest(event: Events, payload: any): Promise<import("axios").AxiosResponse<any, any>>;
45
44
  /**
46
45
  * onChange hook
47
46
  */
@@ -1,6 +1,6 @@
1
1
  import { HocuspocusProvider, HocuspocusProviderConfiguration } from './HocuspocusProvider';
2
2
  import { HocuspocusProviderWebsocketConfiguration } from './HocuspocusProviderWebsocket';
3
- export declare type HocuspocusCloudProviderConfiguration = Required<Pick<HocuspocusProviderConfiguration, 'name'>> & Partial<HocuspocusProviderConfiguration> & Partial<Pick<HocuspocusProviderWebsocketConfiguration, 'url'>> & AdditionalHocuspocusCloudProviderConfiguration;
3
+ export type HocuspocusCloudProviderConfiguration = Required<Pick<HocuspocusProviderConfiguration, 'name'>> & Partial<HocuspocusProviderConfiguration> & Partial<Pick<HocuspocusProviderWebsocketConfiguration, 'url'>> & AdditionalHocuspocusCloudProviderConfiguration;
4
4
  export interface AdditionalHocuspocusCloudProviderConfiguration {
5
5
  /**
6
6
  * A Hocuspocus Cloud key, get one here: https://hocuspocus.cloud/
@@ -4,9 +4,9 @@ import * as mutex from 'lib0/mutex';
4
4
  import type { CloseEvent, Event, MessageEvent } from 'ws';
5
5
  import EventEmitter from './EventEmitter';
6
6
  import { ConstructableOutgoingMessage, onAuthenticationFailedParameters, onCloseParameters, onDisconnectParameters, onMessageParameters, onOpenParameters, onOutgoingMessageParameters, onStatelessParameters, onStatusParameters, onSyncedParameters, WebSocketStatus } from './types';
7
- import { HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket';
7
+ import { CompleteHocuspocusProviderWebsocketConfiguration, HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket';
8
8
  import { onAwarenessChangeParameters, onAwarenessUpdateParameters } from '.';
9
- export declare type HocuspocusProviderConfiguration = Required<Pick<CompleteHocuspocusProviderConfiguration, 'name' | 'websocketProvider'>> & Partial<CompleteHocuspocusProviderConfiguration>;
9
+ export type HocuspocusProviderConfiguration = Required<Pick<CompleteHocuspocusProviderConfiguration, 'name'>> & Partial<CompleteHocuspocusProviderConfiguration> & (Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, 'url'>> | Required<Pick<CompleteHocuspocusProviderConfiguration, 'websocketProvider'>>);
10
10
  export interface CompleteHocuspocusProviderConfiguration {
11
11
  /**
12
12
  * The identifier/name of your document
@@ -70,6 +70,7 @@ export declare class HocuspocusProvider extends EventEmitter {
70
70
  isAuthenticated: boolean;
71
71
  mux: mutex.mutex;
72
72
  intervals: any;
73
+ isConnected: boolean;
73
74
  constructor(configuration: HocuspocusProviderConfiguration);
74
75
  onStatus({ status }: onStatusParameters): void;
75
76
  setConfiguration(configuration?: Partial<HocuspocusProviderConfiguration>): void;
@@ -4,7 +4,7 @@ import { Event } from 'ws';
4
4
  import EventEmitter from './EventEmitter';
5
5
  import { onCloseParameters, onDisconnectParameters, onMessageParameters, onOpenParameters, onOutgoingMessageParameters, onStatusParameters, WebSocketStatus } from './types';
6
6
  import { HocuspocusProvider, onAwarenessChangeParameters, onAwarenessUpdateParameters } from '.';
7
- export declare type HocuspocusProviderWebsocketConfiguration = Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, 'url'>> & Partial<CompleteHocuspocusProviderWebsocketConfiguration>;
7
+ export type HocuspocusProviderWebsocketConfiguration = Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, 'url'>> & Partial<CompleteHocuspocusProviderWebsocketConfiguration>;
8
8
  export interface CompleteHocuspocusProviderWebsocketConfiguration {
9
9
  /**
10
10
  * URL of your @hocuspocus/server instance
@@ -0,0 +1,11 @@
1
+ import { HocuspocusProvider, HocuspocusProviderConfiguration } from './HocuspocusProvider';
2
+ export type TiptapCollabProviderConfiguration = Required<Pick<HocuspocusProviderConfiguration, 'name'>> & Partial<HocuspocusProviderConfiguration> & AdditionalTiptapCollabProviderConfiguration;
3
+ export interface AdditionalTiptapCollabProviderConfiguration {
4
+ /**
5
+ * A Hocuspocus Cloud App ID, get one here: https://collab.tiptap.dev
6
+ */
7
+ appId: string;
8
+ }
9
+ export declare class TiptapCollabProvider extends HocuspocusProvider {
10
+ constructor(configuration: TiptapCollabProviderConfiguration);
11
+ }
@@ -1,4 +1,4 @@
1
1
  export * from './HocuspocusProvider';
2
- export * from './HocuspocusCloudProvider';
2
+ export * from './TiptapCollabProvider';
3
3
  export * from './HocuspocusProviderWebsocket';
4
4
  export * from './types';
@@ -43,42 +43,42 @@ export interface OutgoingMessageArguments {
43
43
  export interface Constructable<T> {
44
44
  new (...args: any): T;
45
45
  }
46
- export declare type ConstructableOutgoingMessage = Constructable<AuthenticationMessage> | Constructable<AwarenessMessage> | Constructable<QueryAwarenessMessage> | Constructable<SyncStepOneMessage> | Constructable<SyncStepTwoMessage> | Constructable<UpdateMessage>;
47
- export declare type onAuthenticationFailedParameters = {
46
+ export type ConstructableOutgoingMessage = Constructable<AuthenticationMessage> | Constructable<AwarenessMessage> | Constructable<QueryAwarenessMessage> | Constructable<SyncStepOneMessage> | Constructable<SyncStepTwoMessage> | Constructable<UpdateMessage>;
47
+ export type onAuthenticationFailedParameters = {
48
48
  reason: string;
49
49
  };
50
- export declare type onOpenParameters = {
50
+ export type onOpenParameters = {
51
51
  event: Event;
52
52
  };
53
- export declare type onMessageParameters = {
53
+ export type onMessageParameters = {
54
54
  event: MessageEvent;
55
55
  message: IncomingMessage;
56
56
  };
57
- export declare type onOutgoingMessageParameters = {
57
+ export type onOutgoingMessageParameters = {
58
58
  message: OutgoingMessage;
59
59
  };
60
- export declare type onStatusParameters = {
60
+ export type onStatusParameters = {
61
61
  status: WebSocketStatus;
62
62
  };
63
- export declare type onSyncedParameters = {
63
+ export type onSyncedParameters = {
64
64
  state: boolean;
65
65
  };
66
- export declare type onDisconnectParameters = {
66
+ export type onDisconnectParameters = {
67
67
  event: CloseEvent;
68
68
  };
69
- export declare type onCloseParameters = {
69
+ export type onCloseParameters = {
70
70
  event: CloseEvent;
71
71
  };
72
- export declare type onAwarenessUpdateParameters = {
72
+ export type onAwarenessUpdateParameters = {
73
73
  states: StatesArray;
74
74
  };
75
- export declare type onAwarenessChangeParameters = {
75
+ export type onAwarenessChangeParameters = {
76
76
  states: StatesArray;
77
77
  };
78
- export declare type onStatelessParameters = {
78
+ export type onStatelessParameters = {
79
79
  payload: string;
80
80
  };
81
- export declare type StatesArray = {
81
+ export type StatesArray = {
82
82
  clientId: number;
83
83
  [key: string | number]: any;
84
84
  }[];
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { IncomingMessage as HTTPIncomingMessage } from 'http';
3
4
  import AsyncLock from 'async-lock';
4
5
  import WebSocket from 'ws';
@@ -23,7 +24,7 @@ export declare class Connection {
23
24
  * Constructor.
24
25
  */
25
26
  constructor(connection: WebSocket, request: HTTPIncomingMessage, document: Document, timeout: number, socketId: string, context: any, readOnly: boolean | undefined, logger: Debugger);
26
- boundClose: (event?: CloseEvent | undefined) => void;
27
+ boundClose: (event?: CloseEvent) => void;
27
28
  boundHandleMessage: (data: Uint8Array) => void;
28
29
  boundHandlePong: () => void;
29
30
  handlePong(): void;
@@ -1,4 +1,5 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
2
3
  import { IncomingMessage, Server as HTTPServer } from 'http';
3
4
  import WebSocket, { AddressInfo, WebSocketServer } from 'ws';
4
5
  import { Configuration, HookName, HookPayload, onListenPayload } from './types';
@@ -1,4 +1,6 @@
1
1
  /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
2
4
  import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http';
3
5
  import { URLSearchParams } from 'url';
4
6
  import { Awareness } from 'y-protocols/awareness';
@@ -47,8 +49,8 @@ export interface Extension {
47
49
  onDisconnect?(data: onDisconnectPayload): Promise<any>;
48
50
  onDestroy?(data: onDestroyPayload): Promise<any>;
49
51
  }
50
- export declare type HookName = 'onConfigure' | 'onListen' | 'onUpgrade' | 'onConnect' | 'connected' | 'onAuthenticate' | 'onLoadDocument' | 'afterLoadDocument' | 'beforeHandleMessage' | 'beforeBroadcastStateless' | 'onStateless' | 'onChange' | 'onStoreDocument' | 'afterStoreDocument' | 'onAwarenessUpdate' | 'onRequest' | 'onDisconnect' | 'onDestroy';
51
- export declare type HookPayload = onConfigurePayload | onListenPayload | onUpgradePayload | onConnectPayload | connectedPayload | onAuthenticatePayload | onLoadDocumentPayload | onStatelessPayload | beforeHandleMessagePayload | beforeBroadcastStatelessPayload | onChangePayload | onStoreDocumentPayload | afterStoreDocumentPayload | onAwarenessUpdatePayload | onRequestPayload | onDisconnectPayload | onDestroyPayload;
52
+ export type HookName = 'onConfigure' | 'onListen' | 'onUpgrade' | 'onConnect' | 'connected' | 'onAuthenticate' | 'onLoadDocument' | 'afterLoadDocument' | 'beforeHandleMessage' | 'beforeBroadcastStateless' | 'onStateless' | 'onChange' | 'onStoreDocument' | 'afterStoreDocument' | 'onAwarenessUpdate' | 'onRequest' | 'onDisconnect' | 'onDestroy';
53
+ export type HookPayload = onConfigurePayload | onListenPayload | onUpgradePayload | onConnectPayload | connectedPayload | onAuthenticatePayload | onLoadDocumentPayload | onStatelessPayload | beforeHandleMessagePayload | beforeBroadcastStatelessPayload | onChangePayload | onStoreDocumentPayload | afterStoreDocumentPayload | onAwarenessUpdatePayload | onRequestPayload | onDisconnectPayload | onDestroyPayload;
52
54
  export interface Configuration extends Extension {
53
55
  /**
54
56
  * A name for the instance, used for logging.
@@ -208,7 +210,7 @@ export interface onAwarenessUpdatePayload {
208
210
  awareness: Awareness;
209
211
  states: StatesArray;
210
212
  }
211
- export declare type StatesArray = {
213
+ export type StatesArray = {
212
214
  clientId: number;
213
215
  [key: string | number]: any;
214
216
  }[];
@@ -0,0 +1 @@
1
+ export {};
@@ -1,2 +1,2 @@
1
1
  import { Hocuspocus, Configuration } from '@hocuspocus/server';
2
- export declare const newHocuspocus: (options?: Partial<Configuration> | undefined) => Promise<Hocuspocus>;
2
+ export declare const newHocuspocus: (options?: Partial<Configuration>) => Promise<Hocuspocus>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hocuspocus/provider",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.0",
4
4
  "description": "hocuspocus provider",
5
5
  "homepage": "https://hocuspocus.dev",
6
6
  "keywords": [
@@ -28,7 +28,7 @@
28
28
  "dist"
29
29
  ],
30
30
  "dependencies": {
31
- "@hocuspocus/common": "^2.0.0-alpha.1",
31
+ "@hocuspocus/common": "^2.0.0",
32
32
  "@lifeomic/attempt": "^3.0.2",
33
33
  "lib0": "^0.2.47",
34
34
  "ws": "^7.5.9"
@@ -26,14 +26,20 @@ import {
26
26
  onSyncedParameters,
27
27
  WebSocketStatus,
28
28
  } from './types'
29
- import { HocuspocusProviderWebsocket } from './HocuspocusProviderWebsocket'
29
+ import {
30
+ CompleteHocuspocusProviderWebsocketConfiguration,
31
+ HocuspocusProviderWebsocket,
32
+ } from './HocuspocusProviderWebsocket'
30
33
  import { StatelessMessage } from './OutgoingMessages/StatelessMessage'
31
34
  import { CloseMessage } from './OutgoingMessages/CloseMessage'
32
35
  import { onAwarenessChangeParameters, onAwarenessUpdateParameters } from '.'
33
36
 
34
37
  export type HocuspocusProviderConfiguration =
35
- Required<Pick<CompleteHocuspocusProviderConfiguration, 'name' | 'websocketProvider'>>
36
- & Partial<CompleteHocuspocusProviderConfiguration>
38
+ Required<Pick<CompleteHocuspocusProviderConfiguration, 'name'>>
39
+ & Partial<CompleteHocuspocusProviderConfiguration> & (
40
+ Required<Pick<CompleteHocuspocusProviderWebsocketConfiguration, 'url'>> |
41
+ Required<Pick<CompleteHocuspocusProviderConfiguration, 'websocketProvider'>>
42
+ )
37
43
 
38
44
  export interface CompleteHocuspocusProviderConfiguration {
39
45
  /**
@@ -135,6 +141,8 @@ export class HocuspocusProvider extends EventEmitter {
135
141
  forceSync: null,
136
142
  }
137
143
 
144
+ isConnected = true
145
+
138
146
  constructor(configuration: HocuspocusProviderConfiguration) {
139
147
  super()
140
148
  this.setConfiguration(configuration)
@@ -204,6 +212,10 @@ export class HocuspocusProvider extends EventEmitter {
204
212
  }
205
213
 
206
214
  public setConfiguration(configuration: Partial<HocuspocusProviderConfiguration> = {}): void {
215
+ if (!configuration.websocketProvider && (configuration as CompleteHocuspocusProviderWebsocketConfiguration).url) {
216
+ this.configuration.websocketProvider = new HocuspocusProviderWebsocket({ url: (configuration as CompleteHocuspocusProviderWebsocketConfiguration).url })
217
+ }
218
+
207
219
  this.configuration = { ...this.configuration, ...configuration }
208
220
  }
209
221
 
@@ -327,6 +339,8 @@ export class HocuspocusProvider extends EventEmitter {
327
339
  }
328
340
 
329
341
  send(message: ConstructableOutgoingMessage, args: any, broadcast = false) {
342
+ if (!this.isConnected) return
343
+
330
344
  if (broadcast) {
331
345
  this.mux(() => { this.broadcast(message, args) })
332
346
  }
@@ -382,6 +396,7 @@ export class HocuspocusProvider extends EventEmitter {
382
396
  this.removeAllListeners()
383
397
 
384
398
  this.send(CloseMessage, { documentName: this.configuration.name })
399
+ this.isConnected = false
385
400
 
386
401
  if (typeof window === 'undefined') {
387
402
  return
@@ -409,8 +409,10 @@ export class HocuspocusProviderWebsocket extends EventEmitter {
409
409
  }
410
410
 
411
411
  if (event.code === Unauthorized.code) {
412
- if (!this.configuration.quiet) {
412
+ if (event.reason === Unauthorized.reason) {
413
413
  console.warn('[HocuspocusProvider] An authentication token is required, but you didn’t send one. Try adding a `token` to your HocuspocusProvider configuration. Won’t try again.')
414
+ } else {
415
+ console.warn(`[HocuspocusProvider] Connection closed with status Unauthorized: ${event.reason}`)
414
416
  }
415
417
 
416
418
  this.shouldConnect = false
@@ -0,0 +1,33 @@
1
+ import {
2
+ HocuspocusProvider,
3
+ HocuspocusProviderConfiguration,
4
+ } from './HocuspocusProvider'
5
+ import {
6
+ HocuspocusProviderWebsocket,
7
+ } from './HocuspocusProviderWebsocket'
8
+
9
+ export type TiptapCollabProviderConfiguration =
10
+ Required<Pick<HocuspocusProviderConfiguration, 'name'>> &
11
+ Partial<HocuspocusProviderConfiguration> &
12
+ AdditionalTiptapCollabProviderConfiguration
13
+
14
+ export interface AdditionalTiptapCollabProviderConfiguration {
15
+ /**
16
+ * A Hocuspocus Cloud App ID, get one here: https://collab.tiptap.dev
17
+ */
18
+ appId: string,
19
+ }
20
+
21
+ export class TiptapCollabProvider extends HocuspocusProvider {
22
+ constructor(configuration: TiptapCollabProviderConfiguration) {
23
+ if (!configuration.websocketProvider) {
24
+ configuration.websocketProvider = new HocuspocusProviderWebsocket({ url: `wss://${configuration.appId}.collab.tiptap.cloud` })
25
+ }
26
+
27
+ if (!configuration.token) {
28
+ configuration.token = 'notoken'
29
+ }
30
+
31
+ super(configuration as HocuspocusProviderConfiguration)
32
+ }
33
+ }
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './HocuspocusProvider'
2
- export * from './HocuspocusCloudProvider'
2
+ export * from './TiptapCollabProvider'
3
3
  export * from './HocuspocusProviderWebsocket'
4
4
  export * from './types'