@hocuspocus/extension-database 1.0.0-alpha.2 → 1.0.0-alpha.6

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.
Files changed (76) hide show
  1. package/dist/hocuspocus-database.cjs +10 -10
  2. package/dist/hocuspocus-database.cjs.map +1 -1
  3. package/dist/hocuspocus-database.esm.js +10 -10
  4. package/dist/hocuspocus-database.esm.js.map +1 -1
  5. package/dist/packages/common/src/CloseEvents.d.ts +23 -0
  6. package/dist/packages/common/src/index.d.ts +1 -0
  7. package/dist/packages/extension-database/src/Database.d.ts +5 -9
  8. package/dist/packages/extension-logger/src/Logger.d.ts +5 -0
  9. package/dist/packages/extension-sqlite/src/SQLite.d.ts +4 -4
  10. package/dist/packages/extension-webhook/src/index.d.ts +1 -2
  11. package/dist/packages/provider/src/EventEmitter.d.ts +1 -1
  12. package/dist/packages/provider/src/HocuspocusCloudProvider.d.ts +4 -3
  13. package/dist/packages/provider/src/HocuspocusProvider.d.ts +16 -8
  14. package/dist/packages/provider/src/types.d.ts +10 -0
  15. package/dist/packages/server/src/Connection.d.ts +5 -5
  16. package/dist/packages/server/src/Debugger.d.ts +1 -2
  17. package/dist/packages/server/src/Document.d.ts +8 -5
  18. package/dist/packages/server/src/Hocuspocus.d.ts +31 -13
  19. package/dist/packages/server/src/MessageReceiver.d.ts +8 -5
  20. package/dist/packages/server/src/OutgoingMessage.d.ts +1 -0
  21. package/dist/packages/server/src/index.d.ts +7 -0
  22. package/dist/packages/server/src/types.d.ts +81 -23
  23. package/dist/tests/extension-logger/onListen.d.ts +1 -0
  24. package/dist/tests/extension-redis/onLoadDocument.d.ts +1 -0
  25. package/dist/tests/extension-redis/onSynced.d.ts +1 -0
  26. package/dist/tests/extension-redis-rewrite/closeConnections.d.ts +1 -0
  27. package/dist/tests/extension-redis-rewrite/getConnectionCount.d.ts +1 -0
  28. package/dist/tests/extension-redis-rewrite/getDocumentsCount.d.ts +1 -0
  29. package/dist/tests/extension-redis-rewrite/onAwarenessChange.d.ts +1 -0
  30. package/dist/tests/extension-redis-rewrite/onChange.d.ts +1 -0
  31. package/dist/tests/extension-redis-rewrite/onStoreDocument.d.ts +1 -0
  32. package/dist/tests/extension-rocksdb/onLoadDocument.d.ts +1 -0
  33. package/dist/tests/provider/configuration.d.ts +1 -0
  34. package/dist/tests/provider/onAuthenticated.d.ts +1 -0
  35. package/dist/tests/provider/onAuthenticationFailed.d.ts +1 -0
  36. package/dist/tests/provider/onAwarenessChange.d.ts +1 -0
  37. package/dist/tests/provider/onAwarenessUpdate.d.ts +1 -0
  38. package/dist/tests/provider/onClose.d.ts +1 -0
  39. package/dist/tests/provider/onConnect.d.ts +1 -0
  40. package/dist/tests/provider/onDisconnect.d.ts +1 -0
  41. package/dist/tests/provider/onMessage.d.ts +1 -0
  42. package/dist/tests/provider/onOpen.d.ts +1 -0
  43. package/dist/tests/provider/onSynced.d.ts +1 -0
  44. package/dist/tests/server/address.d.ts +1 -0
  45. package/dist/tests/server/afterStoreDocument.d.ts +1 -0
  46. package/dist/tests/server/closeConnections.d.ts +1 -0
  47. package/dist/tests/server/getConnectionsCount.d.ts +1 -0
  48. package/dist/tests/server/getDocumentName.d.ts +1 -0
  49. package/dist/tests/server/getDocumentsCount.d.ts +1 -0
  50. package/dist/tests/server/getMessageLogs.d.ts +1 -0
  51. package/dist/tests/server/listen.d.ts +1 -0
  52. package/dist/tests/server/onAuthenticate.d.ts +1 -0
  53. package/dist/tests/server/onAwarenessUpdate.d.ts +1 -0
  54. package/dist/tests/server/onChange.d.ts +1 -0
  55. package/dist/tests/server/onConfigure.d.ts +1 -0
  56. package/dist/tests/server/onConnect.d.ts +1 -0
  57. package/dist/tests/server/onDestroy.d.ts +1 -0
  58. package/dist/tests/server/onDisconnect.d.ts +1 -0
  59. package/dist/tests/server/onListen.d.ts +1 -0
  60. package/dist/tests/server/onLoadDocument.d.ts +1 -0
  61. package/dist/tests/server/onRequest.d.ts +1 -0
  62. package/dist/tests/server/onStoreDocument.d.ts +1 -0
  63. package/dist/tests/server/onUpgrade.d.ts +1 -0
  64. package/dist/tests/server/requiresAuthentication.d.ts +1 -0
  65. package/dist/tests/transformer/TiptapTransformer.d.ts +1 -0
  66. package/dist/tests/utils/createDirectory.d.ts +1 -0
  67. package/dist/tests/utils/flushRedis.d.ts +1 -0
  68. package/dist/tests/utils/index.d.ts +7 -0
  69. package/dist/tests/utils/newHocuspocus.d.ts +2 -0
  70. package/dist/tests/utils/newHocuspocusProvider.d.ts +3 -0
  71. package/dist/tests/utils/redisConnectionSettings.d.ts +4 -0
  72. package/dist/tests/utils/removeDirectory.d.ts +1 -0
  73. package/dist/tests/utils/sleep.d.ts +1 -0
  74. package/package.json +4 -4
  75. package/src/Database.ts +17 -16
  76. package/dist/packages/server/src/CloseEvents.d.ts +0 -4
