@kerebron/extension-yjs 0.6.6 → 0.7.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.
Files changed (90) hide show
  1. package/esm/ExtensionYjs.d.ts +3 -11
  2. package/esm/ExtensionYjs.d.ts.map +1 -1
  3. package/esm/ExtensionYjs.js +38 -45
  4. package/esm/ExtensionYjs.js.map +1 -1
  5. package/esm/WebsocketProvider.d.ts +69 -0
  6. package/esm/WebsocketProvider.d.ts.map +1 -0
  7. package/esm/WebsocketProvider.js +354 -0
  8. package/esm/WebsocketProvider.js.map +1 -0
  9. package/esm/YjsProvider.d.ts +48 -0
  10. package/esm/YjsProvider.d.ts.map +1 -0
  11. package/esm/YjsProvider.js +12 -0
  12. package/esm/YjsProvider.js.map +1 -0
  13. package/esm/_dnt.shims.d.ts +2 -0
  14. package/esm/_dnt.shims.d.ts.map +1 -0
  15. package/esm/_dnt.shims.js +58 -0
  16. package/esm/_dnt.shims.js.map +1 -0
  17. package/esm/binding/BindingMetadata.d.ts +6 -0
  18. package/esm/binding/BindingMetadata.d.ts.map +1 -0
  19. package/esm/binding/BindingMetadata.js +2 -0
  20. package/esm/binding/BindingMetadata.js.map +1 -0
  21. package/esm/binding/PmYjsBinding.d.ts +41 -0
  22. package/esm/binding/PmYjsBinding.d.ts.map +1 -0
  23. package/esm/binding/PmYjsBinding.js +190 -0
  24. package/esm/binding/PmYjsBinding.js.map +1 -0
  25. package/esm/binding/convertUtils.d.ts +48 -0
  26. package/esm/binding/convertUtils.d.ts.map +1 -0
  27. package/esm/binding/convertUtils.js +80 -0
  28. package/esm/binding/convertUtils.js.map +1 -0
  29. package/esm/{createNodeFromYElement.d.ts → binding/createNodeFromYElement.d.ts} +1 -1
  30. package/esm/binding/createNodeFromYElement.d.ts.map +1 -0
  31. package/esm/{createNodeFromYElement.js → binding/createNodeFromYElement.js} +2 -2
  32. package/esm/binding/createNodeFromYElement.js.map +1 -0
  33. package/esm/{updateYFragment.d.ts → binding/updateYFragment.d.ts} +3 -3
  34. package/esm/binding/updateYFragment.d.ts.map +1 -0
  35. package/esm/{updateYFragment.js → binding/updateYFragment.js} +10 -7
  36. package/esm/binding/updateYFragment.js.map +1 -0
  37. package/esm/lib.d.ts +1 -7
  38. package/esm/lib.d.ts.map +1 -1
  39. package/esm/lib.js +1 -200
  40. package/esm/lib.js.map +1 -1
  41. package/esm/position.d.ts +8 -0
  42. package/esm/position.d.ts.map +1 -0
  43. package/esm/position.js +165 -0
  44. package/esm/position.js.map +1 -0
  45. package/esm/ui/selection.d.ts +29 -0
  46. package/esm/ui/selection.d.ts.map +1 -0
  47. package/esm/ui/selection.js +129 -0
  48. package/esm/ui/selection.js.map +1 -0
  49. package/esm/yPositionPlugin.d.ts +6 -1
  50. package/esm/yPositionPlugin.d.ts.map +1 -1
  51. package/esm/yPositionPlugin.js +91 -50
  52. package/esm/yPositionPlugin.js.map +1 -1
  53. package/esm/ySyncPlugin.d.ts +5 -22
  54. package/esm/ySyncPlugin.d.ts.map +1 -1
  55. package/esm/ySyncPlugin.js +54 -116
  56. package/esm/ySyncPlugin.js.map +1 -1
  57. package/esm/yUndoPlugin.d.ts +11 -10
  58. package/esm/yUndoPlugin.d.ts.map +1 -1
  59. package/esm/yUndoPlugin.js +90 -52
  60. package/esm/yUndoPlugin.js.map +1 -1
  61. package/package.json +9 -6
  62. package/src/ExtensionYjs.ts +55 -67
  63. package/src/WebsocketProvider.ts +516 -0
  64. package/src/YjsProvider.ts +75 -0
  65. package/src/_dnt.shims.ts +60 -0
  66. package/src/binding/BindingMetadata.ts +6 -0
  67. package/src/binding/PmYjsBinding.ts +300 -0
  68. package/src/binding/convertUtils.ts +124 -0
  69. package/src/{createNodeFromYElement.ts → binding/createNodeFromYElement.ts} +3 -3
  70. package/src/{updateYFragment.ts → binding/updateYFragment.ts} +15 -8
  71. package/src/lib.ts +4 -230
  72. package/src/position.ts +191 -0
  73. package/src/ui/selection.ts +216 -0
  74. package/src/yPositionPlugin.ts +122 -74
  75. package/src/ySyncPlugin.ts +87 -170
  76. package/src/yUndoPlugin.ts +113 -62
  77. package/esm/ProsemirrorBinding.d.ts +0 -60
  78. package/esm/ProsemirrorBinding.d.ts.map +0 -1
  79. package/esm/ProsemirrorBinding.js +0 -405
  80. package/esm/ProsemirrorBinding.js.map +0 -1
  81. package/esm/createNodeFromYElement.d.ts.map +0 -1
  82. package/esm/createNodeFromYElement.js.map +0 -1
  83. package/esm/updateYFragment.d.ts.map +0 -1
  84. package/esm/updateYFragment.js.map +0 -1
  85. package/esm/userColors.d.ts +0 -5
  86. package/esm/userColors.d.ts.map +0 -1
  87. package/esm/userColors.js +0 -11
  88. package/esm/userColors.js.map +0 -1
  89. package/src/ProsemirrorBinding.ts +0 -607
  90. package/src/userColors.ts +0 -10
