@nice2dev/ui-graphics 1.0.4 → 1.0.5

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 (183) hide show
  1. package/dist/cjs/animation/AnimationEditor.js +1 -1
  2. package/dist/cjs/animation/Audience.js +1 -1
  3. package/dist/cjs/core/LocalUI.js +1 -1
  4. package/dist/cjs/core/yjsCollaboration.js +2 -2
  5. package/dist/cjs/core/yjsCollaboration.js.map +1 -1
  6. package/dist/cjs/game/GameAsset2dEditor.js +1 -1
  7. package/dist/cjs/node_modules/lib0/array.js +103 -0
  8. package/dist/cjs/node_modules/lib0/array.js.map +1 -0
  9. package/dist/cjs/node_modules/lib0/binary.js +42 -0
  10. package/dist/cjs/node_modules/lib0/binary.js.map +1 -0
  11. package/dist/cjs/node_modules/lib0/broadcastchannel.js +121 -0
  12. package/dist/cjs/node_modules/lib0/broadcastchannel.js.map +1 -0
  13. package/dist/cjs/node_modules/lib0/buffer.js +103 -0
  14. package/dist/cjs/node_modules/lib0/buffer.js.map +1 -0
  15. package/dist/cjs/node_modules/lib0/conditions.js +18 -0
  16. package/dist/cjs/node_modules/lib0/conditions.js.map +1 -0
  17. package/dist/cjs/node_modules/lib0/decoding.js +460 -0
  18. package/dist/cjs/node_modules/lib0/decoding.js.map +1 -0
  19. package/dist/cjs/node_modules/lib0/dom.js +55 -0
  20. package/dist/cjs/node_modules/lib0/dom.js.map +1 -0
  21. package/dist/cjs/node_modules/lib0/encoding.js +688 -0
  22. package/dist/cjs/node_modules/lib0/encoding.js.map +1 -0
  23. package/dist/cjs/node_modules/lib0/environment.js +129 -0
  24. package/dist/cjs/node_modules/lib0/environment.js.map +1 -0
  25. package/dist/cjs/node_modules/lib0/error.js +37 -0
  26. package/dist/cjs/node_modules/lib0/error.js.map +1 -0
  27. package/dist/cjs/node_modules/lib0/function.js +135 -0
  28. package/dist/cjs/node_modules/lib0/function.js.map +1 -0
  29. package/dist/cjs/node_modules/lib0/iterator.js +52 -0
  30. package/dist/cjs/node_modules/lib0/iterator.js.map +1 -0
  31. package/dist/cjs/node_modules/lib0/logging.common.js +63 -0
  32. package/dist/cjs/node_modules/lib0/logging.common.js.map +1 -0
  33. package/dist/cjs/node_modules/lib0/logging.js +128 -0
  34. package/dist/cjs/node_modules/lib0/logging.js.map +1 -0
  35. package/dist/cjs/node_modules/lib0/map.js +108 -0
  36. package/dist/cjs/node_modules/lib0/map.js.map +1 -0
  37. package/dist/cjs/node_modules/lib0/math.js +44 -0
  38. package/dist/cjs/node_modules/lib0/math.js.map +1 -0
  39. package/dist/cjs/node_modules/lib0/number.js +21 -0
  40. package/dist/cjs/node_modules/lib0/number.js.map +1 -0
  41. package/dist/cjs/node_modules/lib0/object.js +132 -0
  42. package/dist/cjs/node_modules/lib0/object.js.map +1 -0
  43. package/dist/cjs/node_modules/lib0/observable.js +168 -0
  44. package/dist/cjs/node_modules/lib0/observable.js.map +1 -0
  45. package/dist/cjs/node_modules/lib0/pair.js +33 -0
  46. package/dist/cjs/node_modules/lib0/pair.js.map +1 -0
  47. package/dist/cjs/node_modules/lib0/prng.js +95 -0
  48. package/dist/cjs/node_modules/lib0/prng.js.map +1 -0
  49. package/dist/cjs/node_modules/lib0/promise.js +33 -0
  50. package/dist/cjs/node_modules/lib0/promise.js.map +1 -0
  51. package/dist/cjs/node_modules/lib0/random.js +28 -0
  52. package/dist/cjs/node_modules/lib0/random.js.map +1 -0
  53. package/dist/cjs/node_modules/lib0/schema.js +1168 -0
  54. package/dist/cjs/node_modules/lib0/schema.js.map +1 -0
  55. package/dist/cjs/node_modules/lib0/set.js +12 -0
  56. package/dist/cjs/node_modules/lib0/set.js.map +1 -0
  57. package/dist/cjs/node_modules/lib0/storage.js +79 -0
  58. package/dist/cjs/node_modules/lib0/storage.js.map +1 -0
  59. package/dist/cjs/node_modules/lib0/string.js +94 -0
  60. package/dist/cjs/node_modules/lib0/string.js.map +1 -0
  61. package/dist/cjs/node_modules/lib0/symbol.js +15 -0
  62. package/dist/cjs/node_modules/lib0/symbol.js.map +1 -0
  63. package/dist/cjs/node_modules/lib0/time.js +18 -0
  64. package/dist/cjs/node_modules/lib0/time.js.map +1 -0
  65. package/dist/cjs/node_modules/lib0/trait/equality.js +32 -0
  66. package/dist/cjs/node_modules/lib0/trait/equality.js.map +1 -0
  67. package/dist/cjs/node_modules/lib0/url.js +20 -0
  68. package/dist/cjs/node_modules/lib0/url.js.map +1 -0
  69. package/dist/cjs/node_modules/lib0/webcrypto.js +8 -0
  70. package/dist/cjs/node_modules/lib0/webcrypto.js.map +1 -0
  71. package/dist/cjs/node_modules/y-protocols/auth.js +27 -0
  72. package/dist/cjs/node_modules/y-protocols/auth.js.map +1 -0
  73. package/dist/cjs/node_modules/y-protocols/awareness.js +277 -0
  74. package/dist/cjs/node_modules/y-protocols/awareness.js.map +1 -0
  75. package/dist/cjs/node_modules/y-protocols/sync.js +149 -0
  76. package/dist/cjs/node_modules/y-protocols/sync.js.map +1 -0
  77. package/dist/cjs/node_modules/y-websocket/src/y-websocket.js +521 -0
  78. package/dist/cjs/node_modules/y-websocket/src/y-websocket.js.map +1 -0
  79. package/dist/cjs/node_modules/yjs/dist/yjs.js +10399 -0
  80. package/dist/cjs/node_modules/yjs/dist/yjs.js.map +1 -0
  81. package/dist/cjs/packages/ui/dist/index.js +65997 -0
  82. package/dist/cjs/packages/ui/dist/index.js.map +1 -0
  83. package/dist/cjs/pixel/PixelEditor.js +1 -1
  84. package/dist/cjs/pixel/PixelEditorMenuBar.js +1 -1
  85. package/dist/cjs/pixel/PixelEditorRightPanel.js +1 -1
  86. package/dist/cjs/pixel/PixelEditorTimeline.js +1 -1
  87. package/dist/cjs/pixel/PixelEditorToolbar.js +1 -1
  88. package/dist/cjs/pixel/SpriteGeneratorPanel.js +1 -1
  89. package/dist/cjs/vector/VectorEditor.js +1 -1
  90. package/dist/cjs/vector/VectorEditorMenuBar.js +1 -1
  91. package/dist/cjs/vector/VectorEditorRightPanel.js +1 -1
  92. package/dist/esm/animation/AnimationEditor.js +5 -5
  93. package/dist/esm/animation/Audience.js +2 -2
  94. package/dist/esm/core/LocalUI.js +4 -4
  95. package/dist/esm/core/yjsCollaboration.js +2 -2
  96. package/dist/esm/core/yjsCollaboration.js.map +1 -1
  97. package/dist/esm/game/GameAsset2dEditor.js +19 -19
  98. package/dist/esm/node_modules/lib0/array.js +95 -0
  99. package/dist/esm/node_modules/lib0/array.js.map +1 -0
  100. package/dist/esm/node_modules/lib0/binary.js +30 -0
  101. package/dist/esm/node_modules/lib0/binary.js.map +1 -0
  102. package/dist/esm/node_modules/lib0/broadcastchannel.js +117 -0
  103. package/dist/esm/node_modules/lib0/broadcastchannel.js.map +1 -0
  104. package/dist/esm/node_modules/lib0/buffer.js +96 -0
  105. package/dist/esm/node_modules/lib0/buffer.js.map +1 -0
  106. package/dist/esm/node_modules/lib0/conditions.js +16 -0
  107. package/dist/esm/node_modules/lib0/conditions.js.map +1 -0
  108. package/dist/esm/node_modules/lib0/decoding.js +439 -0
  109. package/dist/esm/node_modules/lib0/decoding.js.map +1 -0
  110. package/dist/esm/node_modules/lib0/dom.js +48 -0
  111. package/dist/esm/node_modules/lib0/dom.js.map +1 -0
  112. package/dist/esm/node_modules/lib0/encoding.js +663 -0
  113. package/dist/esm/node_modules/lib0/encoding.js.map +1 -0
  114. package/dist/esm/node_modules/lib0/environment.js +121 -0
  115. package/dist/esm/node_modules/lib0/environment.js.map +1 -0
  116. package/dist/esm/node_modules/lib0/error.js +33 -0
  117. package/dist/esm/node_modules/lib0/error.js.map +1 -0
  118. package/dist/esm/node_modules/lib0/function.js +130 -0
  119. package/dist/esm/node_modules/lib0/function.js.map +1 -0
  120. package/dist/esm/node_modules/lib0/iterator.js +48 -0
  121. package/dist/esm/node_modules/lib0/iterator.js.map +1 -0
  122. package/dist/esm/node_modules/lib0/logging.common.js +52 -0
  123. package/dist/esm/node_modules/lib0/logging.common.js.map +1 -0
  124. package/dist/esm/node_modules/lib0/logging.js +115 -0
  125. package/dist/esm/node_modules/lib0/logging.js.map +1 -0
  126. package/dist/esm/node_modules/lib0/map.js +102 -0
  127. package/dist/esm/node_modules/lib0/map.js.map +1 -0
  128. package/dist/esm/node_modules/lib0/math.js +37 -0
  129. package/dist/esm/node_modules/lib0/math.js.map +1 -0
  130. package/dist/esm/node_modules/lib0/number.js +17 -0
  131. package/dist/esm/node_modules/lib0/number.js.map +1 -0
  132. package/dist/esm/node_modules/lib0/object.js +119 -0
  133. package/dist/esm/node_modules/lib0/object.js.map +1 -0
  134. package/dist/esm/node_modules/lib0/observable.js +165 -0
  135. package/dist/esm/node_modules/lib0/observable.js.map +1 -0
  136. package/dist/esm/node_modules/lib0/pair.js +30 -0
  137. package/dist/esm/node_modules/lib0/pair.js.map +1 -0
  138. package/dist/esm/node_modules/lib0/prng.js +87 -0
  139. package/dist/esm/node_modules/lib0/prng.js.map +1 -0
  140. package/dist/esm/node_modules/lib0/promise.js +31 -0
  141. package/dist/esm/node_modules/lib0/promise.js.map +1 -0
  142. package/dist/esm/node_modules/lib0/random.js +25 -0
  143. package/dist/esm/node_modules/lib0/random.js.map +1 -0
  144. package/dist/esm/node_modules/lib0/schema.js +1113 -0
  145. package/dist/esm/node_modules/lib0/schema.js.map +1 -0
  146. package/dist/esm/node_modules/lib0/set.js +10 -0
  147. package/dist/esm/node_modules/lib0/set.js.map +1 -0
  148. package/dist/esm/node_modules/lib0/storage.js +75 -0
  149. package/dist/esm/node_modules/lib0/storage.js.map +1 -0
  150. package/dist/esm/node_modules/lib0/string.js +85 -0
  151. package/dist/esm/node_modules/lib0/string.js.map +1 -0
  152. package/dist/esm/node_modules/lib0/symbol.js +13 -0
  153. package/dist/esm/node_modules/lib0/symbol.js.map +1 -0
  154. package/dist/esm/node_modules/lib0/time.js +16 -0
  155. package/dist/esm/node_modules/lib0/time.js.map +1 -0
  156. package/dist/esm/node_modules/lib0/trait/equality.js +29 -0
  157. package/dist/esm/node_modules/lib0/trait/equality.js.map +1 -0
  158. package/dist/esm/node_modules/lib0/url.js +18 -0
  159. package/dist/esm/node_modules/lib0/url.js.map +1 -0
  160. package/dist/esm/node_modules/lib0/webcrypto.js +6 -0
  161. package/dist/esm/node_modules/lib0/webcrypto.js.map +1 -0
  162. package/dist/esm/node_modules/y-protocols/auth.js +24 -0
  163. package/dist/esm/node_modules/y-protocols/auth.js.map +1 -0
  164. package/dist/esm/node_modules/y-protocols/awareness.js +271 -0
  165. package/dist/esm/node_modules/y-protocols/awareness.js.map +1 -0
  166. package/dist/esm/node_modules/y-protocols/sync.js +138 -0
  167. package/dist/esm/node_modules/y-protocols/sync.js.map +1 -0
  168. package/dist/esm/node_modules/y-websocket/src/y-websocket.js +515 -0
  169. package/dist/esm/node_modules/y-websocket/src/y-websocket.js.map +1 -0
  170. package/dist/esm/node_modules/yjs/dist/yjs.js +10295 -0
  171. package/dist/esm/node_modules/yjs/dist/yjs.js.map +1 -0
  172. package/dist/esm/packages/ui/dist/index.js +65571 -0
  173. package/dist/esm/packages/ui/dist/index.js.map +1 -0
  174. package/dist/esm/pixel/PixelEditor.js +3 -3
  175. package/dist/esm/pixel/PixelEditorMenuBar.js +2 -2
  176. package/dist/esm/pixel/PixelEditorRightPanel.js +3 -3
  177. package/dist/esm/pixel/PixelEditorTimeline.js +2 -2
  178. package/dist/esm/pixel/PixelEditorToolbar.js +2 -2
  179. package/dist/esm/pixel/SpriteGeneratorPanel.js +8 -8
  180. package/dist/esm/vector/VectorEditor.js +3 -3
  181. package/dist/esm/vector/VectorEditorMenuBar.js +3 -3
  182. package/dist/esm/vector/VectorEditorRightPanel.js +13 -13
  183. package/package.json +1 -1
