@nice2dev/ui-graphics 1.3.15 → 1.3.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/dist/cjs/animation/AnimatedPerson.js +470 -143
- package/dist/cjs/animation/AnimationEditor.js +289 -101
- package/dist/cjs/animation/Audience.js +83 -61
- package/dist/cjs/animation/BodyRenderer.js +69 -28
- package/dist/cjs/animation/animationHelper.js +281 -288
- package/dist/cjs/animation/characterTypes.js +200 -203
- package/dist/cjs/animation/choreoDSL.js +205 -219
- package/dist/cjs/animation/choreography.js +4 -32
- package/dist/cjs/animation/karaokeIntegration.js +68 -77
- package/dist/cjs/animation/lottieExport.js +108 -114
- package/dist/cjs/animation/motionPath.js +225 -248
- package/dist/cjs/animation/physics.js +227 -254
- package/dist/cjs/animation/rig/RigPlayer.js +53 -56
- package/dist/cjs/animation/rig/RiggedBody.js +71 -26
- package/dist/cjs/animation/rig/choreoRigBridge.js +72 -77
- package/dist/cjs/animation/rig/ik.js +13 -18
- package/dist/cjs/animation/rig/poseOps.js +34 -41
- package/dist/cjs/animation/rig/presets.js +64 -72
- package/dist/cjs/animation/rig/rigMath.js +25 -32
- package/dist/cjs/animation/rig/rigTypes.js +59 -63
- package/dist/cjs/animation/shapes/arms.js +31 -13
- package/dist/cjs/animation/shapes/eyes.js +129 -47
- package/dist/cjs/animation/shapes/hair.js +72 -45
- package/dist/cjs/animation/shapes/heads.js +131 -57
- package/dist/cjs/animation/shapes/headwear.js +47 -38
- package/dist/cjs/animation/shapes/legs.js +31 -13
- package/dist/cjs/animation/shapes/mouths.js +120 -44
- package/dist/cjs/animation/shapes/noses.js +80 -25
- package/dist/cjs/animation/shapes/outfits.js +101 -39
- package/dist/cjs/animation/shapes/torsos.js +15 -11
- package/dist/cjs/animation/spineExport.js +103 -121
- package/dist/cjs/core/LocalUI.js +108 -43
- package/dist/cjs/core/NiceBrushEngine.js +758 -552
- package/dist/cjs/core/collaboration.js +249 -251
- package/dist/cjs/core/colorBlindness.js +100 -115
- package/dist/cjs/core/dragDrop.js +155 -158
- package/dist/cjs/core/editorAsk.js +51 -41
- package/dist/cjs/core/fixes.js +140 -171
- package/dist/cjs/core/gridGuides.js +166 -201
- package/dist/cjs/core/historyVisual.js +156 -135
- package/dist/cjs/core/i18n.js +13 -14
- package/dist/cjs/core/integrations.js +238 -249
- package/dist/cjs/core/minimap.js +149 -151
- package/dist/cjs/core/plugins.js +98 -113
- package/dist/cjs/core/rtl.js +71 -83
- package/dist/cjs/core/shortcuts.js +196 -225
- package/dist/cjs/core/theme.js +142 -149
- package/dist/cjs/core/yjsCollaboration.js +232 -293
- package/dist/cjs/design/design-tools.js +12 -22
- package/dist/cjs/font/NiceFontEditor.js +877 -316
- package/dist/cjs/font/fontFormatUtils.js +388 -448
- package/dist/cjs/game/GameAsset2dEditor.js +1201 -392
- package/dist/cjs/game/GameAsset2dEditor.module.css.js +146 -5
- package/dist/cjs/game/gameAssetTypes.js +7 -16
- package/dist/cjs/game/gameAssetUtils.js +390 -413
- package/dist/cjs/game/useGameAssetEditor.js +820 -763
- package/dist/cjs/index.js +81 -84
- package/dist/cjs/nice2dev-ui-graphics.css +1 -1
- package/dist/cjs/node_modules/lib0/array.js +8 -70
- package/dist/cjs/node_modules/lib0/binary.js +3 -20
- package/dist/cjs/node_modules/lib0/broadcastchannel.js +24 -86
- package/dist/cjs/node_modules/lib0/buffer.js +15 -82
- package/dist/cjs/node_modules/lib0/conditions.js +3 -16
- package/dist/cjs/node_modules/lib0/decoding.js +108 -287
- package/dist/cjs/node_modules/lib0/dom.js +14 -44
- package/dist/cjs/node_modules/lib0/encoding.js +68 -418
- package/dist/cjs/node_modules/lib0/environment.js +26 -92
- package/dist/cjs/node_modules/lib0/error.js +5 -29
- package/dist/cjs/node_modules/lib0/function.js +27 -66
- package/dist/cjs/node_modules/lib0/iterator.js +8 -33
- package/dist/cjs/node_modules/lib0/logging.common.js +12 -22
- package/dist/cjs/node_modules/lib0/logging.js +32 -71
- package/dist/cjs/node_modules/lib0/map.js +16 -86
- package/dist/cjs/node_modules/lib0/math.js +3 -32
- package/dist/cjs/node_modules/lib0/number.js +4 -15
- package/dist/cjs/node_modules/lib0/object.js +14 -88
- package/dist/cjs/node_modules/lib0/observable.js +38 -78
- package/dist/cjs/node_modules/lib0/pair.js +3 -20
- package/dist/cjs/node_modules/lib0/prng.js +8 -77
- package/dist/cjs/node_modules/lib0/promise.js +6 -30
- package/dist/cjs/node_modules/lib0/random.js +8 -23
- package/dist/cjs/node_modules/lib0/schema.js +313 -687
- package/dist/cjs/node_modules/lib0/set.js +3 -10
- package/dist/cjs/node_modules/lib0/storage.js +20 -55
- package/dist/cjs/node_modules/lib0/string.js +17 -72
- package/dist/cjs/node_modules/lib0/symbol.js +2 -12
- package/dist/cjs/node_modules/lib0/time.js +2 -15
- package/dist/cjs/node_modules/lib0/trait/equality.js +3 -28
- package/dist/cjs/node_modules/lib0/url.js +4 -18
- package/dist/cjs/node_modules/lib0/webcrypto.js +2 -5
- package/dist/cjs/node_modules/y-protocols/auth.js +5 -19
- package/dist/cjs/node_modules/y-protocols/awareness.js +53 -116
- package/dist/cjs/node_modules/y-protocols/sync.js +16 -103
- package/dist/cjs/node_modules/y-websocket/src/y-websocket.js +77 -219
- package/dist/cjs/node_modules/yjs/dist/yjs.js +2128 -4868
- package/dist/cjs/photo/FilterThumb.js +37 -25
- package/dist/cjs/photo/NiceAITools.js +679 -467
- package/dist/cjs/photo/PhotoEditor.js +34 -20
- package/dist/cjs/photo/PhotoEditor.module.css.js +296 -5
- package/dist/cjs/photo/PhotoEditorCanvas.js +250 -91
- package/dist/cjs/photo/PhotoEditorLeftPanel.js +1086 -224
- package/dist/cjs/photo/PhotoEditorToolbar.js +135 -19
- package/dist/cjs/photo/photoEditorActions.js +89 -72
- package/dist/cjs/photo/photoEditorTypes.js +29 -32
- package/dist/cjs/photo/photoFilters.js +959 -985
- package/dist/cjs/photo/photoOverlays.js +899 -945
- package/dist/cjs/photo/photoSelection.js +427 -499
- package/dist/cjs/photo/usePhotoEditor.js +739 -741
- package/dist/cjs/pixel/HSVPicker.js +191 -175
- package/dist/cjs/pixel/PixelEditor.js +159 -48
- package/dist/cjs/pixel/PixelEditor.module.css.js +209 -5
- package/dist/cjs/pixel/PixelEditorCanvas.js +29 -16
- package/dist/cjs/pixel/PixelEditorMenuBar.js +160 -162
- package/dist/cjs/pixel/PixelEditorRightPanel.js +377 -45
- package/dist/cjs/pixel/PixelEditorStatusBar.js +47 -20
- package/dist/cjs/pixel/PixelEditorTimeline.js +106 -23
- package/dist/cjs/pixel/PixelEditorToolbar.js +99 -21
- package/dist/cjs/pixel/SpriteGeneratorPanel.js +483 -303
- package/dist/cjs/pixel/animalGeneratorPresets.js +776 -601
- package/dist/cjs/pixel/asepriteFormat.js +511 -560
- package/dist/cjs/pixel/buildingGeneratorPresets.js +693 -520
- package/dist/cjs/pixel/characterGeneratorPresets.js +644 -544
- package/dist/cjs/pixel/pixel-pro.js +52 -63
- package/dist/cjs/pixel/pixelEditorExports.js +388 -428
- package/dist/cjs/pixel/pixelEditorTypes.js +91 -108
- package/dist/cjs/pixel/pixelEditorUtils.js +519 -561
- package/dist/cjs/pixel/spriteGeneratorCore.js +206 -257
- package/dist/cjs/pixel/usePixelEditor.js +1321 -1343
- package/dist/cjs/texture/Nice3DTexturePainter.js +707 -440
- package/dist/cjs/ui/NiceUIDesigner.js +954 -527
- package/dist/cjs/vector/NiceSvgToCode.js +586 -446
- package/dist/cjs/vector/VectorEditor.js +290 -117
- package/dist/cjs/vector/VectorEditor.module.css.js +86 -5
- package/dist/cjs/vector/VectorEditorMenuBar.js +333 -275
- package/dist/cjs/vector/VectorEditorRightPanel.js +1094 -371
- package/dist/cjs/vector/VectorEditorShapeRenderer.js +198 -60
- package/dist/cjs/vector/VectorEditorStatusBar.js +39 -13
- package/dist/cjs/vector/useVectorEditor.js +848 -889
- package/dist/cjs/vector/vectorAnimation.js +110 -137
- package/dist/cjs/vector/vectorBooleanOps.js +398 -485
- package/dist/cjs/vector/vectorEditorExport.js +201 -203
- package/dist/cjs/vector/vectorEditorImport.js +173 -189
- package/dist/cjs/vector/vectorEditorTypes.js +42 -49
- package/dist/cjs/vector/vectorGradients.js +151 -174
- package/dist/cjs/vector/vectorIconExport.js +52 -59
- package/dist/cjs/vector/vectorIconImport.js +169 -219
- package/dist/esm/animation/AnimatedPerson.js +470 -141
- package/dist/esm/animation/AnimationEditor.js +290 -100
- package/dist/esm/animation/Audience.js +83 -59
- package/dist/esm/animation/BodyRenderer.js +71 -25
- package/dist/esm/animation/animationHelper.js +284 -287
- package/dist/esm/animation/characterTypes.js +204 -202
- package/dist/esm/animation/choreoDSL.js +212 -218
- package/dist/esm/animation/choreography.js +8 -31
- package/dist/esm/animation/karaokeIntegration.js +74 -76
- package/dist/esm/animation/lottieExport.js +112 -113
- package/dist/esm/animation/motionPath.js +235 -247
- package/dist/esm/animation/physics.js +235 -253
- package/dist/esm/animation/rig/RigPlayer.js +53 -54
- package/dist/esm/animation/rig/RiggedBody.js +71 -24
- package/dist/esm/animation/rig/choreoRigBridge.js +74 -76
- package/dist/esm/animation/rig/ik.js +14 -17
- package/dist/esm/animation/rig/poseOps.js +37 -40
- package/dist/esm/animation/rig/presets.js +70 -71
- package/dist/esm/animation/rig/rigMath.js +28 -31
- package/dist/esm/animation/rig/rigTypes.js +62 -62
- package/dist/esm/animation/shapes/arms.js +32 -12
- package/dist/esm/animation/shapes/eyes.js +135 -46
- package/dist/esm/animation/shapes/hair.js +80 -44
- package/dist/esm/animation/shapes/heads.js +140 -56
- package/dist/esm/animation/shapes/headwear.js +54 -37
- package/dist/esm/animation/shapes/legs.js +32 -12
- package/dist/esm/animation/shapes/mouths.js +127 -43
- package/dist/esm/animation/shapes/noses.js +87 -24
- package/dist/esm/animation/shapes/outfits.js +106 -38
- package/dist/esm/animation/shapes/torsos.js +16 -10
- package/dist/esm/animation/spineExport.js +106 -120
- package/dist/esm/core/LocalUI.js +111 -42
- package/dist/esm/core/NiceBrushEngine.js +761 -551
- package/dist/esm/core/collaboration.js +255 -250
- package/dist/esm/core/colorBlindness.js +106 -114
- package/dist/esm/core/dragDrop.js +157 -157
- package/dist/esm/core/editorAsk.js +53 -40
- package/dist/esm/core/fixes.js +145 -170
- package/dist/esm/core/gridGuides.js +178 -200
- package/dist/esm/core/historyVisual.js +158 -134
- package/dist/esm/core/i18n.js +15 -13
- package/dist/esm/core/integrations.js +244 -248
- package/dist/esm/core/minimap.js +151 -150
- package/dist/esm/core/plugins.js +102 -112
- package/dist/esm/core/rtl.js +77 -82
- package/dist/esm/core/shortcuts.js +200 -224
- package/dist/esm/core/theme.js +150 -148
- package/dist/esm/core/yjsCollaboration.js +240 -292
- package/dist/esm/design/design-tools.js +13 -21
- package/dist/esm/font/NiceFontEditor.js +880 -315
- package/dist/esm/font/fontFormatUtils.js +394 -447
- package/dist/esm/game/GameAsset2dEditor.js +1202 -391
- package/dist/esm/game/GameAsset2dEditor.module.css.js +146 -3
- package/dist/esm/game/gameAssetTypes.js +8 -15
- package/dist/esm/game/gameAssetUtils.js +408 -412
- package/dist/esm/game/useGameAssetEditor.js +821 -762
- package/dist/esm/index.js +332 -69
- package/dist/esm/nice2dev-ui-graphics.css +1 -1
- package/dist/esm/node_modules/lib0/array.js +15 -69
- package/dist/esm/node_modules/lib0/binary.js +14 -19
- package/dist/esm/node_modules/lib0/broadcastchannel.js +27 -85
- package/dist/esm/node_modules/lib0/buffer.js +20 -80
- package/dist/esm/node_modules/lib0/conditions.js +4 -15
- package/dist/esm/node_modules/lib0/decoding.js +128 -286
- package/dist/esm/node_modules/lib0/dom.js +20 -43
- package/dist/esm/node_modules/lib0/encoding.js +90 -415
- package/dist/esm/node_modules/lib0/environment.js +33 -91
- package/dist/esm/node_modules/lib0/error.js +8 -28
- package/dist/esm/node_modules/lib0/function.js +31 -65
- package/dist/esm/node_modules/lib0/iterator.js +11 -32
- package/dist/esm/node_modules/lib0/logging.common.js +22 -21
- package/dist/esm/node_modules/lib0/logging.js +44 -70
- package/dist/esm/node_modules/lib0/map.js +21 -85
- package/dist/esm/node_modules/lib0/math.js +9 -31
- package/dist/esm/node_modules/lib0/number.js +7 -14
- package/dist/esm/node_modules/lib0/object.js +26 -87
- package/dist/esm/node_modules/lib0/observable.js +40 -77
- package/dist/esm/node_modules/lib0/pair.js +5 -19
- package/dist/esm/node_modules/lib0/prng.js +15 -76
- package/dist/esm/node_modules/lib0/promise.js +7 -29
- package/dist/esm/node_modules/lib0/random.js +10 -22
- package/dist/esm/node_modules/lib0/schema.js +367 -686
- package/dist/esm/node_modules/lib0/set.js +4 -9
- package/dist/esm/node_modules/lib0/storage.js +23 -54
- package/dist/esm/node_modules/lib0/string.js +26 -71
- package/dist/esm/node_modules/lib0/symbol.js +3 -11
- package/dist/esm/node_modules/lib0/time.js +3 -14
- package/dist/esm/node_modules/lib0/trait/equality.js +5 -27
- package/dist/esm/node_modules/lib0/url.js +5 -17
- package/dist/esm/node_modules/lib0/webcrypto.js +3 -4
- package/dist/esm/node_modules/y-protocols/auth.js +7 -18
- package/dist/esm/node_modules/y-protocols/awareness.js +58 -115
- package/dist/esm/node_modules/y-protocols/sync.js +26 -102
- package/dist/esm/node_modules/y-websocket/src/y-websocket.js +82 -218
- package/dist/esm/node_modules/yjs/dist/yjs.js +2263 -4899
- package/dist/esm/photo/FilterThumb.js +37 -23
- package/dist/esm/photo/NiceAITools.js +685 -466
- package/dist/esm/photo/PhotoEditor.js +34 -18
- package/dist/esm/photo/PhotoEditor.module.css.js +296 -3
- package/dist/esm/photo/PhotoEditorCanvas.js +250 -89
- package/dist/esm/photo/PhotoEditorLeftPanel.js +1086 -222
- package/dist/esm/photo/PhotoEditorToolbar.js +135 -17
- package/dist/esm/photo/photoEditorActions.js +93 -71
- package/dist/esm/photo/photoEditorTypes.js +32 -31
- package/dist/esm/photo/photoFilters.js +967 -984
- package/dist/esm/photo/photoOverlays.js +913 -944
- package/dist/esm/photo/photoSelection.js +438 -498
- package/dist/esm/photo/usePhotoEditor.js +740 -740
- package/dist/esm/pixel/HSVPicker.js +192 -174
- package/dist/esm/pixel/PixelEditor.js +160 -47
- package/dist/esm/pixel/PixelEditor.module.css.js +209 -3
- package/dist/esm/pixel/PixelEditorCanvas.js +29 -14
- package/dist/esm/pixel/PixelEditorMenuBar.js +160 -160
- package/dist/esm/pixel/PixelEditorRightPanel.js +377 -43
- package/dist/esm/pixel/PixelEditorStatusBar.js +47 -18
- package/dist/esm/pixel/PixelEditorTimeline.js +106 -21
- package/dist/esm/pixel/PixelEditorToolbar.js +99 -19
- package/dist/esm/pixel/SpriteGeneratorPanel.js +483 -301
- package/dist/esm/pixel/animalGeneratorPresets.js +782 -600
- package/dist/esm/pixel/asepriteFormat.js +517 -559
- package/dist/esm/pixel/buildingGeneratorPresets.js +699 -519
- package/dist/esm/pixel/characterGeneratorPresets.js +650 -543
- package/dist/esm/pixel/pixel-pro.js +53 -62
- package/dist/esm/pixel/pixelEditorExports.js +397 -427
- package/dist/esm/pixel/pixelEditorTypes.js +103 -107
- package/dist/esm/pixel/pixelEditorUtils.js +551 -560
- package/dist/esm/pixel/spriteGeneratorCore.js +223 -256
- package/dist/esm/pixel/usePixelEditor.js +1322 -1342
- package/dist/esm/texture/Nice3DTexturePainter.js +709 -439
- package/dist/esm/ui/NiceUIDesigner.js +957 -526
- package/dist/esm/vector/NiceSvgToCode.js +589 -445
- package/dist/esm/vector/VectorEditor.js +291 -116
- package/dist/esm/vector/VectorEditor.module.css.js +86 -3
- package/dist/esm/vector/VectorEditorMenuBar.js +333 -273
- package/dist/esm/vector/VectorEditorRightPanel.js +1094 -369
- package/dist/esm/vector/VectorEditorShapeRenderer.js +199 -59
- package/dist/esm/vector/VectorEditorStatusBar.js +39 -11
- package/dist/esm/vector/useVectorEditor.js +849 -888
- package/dist/esm/vector/vectorAnimation.js +115 -136
- package/dist/esm/vector/vectorBooleanOps.js +401 -484
- package/dist/esm/vector/vectorEditorExport.js +207 -202
- package/dist/esm/vector/vectorEditorImport.js +174 -188
- package/dist/esm/vector/vectorEditorTypes.js +50 -48
- package/dist/esm/vector/vectorGradients.js +158 -173
- package/dist/esm/vector/vectorIconExport.js +53 -58
- package/dist/esm/vector/vectorIconImport.js +171 -218
- package/package.json +9 -15
|
@@ -1,74 +1,43 @@
|
|
|
1
|
-
/* eslint-env browser */
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Isomorphic variable storage.
|
|
5
|
-
*
|
|
6
|
-
* Uses LocalStorage in the browser and falls back to in-memory storage.
|
|
7
|
-
*
|
|
8
|
-
* @module storage
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/* c8 ignore start */
|
|
12
1
|
class VarStoragePolyfill {
|
|
13
|
-
constructor
|
|
14
|
-
this.map = new Map();
|
|
2
|
+
constructor() {
|
|
3
|
+
this.map = /* @__PURE__ */ new Map();
|
|
15
4
|
}
|
|
16
|
-
|
|
17
5
|
/**
|
|
18
6
|
* @param {string} key
|
|
19
7
|
* @param {any} newValue
|
|
20
8
|
*/
|
|
21
|
-
setItem
|
|
9
|
+
setItem(key, newValue) {
|
|
22
10
|
this.map.set(key, newValue);
|
|
23
11
|
}
|
|
24
|
-
|
|
25
12
|
/**
|
|
26
13
|
* @param {string} key
|
|
27
14
|
*/
|
|
28
|
-
getItem
|
|
29
|
-
return this.map.get(key)
|
|
15
|
+
getItem(key) {
|
|
16
|
+
return this.map.get(key);
|
|
30
17
|
}
|
|
31
18
|
}
|
|
32
|
-
/* c8 ignore stop */
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @type {any}
|
|
36
|
-
*/
|
|
37
19
|
let _localStorage = new VarStoragePolyfill();
|
|
38
20
|
let usePolyfill = true;
|
|
39
|
-
|
|
40
|
-
/* c8 ignore start */
|
|
41
21
|
try {
|
|
42
|
-
|
|
43
|
-
if (typeof localStorage !== 'undefined' && localStorage) {
|
|
22
|
+
if (typeof localStorage !== "undefined" && localStorage) {
|
|
44
23
|
_localStorage = localStorage;
|
|
45
24
|
usePolyfill = false;
|
|
46
25
|
}
|
|
47
|
-
} catch (e) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* This is basically localStorage in browser, or a polyfill in nodejs
|
|
52
|
-
*/
|
|
53
|
-
/* c8 ignore next */
|
|
26
|
+
} catch (e) {
|
|
27
|
+
}
|
|
54
28
|
const varStorage = _localStorage;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
*/
|
|
71
|
-
/* c8 ignore next */
|
|
72
|
-
const offChange = eventHandler => usePolyfill || removeEventListener('storage', /** @type {any} */ (eventHandler));
|
|
73
|
-
|
|
74
|
-
export { offChange, onChange, varStorage };
|
|
29
|
+
const onChange = (eventHandler) => usePolyfill || addEventListener(
|
|
30
|
+
"storage",
|
|
31
|
+
/** @type {any} */
|
|
32
|
+
eventHandler
|
|
33
|
+
);
|
|
34
|
+
const offChange = (eventHandler) => usePolyfill || removeEventListener(
|
|
35
|
+
"storage",
|
|
36
|
+
/** @type {any} */
|
|
37
|
+
eventHandler
|
|
38
|
+
);
|
|
39
|
+
export {
|
|
40
|
+
offChange,
|
|
41
|
+
onChange,
|
|
42
|
+
varStorage
|
|
43
|
+
};
|
|
@@ -1,84 +1,39 @@
|
|
|
1
|
-
import { unfold } from
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Utility module to work with strings.
|
|
5
|
-
*
|
|
6
|
-
* @module string
|
|
7
|
-
*/
|
|
8
|
-
|
|
1
|
+
import { unfold } from "./array.js";
|
|
9
2
|
const fromCharCode = String.fromCharCode;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* @param {string} s
|
|
13
|
-
* @return {string}
|
|
14
|
-
*/
|
|
15
|
-
const toLowerCase = s => s.toLowerCase();
|
|
16
|
-
|
|
3
|
+
const toLowerCase = (s) => s.toLowerCase();
|
|
17
4
|
const trimLeftRegex = /^\s*/g;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @param {string} s
|
|
21
|
-
* @return {string}
|
|
22
|
-
*/
|
|
23
|
-
const trimLeft = s => s.replace(trimLeftRegex, '');
|
|
24
|
-
|
|
5
|
+
const trimLeft = (s) => s.replace(trimLeftRegex, "");
|
|
25
6
|
const fromCamelCaseRegex = /([A-Z])/g;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
* @param {string} s
|
|
29
|
-
* @param {string} separator
|
|
30
|
-
* @return {string}
|
|
31
|
-
*/
|
|
32
|
-
const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, match => `${separator}${toLowerCase(match)}`));
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @param {string} str
|
|
36
|
-
* @return {Uint8Array<ArrayBuffer>}
|
|
37
|
-
*/
|
|
38
|
-
const _encodeUtf8Polyfill = str => {
|
|
7
|
+
const fromCamelCase = (s, separator) => trimLeft(s.replace(fromCamelCaseRegex, (match) => `${separator}${toLowerCase(match)}`));
|
|
8
|
+
const _encodeUtf8Polyfill = (str) => {
|
|
39
9
|
const encodedString = unescape(encodeURIComponent(str));
|
|
40
10
|
const len = encodedString.length;
|
|
41
11
|
const buf = new Uint8Array(len);
|
|
42
12
|
for (let i = 0; i < len; i++) {
|
|
43
|
-
buf[i] = /** @type {number} */
|
|
13
|
+
buf[i] = /** @type {number} */
|
|
14
|
+
encodedString.codePointAt(i);
|
|
44
15
|
}
|
|
45
|
-
return buf
|
|
16
|
+
return buf;
|
|
46
17
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
* @param {string} str
|
|
53
|
-
* @return {Uint8Array<ArrayBuffer>}
|
|
54
|
-
*/
|
|
55
|
-
const _encodeUtf8Native = str => utf8TextEncoder.encode(str);
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* @param {string} str
|
|
59
|
-
* @return {Uint8Array}
|
|
60
|
-
*/
|
|
61
|
-
/* c8 ignore next */
|
|
18
|
+
const utf8TextEncoder = (
|
|
19
|
+
/** @type {TextEncoder} */
|
|
20
|
+
typeof TextEncoder !== "undefined" ? new TextEncoder() : null
|
|
21
|
+
);
|
|
22
|
+
const _encodeUtf8Native = (str) => utf8TextEncoder.encode(str);
|
|
62
23
|
const encodeUtf8 = utf8TextEncoder ? _encodeUtf8Native : _encodeUtf8Polyfill;
|
|
63
|
-
|
|
64
|
-
/* c8 ignore next */
|
|
65
|
-
let utf8TextDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
66
|
-
|
|
67
|
-
/* c8 ignore start */
|
|
24
|
+
let utf8TextDecoder = typeof TextDecoder === "undefined" ? null : new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
68
25
|
if (utf8TextDecoder && utf8TextDecoder.decode(new Uint8Array()).length === 1) {
|
|
69
|
-
// Safari doesn't handle BOM correctly.
|
|
70
|
-
// This fixes a bug in Safari 13.0.5 where it produces a BOM the first time it is called.
|
|
71
|
-
// utf8TextDecoder.decode(new Uint8Array()).length === 1 on the first call and
|
|
72
|
-
// utf8TextDecoder.decode(new Uint8Array()).length === 1 on the second call
|
|
73
|
-
// Another issue is that from then on no BOM chars are recognized anymore
|
|
74
|
-
/* c8 ignore next */
|
|
75
26
|
utf8TextDecoder = null;
|
|
76
27
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
28
|
+
const repeat = (source, n) => unfold(n, () => source).join("");
|
|
29
|
+
export {
|
|
30
|
+
_encodeUtf8Native,
|
|
31
|
+
_encodeUtf8Polyfill,
|
|
32
|
+
encodeUtf8,
|
|
33
|
+
fromCamelCase,
|
|
34
|
+
fromCharCode,
|
|
35
|
+
repeat,
|
|
36
|
+
trimLeft,
|
|
37
|
+
utf8TextDecoder,
|
|
38
|
+
utf8TextEncoder
|
|
39
|
+
};
|
|
@@ -1,28 +1,6 @@
|
|
|
1
|
-
const EqualityTraitSymbol = Symbol(
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @typedef {{ [EqualityTraitSymbol]:(other:EqualityTrait)=>boolean }} EqualityTrait
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
* Utility function to compare any two objects.
|
|
10
|
-
*
|
|
11
|
-
* Note that it is expected that the first parameter is more specific than the latter one.
|
|
12
|
-
*
|
|
13
|
-
* @example js
|
|
14
|
-
* class X { [traits.EqualityTraitSymbol] (other) { return other === this } }
|
|
15
|
-
* class X2 { [traits.EqualityTraitSymbol] (other) { return other === this }, x2 () { return 2 } }
|
|
16
|
-
* // this is fine
|
|
17
|
-
* traits.equals(new X2(), new X())
|
|
18
|
-
* // this is not, because the left type is less specific than the right one
|
|
19
|
-
* traits.equals(new X(), new X2())
|
|
20
|
-
*
|
|
21
|
-
* @template {EqualityTrait} T
|
|
22
|
-
* @param {NoInfer<T>} a
|
|
23
|
-
* @param {T} b
|
|
24
|
-
* @return {boolean}
|
|
25
|
-
*/
|
|
1
|
+
const EqualityTraitSymbol = Symbol("Equality");
|
|
26
2
|
const equals = (a, b) => a === b || !!a?.[EqualityTraitSymbol]?.(b) || false;
|
|
27
|
-
|
|
28
|
-
|
|
3
|
+
export {
|
|
4
|
+
EqualityTraitSymbol,
|
|
5
|
+
equals
|
|
6
|
+
};
|
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
import { map } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* @module url
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @param {Object<string,string>} params
|
|
12
|
-
* @return {string}
|
|
13
|
-
*/
|
|
14
|
-
const encodeQueryParams = params =>
|
|
15
|
-
map(params, (val, key) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`).join('&');
|
|
16
|
-
|
|
17
|
-
export { encodeQueryParams };
|
|
1
|
+
import { map } from "./object.js";
|
|
2
|
+
const encodeQueryParams = (params) => map(params, (val, key) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`).join("&");
|
|
3
|
+
export {
|
|
4
|
+
encodeQueryParams
|
|
5
|
+
};
|
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
import { readVarUint, readVarString } from
|
|
2
|
-
|
|
1
|
+
import { readVarUint, readVarString } from "../lib0/decoding.js";
|
|
3
2
|
const messagePermissionDenied = 0;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @callback PermissionDeniedHandler
|
|
7
|
-
* @param {any} y
|
|
8
|
-
* @param {string} reason
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
* @param {decoding.Decoder} decoder
|
|
14
|
-
* @param {Y.Doc} y
|
|
15
|
-
* @param {PermissionDeniedHandler} permissionDeniedHandler
|
|
16
|
-
*/
|
|
17
3
|
const readAuthMessage = (decoder, y, permissionDeniedHandler) => {
|
|
18
4
|
switch (readVarUint(decoder)) {
|
|
19
|
-
case messagePermissionDenied:
|
|
5
|
+
case messagePermissionDenied:
|
|
6
|
+
permissionDeniedHandler(y, readVarString(decoder));
|
|
20
7
|
}
|
|
21
8
|
};
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
export {
|
|
10
|
+
messagePermissionDenied,
|
|
11
|
+
readAuthMessage
|
|
12
|
+
};
|
|
@@ -1,70 +1,27 @@
|
|
|
1
|
-
import { writeVarUint, writeVarString, toUint8Array, createEncoder } from
|
|
2
|
-
import { readVarUint, readVarString, createDecoder } from
|
|
3
|
-
import { getUnixTime } from
|
|
4
|
-
import { floor } from
|
|
5
|
-
import { Observable } from
|
|
6
|
-
import { equalityDeep } from
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @module awareness-protocol
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const outdatedTimeout = 30000;
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @typedef {Object} MetaClientState
|
|
17
|
-
* @property {number} MetaClientState.clock
|
|
18
|
-
* @property {number} MetaClientState.lastUpdated unix timestamp
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information
|
|
23
|
-
* (cursor, username, status, ..). Each client can update its own local state and listen to state changes of
|
|
24
|
-
* remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline.
|
|
25
|
-
*
|
|
26
|
-
* Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override
|
|
27
|
-
* its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is
|
|
28
|
-
* applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that
|
|
29
|
-
* a remote client is offline, it may propagate a message with
|
|
30
|
-
* `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a
|
|
31
|
-
* message is received, and the known clock of that client equals the received clock, it will override the state with `null`.
|
|
32
|
-
*
|
|
33
|
-
* Before a client disconnects, it should propagate a `null` state with an updated clock.
|
|
34
|
-
*
|
|
35
|
-
* Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state.
|
|
36
|
-
*
|
|
37
|
-
* @extends {Observable<string>}
|
|
38
|
-
*/
|
|
1
|
+
import { writeVarUint, writeVarString, toUint8Array, createEncoder } from "../lib0/encoding.js";
|
|
2
|
+
import { readVarUint, readVarString, createDecoder } from "../lib0/decoding.js";
|
|
3
|
+
import { getUnixTime } from "../lib0/time.js";
|
|
4
|
+
import { floor } from "../lib0/math.js";
|
|
5
|
+
import { Observable } from "../lib0/observable.js";
|
|
6
|
+
import { equalityDeep } from "../lib0/function.js";
|
|
7
|
+
const outdatedTimeout = 3e4;
|
|
39
8
|
class Awareness extends Observable {
|
|
40
9
|
/**
|
|
41
10
|
* @param {Y.Doc} doc
|
|
42
11
|
*/
|
|
43
|
-
constructor
|
|
12
|
+
constructor(doc) {
|
|
44
13
|
super();
|
|
45
14
|
this.doc = doc;
|
|
46
|
-
/**
|
|
47
|
-
* @type {number}
|
|
48
|
-
*/
|
|
49
15
|
this.clientID = doc.clientID;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.states = new Map();
|
|
55
|
-
/**
|
|
56
|
-
* @type {Map<number, MetaClientState>}
|
|
57
|
-
*/
|
|
58
|
-
this.meta = new Map();
|
|
59
|
-
this._checkInterval = /** @type {any} */ (setInterval(() => {
|
|
16
|
+
this.states = /* @__PURE__ */ new Map();
|
|
17
|
+
this.meta = /* @__PURE__ */ new Map();
|
|
18
|
+
this._checkInterval = /** @type {any} */
|
|
19
|
+
setInterval(() => {
|
|
60
20
|
const now = getUnixTime();
|
|
61
|
-
if (this.getLocalState() !== null &&
|
|
62
|
-
|
|
21
|
+
if (this.getLocalState() !== null && outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */
|
|
22
|
+
this.meta.get(this.clientID).lastUpdated) {
|
|
63
23
|
this.setLocalState(this.getLocalState());
|
|
64
24
|
}
|
|
65
|
-
/**
|
|
66
|
-
* @type {Array<number>}
|
|
67
|
-
*/
|
|
68
25
|
const remove = [];
|
|
69
26
|
this.meta.forEach((meta, clientid) => {
|
|
70
27
|
if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {
|
|
@@ -72,36 +29,33 @@ class Awareness extends Observable {
|
|
|
72
29
|
}
|
|
73
30
|
});
|
|
74
31
|
if (remove.length > 0) {
|
|
75
|
-
removeAwarenessStates(this, remove,
|
|
32
|
+
removeAwarenessStates(this, remove, "timeout");
|
|
76
33
|
}
|
|
77
|
-
}, floor(outdatedTimeout / 10))
|
|
78
|
-
doc.on(
|
|
34
|
+
}, floor(outdatedTimeout / 10));
|
|
35
|
+
doc.on("destroy", () => {
|
|
79
36
|
this.destroy();
|
|
80
37
|
});
|
|
81
38
|
this.setLocalState({});
|
|
82
39
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
this.emit('destroy', [this]);
|
|
40
|
+
destroy() {
|
|
41
|
+
this.emit("destroy", [this]);
|
|
86
42
|
this.setLocalState(null);
|
|
87
43
|
super.destroy();
|
|
88
44
|
clearInterval(this._checkInterval);
|
|
89
45
|
}
|
|
90
|
-
|
|
91
46
|
/**
|
|
92
47
|
* @return {Object<string,any>|null}
|
|
93
48
|
*/
|
|
94
|
-
getLocalState
|
|
95
|
-
return this.states.get(this.clientID) || null
|
|
49
|
+
getLocalState() {
|
|
50
|
+
return this.states.get(this.clientID) || null;
|
|
96
51
|
}
|
|
97
|
-
|
|
98
52
|
/**
|
|
99
53
|
* @param {Object<string,any>|null} state
|
|
100
54
|
*/
|
|
101
|
-
setLocalState
|
|
55
|
+
setLocalState(state) {
|
|
102
56
|
const clientID = this.clientID;
|
|
103
57
|
const currLocalMeta = this.meta.get(clientID);
|
|
104
|
-
const clock = currLocalMeta ===
|
|
58
|
+
const clock = currLocalMeta === void 0 ? 0 : currLocalMeta.clock + 1;
|
|
105
59
|
const prevState = this.states.get(clientID);
|
|
106
60
|
if (state === null) {
|
|
107
61
|
this.states.delete(clientID);
|
|
@@ -129,16 +83,15 @@ class Awareness extends Observable {
|
|
|
129
83
|
}
|
|
130
84
|
}
|
|
131
85
|
if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {
|
|
132
|
-
this.emit(
|
|
86
|
+
this.emit("change", [{ added, updated: filteredUpdated, removed }, "local"]);
|
|
133
87
|
}
|
|
134
|
-
this.emit(
|
|
88
|
+
this.emit("update", [{ added, updated, removed }, "local"]);
|
|
135
89
|
}
|
|
136
|
-
|
|
137
90
|
/**
|
|
138
91
|
* @param {string} field
|
|
139
92
|
* @param {any} value
|
|
140
93
|
*/
|
|
141
|
-
setLocalStateField
|
|
94
|
+
setLocalStateField(field, value) {
|
|
142
95
|
const state = this.getLocalState();
|
|
143
96
|
if (state !== null) {
|
|
144
97
|
this.setLocalState({
|
|
@@ -147,23 +100,13 @@ class Awareness extends Observable {
|
|
|
147
100
|
});
|
|
148
101
|
}
|
|
149
102
|
}
|
|
150
|
-
|
|
151
103
|
/**
|
|
152
104
|
* @return {Map<number,Object<string,any>>}
|
|
153
105
|
*/
|
|
154
|
-
getStates
|
|
155
|
-
return this.states
|
|
106
|
+
getStates() {
|
|
107
|
+
return this.states;
|
|
156
108
|
}
|
|
157
109
|
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Mark (remote) clients as inactive and remove them from the list of active peers.
|
|
161
|
-
* This change will be propagated to remote clients.
|
|
162
|
-
*
|
|
163
|
-
* @param {Awareness} awareness
|
|
164
|
-
* @param {Array<number>} clients
|
|
165
|
-
* @param {any} origin
|
|
166
|
-
*/
|
|
167
110
|
const removeAwarenessStates = (awareness, clients, origin) => {
|
|
168
111
|
const removed = [];
|
|
169
112
|
for (let i = 0; i < clients.length; i++) {
|
|
@@ -171,7 +114,10 @@ const removeAwarenessStates = (awareness, clients, origin) => {
|
|
|
171
114
|
if (awareness.states.has(clientID)) {
|
|
172
115
|
awareness.states.delete(clientID);
|
|
173
116
|
if (clientID === awareness.clientID) {
|
|
174
|
-
const curMeta =
|
|
117
|
+
const curMeta = (
|
|
118
|
+
/** @type {MetaClientState} */
|
|
119
|
+
awareness.meta.get(clientID)
|
|
120
|
+
);
|
|
175
121
|
awareness.meta.set(clientID, {
|
|
176
122
|
clock: curMeta.clock + 1,
|
|
177
123
|
lastUpdated: getUnixTime()
|
|
@@ -181,16 +127,10 @@ const removeAwarenessStates = (awareness, clients, origin) => {
|
|
|
181
127
|
}
|
|
182
128
|
}
|
|
183
129
|
if (removed.length > 0) {
|
|
184
|
-
awareness.emit(
|
|
185
|
-
awareness.emit(
|
|
130
|
+
awareness.emit("change", [{ added: [], updated: [], removed }, origin]);
|
|
131
|
+
awareness.emit("update", [{ added: [], updated: [], removed }, origin]);
|
|
186
132
|
}
|
|
187
133
|
};
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* @param {Awareness} awareness
|
|
191
|
-
* @param {Array<number>} clients
|
|
192
|
-
* @return {Uint8Array}
|
|
193
|
-
*/
|
|
194
134
|
const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => {
|
|
195
135
|
const len = clients.length;
|
|
196
136
|
const encoder = createEncoder();
|
|
@@ -198,19 +138,16 @@ const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) =>
|
|
|
198
138
|
for (let i = 0; i < len; i++) {
|
|
199
139
|
const clientID = clients[i];
|
|
200
140
|
const state = states.get(clientID) || null;
|
|
201
|
-
const clock =
|
|
141
|
+
const clock = (
|
|
142
|
+
/** @type {MetaClientState} */
|
|
143
|
+
awareness.meta.get(clientID).clock
|
|
144
|
+
);
|
|
202
145
|
writeVarUint(encoder, clientID);
|
|
203
146
|
writeVarUint(encoder, clock);
|
|
204
147
|
writeVarString(encoder, JSON.stringify(state));
|
|
205
148
|
}
|
|
206
|
-
return toUint8Array(encoder)
|
|
149
|
+
return toUint8Array(encoder);
|
|
207
150
|
};
|
|
208
|
-
|
|
209
|
-
/**
|
|
210
|
-
* @param {Awareness} awareness
|
|
211
|
-
* @param {Uint8Array} update
|
|
212
|
-
* @param {any} origin This will be added to the emitted change event
|
|
213
|
-
*/
|
|
214
151
|
const applyAwarenessUpdate = (awareness, update, origin) => {
|
|
215
152
|
const decoder = createDecoder(update);
|
|
216
153
|
const timestamp = getUnixTime();
|
|
@@ -225,13 +162,10 @@ const applyAwarenessUpdate = (awareness, update, origin) => {
|
|
|
225
162
|
const state = JSON.parse(readVarString(decoder));
|
|
226
163
|
const clientMeta = awareness.meta.get(clientID);
|
|
227
164
|
const prevState = awareness.states.get(clientID);
|
|
228
|
-
const currClock = clientMeta ===
|
|
229
|
-
if (currClock < clock ||
|
|
165
|
+
const currClock = clientMeta === void 0 ? 0 : clientMeta.clock;
|
|
166
|
+
if (currClock < clock || currClock === clock && state === null && awareness.states.has(clientID)) {
|
|
230
167
|
if (state === null) {
|
|
231
|
-
// never let a remote client remove this local state
|
|
232
168
|
if (clientID === awareness.clientID && awareness.getLocalState() != null) {
|
|
233
|
-
// remote client removed the local state. Do not remote state. Broadcast a message indicating
|
|
234
|
-
// that this client still exists by increasing the clock
|
|
235
169
|
clock++;
|
|
236
170
|
} else {
|
|
237
171
|
awareness.states.delete(clientID);
|
|
@@ -243,9 +177,9 @@ const applyAwarenessUpdate = (awareness, update, origin) => {
|
|
|
243
177
|
clock,
|
|
244
178
|
lastUpdated: timestamp
|
|
245
179
|
});
|
|
246
|
-
if (clientMeta ===
|
|
180
|
+
if (clientMeta === void 0 && state !== null) {
|
|
247
181
|
added.push(clientID);
|
|
248
|
-
} else if (clientMeta !==
|
|
182
|
+
} else if (clientMeta !== void 0 && state === null) {
|
|
249
183
|
removed.push(clientID);
|
|
250
184
|
} else if (state !== null) {
|
|
251
185
|
if (!equalityDeep(state, prevState)) {
|
|
@@ -256,15 +190,24 @@ const applyAwarenessUpdate = (awareness, update, origin) => {
|
|
|
256
190
|
}
|
|
257
191
|
}
|
|
258
192
|
if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {
|
|
259
|
-
awareness.emit(
|
|
260
|
-
added,
|
|
193
|
+
awareness.emit("change", [{
|
|
194
|
+
added,
|
|
195
|
+
updated: filteredUpdated,
|
|
196
|
+
removed
|
|
261
197
|
}, origin]);
|
|
262
198
|
}
|
|
263
199
|
if (added.length > 0 || updated.length > 0 || removed.length > 0) {
|
|
264
|
-
awareness.emit(
|
|
265
|
-
added,
|
|
200
|
+
awareness.emit("update", [{
|
|
201
|
+
added,
|
|
202
|
+
updated,
|
|
203
|
+
removed
|
|
266
204
|
}, origin]);
|
|
267
205
|
}
|
|
268
206
|
};
|
|
269
|
-
|
|
270
|
-
|
|
207
|
+
export {
|
|
208
|
+
Awareness,
|
|
209
|
+
applyAwarenessUpdate,
|
|
210
|
+
encodeAwarenessUpdate,
|
|
211
|
+
outdatedTimeout,
|
|
212
|
+
removeAwarenessStates
|
|
213
|
+
};
|