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