@@ -0,0 +1,515 @@
1
+ import { publish, subscribe, unsubscribe } from '../../lib0/broadcastchannel.js';
2
+ import { getUnixTime } from '../../lib0/time.js';
3
+ import { writeVarUint, toUint8Array, length, writeVarUint8Array, createEncoder } from '../../lib0/encoding.js';
4
+ import { readVarUint, createDecoder, readVarUint8Array } from '../../lib0/decoding.js';
5
+ import { writeSyncStep1, writeUpdate, writeSyncStep2, readSyncMessage, messageYjsSyncStep2 } from '../../y-protocols/sync.js';
6
+ import { readAuthMessage } from '../../y-protocols/auth.js';
7
+ import { Awareness, encodeAwarenessUpdate, removeAwarenessStates, applyAwarenessUpdate } from '../../y-protocols/awareness.js';
8
+ import { ObservableV2 } from '../../lib0/observable.js';
9
+ import { min, pow } from '../../lib0/math.js';
10
+ import { encodeQueryParams } from '../../lib0/url.js';
11
+ import { isNode } from '../../lib0/environment.js';
12
+
13
+ /**
14
+ * @module provider/websocket
15
+ */
16
+
17
+
18
+ const messageSync = 0;
19
+ const messageQueryAwareness = 3;
20
+ const messageAwareness = 1;
21
+ const messageAuth = 2;
22
+
23
+ /**
24
+ * encoder, decoder, provider, emitSynced, messageType
25
+ * @type {Array<function(encoding.Encoder, decoding.Decoder, WebsocketProvider, boolean, number):void>}
26
+ */
27
+ const messageHandlers = [];
28
+
29
+ messageHandlers[messageSync] = (
30
+ encoder,
31
+ decoder,
32
+ provider,
33
+ emitSynced,
34
+ _messageType
35
+ ) => {
36
+ writeVarUint(encoder, messageSync);
37
+ const syncMessageType = readSyncMessage(
38
+ decoder,
39
+ encoder,
40
+ provider.doc,
41
+ provider
42
+ );
43
+ if (
44
+ emitSynced && syncMessageType === messageYjsSyncStep2 &&
45
+ !provider.synced
46
+ ) {
47
+ provider.synced = true;
48
+ }
49
+ };
50
+
51
+ messageHandlers[messageQueryAwareness] = (
52
+ encoder,
53
+ _decoder,
54
+ provider,
55
+ _emitSynced,
56
+ _messageType
57
+ ) => {
58
+ writeVarUint(encoder, messageAwareness);
59
+ writeVarUint8Array(
60
+ encoder,
61
+ encodeAwarenessUpdate(
62
+ provider.awareness,
63
+ Array.from(provider.awareness.getStates().keys())
64
+ )
65
+ );
66
+ };
67
+
68
+ messageHandlers[messageAwareness] = (
69
+ _encoder,
70
+ decoder,
71
+ provider,
72
+ _emitSynced,
73
+ _messageType
74
+ ) => {
75
+ applyAwarenessUpdate(
76
+ provider.awareness,
77
+ readVarUint8Array(decoder),
78
+ provider
79
+ );
80
+ };
81
+
82
+ messageHandlers[messageAuth] = (
83
+ _encoder,
84
+ decoder,
85
+ provider,
86
+ _emitSynced,
87
+ _messageType
88
+ ) => {
89
+ readAuthMessage(
90
+ decoder,
91
+ provider.doc,
92
+ (_ydoc, reason) => permissionDeniedHandler(provider, reason)
93
+ );
94
+ };
95
+
96
+ // @todo - this should depend on awareness.outdatedTime
97
+ const messageReconnectTimeout = 30000;
98
+
99
+ /**
100
+ * @param {WebsocketProvider} provider
101
+ * @param {string} reason
102
+ */
103
+ const permissionDeniedHandler = (provider, reason) =>
104
+ console.warn(`Permission denied to access ${provider.url}.\n${reason}`);
105
+
106
+ /**
107
+ * @param {WebsocketProvider} provider
108
+ * @param {Uint8Array} buf
109
+ * @param {boolean} emitSynced
110
+ * @return {encoding.Encoder}
111
+ */
112
+ const readMessage = (provider, buf, emitSynced) => {
113
+ const decoder = createDecoder(buf);
114
+ const encoder = createEncoder();
115
+ const messageType = readVarUint(decoder);
116
+ const messageHandler = provider.messageHandlers[messageType];
117
+ if (/** @type {any} */ (messageHandler)) {
118
+ messageHandler(encoder, decoder, provider, emitSynced, messageType);
119
+ } else {
120
+ console.error('Unable to compute message');
121
+ }
122
+ return encoder
123
+ };
124
+
125
+ /**
126
+ * Outsource this function so that a new websocket connection is created immediately.
127
+ * I suspect that the `ws.onclose` event is not always fired if there are network issues.
128
+ *
129
+ * @param {WebsocketProvider} provider
130
+ * @param {WebSocket} ws
131
+ * @param {CloseEvent | null} event
132
+ */
133
+ const closeWebsocketConnection = (provider, ws, event) => {
134
+ if (ws === provider.ws) {
135
+ provider.emit('connection-close', [event, provider]);
136
+ provider.ws = null;
137
+ ws.close();
138
+ provider.wsconnecting = false;
139
+ if (provider.wsconnected) {
140
+ provider.wsconnected = false;
141
+ provider.synced = false;
142
+ // update awareness (all users except local left)
143
+ removeAwarenessStates(
144
+ provider.awareness,
145
+ Array.from(provider.awareness.getStates().keys()).filter((client) =>
146
+ client !== provider.doc.clientID
147
+ ),
148
+ provider
149
+ );
150
+ provider.emit('status', [{
151
+ status: 'disconnected'
152
+ }]);
153
+ } else {
154
+ provider.wsUnsuccessfulReconnects++;
155
+ }
156
+ // Start with no reconnect timeout and increase timeout by
157
+ // using exponential backoff starting with 100ms
158
+ setTimeout(
159
+ setupWS,
160
+ min(
161
+ pow(2, provider.wsUnsuccessfulReconnects) * 100,
162
+ provider.maxBackoffTime
163
+ ),
164
+ provider
165
+ );
166
+ }
167
+ };
168
+
169
+ /**
170
+ * @param {WebsocketProvider} provider
171
+ */
172
+ const setupWS = (provider) => {
173
+ if (provider.shouldConnect && provider.ws === null) {
174
+ const websocket = new provider._WS(provider.url, provider.protocols);
175
+ websocket.binaryType = 'arraybuffer';
176
+ provider.ws = websocket;
177
+ provider.wsconnecting = true;
178
+ provider.wsconnected = false;
179
+ provider.synced = false;
180
+
181
+ websocket.onmessage = (event) => {
182
+ provider.wsLastMessageReceived = getUnixTime();
183
+ const encoder = readMessage(provider, new Uint8Array(event.data), true);
184
+ if (length(encoder) > 1) {
185
+ websocket.send(toUint8Array(encoder));
186
+ }
187
+ };
188
+ websocket.onerror = (event) => {
189
+ provider.emit('connection-error', [event, provider]);
190
+ };
191
+ websocket.onclose = (event) => {
192
+ closeWebsocketConnection(provider, websocket, event);
193
+ };
194
+ websocket.onopen = () => {
195
+ provider.wsLastMessageReceived = getUnixTime();
196
+ provider.wsconnecting = false;
197
+ provider.wsconnected = true;
198
+ provider.wsUnsuccessfulReconnects = 0;
199
+ provider.emit('status', [{
200
+ status: 'connected'
201
+ }]);
202
+ // always send sync step 1 when connected
203
+ const encoder = createEncoder();
204
+ writeVarUint(encoder, messageSync);
205
+ writeSyncStep1(encoder, provider.doc);
206
+ websocket.send(toUint8Array(encoder));
207
+ // broadcast local awareness state
208
+ if (provider.awareness.getLocalState() !== null) {
209
+ const encoderAwarenessState = createEncoder();
210
+ writeVarUint(encoderAwarenessState, messageAwareness);
211
+ writeVarUint8Array(
212
+ encoderAwarenessState,
213
+ encodeAwarenessUpdate(provider.awareness, [
214
+ provider.doc.clientID
215
+ ])
216
+ );
217
+ websocket.send(toUint8Array(encoderAwarenessState));
218
+ }
219
+ };
220
+ provider.emit('status', [{
221
+ status: 'connecting'
222
+ }]);
223
+ }
224
+ };
225
+
226
+ /**
227
+ * @param {WebsocketProvider} provider
228
+ * @param {ArrayBuffer} buf
229
+ */
230
+ const broadcastMessage = (provider, buf) => {
231
+ const ws = provider.ws;
232
+ if (provider.wsconnected && ws && ws.readyState === ws.OPEN) {
233
+ ws.send(buf);
234
+ }
235
+ if (provider.bcconnected) {
236
+ publish(provider.bcChannel, buf, provider);
237
+ }
238
+ };
239
+
240
+ /**
241
+ * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document.
242
+ * The document name is attached to the provided url. I.e. the following example
243
+ * creates a websocket connection to http://localhost:1234/my-document-name
244
+ *
245
+ * @example
246
+ * import * as Y from 'yjs'
247
+ * import { WebsocketProvider } from 'y-websocket'
248
+ * const doc = new Y.Doc()
249
+ * const provider = new WebsocketProvider('http://localhost:1234', 'my-document-name', doc)
250
+ *
251
+ * @extends {ObservableV2<{ 'connection-close': (event: CloseEvent | null, provider: WebsocketProvider) => any, 'status': (event: { status: 'connected' | 'disconnected' | 'connecting' }) => any, 'connection-error': (event: Event, provider: WebsocketProvider) => any, 'sync': (state: boolean) => any }>}
252
+ */
253
+ class WebsocketProvider extends ObservableV2 {
254
+ /**
255
+ * @param {string} serverUrl
256
+ * @param {string} roomname
257
+ * @param {Y.Doc} doc
258
+ * @param {object} opts
259
+ * @param {boolean} [opts.connect]
260
+ * @param {awarenessProtocol.Awareness} [opts.awareness]
261
+ * @param {Object<string,string>} [opts.params] specify url parameters
262
+ * @param {Array<string>} [opts.protocols] specify websocket protocols
263
+ * @param {typeof WebSocket} [opts.WebSocketPolyfill] Optionall provide a WebSocket polyfill
264
+ * @param {number} [opts.resyncInterval] Request server state every `resyncInterval` milliseconds
265
+ * @param {number} [opts.maxBackoffTime] Maximum amount of time to wait before trying to reconnect (we try to reconnect using exponential backoff)
266
+ * @param {boolean} [opts.disableBc] Disable cross-tab BroadcastChannel communication
267
+ */
268
+ constructor (serverUrl, roomname, doc, {
269
+ connect = true,
270
+ awareness = new Awareness(doc),
271
+ params = {},
272
+ protocols = [],
273
+ WebSocketPolyfill = WebSocket,
274
+ resyncInterval = -1,
275
+ maxBackoffTime = 2500,
276
+ disableBc = false
277
+ } = {}) {
278
+ super();
279
+ // ensure that url is always ends with /
280
+ while (serverUrl[serverUrl.length - 1] === '/') {
281
+ serverUrl = serverUrl.slice(0, serverUrl.length - 1);
282
+ }
283
+ this.serverUrl = serverUrl;
284
+ this.bcChannel = serverUrl + '/' + roomname;
285
+ this.maxBackoffTime = maxBackoffTime;
286
+ /**
287
+ * The specified url parameters. This can be safely updated. The changed parameters will be used
288
+ * when a new connection is established.
289
+ * @type {Object<string,string>}
290
+ */
291
+ this.params = params;
292
+ this.protocols = protocols;
293
+ this.roomname = roomname;
294
+ this.doc = doc;
295
+ this._WS = WebSocketPolyfill;
296
+ this.awareness = awareness;
297
+ this.wsconnected = false;
298
+ this.wsconnecting = false;
299
+ this.bcconnected = false;
300
+ this.disableBc = disableBc;
301
+ this.wsUnsuccessfulReconnects = 0;
302
+ this.messageHandlers = messageHandlers.slice();
303
+ /**
304
+ * @type {boolean}
305
+ */
306
+ this._synced = false;
307
+ /**
308
+ * @type {WebSocket?}
309
+ */
310
+ this.ws = null;
311
+ this.wsLastMessageReceived = 0;
312
+ /**
313
+ * Whether to connect to other peers or not
314
+ * @type {boolean}
315
+ */
316
+ this.shouldConnect = connect;
317
+
318
+ /**
319
+ * @type {number}
320
+ */
321
+ this._resyncInterval = 0;
322
+ if (resyncInterval > 0) {
323
+ this._resyncInterval = /** @type {any} */ (setInterval(() => {
324
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
325
+ // resend sync step 1
326
+ const encoder = createEncoder();
327
+ writeVarUint(encoder, messageSync);
328
+ writeSyncStep1(encoder, doc);
329
+ this.ws.send(toUint8Array(encoder));
330
+ }
331
+ }, resyncInterval));
332
+ }
333
+
334
+ /**
335
+ * @param {ArrayBuffer} data
336
+ * @param {any} origin
337
+ */
338
+ this._bcSubscriber = (data, origin) => {
339
+ if (origin !== this) {
340
+ const encoder = readMessage(this, new Uint8Array(data), false);
341
+ if (length(encoder) > 1) {
342
+ publish(this.bcChannel, toUint8Array(encoder), this);
343
+ }
344
+ }
345
+ };
346
+ /**
347
+ * Listens to Yjs updates and sends them to remote peers (ws and broadcastchannel)
348
+ * @param {Uint8Array} update
349
+ * @param {any} origin
350
+ */
351
+ this._updateHandler = (update, origin) => {
352
+ if (origin !== this) {
353
+ const encoder = createEncoder();
354
+ writeVarUint(encoder, messageSync);
355
+ writeUpdate(encoder, update);
356
+ broadcastMessage(this, toUint8Array(encoder));
357
+ }
358
+ };
359
+ this.doc.on('update', this._updateHandler);
360
+ /**
361
+ * @param {any} changed
362
+ * @param {any} _origin
363
+ */
364
+ this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => {
365
+ const changedClients = added.concat(updated).concat(removed);
366
+ const encoder = createEncoder();
367
+ writeVarUint(encoder, messageAwareness);
368
+ writeVarUint8Array(
369
+ encoder,
370
+ encodeAwarenessUpdate(awareness, changedClients)
371
+ );
372
+ broadcastMessage(this, toUint8Array(encoder));
373
+ };
374
+ this._exitHandler = () => {
375
+ removeAwarenessStates(
376
+ this.awareness,
377
+ [doc.clientID],
378
+ 'app closed'
379
+ );
380
+ };
381
+ if (isNode && typeof process !== 'undefined') {
382
+ process.on('exit', this._exitHandler);
383
+ }
384
+ awareness.on('update', this._awarenessUpdateHandler);
385
+ this._checkInterval = /** @type {any} */ (setInterval(() => {
386
+ if (
387
+ this.wsconnected &&
388
+ messageReconnectTimeout <
389
+ getUnixTime() - this.wsLastMessageReceived
390
+ ) {
391
+ // no message received in a long time - not even your own awareness
392
+ // updates (which are updated every 15 seconds)
393
+ closeWebsocketConnection(this, /** @type {WebSocket} */ (this.ws), null);
394
+ }
395
+ }, messageReconnectTimeout / 10));
396
+ if (connect) {
397
+ this.connect();
398
+ }
399
+ }
400
+
401
+ get url () {
402
+ const encodedParams = encodeQueryParams(this.params);
403
+ return this.serverUrl + '/' + this.roomname +
404
+ (encodedParams.length === 0 ? '' : '?' + encodedParams)
405
+ }
406
+
407
+ /**
408
+ * @type {boolean}
409
+ */
410
+ get synced () {
411
+ return this._synced
412
+ }
413
+
414
+ set synced (state) {
415
+ if (this._synced !== state) {
416
+ this._synced = state;
417
+ // @ts-ignore
418
+ this.emit('synced', [state]);
419
+ this.emit('sync', [state]);
420
+ }
421
+ }
422
+
423
+ destroy () {
424
+ if (this._resyncInterval !== 0) {
425
+ clearInterval(this._resyncInterval);
426
+ }
427
+ clearInterval(this._checkInterval);
428
+ this.disconnect();
429
+ if (isNode && typeof process !== 'undefined') {
430
+ process.off('exit', this._exitHandler);
431
+ }
432
+ this.awareness.off('update', this._awarenessUpdateHandler);
433
+ this.doc.off('update', this._updateHandler);
434
+ super.destroy();
435
+ }
436
+
437
+ connectBc () {
438
+ if (this.disableBc) {
439
+ return
440
+ }
441
+ if (!this.bcconnected) {
442
+ subscribe(this.bcChannel, this._bcSubscriber);
443
+ this.bcconnected = true;
444
+ }
445
+ // send sync step1 to bc
446
+ // write sync step 1
447
+ const encoderSync = createEncoder();
448
+ writeVarUint(encoderSync, messageSync);
449
+ writeSyncStep1(encoderSync, this.doc);
450
+ publish(this.bcChannel, toUint8Array(encoderSync), this);
451
+ // broadcast local state
452
+ const encoderState = createEncoder();
453
+ writeVarUint(encoderState, messageSync);
454
+ writeSyncStep2(encoderState, this.doc);
455
+ publish(this.bcChannel, toUint8Array(encoderState), this);
456
+ // write queryAwareness
457
+ const encoderAwarenessQuery = createEncoder();
458
+ writeVarUint(encoderAwarenessQuery, messageQueryAwareness);
459
+ publish(
460
+ this.bcChannel,
461
+ toUint8Array(encoderAwarenessQuery),
462
+ this
463
+ );
464
+ // broadcast local awareness state
465
+ const encoderAwarenessState = createEncoder();
466
+ writeVarUint(encoderAwarenessState, messageAwareness);
467
+ writeVarUint8Array(
468
+ encoderAwarenessState,
469
+ encodeAwarenessUpdate(this.awareness, [
470
+ this.doc.clientID
471
+ ])
472
+ );
473
+ publish(
474
+ this.bcChannel,
475
+ toUint8Array(encoderAwarenessState),
476
+ this
477
+ );
478
+ }
479
+
480
+ disconnectBc () {
481
+ // broadcast message with local awareness state set to null (indicating disconnect)
482
+ const encoder = createEncoder();
483
+ writeVarUint(encoder, messageAwareness);
484
+ writeVarUint8Array(
485
+ encoder,
486
+ encodeAwarenessUpdate(this.awareness, [
487
+ this.doc.clientID
488
+ ], new Map())
489
+ );
490
+ broadcastMessage(this, toUint8Array(encoder));
491
+ if (this.bcconnected) {
492
+ unsubscribe(this.bcChannel, this._bcSubscriber);
493
+ this.bcconnected = false;
494
+ }
495
+ }
496
+
497
+ disconnect () {
498
+ this.shouldConnect = false;
499
+ this.disconnectBc();
500
+ if (this.ws !== null) {
501
+ closeWebsocketConnection(this, this.ws, null);
502
+ }
503
+ }
504
+
505
+ connect () {
506
+ this.shouldConnect = true;
507
+ if (!this.wsconnected && this.ws === null) {
508
+ setupWS(this);
509
+ this.connectBc();
510
+ }
511
+ }
512
+ }
513
+
514
+ export { WebsocketProvider, messageAuth, messageAwareness, messageQueryAwareness, messageSync };
515
+ //# sourceMappingURL=y-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"y-websocket.js","sources":["../../../../../../../node_modules/y-websocket/src/y-websocket.js"],"sourcesContent":["/**\n * @module provider/websocket\n */\n\n/* eslint-env browser */\n\nimport * as Y from 'yjs' // eslint-disable-line\nimport * as bc from 'lib0/broadcastchannel'\nimport * as time from 'lib0/time'\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as syncProtocol from 'y-protocols/sync'\nimport * as authProtocol from 'y-protocols/auth'\nimport * as awarenessProtocol from 'y-protocols/awareness'\nimport { ObservableV2 } from 'lib0/observable'\nimport * as math from 'lib0/math'\nimport * as url from 'lib0/url'\nimport * as env from 'lib0/environment'\n\nexport const messageSync = 0\nexport const messageQueryAwareness = 3\nexport const messageAwareness = 1\nexport const messageAuth = 2\n\n/**\n * encoder, decoder, provider, emitSynced, messageType\n * @type {Array<function(encoding.Encoder, decoding.Decoder, WebsocketProvider, boolean, number):void>}\n */\nconst messageHandlers = []\n\nmessageHandlers[messageSync] = (\n encoder,\n decoder,\n provider,\n emitSynced,\n _messageType\n) => {\n encoding.writeVarUint(encoder, messageSync)\n const syncMessageType = syncProtocol.readSyncMessage(\n decoder,\n encoder,\n provider.doc,\n provider\n )\n if (\n emitSynced && syncMessageType === syncProtocol.messageYjsSyncStep2 &&\n !provider.synced\n ) {\n provider.synced = true\n }\n}\n\nmessageHandlers[messageQueryAwareness] = (\n encoder,\n _decoder,\n provider,\n _emitSynced,\n _messageType\n) => {\n encoding.writeVarUint(encoder, messageAwareness)\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(\n provider.awareness,\n Array.from(provider.awareness.getStates().keys())\n )\n )\n}\n\nmessageHandlers[messageAwareness] = (\n _encoder,\n decoder,\n provider,\n _emitSynced,\n _messageType\n) => {\n awarenessProtocol.applyAwarenessUpdate(\n provider.awareness,\n decoding.readVarUint8Array(decoder),\n provider\n )\n}\n\nmessageHandlers[messageAuth] = (\n _encoder,\n decoder,\n provider,\n _emitSynced,\n _messageType\n) => {\n authProtocol.readAuthMessage(\n decoder,\n provider.doc,\n (_ydoc, reason) => permissionDeniedHandler(provider, reason)\n )\n}\n\n// @todo - this should depend on awareness.outdatedTime\nconst messageReconnectTimeout = 30000\n\n/**\n * @param {WebsocketProvider} provider\n * @param {string} reason\n */\nconst permissionDeniedHandler = (provider, reason) =>\n console.warn(`Permission denied to access ${provider.url}.\\n${reason}`)\n\n/**\n * @param {WebsocketProvider} provider\n * @param {Uint8Array} buf\n * @param {boolean} emitSynced\n * @return {encoding.Encoder}\n */\nconst readMessage = (provider, buf, emitSynced) => {\n const decoder = decoding.createDecoder(buf)\n const encoder = encoding.createEncoder()\n const messageType = decoding.readVarUint(decoder)\n const messageHandler = provider.messageHandlers[messageType]\n if (/** @type {any} */ (messageHandler)) {\n messageHandler(encoder, decoder, provider, emitSynced, messageType)\n } else {\n console.error('Unable to compute message')\n }\n return encoder\n}\n\n/**\n * Outsource this function so that a new websocket connection is created immediately.\n * I suspect that the `ws.onclose` event is not always fired if there are network issues.\n *\n * @param {WebsocketProvider} provider\n * @param {WebSocket} ws\n * @param {CloseEvent | null} event\n */\nconst closeWebsocketConnection = (provider, ws, event) => {\n if (ws === provider.ws) {\n provider.emit('connection-close', [event, provider])\n provider.ws = null\n ws.close()\n provider.wsconnecting = false\n if (provider.wsconnected) {\n provider.wsconnected = false\n provider.synced = false\n // update awareness (all users except local left)\n awarenessProtocol.removeAwarenessStates(\n provider.awareness,\n Array.from(provider.awareness.getStates().keys()).filter((client) =>\n client !== provider.doc.clientID\n ),\n provider\n )\n provider.emit('status', [{\n status: 'disconnected'\n }])\n } else {\n provider.wsUnsuccessfulReconnects++\n }\n // Start with no reconnect timeout and increase timeout by\n // using exponential backoff starting with 100ms\n setTimeout(\n setupWS,\n math.min(\n math.pow(2, provider.wsUnsuccessfulReconnects) * 100,\n provider.maxBackoffTime\n ),\n provider\n )\n }\n}\n\n/**\n * @param {WebsocketProvider} provider\n */\nconst setupWS = (provider) => {\n if (provider.shouldConnect && provider.ws === null) {\n const websocket = new provider._WS(provider.url, provider.protocols)\n websocket.binaryType = 'arraybuffer'\n provider.ws = websocket\n provider.wsconnecting = true\n provider.wsconnected = false\n provider.synced = false\n\n websocket.onmessage = (event) => {\n provider.wsLastMessageReceived = time.getUnixTime()\n const encoder = readMessage(provider, new Uint8Array(event.data), true)\n if (encoding.length(encoder) > 1) {\n websocket.send(encoding.toUint8Array(encoder))\n }\n }\n websocket.onerror = (event) => {\n provider.emit('connection-error', [event, provider])\n }\n websocket.onclose = (event) => {\n closeWebsocketConnection(provider, websocket, event)\n }\n websocket.onopen = () => {\n provider.wsLastMessageReceived = time.getUnixTime()\n provider.wsconnecting = false\n provider.wsconnected = true\n provider.wsUnsuccessfulReconnects = 0\n provider.emit('status', [{\n status: 'connected'\n }])\n // always send sync step 1 when connected\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageSync)\n syncProtocol.writeSyncStep1(encoder, provider.doc)\n websocket.send(encoding.toUint8Array(encoder))\n // broadcast local awareness state\n if (provider.awareness.getLocalState() !== null) {\n const encoderAwarenessState = encoding.createEncoder()\n encoding.writeVarUint(encoderAwarenessState, messageAwareness)\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(provider.awareness, [\n provider.doc.clientID\n ])\n )\n websocket.send(encoding.toUint8Array(encoderAwarenessState))\n }\n }\n provider.emit('status', [{\n status: 'connecting'\n }])\n }\n}\n\n/**\n * @param {WebsocketProvider} provider\n * @param {ArrayBuffer} buf\n */\nconst broadcastMessage = (provider, buf) => {\n const ws = provider.ws\n if (provider.wsconnected && ws && ws.readyState === ws.OPEN) {\n ws.send(buf)\n }\n if (provider.bcconnected) {\n bc.publish(provider.bcChannel, buf, provider)\n }\n}\n\n/**\n * Websocket Provider for Yjs. Creates a websocket connection to sync the shared document.\n * The document name is attached to the provided url. I.e. the following example\n * creates a websocket connection to http://localhost:1234/my-document-name\n *\n * @example\n * import * as Y from 'yjs'\n * import { WebsocketProvider } from 'y-websocket'\n * const doc = new Y.Doc()\n * const provider = new WebsocketProvider('http://localhost:1234', 'my-document-name', doc)\n *\n * @extends {ObservableV2<{ 'connection-close': (event: CloseEvent | null, provider: WebsocketProvider) => any, 'status': (event: { status: 'connected' | 'disconnected' | 'connecting' }) => any, 'connection-error': (event: Event, provider: WebsocketProvider) => any, 'sync': (state: boolean) => any }>}\n */\nexport class WebsocketProvider extends ObservableV2 {\n /**\n * @param {string} serverUrl\n * @param {string} roomname\n * @param {Y.Doc} doc\n * @param {object} opts\n * @param {boolean} [opts.connect]\n * @param {awarenessProtocol.Awareness} [opts.awareness]\n * @param {Object<string,string>} [opts.params] specify url parameters\n * @param {Array<string>} [opts.protocols] specify websocket protocols\n * @param {typeof WebSocket} [opts.WebSocketPolyfill] Optionall provide a WebSocket polyfill\n * @param {number} [opts.resyncInterval] Request server state every `resyncInterval` milliseconds\n * @param {number} [opts.maxBackoffTime] Maximum amount of time to wait before trying to reconnect (we try to reconnect using exponential backoff)\n * @param {boolean} [opts.disableBc] Disable cross-tab BroadcastChannel communication\n */\n constructor (serverUrl, roomname, doc, {\n connect = true,\n awareness = new awarenessProtocol.Awareness(doc),\n params = {},\n protocols = [],\n WebSocketPolyfill = WebSocket,\n resyncInterval = -1,\n maxBackoffTime = 2500,\n disableBc = false\n } = {}) {\n super()\n // ensure that url is always ends with /\n while (serverUrl[serverUrl.length - 1] === '/') {\n serverUrl = serverUrl.slice(0, serverUrl.length - 1)\n }\n this.serverUrl = serverUrl\n this.bcChannel = serverUrl + '/' + roomname\n this.maxBackoffTime = maxBackoffTime\n /**\n * The specified url parameters. This can be safely updated. The changed parameters will be used\n * when a new connection is established.\n * @type {Object<string,string>}\n */\n this.params = params\n this.protocols = protocols\n this.roomname = roomname\n this.doc = doc\n this._WS = WebSocketPolyfill\n this.awareness = awareness\n this.wsconnected = false\n this.wsconnecting = false\n this.bcconnected = false\n this.disableBc = disableBc\n this.wsUnsuccessfulReconnects = 0\n this.messageHandlers = messageHandlers.slice()\n /**\n * @type {boolean}\n */\n this._synced = false\n /**\n * @type {WebSocket?}\n */\n this.ws = null\n this.wsLastMessageReceived = 0\n /**\n * Whether to connect to other peers or not\n * @type {boolean}\n */\n this.shouldConnect = connect\n\n /**\n * @type {number}\n */\n this._resyncInterval = 0\n if (resyncInterval > 0) {\n this._resyncInterval = /** @type {any} */ (setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n // resend sync step 1\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageSync)\n syncProtocol.writeSyncStep1(encoder, doc)\n this.ws.send(encoding.toUint8Array(encoder))\n }\n }, resyncInterval))\n }\n\n /**\n * @param {ArrayBuffer} data\n * @param {any} origin\n */\n this._bcSubscriber = (data, origin) => {\n if (origin !== this) {\n const encoder = readMessage(this, new Uint8Array(data), false)\n if (encoding.length(encoder) > 1) {\n bc.publish(this.bcChannel, encoding.toUint8Array(encoder), this)\n }\n }\n }\n /**\n * Listens to Yjs updates and sends them to remote peers (ws and broadcastchannel)\n * @param {Uint8Array} update\n * @param {any} origin\n */\n this._updateHandler = (update, origin) => {\n if (origin !== this) {\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageSync)\n syncProtocol.writeUpdate(encoder, update)\n broadcastMessage(this, encoding.toUint8Array(encoder))\n }\n }\n this.doc.on('update', this._updateHandler)\n /**\n * @param {any} changed\n * @param {any} _origin\n */\n this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => {\n const changedClients = added.concat(updated).concat(removed)\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageAwareness)\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(awareness, changedClients)\n )\n broadcastMessage(this, encoding.toUint8Array(encoder))\n }\n this._exitHandler = () => {\n awarenessProtocol.removeAwarenessStates(\n this.awareness,\n [doc.clientID],\n 'app closed'\n )\n }\n if (env.isNode && typeof process !== 'undefined') {\n process.on('exit', this._exitHandler)\n }\n awareness.on('update', this._awarenessUpdateHandler)\n this._checkInterval = /** @type {any} */ (setInterval(() => {\n if (\n this.wsconnected &&\n messageReconnectTimeout <\n time.getUnixTime() - this.wsLastMessageReceived\n ) {\n // no message received in a long time - not even your own awareness\n // updates (which are updated every 15 seconds)\n closeWebsocketConnection(this, /** @type {WebSocket} */ (this.ws), null)\n }\n }, messageReconnectTimeout / 10))\n if (connect) {\n this.connect()\n }\n }\n\n get url () {\n const encodedParams = url.encodeQueryParams(this.params)\n return this.serverUrl + '/' + this.roomname +\n (encodedParams.length === 0 ? '' : '?' + encodedParams)\n }\n\n /**\n * @type {boolean}\n */\n get synced () {\n return this._synced\n }\n\n set synced (state) {\n if (this._synced !== state) {\n this._synced = state\n // @ts-ignore\n this.emit('synced', [state])\n this.emit('sync', [state])\n }\n }\n\n destroy () {\n if (this._resyncInterval !== 0) {\n clearInterval(this._resyncInterval)\n }\n clearInterval(this._checkInterval)\n this.disconnect()\n if (env.isNode && typeof process !== 'undefined') {\n process.off('exit', this._exitHandler)\n }\n this.awareness.off('update', this._awarenessUpdateHandler)\n this.doc.off('update', this._updateHandler)\n super.destroy()\n }\n\n connectBc () {\n if (this.disableBc) {\n return\n }\n if (!this.bcconnected) {\n bc.subscribe(this.bcChannel, this._bcSubscriber)\n this.bcconnected = true\n }\n // send sync step1 to bc\n // write sync step 1\n const encoderSync = encoding.createEncoder()\n encoding.writeVarUint(encoderSync, messageSync)\n syncProtocol.writeSyncStep1(encoderSync, this.doc)\n bc.publish(this.bcChannel, encoding.toUint8Array(encoderSync), this)\n // broadcast local state\n const encoderState = encoding.createEncoder()\n encoding.writeVarUint(encoderState, messageSync)\n syncProtocol.writeSyncStep2(encoderState, this.doc)\n bc.publish(this.bcChannel, encoding.toUint8Array(encoderState), this)\n // write queryAwareness\n const encoderAwarenessQuery = encoding.createEncoder()\n encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness)\n bc.publish(\n this.bcChannel,\n encoding.toUint8Array(encoderAwarenessQuery),\n this\n )\n // broadcast local awareness state\n const encoderAwarenessState = encoding.createEncoder()\n encoding.writeVarUint(encoderAwarenessState, messageAwareness)\n encoding.writeVarUint8Array(\n encoderAwarenessState,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [\n this.doc.clientID\n ])\n )\n bc.publish(\n this.bcChannel,\n encoding.toUint8Array(encoderAwarenessState),\n this\n )\n }\n\n disconnectBc () {\n // broadcast message with local awareness state set to null (indicating disconnect)\n const encoder = encoding.createEncoder()\n encoding.writeVarUint(encoder, messageAwareness)\n encoding.writeVarUint8Array(\n encoder,\n awarenessProtocol.encodeAwarenessUpdate(this.awareness, [\n this.doc.clientID\n ], new Map())\n )\n broadcastMessage(this, encoding.toUint8Array(encoder))\n if (this.bcconnected) {\n bc.unsubscribe(this.bcChannel, this._bcSubscriber)\n this.bcconnected = false\n }\n }\n\n disconnect () {\n this.shouldConnect = false\n this.disconnectBc()\n if (this.ws !== null) {\n closeWebsocketConnection(this, this.ws, null)\n }\n }\n\n connect () {\n this.shouldConnect = true\n if (!this.wsconnected && this.ws === null) {\n setupWS(this)\n this.connectBc()\n }\n }\n}\n"],"names":["encoding.writeVarUint","syncProtocol.readSyncMessage","syncProtocol.messageYjsSyncStep2","encoding.writeVarUint8Array","awarenessProtocol.encodeAwarenessUpdate","awarenessProtocol.applyAwarenessUpdate","decoding.readVarUint8Array","authProtocol.readAuthMessage","decoding.createDecoder","encoding.createEncoder","decoding.readVarUint","awarenessProtocol.removeAwarenessStates","math.min","math.pow","time.getUnixTime","encoding.length","encoding.toUint8Array","syncProtocol.writeSyncStep1","bc.publish","awarenessProtocol.Awareness","syncProtocol.writeUpdate","env.isNode","url.encodeQueryParams","bc.subscribe","syncProtocol.writeSyncStep2","bc.unsubscribe"],"mappings":"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","x_google_ignoreList":[0]}