@@ -1,16 +1,9 @@
1
- import type { Schema } from 'prosemirror-model';
2
1
  import type { Plugin } from 'prosemirror-state';
3
- import * as Y from 'yjs';
4
- import * as awarenessProtocol from 'y-protocols/awareness';
5
- import { Converter, CoreEditor, Extension } from '@kerebron/editor';
2
+ import { Extension } from '@kerebron/editor';
6
3
  import type { CommandFactories, CommandShortcuts } from '@kerebron/editor/commands';
7
- export interface YjsProvider {
8
- on(eventName: string, callback: (event: any) => void): void;
9
- awareness: awarenessProtocol.Awareness;
10
- }
11
- export type CreateWsProvider = (roomId: string) => [YjsProvider, Y.Doc];
4
+ import type { CreateYjsProvider } from './YjsProvider.js';
12
5
  export interface YjsConfig {
13
- createWsProvider: CreateWsProvider;
6
+ createYjsProvider: CreateYjsProvider;
14
7
  }
15
8
  export declare class ExtensionYjs extends Extension {
16
9
  config: YjsConfig;
@@ -20,7 +13,6 @@ export declare class ExtensionYjs extends Extension {
20
13
  getCommandFactories(): Partial<CommandFactories>;
21
14
  getKeyboardShortcuts(): Partial<CommandShortcuts>;
22
15
  constructor(config: YjsConfig);
23
- getConverters(editor: CoreEditor, schema: Schema): Record<string, Converter>;
24
16
  getProseMirrorPlugins(): Plugin[];
25
17
  }
26
18
  //# sourceMappingURL=ExtensionYjs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionYjs.d.ts","sourceRoot":"","sources":["../src/ExtensionYjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAOnC,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;CACxC;AAaD,MAAM,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAExE,MAAM,WAAW,SAAS;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,qBAAa,YAAa,SAAQ,SAAS;IAqBb,MAAM,EAAE,SAAS;IApB7C,IAAI,SAAS;IAEJ,SAAS,WAAe;IACjC,QAAQ,WAAwB;IAGvB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAOhD,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC;gBAO9B,MAAM,EAAE,SAAS;IAepC,aAAa,CACpB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IAyBnB,qBAAqB,IAAI,MAAM,EAAE;CAO3C"}
1
+ {"version":3,"file":"ExtensionYjs.d.ts","sourceRoot":"","sources":["../src/ExtensionYjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,MAAM,EAAe,MAAM,mBAAmB,CAAC;AAI1E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EACV,gBAAgB,EAEhB,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAOnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,WAAW,SAAS;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,qBAAa,YAAa,SAAQ,SAAS;IAiEb,MAAM,EAAE,SAAS;IAhE7C,IAAI,SAAS;IAEJ,SAAS,WAAe;IACjC,QAAQ,WAAwB;IAEvB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAoDhD,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC;gBAO9B,MAAM,EAAE,SAAS;IAIpC,qBAAqB,IAAI,MAAM,EAAE;CAO3C"}
@@ -1,26 +1,50 @@
1
1
  import { Extension } from '@kerebron/editor';
2
- import { ySyncPluginKey } from './keys.js';
3
2
  import { ySyncPlugin } from './ySyncPlugin.js';
4
3
  import { yPositionPlugin } from './yPositionPlugin.js';
5
- import { redo, undo, yUndoPlugin } from './yUndoPlugin.js';
6
- function stringToIndex(str, arrayLength) {
7
- let hash = 0;
8
- for (let i = 0; i < str.length; i++) {
9
- hash = (hash << 5) - hash + str.charCodeAt(i);
10
- hash |= 0; // force 32-bit integer
11
- }
12
- return Math.abs(hash) % arrayLength;
13
- }
4
+ import { redoCommand, undoCommand, yUndoPlugin } from './yUndoPlugin.js';
5
+ import { ySyncPluginKey } from './keys.js';
14
6
  export class ExtensionYjs extends Extension {
15
7
  config;
16
8
  name = 'yjs';
17
9
  conflicts = ['history'];
18
10
  requires = ['remote-selection'];
19
- // declare type Command = (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;
20
11
  getCommandFactories() {
12
+ const changeRoom = (roomId) => {
13
+ return (state, dispatch) => {
14
+ const tr = state.tr;
15
+ tr.setMeta(ySyncPluginKey, { changeRoom: { roomId } });
16
+ if (dispatch) {
17
+ dispatch(tr);
18
+ }
19
+ return true;
20
+ };
21
+ };
22
+ const leaveRoom = () => {
23
+ return (state, dispatch) => {
24
+ const tr = state.tr;
25
+ tr.setMeta(ySyncPluginKey, { leaveRoom: true });
26
+ if (dispatch) {
27
+ dispatch(tr);
28
+ }
29
+ return true;
30
+ };
31
+ };
32
+ const getYDoc = ({ resolve, reject }) => {
33
+ return (state, dispatch) => {
34
+ const tr = state.tr;
35
+ tr.setMeta(ySyncPluginKey, { getYDoc: { resolve, reject } });
36
+ if (dispatch) {
37
+ dispatch(tr);
38
+ }
39
+ return true;
40
+ };
41
+ };
21
42
  return {
22
- 'undo': () => undo,
23
- 'redo': () => redo,
43
+ getYDoc,
44
+ changeRoom,
45
+ leaveRoom,
46
+ 'undo': () => undoCommand,
47
+ 'redo': () => redoCommand,
24
48
  };
25
49
  }
26
50
  getKeyboardShortcuts() {
@@ -33,40 +57,9 @@ export class ExtensionYjs extends Extension {
33
57
  super();
34
58
  this.config = config;
35
59
  }
36
- // changeUser(userName: string) {
37
- // const idx = stringToIndex(userName, userColors.length);
38
- // const userColor = userColors[idx];
39
- // this.wsProvider.awareness.setLocalStateField('user', {
40
- // name: userName,
41
- // color: userColor.color,
42
- // colorLight: userColor.light,
43
- // });
44
- // }
45
- // //
46
- getConverters(editor, schema) {
47
- return {
48
- 'yjs': {
49
- fromDoc: async (document) => {
50
- throw new Error('Not implemented');
51
- },
52
- toDoc: async (buffer) => {
53
- const roomId = new TextDecoder().decode(buffer);
54
- const tr = editor.state.tr.setMeta(ySyncPluginKey, {
55
- roomId: '',
56
- });
57
- editor.view.dispatch(tr);
58
- setTimeout(() => {
59
- const tr = editor.state.tr.setMeta(ySyncPluginKey, { roomId });
60
- editor.view.dispatch(tr);
61
- }, 100);
62
- return schema.topNodeType.createAndFill();
63
- },
64
- },
65
- };
66
- }
67
60
  getProseMirrorPlugins() {
68
61
  return [
69
- ySyncPlugin(this.editor.schema, this.config.createWsProvider),
62
+ ySyncPlugin(this.editor, this.config.createYjsProvider),
70
63
  yPositionPlugin(this.editor),
71
64
  yUndoPlugin(),
72
65
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionYjs.js","sourceRoot":"","sources":["../src/ExtensionYjs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExtensionYjs.js","sourceRoot":"","sources":["../src/ExtensionYjs.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAO7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAQ3C,MAAM,OAAO,YAAa,SAAQ,SAAS;IAiEb;IAhE5B,IAAI,GAAG,KAAK,CAAC;IAEJ,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEvB,mBAAmB;QAC1B,MAAM,UAAU,GAAmB,CAAC,MAAc,EAAE,EAAE;YACpD,OAAO,CAAC,KAAkB,EAAE,QAAoC,EAAE,EAAE;gBAClE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;gBACpB,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBAEvD,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,SAAS,GAAmB,GAAG,EAAE;YACrC,OAAO,CAAC,KAAkB,EAAE,QAAoC,EAAE,EAAE;gBAClE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;gBACpB,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEhD,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAmB,CAC9B,EAAE,OAAO,EAAE,MAAM,EAGhB,EACD,EAAE;YACF,OAAO,CAAC,KAAkB,EAAE,QAAoC,EAAE,EAAE;gBAClE,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;gBACpB,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,OAAO;YACL,OAAO;YACP,UAAU;YACV,SAAS;YACT,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW;YACzB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW;SAC1B,CAAC;IACJ,CAAC;IAEQ,oBAAoB;QAC3B,OAAO;YACL,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAChB,CAAC;IACJ,CAAC;IAED,YAA4B,MAAiB;QAC3C,KAAK,EAAE,CAAC;QADkB,WAAM,GAAN,MAAM,CAAW;IAE7C,CAAC;IAEQ,qBAAqB;QAC5B,OAAO;YACL,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YACvD,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5B,WAAW,EAAE;SACd,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,69 @@
1
+ import * as Y from 'yjs';
2
+ import * as awarenessProtocol from 'y-protocols/awareness';
3
+ import { MessageHandler, YjsProvider } from './YjsProvider.js';
4
+ interface WebsocketProviderOpts {
5
+ connect: boolean;
6
+ awareness: awarenessProtocol.Awareness;
7
+ params: Record<string, string>;
8
+ protocols: Array<string>;
9
+ WebSocketPolyfill: typeof WebSocket;
10
+ resyncInterval: number;
11
+ maxBackoffTime: number;
12
+ disableBc: boolean;
13
+ }
14
+ /**
15
+ * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document.
16
+ * The document name is attached to the provided url. I.e. the following example
17
+ * creates a websocket connection to http://localhost:1234/my-document-name
18
+ *
19
+ * @example
20
+ * import * as Y from 'yjs'
21
+ * import { WebsocketProvider } from '@kerebron/extension-yjs/WebsocketProvider'
22
+ * const doc = new Y.Doc()
23
+ * const provider = new WebsocketProvider('http://localhost:1234', 'my-document-name', doc)
24
+ */
25
+ export declare class WebsocketProvider extends EventTarget implements YjsProvider {
26
+ roomname: string;
27
+ doc: Y.Doc;
28
+ _synced: boolean;
29
+ shouldConnect: boolean;
30
+ ws: WebSocket | undefined;
31
+ _resyncInterval: number;
32
+ serverUrl: string;
33
+ bcChannel: string;
34
+ maxBackoffTime: number;
35
+ /**
36
+ * The specified url parameters. This can be safely updated. The changed parameters will be used
37
+ * when a new connection is established.
38
+ */
39
+ params: Record<string, string>;
40
+ protocols: string[];
41
+ _WS: typeof WebSocket;
42
+ awareness: awarenessProtocol.Awareness;
43
+ destroyed: boolean;
44
+ wsconnected: boolean;
45
+ wsconnecting: boolean;
46
+ bcconnected: boolean;
47
+ disableBc: boolean;
48
+ wsUnsuccessfulReconnects: number;
49
+ messageHandlers: MessageHandler<WebsocketProvider>[];
50
+ wsLastMessageReceived: number;
51
+ private _bcSubscriber;
52
+ private _updateHandler;
53
+ private _awarenessUpdateHandler;
54
+ private _exitHandler;
55
+ private _checkInterval;
56
+ setupWSTimeout: number | undefined;
57
+ constructor(serverUrl: string, roomname: string, doc: Y.Doc, opts?: WebsocketProviderOpts);
58
+ get url(): string;
59
+ get synced(): boolean;
60
+ set synced(state: boolean);
61
+ destroy(): void;
62
+ connectBc(): void;
63
+ disconnectBc(): void;
64
+ disconnect(): void;
65
+ connect(): void;
66
+ private setupMessageHandlers;
67
+ }
68
+ export {};
69
+ //# sourceMappingURL=WebsocketProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketProvider.d.ts","sourceRoot":"","sources":["../src/WebsocketProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAOzB,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAI3D,OAAO,EAGL,cAAc,EAId,WAAW,EACZ,MAAM,kBAAkB,CAAC;AA4I1B,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,iBAAiB,EAAE,OAAO,SAAS,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,WAAW;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IAEX,OAAO,UAAS;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC;IAC1B,eAAe,SAAK;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,OAAO,SAAS,CAAC;IACtB,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;IACvC,SAAS,UAAS;IAClB,WAAW,UAAS;IACpB,YAAY,UAAS;IACrB,WAAW,UAAS;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;IACrD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,uBAAuB,CAGrB;IACV,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,cAAc,CAAS;IAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,IAAI,GAAE,qBASL;IAoGH,IAAI,GAAG,WAIN;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,EAMxB;IAED,OAAO;IAmBP,SAAS;IA2CT,YAAY;IAiBZ,UAAU;IAQV,OAAO;IAQP,OAAO,CAAC,oBAAoB;CAuE7B"}
@@ -0,0 +1,354 @@
1
+ import * as bc from 'lib0/broadcastchannel';
2
+ import * as time from 'lib0/time';
3
+ import * as encoding from 'lib0/encoding';
4
+ import * as decoding from 'lib0/decoding';
5
+ import * as syncProtocol from 'y-protocols/sync';
6
+ import * as authProtocol from 'y-protocols/auth';
7
+ import * as awarenessProtocol from 'y-protocols/awareness';
8
+ import * as math from 'lib0/math';
9
+ import * as url from 'lib0/url';
10
+ import { messageAuth, messageAwareness, messageQueryAwareness, messageSync, } from './YjsProvider.js';
11
+ // @todo - this should depend on awareness.outdatedTime
12
+ const messageReconnectTimeout = 30000;
13
+ const permissionDeniedHandler = (provider, reason) => console.warn(`Permission denied to access ${provider.url}.\n${reason}`);
14
+ const readMessage = (provider, buf, emitSynced) => {
15
+ const decoder = decoding.createDecoder(buf);
16
+ const encoder = encoding.createEncoder();
17
+ const messageType = decoding.readVarUint(decoder);
18
+ const messageHandler = provider.messageHandlers[messageType];
19
+ if (messageHandler) {
20
+ messageHandler(encoder, decoder, provider, emitSynced, messageType);
21
+ }
22
+ else {
23
+ console.error('Unable to compute message');
24
+ }
25
+ return encoder;
26
+ };
27
+ /**
28
+ * Outsource this function so that a new websocket connection is created immediately.
29
+ * I suspect that the `ws.onclose` event is not always fired if there are network issues.
30
+ */
31
+ const closeWebsocketConnection = (provider, ws, event) => {
32
+ if (ws === provider.ws) {
33
+ provider.dispatchEvent(new CustomEvent('connection-close', { detail: { event, provider } }));
34
+ provider.ws = undefined;
35
+ ws.close();
36
+ provider.wsconnecting = false;
37
+ if (provider.wsconnected) {
38
+ provider.wsconnected = false;
39
+ provider.synced = false;
40
+ // update awareness (all users except local left)
41
+ awarenessProtocol.removeAwarenessStates(provider.awareness, Array.from(provider.awareness.getStates().keys()).filter((client) => client !== provider.doc.clientID), provider);
42
+ provider.dispatchEvent(new CustomEvent('status', { detail: { status: 'disconnected' } }));
43
+ }
44
+ else {
45
+ provider.wsUnsuccessfulReconnects++;
46
+ }
47
+ // Start with no reconnect timeout and increase timeout by
48
+ // using exponential backoff starting with 100ms
49
+ if (!provider.destroyed) {
50
+ provider.setupWSTimeout = setTimeout(setupWS, math.min(math.pow(2, provider.wsUnsuccessfulReconnects) * 100, provider.maxBackoffTime), provider);
51
+ }
52
+ }
53
+ };
54
+ const setupWS = (provider) => {
55
+ provider.setupWSTimeout = undefined;
56
+ if (provider.shouldConnect && !provider.ws) {
57
+ const websocket = new provider._WS(provider.url, provider.protocols);
58
+ websocket.binaryType = 'arraybuffer';
59
+ provider.ws = websocket;
60
+ provider.wsconnecting = true;
61
+ provider.wsconnected = false;
62
+ provider.synced = false;
63
+ websocket.onmessage = (event) => {
64
+ provider.wsLastMessageReceived = time.getUnixTime();
65
+ const encoder = readMessage(provider, new Uint8Array(event.data), true);
66
+ if (encoding.length(encoder) > 1) {
67
+ websocket.send(encoding.toUint8Array(encoder));
68
+ }
69
+ };
70
+ websocket.onerror = (event) => {
71
+ provider.dispatchEvent(new CustomEvent('connection-error', { detail: { event, provider } }));
72
+ };
73
+ websocket.onclose = (event) => {
74
+ closeWebsocketConnection(provider, websocket, event);
75
+ };
76
+ websocket.onopen = () => {
77
+ provider.wsLastMessageReceived = time.getUnixTime();
78
+ provider.wsconnecting = false;
79
+ provider.wsconnected = true;
80
+ provider.wsUnsuccessfulReconnects = 0;
81
+ provider.dispatchEvent(new CustomEvent('status', { detail: { status: 'connected' } }));
82
+ // always send sync step 1 when connected
83
+ const encoder = encoding.createEncoder();
84
+ encoding.writeVarUint(encoder, messageSync);
85
+ syncProtocol.writeSyncStep1(encoder, provider.doc);
86
+ websocket.send(encoding.toUint8Array(encoder));
87
+ // broadcast local awareness state
88
+ if (provider.awareness.getLocalState() !== null) {
89
+ const encoderAwarenessState = encoding.createEncoder();
90
+ encoding.writeVarUint(encoderAwarenessState, messageAwareness);
91
+ encoding.writeVarUint8Array(encoderAwarenessState, awarenessProtocol.encodeAwarenessUpdate(provider.awareness, [
92
+ provider.doc.clientID,
93
+ ]));
94
+ websocket.send(encoding.toUint8Array(encoderAwarenessState));
95
+ }
96
+ };
97
+ provider.dispatchEvent(new CustomEvent('status', { detail: { status: 'connecting' } }));
98
+ }
99
+ };
100
+ const broadcastMessage = (provider, buf) => {
101
+ const ws = provider.ws;
102
+ if (provider.wsconnected && ws && ws.readyState === ws.OPEN) {
103
+ ws.send(buf);
104
+ }
105
+ if (provider.bcconnected) {
106
+ bc.publish(provider.bcChannel, buf, provider);
107
+ }
108
+ };
109
+ /**
110
+ * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document.
111
+ * The document name is attached to the provided url. I.e. the following example
112
+ * creates a websocket connection to http://localhost:1234/my-document-name
113
+ *
114
+ * @example
115
+ * import * as Y from 'yjs'
116
+ * import { WebsocketProvider } from '@kerebron/extension-yjs/WebsocketProvider'
117
+ * const doc = new Y.Doc()
118
+ * const provider = new WebsocketProvider('http://localhost:1234', 'my-document-name', doc)
119
+ */
120
+ export class WebsocketProvider extends EventTarget {
121
+ roomname;
122
+ doc;
123
+ _synced = false;
124
+ shouldConnect;
125
+ ws;
126
+ _resyncInterval = 0;
127
+ serverUrl;
128
+ bcChannel;
129
+ maxBackoffTime;
130
+ /**
131
+ * The specified url parameters. This can be safely updated. The changed parameters will be used
132
+ * when a new connection is established.
133
+ */
134
+ params;
135
+ protocols;
136
+ _WS;
137
+ awareness;
138
+ destroyed = false;
139
+ wsconnected = false;
140
+ wsconnecting = false;
141
+ bcconnected = false;
142
+ disableBc;
143
+ wsUnsuccessfulReconnects;
144
+ messageHandlers;
145
+ wsLastMessageReceived;
146
+ _bcSubscriber;
147
+ _updateHandler;
148
+ _awarenessUpdateHandler;
149
+ _exitHandler;
150
+ _checkInterval;
151
+ setupWSTimeout;
152
+ constructor(serverUrl, roomname, doc, opts = {
153
+ connect: true,
154
+ awareness: new awarenessProtocol.Awareness(doc),
155
+ params: {},
156
+ protocols: [],
157
+ WebSocketPolyfill: WebSocket,
158
+ resyncInterval: -1,
159
+ maxBackoffTime: 2500,
160
+ disableBc: false,
161
+ }) {
162
+ super();
163
+ // ensure that serverUrl does not end with /
164
+ this.serverUrl = serverUrl;
165
+ this.roomname = roomname;
166
+ this.doc = doc;
167
+ while (this.serverUrl[this.serverUrl.length - 1] === '/') {
168
+ this.serverUrl = this.serverUrl.slice(0, this.serverUrl.length - 1);
169
+ }
170
+ this.bcChannel = this.serverUrl + '/' + roomname;
171
+ this.maxBackoffTime = opts.maxBackoffTime;
172
+ this.params = opts.params;
173
+ this.protocols = opts.protocols;
174
+ this._WS = opts.WebSocketPolyfill;
175
+ this.awareness = opts.awareness;
176
+ this.disableBc = opts.disableBc;
177
+ this.wsUnsuccessfulReconnects = 0;
178
+ this.messageHandlers = this.setupMessageHandlers();
179
+ this.wsLastMessageReceived = 0;
180
+ this.shouldConnect = opts.connect;
181
+ if (opts.resyncInterval > 0) {
182
+ this._resyncInterval = setInterval(() => {
183
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
184
+ // resend sync step 1
185
+ const encoder = encoding.createEncoder();
186
+ encoding.writeVarUint(encoder, messageSync);
187
+ syncProtocol.writeSyncStep1(encoder, doc);
188
+ this.ws.send(encoding.toUint8Array(encoder));
189
+ }
190
+ }, opts.resyncInterval);
191
+ }
192
+ this._bcSubscriber = (data, origin) => {
193
+ if (origin !== this) {
194
+ const encoder = readMessage(this, new Uint8Array(data), false);
195
+ if (encoding.length(encoder) > 1) {
196
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoder), this);
197
+ }
198
+ }
199
+ };
200
+ /**
201
+ * Listens to Yjs updates and sends them to remote peers (ws and broadcastchannel)
202
+ */
203
+ this._updateHandler = (update, origin) => {
204
+ if (origin !== this) {
205
+ const encoder = encoding.createEncoder();
206
+ encoding.writeVarUint(encoder, messageSync);
207
+ syncProtocol.writeUpdate(encoder, update);
208
+ broadcastMessage(this, encoding.toUint8Array(encoder));
209
+ }
210
+ };
211
+ this.doc.on('update', this._updateHandler);
212
+ this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => {
213
+ const changedClients = added.concat(updated).concat(removed);
214
+ const encoder = encoding.createEncoder();
215
+ encoding.writeVarUint(encoder, messageAwareness);
216
+ encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(opts.awareness, changedClients));
217
+ broadcastMessage(this, encoding.toUint8Array(encoder));
218
+ };
219
+ this._exitHandler = () => {
220
+ awarenessProtocol.removeAwarenessStates(this.awareness, [doc.clientID], 'app closed');
221
+ };
222
+ // if (env.isNode && typeof process !== 'undefined') {
223
+ // process.on('exit', this._exitHandler);
224
+ // }
225
+ opts.awareness.on('update', this._awarenessUpdateHandler);
226
+ this._checkInterval = /** @type {any} */ (setInterval(() => {
227
+ if (this.wsconnected &&
228
+ messageReconnectTimeout <
229
+ time.getUnixTime() - this.wsLastMessageReceived) {
230
+ // no message received in a long time - not even your own awareness
231
+ // updates (which are updated every 15 seconds)
232
+ if (this.ws) {
233
+ closeWebsocketConnection(this, this.ws, null);
234
+ }
235
+ }
236
+ }, messageReconnectTimeout / 10));
237
+ if (opts.connect) {
238
+ this.connect();
239
+ }
240
+ }
241
+ get url() {
242
+ const encodedParams = url.encodeQueryParams(this.params);
243
+ return this.serverUrl + '/' + this.roomname +
244
+ (encodedParams.length === 0 ? '' : '?' + encodedParams);
245
+ }
246
+ get synced() {
247
+ return this._synced;
248
+ }
249
+ set synced(state) {
250
+ if (this._synced !== state) {
251
+ this._synced = state;
252
+ this.dispatchEvent(new CustomEvent('synced', { detail: { state } }));
253
+ this.dispatchEvent(new CustomEvent('sync', { detail: { state } }));
254
+ }
255
+ }
256
+ destroy() {
257
+ this.destroyed = true;
258
+ if (this._resyncInterval !== 0) {
259
+ clearInterval(this._resyncInterval);
260
+ }
261
+ if (this.setupWSTimeout) {
262
+ clearTimeout(this.setupWSTimeout);
263
+ }
264
+ clearInterval(this._checkInterval);
265
+ this.disconnect();
266
+ // if (env.isNode && typeof process !== 'undefined') {
267
+ // process.off('exit', this._exitHandler);
268
+ // }
269
+ this.awareness.off('update', this._awarenessUpdateHandler);
270
+ this.doc.off('update', this._updateHandler);
271
+ this.awareness.destroy();
272
+ }
273
+ connectBc() {
274
+ if (this.disableBc) {
275
+ return;
276
+ }
277
+ if (!this.bcconnected) {
278
+ bc.subscribe(this.bcChannel, this._bcSubscriber);
279
+ this.bcconnected = true;
280
+ }
281
+ // send sync step1 to bc
282
+ // write sync step 1
283
+ const encoderSync = encoding.createEncoder();
284
+ encoding.writeVarUint(encoderSync, messageSync);
285
+ syncProtocol.writeSyncStep1(encoderSync, this.doc);
286
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoderSync), this);
287
+ // broadcast local state
288
+ const encoderState = encoding.createEncoder();
289
+ encoding.writeVarUint(encoderState, messageSync);
290
+ syncProtocol.writeSyncStep2(encoderState, this.doc);
291
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoderState), this);
292
+ // write queryAwareness
293
+ const encoderAwarenessQuery = encoding.createEncoder();
294
+ encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness);
295
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoderAwarenessQuery), this);
296
+ // broadcast local awareness state
297
+ const encoderAwarenessState = encoding.createEncoder();
298
+ encoding.writeVarUint(encoderAwarenessState, messageAwareness);
299
+ encoding.writeVarUint8Array(encoderAwarenessState, awarenessProtocol.encodeAwarenessUpdate(this.awareness, [
300
+ this.doc.clientID,
301
+ ]));
302
+ bc.publish(this.bcChannel, encoding.toUint8Array(encoderAwarenessState), this);
303
+ }
304
+ disconnectBc() {
305
+ // broadcast message with local awareness state set to null (indicating disconnect)
306
+ const encoder = encoding.createEncoder();
307
+ encoding.writeVarUint(encoder, messageAwareness);
308
+ encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(this.awareness, [
309
+ this.doc.clientID,
310
+ ], new Map()));
311
+ broadcastMessage(this, encoding.toUint8Array(encoder));
312
+ if (this.bcconnected) {
313
+ bc.unsubscribe(this.bcChannel, this._bcSubscriber);
314
+ this.bcconnected = false;
315
+ }
316
+ }
317
+ disconnect() {
318
+ this.shouldConnect = false;
319
+ this.disconnectBc();
320
+ if (this.ws) {
321
+ closeWebsocketConnection(this, this.ws, null);
322
+ }
323
+ }
324
+ connect() {
325
+ this.shouldConnect = true;
326
+ if (!this.wsconnected && !this.ws) {
327
+ setupWS(this);
328
+ this.connectBc();
329
+ }
330
+ }
331
+ setupMessageHandlers() {
332
+ const messageHandlers = [];
333
+ messageHandlers[messageSync] = (encoder, decoder, provider, emitSynced, _messageType) => {
334
+ encoding.writeVarUint(encoder, messageSync);
335
+ const syncMessageType = syncProtocol.readSyncMessage(decoder, encoder, provider.doc, provider);
336
+ if (emitSynced && syncMessageType === syncProtocol.messageYjsSyncStep2 &&
337
+ !provider.synced) {
338
+ provider.synced = true;
339
+ }
340
+ };
341
+ messageHandlers[messageQueryAwareness] = (encoder, _decoder, provider, _emitSynced, _messageType) => {
342
+ encoding.writeVarUint(encoder, messageAwareness);
343
+ encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(provider.awareness, Array.from(provider.awareness.getStates().keys())));
344
+ };
345
+ messageHandlers[messageAwareness] = (_encoder, decoder, provider, _emitSynced, _messageType) => {
346
+ awarenessProtocol.applyAwarenessUpdate(provider.awareness, decoding.readVarUint8Array(decoder), provider);
347
+ };
348
+ messageHandlers[messageAuth] = (_encoder, decoder, provider, _emitSynced, _messageType) => {
349
+ authProtocol.readAuthMessage(decoder, provider.doc, (_ydoc, reason) => permissionDeniedHandler(provider, reason));
350
+ };
351
+ return messageHandlers;
352
+ }
353
+ }
354
+ //# sourceMappingURL=WebsocketProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketProvider.js","sourceRoot":"","sources":["../src/WebsocketProvider.ts"],"names":[],"mappings":"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"}