@hocuspocus/provider 1.0.0-alpha.36 → 1.0.0-alpha.37

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,12 +1,10 @@
1
- import { Extension, onChangePayload, onLoadDocumentPayload, storePayload } from '@hocuspocus/server';
1
+ import { Extension, onChangePayload, onLoadDocumentPayload, storePayload, fetchPayload } from '@hocuspocus/server';
2
2
  export interface DatabaseConfiguration {
3
3
  /**
4
4
  * Pass a Promise to retrieve updates from your database. The Promise should resolve to
5
5
  * an array of items with Y.js-compatible binary data.
6
6
  */
7
- fetch: ({ documentName }: {
8
- documentName: string;
9
- }) => Promise<Uint8Array | null>;
7
+ fetch: (data: fetchPayload) => Promise<Uint8Array | null>;
10
8
  /**
11
9
  * Pass a function to store updates in your database.
12
10
  */
@@ -24,7 +22,7 @@ export declare class Database implements Extension {
24
22
  /**
25
23
  * Get stored data from the database.
26
24
  */
27
- onLoadDocument({ document, documentName }: onLoadDocumentPayload): Promise<any>;
25
+ onLoadDocument(data: onLoadDocumentPayload): Promise<any>;
28
26
  /**
29
27
  * Store new updates in the database.
30
28
  */
@@ -1,6 +1,6 @@
1
1
  import RedisClient from 'ioredis';
2
2
  import Redlock from 'redlock';
3
- import { Document, Extension, afterLoadDocumentPayload, afterStoreDocumentPayload, onDisconnectPayload, onStoreDocumentPayload, onAwarenessUpdatePayload, Debugger, onConfigurePayload, onListenPayload } from '@hocuspocus/server';
3
+ import { Document, Extension, afterLoadDocumentPayload, afterStoreDocumentPayload, onDisconnectPayload, onStoreDocumentPayload, onAwarenessUpdatePayload, onChangePayload, Debugger, onConfigurePayload, onListenPayload } from '@hocuspocus/server';
4
4
  export interface Configuration {
5
5
  /**
6
6
  * Redis port
@@ -82,6 +82,10 @@ export declare class Redis implements Extension {
82
82
  * in Redis to filter these.
83
83
  */
84
84
  private handleIncomingMessage;
85
+ /**
86
+ * if the ydoc changed, we'll need to inform other Hocuspocus servers about it.
87
+ */
88
+ onChange(data: onChangePayload): Promise<any>;
85
89
  /**
86
90
  * Make sure to *not* listen for further changes, when there’s
87
91
  * noone connected anymore.
@@ -120,6 +120,7 @@ export declare class HocuspocusProvider extends EventEmitter {
120
120
  } | null;
121
121
  constructor(configuration: HocuspocusProviderConfiguration);
122
122
  setConfiguration(configuration?: Partial<HocuspocusProviderConfiguration>): void;
123
+ boundConnect: () => Promise<void>;
123
124
  connect(): Promise<void>;
124
125
  createWebSocketConnection(): Promise<unknown>;
125
126
  resolveConnectionAttempt(): void;
@@ -129,6 +130,8 @@ export declare class HocuspocusProvider extends EventEmitter {
129
130
  get awareness(): Awareness;
130
131
  checkConnection(): void;
131
132
  forceSync(): void;
133
+ boundBeforeUnload: () => void;
134
+ beforeUnload(): void;
132
135
  registerEventListeners(): void;
133
136
  documentUpdateHandler(update: Uint8Array, origin: any): void;
134
137
  awarenessUpdateHandler({ added, updated, removed }: any, origin: any): void;
@@ -148,6 +151,7 @@ export declare class HocuspocusProvider extends EventEmitter {
148
151
  onClose(event: CloseEvent): void;
149
152
  destroy(): void;
150
153
  get broadcastChannel(): string;
154
+ boundBroadcastChannelSubscriber: (data: ArrayBuffer) => void;
151
155
  broadcastChannelSubscriber(data: ArrayBuffer): void;
152
156
  subscribeToBroadcastChannel(): void;
153
157
  disconnectBroadcastChannel(): void;
@@ -19,7 +19,7 @@ export declare class Document extends Doc {
19
19
  /**
20
20
  * Constructor.
21
21
  */
22
- constructor(name: string, logger: Debugger);
22
+ constructor(name: string, logger: Debugger, yDocOptions: {});
23
23
  /**
24
24
  * Check if the Document is empty
25
25
  */
@@ -12,6 +12,10 @@ export declare const defaultConfiguration: {
12
12
  debounce: number;
13
13
  maxDebounce: number;
14
14
  quiet: boolean;
15
+ yDocOptions: {
16
+ gc: boolean;
17
+ gcFilter: () => boolean;
18
+ };
15
19
  };
16
20
  /**
17
21
  * Hocuspocus Server
@@ -8,6 +8,6 @@ export declare class MessageReceiver {
8
8
  logger: Debugger;
9
9
  constructor(message: IncomingMessage, logger: Debugger);
10
10
  apply(document: Document, connection?: Connection, reply?: (message: Uint8Array) => void): void;
11
- readSyncMessage(message: IncomingMessage, document: Document, connection?: Connection, reply?: (message: Uint8Array) => void): 0 | 2 | 1;
11
+ readSyncMessage(message: IncomingMessage, document: Document, connection?: Connection, reply?: (message: Uint8Array) => void, requestFirstSync?: boolean): 0 | 2 | 1;
12
12
  applyQueryAwarenessMessage(awareness: Awareness, reply?: (message: Uint8Array) => void): void;
13
13
  }
@@ -7,6 +7,7 @@ export declare class OutgoingMessage {
7
7
  category?: string;
8
8
  constructor();
9
9
  createSyncMessage(): OutgoingMessage;
10
+ createSyncReplyMessage(): OutgoingMessage;
10
11
  createAwarenessUpdateMessage(awareness: Awareness, changedClients?: Array<any>): OutgoingMessage;
11
12
  writeQueryAwareness(): OutgoingMessage;
12
13
  writeAuthenticated(): OutgoingMessage;
@@ -9,7 +9,8 @@ export declare enum MessageType {
9
9
  Sync = 0,
10
10
  Awareness = 1,
11
11
  Auth = 2,
12
- QueryAwareness = 3
12
+ QueryAwareness = 3,
13
+ SyncReply = 4
13
14
  }
14
15
  export interface AwarenessUpdate {
15
16
  added: Array<any>;
@@ -48,7 +49,7 @@ export declare type HookName = 'onConfigure' | 'onListen' | 'onUpgrade' | 'onCon
48
49
  * @deprecated onCreateDocument is deprecated, use onLoadDocument instead
49
50
  */
50
51
  'onCreateDocument' | 'onLoadDocument' | 'afterLoadDocument' | 'onChange' | 'onStoreDocument' | 'afterStoreDocument' | 'onAwarenessUpdate' | 'onRequest' | 'onDisconnect' | 'onDestroy';
51
- export declare type HookPayload = onConfigurePayload | onListenPayload | onUpgradePayload | onConnectPayload | connectedPayload | onAuthenticatePayload | onLoadDocumentPayload | onLoadDocumentPayload | onLoadDocumentPayload | onChangePayload | onStoreDocumentPayload | afterStoreDocumentPayload | onAwarenessUpdatePayload | onRequestPayload | onDisconnectPayload | onDestroyPayload;
52
+ export declare type HookPayload = onConfigurePayload | onListenPayload | onUpgradePayload | onConnectPayload | connectedPayload | onAuthenticatePayload | onLoadDocumentPayload | onChangePayload | onStoreDocumentPayload | afterStoreDocumentPayload | onAwarenessUpdatePayload | onRequestPayload | onDisconnectPayload | onDestroyPayload;
52
53
  export interface Configuration extends Extension {
53
54
  /**
54
55
  * A name for the instance, used for logging.
@@ -79,6 +80,13 @@ export interface Configuration extends Extension {
79
80
  * By default, the servers show a start screen. If passed false, the server will start quietly.
80
81
  */
81
82
  quiet: boolean;
83
+ /**
84
+ * options to pass to the ydoc document
85
+ */
86
+ yDocOptions: {
87
+ gc: boolean;
88
+ gcFilter: () => boolean;
89
+ };
82
90
  /**
83
91
  * Function which returns the (customized) document name based on the request
84
92
  */
@@ -179,6 +187,16 @@ export declare type StatesArray = {
179
187
  clientId: number;
180
188
  [key: string | number]: any;
181
189
  }[];
190
+ export interface fetchPayload {
191
+ context: any;
192
+ document: Document;
193
+ documentName: string;
194
+ instance: Hocuspocus;
195
+ requestHeaders: IncomingHttpHeaders;
196
+ requestParameters: URLSearchParams;
197
+ socketId: string;
198
+ connection: ConnectionConfiguration;
199
+ }
182
200
  export interface storePayload extends onStoreDocumentPayload {
183
201
  state: Buffer;
184
202
  }
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hocuspocus/provider",
3
- "version": "1.0.0-alpha.36",
3
+ "version": "1.0.0-alpha.37",
4
4
  "description": "hocuspocus provider",
5
5
  "homepage": "https://hocuspocus.dev",
6
6
  "keywords": [
@@ -34,5 +34,5 @@
34
34
  "y-protocols": "^1.0.5",
35
35
  "yjs": "^13.5.29"
36
36
  },
37
- "gitHead": "b0a04ffe8d56cfa6b269a2c8ad7f64c92b108de0"
37
+ "gitHead": "af278e7c5d91c74afefd9234379c8179c8b91e6d"
38
38
  }
@@ -259,6 +259,8 @@ export class HocuspocusProvider extends EventEmitter {
259
259
  this.configuration = { ...this.configuration, ...configuration }
260
260
  }
261
261
 
262
+ boundConnect = this.connect.bind(this)
263
+
262
264
  async connect() {
263
265
  if (this.status === WebSocketStatus.Connected) {
264
266
  return
@@ -373,15 +375,19 @@ export class HocuspocusProvider extends EventEmitter {
373
375
  this.send(SyncStepOneMessage, { document: this.document })
374
376
  }
375
377
 
378
+ boundBeforeUnload = this.beforeUnload.bind(this)
379
+
380
+ beforeUnload() {
381
+ removeAwarenessStates(this.awareness, [this.document.clientID], 'window unload')
382
+ }
383
+
376
384
  registerEventListeners() {
377
385
  if (typeof window === 'undefined') {
378
386
  return
379
387
  }
380
388
 
381
- window.addEventListener('online', this.connect.bind(this))
382
- window.addEventListener('beforeunload', () => {
383
- removeAwarenessStates(this.awareness, [this.document.clientID], 'window unload')
384
- })
389
+ window.addEventListener('online', this.boundConnect)
390
+ window.addEventListener('beforeunload', this.boundBeforeUnload)
385
391
  }
386
392
 
387
393
  documentUpdateHandler(update: Uint8Array, origin: any) {
@@ -605,13 +611,16 @@ export class HocuspocusProvider extends EventEmitter {
605
611
  return
606
612
  }
607
613
 
608
- window.removeEventListener('online', this.connect.bind(this))
614
+ window.removeEventListener('online', this.boundConnect)
615
+ window.removeEventListener('beforeunload', this.boundBeforeUnload)
609
616
  }
610
617
 
611
618
  get broadcastChannel() {
612
619
  return `${this.serverUrl}/${this.configuration.name}`
613
620
  }
614
621
 
622
+ boundBroadcastChannelSubscriber = this.broadcastChannelSubscriber.bind(this)
623
+
615
624
  broadcastChannelSubscriber(data: ArrayBuffer) {
616
625
  this.mux(() => {
617
626
  const message = new IncomingMessage(data)
@@ -623,7 +632,7 @@ export class HocuspocusProvider extends EventEmitter {
623
632
 
624
633
  subscribeToBroadcastChannel() {
625
634
  if (!this.subscribedToBroadcastChannel) {
626
- bc.subscribe(this.broadcastChannel, this.broadcastChannelSubscriber.bind(this))
635
+ bc.subscribe(this.broadcastChannel, this.boundBroadcastChannelSubscriber)
627
636
  this.subscribedToBroadcastChannel = true
628
637
  }
629
638
 
@@ -644,7 +653,7 @@ export class HocuspocusProvider extends EventEmitter {
644
653
  }, true)
645
654
 
646
655
  if (this.subscribedToBroadcastChannel) {
647
- bc.unsubscribe(this.broadcastChannel, this.broadcastChannelSubscriber.bind(this))
656
+ bc.unsubscribe(this.broadcastChannel, this.boundBroadcastChannelSubscriber)
648
657
  this.subscribedToBroadcastChannel = false
649
658
  }
650
659
  }