@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.
- package/dist/hocuspocus-provider.cjs +12 -7
- package/dist/hocuspocus-provider.cjs.map +1 -1
- package/dist/hocuspocus-provider.esm.js +12 -7
- package/dist/hocuspocus-provider.esm.js.map +1 -1
- package/dist/packages/extension-database/src/Database.d.ts +3 -5
- package/dist/packages/extension-redis/src/Redis.d.ts +5 -1
- package/dist/packages/provider/src/HocuspocusProvider.d.ts +4 -0
- package/dist/packages/server/src/Document.d.ts +1 -1
- package/dist/packages/server/src/Hocuspocus.d.ts +4 -0
- package/dist/packages/server/src/MessageReceiver.d.ts +1 -1
- package/dist/packages/server/src/OutgoingMessage.d.ts +1 -0
- package/dist/packages/server/src/types.d.ts +20 -2
- package/dist/tests/extension-database/fetch.d.ts +1 -0
- package/package.json +2 -2
- package/src/HocuspocusProvider.ts +16 -7
|
@@ -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: (
|
|
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(
|
|
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;
|
|
@@ -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 |
|
|
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.
|
|
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": "
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
656
|
+
bc.unsubscribe(this.broadcastChannel, this.boundBroadcastChannelSubscriber)
|
|
648
657
|
this.subscribedToBroadcastChannel = false
|
|
649
658
|
}
|
|
650
659
|
}
|