@@ -33,8 +33,8 @@ class Database {
33
33
  * Default configuration
34
34
  */
35
35
  this.configuration = {
36
- fetchUpdates: async () => [],
37
- storeUpdate: async () => null,
36
+ fetch: async () => null,
37
+ store: async () => null,
38
38
  };
39
39
  this.configuration = {
40
40
  ...this.configuration,
@@ -45,20 +45,20 @@ class Database {
45
45
  * Get stored data from the database.
46
46
  */
47
47
  async onLoadDocument({ document, documentName }) {
48
- const updates = await this.configuration.fetchUpdates({ documentName });
49
- if (updates && updates.length) {
50
- updates.forEach((update) => {
51
- Y__namespace.applyUpdate(document, update);
52
- });
48
+ const update = await this.configuration.fetch({ documentName });
49
+ if (update) {
50
+ Y__namespace.applyUpdate(document, update);
53
51
  }
54
52
  return document;
55
53
  }
56
54
  /**
57
55
  * Store new updates in the database.
58
56
  */
59
- async onChange({ document, documentName }) {
60
- const update = Buffer.from(Y__namespace.encodeStateAsUpdate(document));
61
- return this.configuration.storeUpdate({ update, documentName });
57
+ async onStoreDocument(data) {
58
+ return this.configuration.store({
59
+ ...data,
60
+ state: Buffer.from(Y__namespace.encodeStateAsUpdate(data.document)),
61
+ });
62
62
  }
63
63
  }
64
64
 
@@ -1 +1 @@
1
- {"version":3,"file":"hocuspocus-database.cjs","sources":["../src/Database.ts"],"sourcesContent":["import { Extension, onChangePayload, onLoadDocumentPayload } from '@hocuspocus/server'\nimport * as Y from 'yjs'\n\nexport interface DatabaseConfiguration {\n /**\n * Pass a Promise to retrieve updates from your database. The Promise should resolve to\n * an array of items with Y.js-compatible binary data.\n */\n fetchUpdates: ({ documentName }: { documentName: string}) => Promise<Uint8Array[]>,\n /**\n * Pass a function to store updates in your database.\n */\n storeUpdate: ({ update, documentName }: { update: Buffer, documentName: string}) => void,\n}\n\nexport class Database implements Extension {\n /**\n * Default configuration\n */\n configuration: DatabaseConfiguration = {\n fetchUpdates: async () => [],\n storeUpdate: async () => null,\n }\n\n /**\n * Constructor\n */\n constructor(configuration: Partial<DatabaseConfiguration>) {\n this.configuration = {\n ...this.configuration,\n ...configuration,\n }\n }\n\n /**\n * Get stored data from the database.\n */\n async onLoadDocument({ document, documentName }: onLoadDocumentPayload): Promise<any> {\n const updates = await this.configuration.fetchUpdates({ documentName })\n\n if (updates && updates.length) {\n updates.forEach((update: any) => {\n Y.applyUpdate(document, update)\n })\n }\n\n return document\n }\n\n /**\n * Store new updates in the database.\n */\n async onChange({ document, documentName }: onChangePayload) {\n const update = Buffer.from(\n Y.encodeStateAsUpdate(document),\n )\n\n return this.configuration.storeUpdate({ update, documentName })\n }\n}\n"],"names":["Y"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;MAea,QAAQ;;;;IAYnB,YAAY,aAA6C;;;;QARzD,kBAAa,GAA0B;YACrC,YAAY,EAAE,YAAY,EAAE;YAC5B,WAAW,EAAE,YAAY,IAAI;SAC9B,CAAA;QAMC,IAAI,CAAC,aAAa,GAAG;YACnB,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,aAAa;SACjB,CAAA;KACF;;;;IAKD,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAyB;QACpE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;QAEvE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;YAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW;gBAC1BA,YAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;aAChC,CAAC,CAAA;SACH;QAED,OAAO,QAAQ,CAAA;KAChB;;;;IAKD,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAmB;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxBA,YAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAChC,CAAA;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;KAChE;;;;;"}
1
+ {"version":3,"file":"hocuspocus-database.cjs","sources":["../src/Database.ts"],"sourcesContent":["import {\n Extension, onChangePayload, onLoadDocumentPayload, storePayload,\n} from '@hocuspocus/server'\nimport * as Y from 'yjs'\n\nexport interface DatabaseConfiguration {\n /**\n * Pass a Promise to retrieve updates from your database. The Promise should resolve to\n * an array of items with Y.js-compatible binary data.\n */\n fetch: ({ documentName }: { documentName: string}) => Promise<Uint8Array | null>,\n /**\n * Pass a function to store updates in your database.\n */\n store: (data: storePayload) => void,\n}\n\nexport class Database implements Extension {\n /**\n * Default configuration\n */\n configuration: DatabaseConfiguration = {\n fetch: async () => null,\n store: async () => null,\n }\n\n /**\n * Constructor\n */\n constructor(configuration: Partial<DatabaseConfiguration>) {\n this.configuration = {\n ...this.configuration,\n ...configuration,\n }\n }\n\n /**\n * Get stored data from the database.\n */\n async onLoadDocument({ document, documentName }: onLoadDocumentPayload): Promise<any> {\n const update = await this.configuration.fetch({ documentName })\n\n if (update) {\n Y.applyUpdate(document, update)\n }\n\n return document\n }\n\n /**\n * Store new updates in the database.\n */\n async onStoreDocument(data: onChangePayload) {\n return this.configuration.store({\n ...data,\n state: Buffer.from(\n Y.encodeStateAsUpdate(data.document),\n ),\n })\n }\n}\n"],"names":["Y"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;MAiBa,QAAQ;;;;IAYnB,YAAY,aAA6C;;;;QARzD,kBAAa,GAA0B;YACrC,KAAK,EAAE,YAAY,IAAI;YACvB,KAAK,EAAE,YAAY,IAAI;SACxB,CAAA;QAMC,IAAI,CAAC,aAAa,GAAG;YACnB,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,aAAa;SACjB,CAAA;KACF;;;;IAKD,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAyB;QACpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;QAE/D,IAAI,MAAM,EAAE;YACVA,YAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;SAChC;QAED,OAAO,QAAQ,CAAA;KAChB;;;;IAKD,MAAM,eAAe,CAAC,IAAqB;QACzC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAC9B,GAAG,IAAI;YACP,KAAK,EAAE,MAAM,CAAC,IAAI,CAChBA,YAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CACrC;SACF,CAAC,CAAA;KACH;;;;;"}
@@ -9,8 +9,8 @@ class Database {
9
9
  * Default configuration
10
10
  */
11
11
  this.configuration = {
12
- fetchUpdates: async () => [],
13
- storeUpdate: async () => null,
12
+ fetch: async () => null,
13
+ store: async () => null,
14
14
  };
15
15
  this.configuration = {
16
16
  ...this.configuration,
@@ -21,20 +21,20 @@ class Database {
21
21
  * Get stored data from the database.
22
22
  */
23
23
  async onLoadDocument({ document, documentName }) {
24
- const updates = await this.configuration.fetchUpdates({ documentName });
25
- if (updates && updates.length) {
26
- updates.forEach((update) => {
27
- Y.applyUpdate(document, update);
28
- });
24
+ const update = await this.configuration.fetch({ documentName });
25
+ if (update) {
26
+ Y.applyUpdate(document, update);
29
27
  }
30
28
  return document;
31
29
  }
32
30
  /**
33
31
  * Store new updates in the database.
34
32
  */
35
- async onChange({ document, documentName }) {
36
- const update = Buffer.from(Y.encodeStateAsUpdate(document));
37
- return this.configuration.storeUpdate({ update, documentName });
33
+ async onStoreDocument(data) {
34
+ return this.configuration.store({
35
+ ...data,
36
+ state: Buffer.from(Y.encodeStateAsUpdate(data.document)),
37
+ });
38
38
  }
39
39
  }
40
40
 
@@ -1 +1 @@
1
- {"version":3,"file":"hocuspocus-database.esm.js","sources":["../src/Database.ts"],"sourcesContent":["import { Extension, onChangePayload, onLoadDocumentPayload } from '@hocuspocus/server'\nimport * as Y from 'yjs'\n\nexport interface DatabaseConfiguration {\n /**\n * Pass a Promise to retrieve updates from your database. The Promise should resolve to\n * an array of items with Y.js-compatible binary data.\n */\n fetchUpdates: ({ documentName }: { documentName: string}) => Promise<Uint8Array[]>,\n /**\n * Pass a function to store updates in your database.\n */\n storeUpdate: ({ update, documentName }: { update: Buffer, documentName: string}) => void,\n}\n\nexport class Database implements Extension {\n /**\n * Default configuration\n */\n configuration: DatabaseConfiguration = {\n fetchUpdates: async () => [],\n storeUpdate: async () => null,\n }\n\n /**\n * Constructor\n */\n constructor(configuration: Partial<DatabaseConfiguration>) {\n this.configuration = {\n ...this.configuration,\n ...configuration,\n }\n }\n\n /**\n * Get stored data from the database.\n */\n async onLoadDocument({ document, documentName }: onLoadDocumentPayload): Promise<any> {\n const updates = await this.configuration.fetchUpdates({ documentName })\n\n if (updates && updates.length) {\n updates.forEach((update: any) => {\n Y.applyUpdate(document, update)\n })\n }\n\n return document\n }\n\n /**\n * Store new updates in the database.\n */\n async onChange({ document, documentName }: onChangePayload) {\n const update = Buffer.from(\n Y.encodeStateAsUpdate(document),\n )\n\n return this.configuration.storeUpdate({ update, documentName })\n }\n}\n"],"names":[],"mappings":";;MAea,QAAQ;;;;IAYnB,YAAY,aAA6C;;;;QARzD,kBAAa,GAA0B;YACrC,YAAY,EAAE,YAAY,EAAE;YAC5B,WAAW,EAAE,YAAY,IAAI;SAC9B,CAAA;QAMC,IAAI,CAAC,aAAa,GAAG;YACnB,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,aAAa;SACjB,CAAA;KACF;;;;IAKD,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAyB;QACpE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;QAEvE,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;YAC7B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW;gBAC1B,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;aAChC,CAAC,CAAA;SACH;QAED,OAAO,QAAQ,CAAA;KAChB;;;;IAKD,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAmB;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAChC,CAAA;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAA;KAChE;;;;;"}
1
+ {"version":3,"file":"hocuspocus-database.esm.js","sources":["../src/Database.ts"],"sourcesContent":["import {\n Extension, onChangePayload, onLoadDocumentPayload, storePayload,\n} from '@hocuspocus/server'\nimport * as Y from 'yjs'\n\nexport interface DatabaseConfiguration {\n /**\n * Pass a Promise to retrieve updates from your database. The Promise should resolve to\n * an array of items with Y.js-compatible binary data.\n */\n fetch: ({ documentName }: { documentName: string}) => Promise<Uint8Array | null>,\n /**\n * Pass a function to store updates in your database.\n */\n store: (data: storePayload) => void,\n}\n\nexport class Database implements Extension {\n /**\n * Default configuration\n */\n configuration: DatabaseConfiguration = {\n fetch: async () => null,\n store: async () => null,\n }\n\n /**\n * Constructor\n */\n constructor(configuration: Partial<DatabaseConfiguration>) {\n this.configuration = {\n ...this.configuration,\n ...configuration,\n }\n }\n\n /**\n * Get stored data from the database.\n */\n async onLoadDocument({ document, documentName }: onLoadDocumentPayload): Promise<any> {\n const update = await this.configuration.fetch({ documentName })\n\n if (update) {\n Y.applyUpdate(document, update)\n }\n\n return document\n }\n\n /**\n * Store new updates in the database.\n */\n async onStoreDocument(data: onChangePayload) {\n return this.configuration.store({\n ...data,\n state: Buffer.from(\n Y.encodeStateAsUpdate(data.document),\n ),\n })\n }\n}\n"],"names":[],"mappings":";;MAiBa,QAAQ;;;;IAYnB,YAAY,aAA6C;;;;QARzD,kBAAa,GAA0B;YACrC,KAAK,EAAE,YAAY,IAAI;YACvB,KAAK,EAAE,YAAY,IAAI;SACxB,CAAA;QAMC,IAAI,CAAC,aAAa,GAAG;YACnB,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,aAAa;SACjB,CAAA;KACF;;;;IAKD,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAyB;QACpE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;QAE/D,IAAI,MAAM,EAAE;YACV,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;SAChC;QAED,OAAO,QAAQ,CAAA;KAChB;;;;IAKD,MAAM,eAAe,CAAC,IAAqB;QACzC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YAC9B,GAAG,IAAI;YACP,KAAK,EAAE,MAAM,CAAC,IAAI,CAChB,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CACrC;SACF,CAAC,CAAA;KACH;;;;;"}
@@ -0,0 +1,23 @@
1
+ export interface CloseEvent {
2
+ code: number;
3
+ reason: string;
4
+ }
5
+ /**
6
+ * The server successfully processed the request, asks that the requester reset
7
+ * its document view, and is not returning any content.
8
+ */
9
+ export declare const ResetConnection: CloseEvent;
10
+ /**
11
+ * Similar to Forbidden, but specifically for use when authentication is required and has
12
+ * failed or has not yet been provided.
13
+ */
14
+ export declare const Unauthorized: CloseEvent;
15
+ /**
16
+ * The request contained valid data and was understood by the server, but the server
17
+ * is refusing action.
18
+ */
19
+ export declare const Forbidden: CloseEvent;
20
+ /**
21
+ * The server timed out waiting for the request.
22
+ */
23
+ export declare const ConnectionTimeout: CloseEvent;
@@ -1 +1,2 @@
1
1
  export * from './auth';
2
+ export * from './CloseEvents';
@@ -1,20 +1,16 @@
1
- /// <reference types="node" />
2
- import { Extension, onChangePayload, onLoadDocumentPayload } from '@hocuspocus/server';
1
+ import { Extension, onChangePayload, onLoadDocumentPayload, storePayload } from '@hocuspocus/server';
3
2
  export interface DatabaseConfiguration {
4
3
  /**
5
4
  * Pass a Promise to retrieve updates from your database. The Promise should resolve to
6
5
  * an array of items with Y.js-compatible binary data.
7
6
  */
8
- fetchUpdates: ({ documentName }: {
7
+ fetch: ({ documentName }: {
9
8
  documentName: string;
10
- }) => Promise<Uint8Array[]>;
9
+ }) => Promise<Uint8Array | null>;
11
10
  /**
12
11
  * Pass a function to store updates in your database.
13
12
  */
14
- storeUpdate: ({ update, documentName }: {
15
- update: Buffer;
16
- documentName: string;
17
- }) => void;
13
+ store: (data: storePayload) => void;
18
14
  }
19
15
  export declare class Database implements Extension {
20
16
  /**
@@ -32,5 +28,5 @@ export declare class Database implements Extension {
32
28
  /**
33
29
  * Store new updates in the database.
34
30
  */
35
- onChange({ document, documentName }: onChangePayload): Promise<void>;
31
+ onStoreDocument(data: onChangePayload): Promise<void>;
36
32
  }
@@ -14,6 +14,10 @@ export interface LoggerConfiguration {
14
14
  * Whether to log something for the `onChange` hook.
15
15
  */
16
16
  onChange: boolean;
17
+ /**
18
+ * Whether to log something for the `onStoreDocument` hook.
19
+ */
20
+ onStoreDocument: boolean;
17
21
  /**
18
22
  * Whether to log something for the `onConnect` hook.
19
23
  */
@@ -53,6 +57,7 @@ export declare class Logger implements Extension {
53
57
  onConfigure(data: onConfigurePayload): Promise<void>;
54
58
  onLoadDocument(data: onLoadDocumentPayload): Promise<void>;
55
59
  onChange(data: onChangePayload): Promise<void>;
60
+ onStoreDocument(data: onDisconnectPayload): Promise<void>;
56
61
  onConnect(data: onConnectPayload): Promise<void>;
57
62
  onDisconnect(data: onDisconnectPayload): Promise<void>;
58
63
  onUpgrade(data: onUpgradePayload): Promise<void>;
@@ -1,5 +1,8 @@
1
1
  import { Database, DatabaseConfiguration } from '@hocuspocus/extension-database';
2
2
  import sqlite3 from 'sqlite3';
3
+ export declare const schema = "CREATE TABLE IF NOT EXISTS \"documents\" (\n \"name\" varchar(255) NOT NULL,\n \"data\" blob NOT NULL,\n UNIQUE(name)\n)";
4
+ export declare const selectQuery = "\n SELECT data FROM \"documents\" WHERE name = $name ORDER BY rowid DESC\n";
5
+ export declare const upsertQuery = "\n INSERT INTO \"documents\" (\"name\", \"data\") VALUES ($name, $data)\n ON CONFLICT(name) DO UPDATE SET data = $data\n";
3
6
  export interface SQLiteConfiguration extends DatabaseConfiguration {
4
7
  /**
5
8
  * Valid values are filenames, ":memory:" for an anonymous in-memory database and an empty
@@ -17,10 +20,7 @@ export interface SQLiteConfiguration extends DatabaseConfiguration {
17
20
  export declare class SQLite extends Database {
18
21
  db?: sqlite3.Database;
19
22
  configuration: SQLiteConfiguration;
20
- /**
21
- * Constructor
22
- */
23
23
  constructor(configuration?: Partial<SQLiteConfiguration>);
24
- onListen(): Promise<void>;
25
24
  onConfigure(): Promise<void>;
25
+ onListen(): Promise<void>;
26
26
  }
@@ -3,7 +3,6 @@ import { Extension, onChangePayload, onConnectPayload, onLoadDocumentPayload, on
3
3
  import { Doc } from 'yjs';
4
4
  import { Transformer } from '@hocuspocus/transformer';
5
5
  import { AxiosResponse } from 'axios';
6
- import Timeout = NodeJS.Timeout;
7
6
  export declare enum Events {
8
7
  onChange = "change",
9
8
  onConnect = "connect",
@@ -24,7 +23,7 @@ export interface Configuration {
24
23
  export declare class Webhook implements Extension {
25
24
  configuration: Configuration;
26
25
  debounced: Map<string, {
27
- timeout: Timeout;
26
+ timeout: NodeJS.Timeout;
28
27
  start: number;
29
28
  }>;
30
29
  /**
@@ -5,5 +5,5 @@ export default class EventEmitter {
5
5
  on(event: string, fn: Function): this;
6
6
  protected emit(event: string, ...args: any): this;
7
7
  off(event: string, fn?: Function): this;
8
- protected removeAllListeners(): void;
8
+ removeAllListeners(): void;
9
9
  }
@@ -1,10 +1,11 @@
1
- import { HocuspocusProvider, HocuspocusProviderOptions } from './HocuspocusProvider';
2
- export interface HocuspocusCloudProviderOptions extends HocuspocusProviderOptions {
1
+ import { HocuspocusProvider, HocuspocusProviderConfiguration } from './HocuspocusProvider';
2
+ export declare type HocuspocusCloudProviderConfiguration = Required<Pick<HocuspocusProviderConfiguration, 'name'>> & Partial<HocuspocusProviderConfiguration> & AdditionalHocuspocusCloudProviderConfiguration;
3
+ export interface AdditionalHocuspocusCloudProviderConfiguration {
3
4
  /**
4
5
  * A Hocuspocus Cloud key, get one here: https://hocuspocus.cloud/
5
6
  */
6
7
  key: string;
7
8
  }
8
9
  export declare class HocuspocusCloudProvider extends HocuspocusProvider {
9
- constructor(options: HocuspocusCloudProviderOptions);
10
+ constructor(configuration: HocuspocusCloudProviderConfiguration);
10
11
  }
@@ -1,16 +1,18 @@
1
1
  import * as Y from 'yjs';
2
2
  import { Awareness } from 'y-protocols/awareness';
3
3
  import * as mutex from 'lib0/mutex';
4
- import { Event, CloseEvent, MessageEvent } from 'ws';
4
+ import type { Event, CloseEvent, MessageEvent } from 'ws';
5
5
  import EventEmitter from './EventEmitter';
6
6
  import { OutgoingMessage } from './OutgoingMessage';
7
7
  import { ConstructableOutgoingMessage } from './types';
8
+ import { onAwarenessChangeParameters, onAwarenessUpdateParameters } from '.';
8
9
  export declare enum WebSocketStatus {
9
10
  Connecting = "connecting",
10
11
  Connected = "connected",
11
12
  Disconnected = "disconnected"
12
13
  }
13
- export interface HocuspocusProviderOptions {
14
+ export declare type HocuspocusProviderConfiguration = Required<Pick<CompleteHocuspocusProviderConfiguration, 'url' | 'name'>> & Partial<CompleteHocuspocusProviderConfiguration>;
15
+ export interface CompleteHocuspocusProviderConfiguration {
14
16
  /**
15
17
  * URL of your @hocuspocus/server instance
16
18
  */
@@ -98,15 +100,21 @@ export interface HocuspocusProviderOptions {
98
100
  onMessage: (event: MessageEvent) => void;
99
101
  onOutgoingMessage: (message: OutgoingMessage) => void;
100
102
  onStatus: (status: any) => void;
101
- onSynced: () => void;
103
+ onSynced: ({ state }: {
104
+ state: boolean;
105
+ }) => void;
102
106
  onDisconnect: (event: CloseEvent) => void;
103
107
  onClose: (event: CloseEvent) => void;
104
108
  onDestroy: () => void;
105
- onAwarenessUpdate: (states: any) => void;
106
- onAwarenessChange: (states: any) => void;
109
+ onAwarenessUpdate: ({ states }: onAwarenessUpdateParameters) => void;
110
+ onAwarenessChange: ({ states }: onAwarenessChangeParameters) => void;
111
+ /**
112
+ * Don’t output any warnings.
113
+ */
114
+ quiet: boolean;
107
115
  }
108
116
  export declare class HocuspocusProvider extends EventEmitter {
109
- options: HocuspocusProviderOptions;
117
+ configuration: CompleteHocuspocusProviderConfiguration;
110
118
  subscribedToBroadcastChannel: boolean;
111
119
  webSocket: WebSocket | null;
112
120
  shouldConnect: boolean;
@@ -120,8 +128,8 @@ export declare class HocuspocusProvider extends EventEmitter {
120
128
  resolve: (value?: any) => void;
121
129
  reject: (reason?: any) => void;
122
130
  } | null;
123
- constructor(options?: Partial<HocuspocusProviderOptions>);
124
- setOptions(options?: Partial<HocuspocusProviderOptions>): void;
131
+ constructor(configuration: HocuspocusProviderConfiguration);
132
+ setConfiguration(configuration?: Partial<HocuspocusProviderConfiguration>): void;
125
133
  connect(): Promise<void>;
126
134
  createWebSocketConnection(): Promise<unknown>;
127
135
  resolveConnectionAttempt(): void;
@@ -32,3 +32,13 @@ export interface Constructable<T> {
32
32
  new (...args: any): T;
33
33
  }
34
34
  export declare type ConstructableOutgoingMessage = Constructable<AuthenticationMessage> | Constructable<AwarenessMessage> | Constructable<QueryAwarenessMessage> | Constructable<SyncStepOneMessage> | Constructable<SyncStepTwoMessage> | Constructable<UpdateMessage>;
35
+ export declare type onAwarenessUpdateParameters = {
36
+ states: StatesArray;
37
+ };
38
+ export declare type onAwarenessChangeParameters = {
39
+ states: StatesArray;
40
+ };
41
+ export declare type StatesArray = {
42
+ clientId: number;
43
+ [key: string | number]: any;
44
+ }[];
@@ -2,10 +2,10 @@
2
2
  import AsyncLock from 'async-lock';
3
3
  import WebSocket from 'ws';
4
4
  import { IncomingMessage as HTTPIncomingMessage } from 'http';
5
+ import { CloseEvent } from '@hocuspocus/common';
5
6
  import Document from './Document';
6
- import { CloseEvent } from './types';
7
- import { MessageLogger } from './Debugger';
8
- declare class Connection {
7
+ import { Debugger } from './Debugger';
8
+ export declare class Connection {
9
9
  webSocket: WebSocket;
10
10
  context: any;
11
11
  document: Document;
@@ -17,11 +17,11 @@ declare class Connection {
17
17
  socketId: string;
18
18
  lock: AsyncLock;
19
19
  readOnly: Boolean;
20
- debugger: MessageLogger;
20
+ logger: Debugger;
21
21
  /**
22
22
  * Constructor.
23
23
  */
24
- constructor(connection: WebSocket, request: HTTPIncomingMessage, document: Document, timeout: number, socketId: string, context: any, readOnly?: boolean);
24
+ constructor(connection: WebSocket, request: HTTPIncomingMessage, document: Document, timeout: number, socketId: string, context: any, readOnly: boolean | undefined, logger: Debugger);
25
25
  /**
26
26
  * Set a callback that will be triggered when the connection is closed
27
27
  */
@@ -1,4 +1,4 @@
1
- export declare class MessageLogger {
1
+ export declare class Debugger {
2
2
  logs: any[];
3
3
  listen: boolean;
4
4
  output: boolean;
@@ -12,4 +12,3 @@ export declare class MessageLogger {
12
12
  logs: any[];
13
13
  };
14
14
  }
15
- export declare const Debugger: MessageLogger;
@@ -3,20 +3,23 @@ import { Awareness } from 'y-protocols/awareness';
3
3
  import { Doc } from 'yjs';
4
4
  import { mutex } from 'lib0/mutex.js';
5
5
  import Connection from './Connection';
6
- import { MessageLogger } from './Debugger';
7
- declare class Document extends Doc {
6
+ import { Debugger } from './Debugger';
7
+ export declare class Document extends Doc {
8
8
  awareness: Awareness;
9
9
  callbacks: {
10
10
  onUpdate: (document: Document, connection: Connection, update: Uint8Array) => void;
11
11
  };
12
- connections: Map<any, any>;
12
+ connections: Map<WebSocket, {
13
+ clients: Set<any>;
14
+ connection: Connection;
15
+ }>;
13
16
  name: string;
14
17
  mux: mutex;
15
- debugger: MessageLogger;
18
+ logger: Debugger;
16
19
  /**
17
20
  * Constructor.
18
21
  */
19
- constructor(name: string);
22
+ constructor(name: string, logger: Debugger);
20
23
  /**
21
24
  * Check if the Document is empty
22
25
  */
@@ -1,13 +1,16 @@
1
1
  /// <reference types="node" />
2
- import WebSocket, { WebSocketServer } from 'ws';
2
+ import WebSocket, { AddressInfo, WebSocketServer } from 'ws';
3
3
  import { IncomingMessage, Server as HTTPServer } from 'http';
4
4
  import { Configuration, Hook } from './types';
5
- import { MessageLogger } from './Debugger';
5
+ import Document from './Document';
6
+ import { Debugger } from './Debugger';
6
7
  import { onListenPayload } from '.';
7
8
  export declare const defaultConfiguration: {
8
9
  name: null;
9
10
  port: number;
10
11
  timeout: number;
12
+ debounce: number;
13
+ maxDebounce: number;
11
14
  quiet: boolean;
12
15
  };
13
16
  /**
@@ -15,10 +18,11 @@ export declare const defaultConfiguration: {
15
18
  */
16
19
  export declare class Hocuspocus {
17
20
  configuration: Configuration;
18
- documents: Map<any, any>;
21
+ documents: Map<string, Document>;
19
22
  httpServer?: HTTPServer;
20
23
  webSocketServer?: WebSocketServer;
21
- debugger: MessageLogger;
24
+ debugger: Debugger;
25
+ constructor(configuration?: Partial<Configuration>);
22
26
  /**
23
27
  * Configure the server
24
28
  */
@@ -27,7 +31,11 @@ export declare class Hocuspocus {
27
31
  /**
28
32
  * Start the server
29
33
  */
30
- listen(portOrCallback?: number | ((data: onListenPayload) => Promise<any>) | null, callback?: any): Promise<void>;
34
+ listen(portOrCallback?: number | ((data: onListenPayload) => Promise<any>) | null, callback?: any): Promise<Hocuspocus>;
35
+ get address(): AddressInfo;
36
+ get URL(): string;
37
+ get webSocketURL(): string;
38
+ get httpURL(): string;
31
39
  private showStartScreen;
32
40
  /**
33
41
  * Get the total number of active documents
@@ -46,37 +54,47 @@ export declare class Hocuspocus {
46
54
  */
47
55
  destroy(): Promise<any>;
48
56
  /**
49
- * Handle the incoming WebSocket connection
57
+ * The `handleConnection` method receives incoming WebSocket connections,
58
+ * runs all hooks:
59
+ *
60
+ * - onConnect for all connections
61
+ * - onAuthenticate only if required
62
+ *
63
+ * … and if nothings fails it’ll fully establish the connection and
64
+ * load the Document then.
50
65
  */
51
66
  handleConnection(incoming: WebSocket, request: IncomingMessage, documentName: string, context?: any): void;
52
67
  /**
53
68
  * Handle update of the given document
54
- * @private
55
69
  */
56
70
  private handleDocumentUpdate;
71
+ timers: Map<string, {
72
+ timeout: NodeJS.Timeout;
73
+ start: number;
74
+ }>;
75
+ /**
76
+ * debounce the given function, using the given identifier
77
+ */
78
+ debounce(id: string, func: Function, immediately?: boolean): void;
57
79
  /**
58
80
  * Create a new document by the given request
59
- * @private
60
81
  */
61
82
  private createDocument;
62
83
  /**
63
84
  * Create a new connection by the given request and document
64
- * @private
65
85
  */
66
86
  private createConnection;
67
87
  /**
68
- * Run the given hook on all configured extensions
69
- * Runs the given callback after each hook
88
+ * Run the given hook on all configured extensions.
89
+ * Runs the given callback after each hook.
70
90
  */
71
91
  hooks(name: Hook, payload: any, callback?: Function | null): Promise<any>;
72
92
  /**
73
93
  * Get parameters by the given request
74
- * @private
75
94
  */
76
95
  private static getParameters;
77
96
  /**
78
97
  * Get document name by the given request
79
- * @private
80
98
  */
81
99
  private getDocumentNameFromRequest;
82
100
  enableDebugging(): void;
@@ -1,10 +1,13 @@
1
+ import { Awareness } from 'y-protocols/awareness';
1
2
  import Connection from './Connection';
2
3
  import { IncomingMessage } from './IncomingMessage';
3
- import { MessageLogger } from './Debugger';
4
+ import { Debugger } from './Debugger';
5
+ import Document from './Document';
4
6
  export declare class MessageReceiver {
5
7
  message: IncomingMessage;
6
- debugger: MessageLogger;
7
- constructor(message: IncomingMessage);
8
- apply(connection: Connection): void;
9
- readSyncMessage(message: IncomingMessage, connection: Connection): 0 | 1 | 2;
8
+ logger: Debugger;
9
+ constructor(message: IncomingMessage, logger: Debugger);
10
+ apply(document: Document, connection?: Connection, reply?: (message: Uint8Array) => void): void;
11
+ readSyncMessage(message: IncomingMessage, document: Document, connection?: Connection, reply?: (message: Uint8Array) => void): 0 | 1 | 2;
12
+ applyQueryAwarenessMessage(awareness: Awareness, reply?: (message: Uint8Array) => void): void;
10
13
  }
@@ -8,6 +8,7 @@ export declare class OutgoingMessage {
8
8
  constructor();
9
9
  createSyncMessage(): OutgoingMessage;
10
10
  createAwarenessUpdateMessage(awareness: Awareness, changedClients?: Array<any>): OutgoingMessage;
11
+ writeQueryAwareness(): OutgoingMessage;
11
12
  writeAuthenticated(): OutgoingMessage;
12
13
  writePermissionDenied(reason: string): OutgoingMessage;
13
14
  writeFirstSyncStepFor(document: Document): OutgoingMessage;
@@ -1,2 +1,9 @@
1
1
  export * from './Hocuspocus';
2
+ export * from './Connection';
3
+ export * from './Document';
4
+ export * from './IncomingMessage';
5
+ export * from './OutgoingMessage';
2
6
  export * from './types';
7
+ export * from './MessageReceiver';
8
+ export * from './Document';
9
+ export * from './Connection';
@@ -2,13 +2,15 @@
2
2
  import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http';
3
3
  import { URLSearchParams } from 'url';
4
4
  import { Socket } from 'net';
5
+ import { Awareness } from 'y-protocols/awareness';
5
6
  import Document from './Document';
6
7
  import { Hocuspocus } from './Hocuspocus';
7
8
  export declare enum MessageType {
8
9
  Unknown = -1,
9
10
  Sync = 0,
10
11
  Awareness = 1,
11
- Auth = 2
12
+ Auth = 2,
13
+ QueryAwareness = 3
12
14
  }
13
15
  /**
14
16
  * State of the WebSocket connection.
@@ -25,32 +27,37 @@ export interface AwarenessUpdate {
25
27
  updated: Array<any>;
26
28
  removed: Array<any>;
27
29
  }
28
- export interface ConnectionConfig {
30
+ export interface ConnectionConfiguration {
29
31
  readOnly: boolean;
30
32
  requiresAuthentication: boolean;
31
33
  isAuthenticated: boolean;
32
34
  }
33
35
  export interface Extension {
34
- onAuthenticate?(data: onAuthenticatePayload): Promise<any>;
35
- onChange?(data: onChangePayload): Promise<any>;
36
- onConnect?(data: onConnectPayload): Promise<any>;
36
+ priority?: number;
37
37
  onConfigure?(data: onConfigurePayload): Promise<any>;
38
+ onListen?(data: onListenPayload): Promise<any>;
39
+ onUpgrade?(data: onUpgradePayload): Promise<any>;
40
+ onConnect?(data: onConnectPayload): Promise<any>;
41
+ onAuthenticate?(data: onAuthenticatePayload): Promise<any>;
38
42
  /**
39
43
  * @deprecated onCreateDocument is deprecated, use onLoadDocument instead
40
44
  */
41
45
  onCreateDocument?(data: onLoadDocumentPayload): Promise<any>;
42
46
  onLoadDocument?(data: onLoadDocumentPayload): Promise<any>;
43
- onDestroy?(data: onDestroyPayload): Promise<any>;
44
- onDisconnect?(data: onDisconnectPayload): Promise<any>;
45
- onListen?(data: onListenPayload): Promise<any>;
47
+ afterLoadDocument?(data: onLoadDocumentPayload): Promise<any>;
48
+ onChange?(data: onChangePayload): Promise<any>;
49
+ onStoreDocument?(data: onStoreDocumentPayload): Promise<any>;
50
+ afterStoreDocument?(data: afterStoreDocumentPayload): Promise<any>;
51
+ onAwarenessUpdate?(data: onAwarenessUpdatePayload): Promise<any>;
46
52
  onRequest?(data: onRequestPayload): Promise<any>;
47
- onUpgrade?(data: onUpgradePayload): Promise<any>;
53
+ onDisconnect?(data: onDisconnectPayload): Promise<any>;
54
+ onDestroy?(data: onDestroyPayload): Promise<any>;
48
55
  }
49
- export declare type Hook = 'onAuthenticate' | 'onChange' | 'onConnect' | 'onConfigure' |
56
+ export declare type Hook = 'onConfigure' | 'onListen' | 'onUpgrade' | 'onConnect' | 'onAuthenticate' |
50
57
  /**
51
58
  * @deprecated onCreateDocument is deprecated, use onLoadDocument instead
52
59
  */
53
- 'onCreateDocument' | 'onLoadDocument' | 'onDestroy' | 'onDisconnect' | 'onListen' | 'onRequest' | 'onUpgrade';
60
+ 'onCreateDocument' | 'onLoadDocument' | 'afterLoadDocument' | 'onChange' | 'onStoreDocument' | 'afterStoreDocument' | 'onAwarenessUpdate' | 'onRequest' | 'onDisconnect' | 'onDestroy';
54
61
  export interface Configuration extends Extension {
55
62
  /**
56
63
  * A name for the instance, used for logging.
@@ -68,6 +75,15 @@ export interface Configuration extends Extension {
68
75
  * Defines in which interval the server sends a ping, and closes the connection when no pong is sent back.
69
76
  */
70
77
  timeout: number;
78
+ /**
79
+ * Debounces the call of the `onStoreDocument` hook for the given amount of time in ms.
80
+ * Otherwise every single update would be persisted.
81
+ */
82
+ debounce: number;
83
+ /**
84
+ * Makes sure to call `onStoreDocument` at least in the given amount of time (ms).
85
+ */
86
+ maxDebounce: number;
71
87
  /**
72
88
  * By default, the servers show a start screen. If passed false, the server will start quietly.
73
89
  */
@@ -75,11 +91,12 @@ export interface Configuration extends Extension {
75
91
  /**
76
92
  * Function which returns the (customized) document name based on the request
77
93
  */
78
- getDocumentName?(data: {
79
- documentName: string;
80
- request: IncomingMessage;
81
- requestParameters: URLSearchParams;
82
- }): string | Promise<string>;
94
+ getDocumentName?(data: getDocumentNamePayload): string | Promise<string>;
95
+ }
96
+ export interface getDocumentNamePayload {
97
+ documentName: string;
98
+ request: IncomingMessage;
99
+ requestParameters: URLSearchParams;
83
100
  }
84
101
  export interface onAuthenticatePayload {
85
102
  documentName: string;
@@ -88,7 +105,7 @@ export interface onAuthenticatePayload {
88
105
  requestParameters: URLSearchParams;
89
106
  socketId: string;
90
107
  token: string;
91
- connection: ConnectionConfig;
108
+ connection: ConnectionConfiguration;
92
109
  }
93
110
  export interface onConnectPayload {
94
111
  documentName: string;
@@ -97,7 +114,7 @@ export interface onConnectPayload {
97
114
  requestHeaders: IncomingHttpHeaders;
98
115
  requestParameters: URLSearchParams;
99
116
  socketId: string;
100
- connection: ConnectionConfig;
117
+ connection: ConnectionConfiguration;
101
118
  }
102
119
  export interface onLoadDocumentPayload {
103
120
  context: any;
@@ -107,7 +124,17 @@ export interface onLoadDocumentPayload {
107
124
  requestHeaders: IncomingHttpHeaders;
108
125
  requestParameters: URLSearchParams;
109
126
  socketId: string;
110
- connection: ConnectionConfig;
127
+ connection: ConnectionConfiguration;
128
+ }
129
+ export interface afterLoadDocumentPayload {
130
+ context: any;
131
+ document: Document;
132
+ documentName: string;
133
+ instance: Hocuspocus;
134
+ requestHeaders: IncomingHttpHeaders;
135
+ requestParameters: URLSearchParams;
136
+ socketId: string;
137
+ connection: ConnectionConfiguration;
111
138
  }
112
139
  export interface onChangePayload {
113
140
  clientsCount: number;
@@ -120,6 +147,41 @@ export interface onChangePayload {
120
147
  update: Uint8Array;
121
148
  socketId: string;
122
149
  }
150
+ export interface onStoreDocumentPayload {
151
+ clientsCount: number;
152
+ context: any;
153
+ document: Document;
154
+ documentName: string;
155
+ instance: Hocuspocus;
156
+ requestHeaders: IncomingHttpHeaders;
157
+ requestParameters: URLSearchParams;
158
+ socketId: string;
159
+ }
160
+ export interface afterStoreDocumentPayload extends onStoreDocumentPayload {
161
+ }
162
+ export interface onAwarenessUpdatePayload {
163
+ clientsCount: number;
164
+ context: any;
165
+ document: Document;
166
+ documentName: string;
167
+ instance: Hocuspocus;
168
+ requestHeaders: IncomingHttpHeaders;
169
+ requestParameters: URLSearchParams;
170
+ update: Uint8Array;
171
+ socketId: string;
172
+ added: number[];
173
+ updated: number[];
174
+ removed: number[];
175
+ awareness: Awareness;
176
+ states: StatesArray;
177
+ }
178
+ export declare type StatesArray = {
179
+ clientId: number;
180
+ [key: string | number]: any;
181
+ }[];
182
+ export interface storePayload extends onStoreDocumentPayload {
183
+ state: Buffer;
184
+ }
123
185
  export interface onDisconnectPayload {
124
186
  clientsCount: number;
125
187
  context: any;
@@ -153,7 +215,3 @@ export interface onConfigurePayload {
153
215
  yjsVersion: string;
154
216
  instance: Hocuspocus;
155
217
  }
156
- export interface CloseEvent {
157
- code: number;
158
- reason: string;
159
- }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const createDirectory: (dir: string) => void;
@@ -0,0 +1 @@
1
+ export declare const flushRedis: () => Promise<string>;
@@ -0,0 +1,7 @@
1
+ export * from './createDirectory';
2
+ export * from './flushRedis';
3
+ export * from './newHocuspocus';
4
+ export * from './newHocuspocusProvider';
5
+ export * from './redisConnectionSettings';
6
+ export * from './removeDirectory';
7
+ export * from './sleep';
@@ -0,0 +1,2 @@
1
+ import { Hocuspocus, Configuration } from '@hocuspocus/server';
2
+ export declare const newHocuspocus: (options?: Partial<Configuration> | undefined) => Hocuspocus;
@@ -0,0 +1,3 @@
1
+ import { HocuspocusProvider, HocuspocusProviderConfiguration } from '@hocuspocus/provider';
2
+ import { Hocuspocus } from '@hocuspocus/server';
3
+ export declare const newHocuspocusProvider: (server: Hocuspocus, options?: Partial<Omit<HocuspocusProviderConfiguration, 'url'>>) => HocuspocusProvider;
@@ -0,0 +1,4 @@
1
+ export declare const redisConnectionSettings: {
2
+ host: string;
3
+ port: number;
4
+ };
@@ -0,0 +1 @@
1
+ export declare const removeDirectory: (dir: string) => void;
@@ -0,0 +1 @@
1
+ export declare const sleep: (time: number) => Promise<unknown>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hocuspocus/extension-database",
3
3
  "description": "a generic Hocuspocus persistence driver for the database",
4
- "version": "1.0.0-alpha.2",
4
+ "version": "1.0.0-alpha.6",
5
5
  "homepage": "https://hocuspocus.dev",
6
6
  "keywords": [
7
7
  "hocuspocus",
@@ -26,11 +26,11 @@
26
26
  "dist"
27
27
  ],
28
28
  "dependencies": {
29
- "@hocuspocus/server": "^1.0.0-alpha.88",
30
- "yjs": "^13.5.22"
29
+ "@hocuspocus/server": "^1.0.0-alpha.92",
30
+ "yjs": "^13.5.24"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
34
34
  },
35
- "gitHead": "09919438a0a220ffb7479afc562872c8726cc4b4"
35
+ "gitHead": "125d94dc3520bb5185293c9b316f66ddd9215992"
36
36
  }
package/src/Database.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { Extension, onChangePayload, onLoadDocumentPayload } from '@hocuspocus/server'
1
+ import {
2
+ Extension, onChangePayload, onLoadDocumentPayload, storePayload,
3
+ } from '@hocuspocus/server'
2
4
  import * as Y from 'yjs'
3
5
 
4
6
  export interface DatabaseConfiguration {
@@ -6,11 +8,11 @@ export interface DatabaseConfiguration {
6
8
  * Pass a Promise to retrieve updates from your database. The Promise should resolve to
7
9
  * an array of items with Y.js-compatible binary data.
8
10
  */
9
- fetchUpdates: ({ documentName }: { documentName: string}) => Promise<Uint8Array[]>,
11
+ fetch: ({ documentName }: { documentName: string}) => Promise<Uint8Array | null>,
10
12
  /**
11
13
  * Pass a function to store updates in your database.
12
14
  */
13
- storeUpdate: ({ update, documentName }: { update: Buffer, documentName: string}) => void,
15
+ store: (data: storePayload) => void,
14
16
  }
15
17
 
16
18
  export class Database implements Extension {
@@ -18,8 +20,8 @@ export class Database implements Extension {
18
20
  * Default configuration
19
21
  */
20
22
  configuration: DatabaseConfiguration = {
21
- fetchUpdates: async () => [],
22
- storeUpdate: async () => null,
23
+ fetch: async () => null,
24
+ store: async () => null,
23
25
  }
24
26
 
25
27
  /**
@@ -36,12 +38,10 @@ export class Database implements Extension {
36
38
  * Get stored data from the database.
37
39
  */
38
40
  async onLoadDocument({ document, documentName }: onLoadDocumentPayload): Promise<any> {
39
- const updates = await this.configuration.fetchUpdates({ documentName })
41
+ const update = await this.configuration.fetch({ documentName })
40
42
 
41
- if (updates && updates.length) {
42
- updates.forEach((update: any) => {
43
- Y.applyUpdate(document, update)
44
- })
43
+ if (update) {
44
+ Y.applyUpdate(document, update)
45
45
  }
46
46
 
47
47
  return document
@@ -50,11 +50,12 @@ export class Database implements Extension {
50
50
  /**
51
51
  * Store new updates in the database.
52
52
  */
53
- async onChange({ document, documentName }: onChangePayload) {
54
- const update = Buffer.from(
55
- Y.encodeStateAsUpdate(document),
56
- )
57
-
58
- return this.configuration.storeUpdate({ update, documentName })
53
+ async onStoreDocument(data: onChangePayload) {
54
+ return this.configuration.store({
55
+ ...data,
56
+ state: Buffer.from(
57
+ Y.encodeStateAsUpdate(data.document),
58
+ ),
59
+ })
59
60
  }
60
61
  }
@@ -1,4 +0,0 @@
1
- import { CloseEvent } from './types';
2
- export declare const Forbidden: CloseEvent;
3
- export declare const ResetConnection: CloseEvent;
4
- export declare const CloseEvents: CloseEvent[];