@node-projects/web-component-designer 0.1.350 → 0.1.351
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/dist/elements/documentContainer.js +4 -0
- package/dist/elements/documentContainer.js.map +1 -1
- package/dist/elements/helper/PathDataPolyfill.d.ts +1 -1
- package/dist/elements/helper/PathDataPolyfill.js +11 -49
- package/dist/elements/helper/PathDataPolyfill.js.map +1 -1
- package/dist/elements/helper/QuadEdgeHandleHelper.d.ts +5 -0
- package/dist/elements/helper/QuadEdgeHandleHelper.js +42 -0
- package/dist/elements/helper/QuadEdgeHandleHelper.js.map +1 -0
- package/dist/elements/item/DesignItem.d.ts +1 -1
- package/dist/elements/services/DefaultServiceBootstrap.js +4 -0
- package/dist/elements/services/DefaultServiceBootstrap.js.map +1 -1
- package/dist/elements/services/GlobalContext.js +1 -1
- package/dist/elements/services/GlobalContext.js.map +1 -1
- package/dist/elements/services/InstanceServiceContainer.d.ts +2 -0
- package/dist/elements/services/InstanceServiceContainer.js +1 -0
- package/dist/elements/services/InstanceServiceContainer.js.map +1 -1
- package/dist/elements/services/ServiceContainer.d.ts +2 -0
- package/dist/elements/services/ServiceContainer.js.map +1 -1
- package/dist/elements/services/collaborationService/CollaborationNodeIndex.d.ts +4 -0
- package/dist/elements/services/collaborationService/CollaborationNodeIndex.js +46 -0
- package/dist/elements/services/collaborationService/CollaborationNodeIndex.js.map +1 -0
- package/dist/elements/services/collaborationService/DefaultCollaborationService.d.ts +45 -0
- package/dist/elements/services/collaborationService/DefaultCollaborationService.js +298 -0
- package/dist/elements/services/collaborationService/DefaultCollaborationService.js.map +1 -0
- package/dist/elements/services/collaborationService/ICollaborationService.d.ts +102 -0
- package/dist/elements/services/collaborationService/ICollaborationService.js +2 -0
- package/dist/elements/services/collaborationService/ICollaborationService.js.map +1 -0
- package/dist/elements/services/collaborationService/WebRtcTabCollaborationTransport.d.ts +95 -0
- package/dist/elements/services/collaborationService/WebRtcTabCollaborationTransport.js +571 -0
- package/dist/elements/services/collaborationService/WebRtcTabCollaborationTransport.js.map +1 -0
- package/dist/elements/services/placementService/AbsolutePlacementService.js +1 -1
- package/dist/elements/services/placementService/AbsolutePlacementService.js.map +1 -1
- package/dist/elements/services/placementService/DefaultPlacementService.js +1 -1
- package/dist/elements/services/placementService/DefaultPlacementService.js.map +1 -1
- package/dist/elements/services/undoService/ChangeGroup.d.ts +3 -1
- package/dist/elements/services/undoService/ChangeGroup.js +3 -1
- package/dist/elements/services/undoService/ChangeGroup.js.map +1 -1
- package/dist/elements/services/undoService/IUndoChangeEvent.d.ts +8 -0
- package/dist/elements/services/undoService/IUndoChangeEvent.js +2 -0
- package/dist/elements/services/undoService/IUndoChangeEvent.js.map +1 -0
- package/dist/elements/services/undoService/IUndoService.d.ts +7 -4
- package/dist/elements/services/undoService/UndoService.d.ts +8 -4
- package/dist/elements/services/undoService/UndoService.js +14 -5
- package/dist/elements/services/undoService/UndoService.js.map +1 -1
- package/dist/elements/widgets/designerView/DomConverter.d.ts +1 -1
- package/dist/elements/widgets/designerView/designerCanvas.js +10 -0
- package/dist/elements/widgets/designerView/designerCanvas.js.map +1 -1
- package/dist/elements/widgets/designerView/extensions/CollaborationCursorOverlayExtension.d.ts +11 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationCursorOverlayExtension.js +72 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationCursorOverlayExtension.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationCursorOverlayExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationCursorOverlayExtensionProvider.js +22 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationCursorOverlayExtensionProvider.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationOverlayExtension.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationOverlayExtension.js +116 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationOverlayExtension.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationOverlayExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationOverlayExtensionProvider.js +31 -0
- package/dist/elements/widgets/designerView/extensions/CollaborationOverlayExtensionProvider.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +10 -0
- package/dist/elements/widgets/designerView/extensions/ExtensionManager.js.map +1 -1
- package/dist/elements/widgets/designerView/extensions/ProjectiveTransformExtension.d.ts +33 -0
- package/dist/elements/widgets/designerView/extensions/ProjectiveTransformExtension.js +337 -0
- package/dist/elements/widgets/designerView/extensions/ProjectiveTransformExtension.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/ProjectiveTransformExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/ProjectiveTransformExtensionProvider.js +22 -0
- package/dist/elements/widgets/designerView/extensions/ProjectiveTransformExtensionProvider.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/QuadEdgeHandleHelper.d.ts +5 -0
- package/dist/elements/widgets/designerView/extensions/QuadEdgeHandleHelper.js +42 -0
- package/dist/elements/widgets/designerView/extensions/QuadEdgeHandleHelper.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/RotateExtension.d.ts +3 -2
- package/dist/elements/widgets/designerView/extensions/RotateExtension.js +46 -13
- package/dist/elements/widgets/designerView/extensions/RotateExtension.js.map +1 -1
- package/dist/elements/widgets/designerView/extensions/SkewExtension.d.ts +30 -0
- package/dist/elements/widgets/designerView/extensions/SkewExtension.js +291 -0
- package/dist/elements/widgets/designerView/extensions/SkewExtension.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/SkewExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/SkewExtensionProvider.js +20 -0
- package/dist/elements/widgets/designerView/extensions/SkewExtensionProvider.js.map +1 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/CollaborationCommentsContextMenu.d.ts +9 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/CollaborationCommentsContextMenu.js +72 -0
- package/dist/elements/widgets/designerView/extensions/contextMenu/CollaborationCommentsContextMenu.js.map +1 -0
- package/dist/elements/widgets/designerView/tools/DrawPathTool.d.ts +6 -1
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js +7 -3
- package/dist/elements/widgets/designerView/tools/DrawPathTool.js.map +1 -1
- package/dist/index-min.js +7 -7
- package/dist/index-min.js.map +4 -4
- package/dist/index.d.ts +8 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { IDesignItem } from '../../item/IDesignItem.js';
|
|
2
|
+
export declare function getCollaborationNodeIndex(designItem: IDesignItem, cache?: Record<string | symbol, any>): number;
|
|
3
|
+
export declare function getCollaborationNodeIndexes(designItems: IDesignItem[], cache?: Record<string | symbol, any>): number[];
|
|
4
|
+
export declare function getDesignItemByCollaborationNodeIndex(rootDesignItem: IDesignItem, nodeIndex: number, cache?: Record<string | symbol, any>): IDesignItem;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { NodeType } from '../../item/NodeType.js';
|
|
2
|
+
const collaborationNodeIndexCacheKey = Symbol('collaborationNodeIndexCache');
|
|
3
|
+
function buildCache(rootDesignItem) {
|
|
4
|
+
const orderedItems = [];
|
|
5
|
+
const byItem = new WeakMap();
|
|
6
|
+
let index = 0;
|
|
7
|
+
const visit = (designItem) => {
|
|
8
|
+
if (!designItem)
|
|
9
|
+
return;
|
|
10
|
+
if (!designItem.isRootItem && designItem.nodeType === NodeType.Element) {
|
|
11
|
+
orderedItems.push(designItem);
|
|
12
|
+
byItem.set(designItem, index++);
|
|
13
|
+
}
|
|
14
|
+
if (designItem.hasChildren) {
|
|
15
|
+
for (const child of designItem.children())
|
|
16
|
+
visit(child);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
visit(rootDesignItem);
|
|
20
|
+
return { orderedItems, byItem };
|
|
21
|
+
}
|
|
22
|
+
function getCache(rootDesignItem, cache) {
|
|
23
|
+
if (cache?.[collaborationNodeIndexCacheKey])
|
|
24
|
+
return cache[collaborationNodeIndexCacheKey];
|
|
25
|
+
const nodeIndexCache = buildCache(rootDesignItem);
|
|
26
|
+
if (cache)
|
|
27
|
+
cache[collaborationNodeIndexCacheKey] = nodeIndexCache;
|
|
28
|
+
return nodeIndexCache;
|
|
29
|
+
}
|
|
30
|
+
export function getCollaborationNodeIndex(designItem, cache) {
|
|
31
|
+
if (!designItem || designItem.isRootItem)
|
|
32
|
+
return null;
|
|
33
|
+
const rootDesignItem = designItem.instanceServiceContainer.contentService.rootDesignItem;
|
|
34
|
+
return getCache(rootDesignItem, cache).byItem.get(designItem) ?? null;
|
|
35
|
+
}
|
|
36
|
+
export function getCollaborationNodeIndexes(designItems, cache) {
|
|
37
|
+
if (!designItems?.length)
|
|
38
|
+
return [];
|
|
39
|
+
return designItems.map(x => getCollaborationNodeIndex(x, cache)).filter(x => x != null);
|
|
40
|
+
}
|
|
41
|
+
export function getDesignItemByCollaborationNodeIndex(rootDesignItem, nodeIndex, cache) {
|
|
42
|
+
if (nodeIndex == null || nodeIndex < 0)
|
|
43
|
+
return null;
|
|
44
|
+
return getCache(rootDesignItem, cache).orderedItems[nodeIndex] ?? null;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=CollaborationNodeIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollaborationNodeIndex.js","sourceRoot":"","sources":["../../../../src/elements/services/collaborationService/CollaborationNodeIndex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAOlD,MAAM,8BAA8B,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAE7E,SAAS,UAAU,CAAC,cAA2B;IAC7C,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,OAAO,EAAuB,CAAC;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,KAAK,GAAG,CAAC,UAAuB,EAAE,EAAE;QACxC,IAAI,CAAC,UAAU;YACb,OAAO;QAET,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,QAAQ,EAAE;gBACvC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,CAAC,cAAc,CAAC,CAAC;IAEtB,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,QAAQ,CAAC,cAA2B,EAAE,KAAoC;IACjF,IAAI,KAAK,EAAE,CAAC,8BAA8B,CAAC;QACzC,OAAO,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAE/C,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAClD,IAAI,KAAK;QACP,KAAK,CAAC,8BAA8B,CAAC,GAAG,cAAc,CAAC;IACzD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAuB,EAAE,KAAoC;IACrG,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU;QACtC,OAAO,IAAI,CAAC;IAEd,MAAM,cAAc,GAAG,UAAU,CAAC,wBAAwB,CAAC,cAAc,CAAC,cAAc,CAAC;IACzF,OAAO,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,WAA0B,EAAE,KAAoC;IAC1G,IAAI,CAAC,WAAW,EAAE,MAAM;QACtB,OAAO,EAAE,CAAC;IAEZ,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,qCAAqC,CAAC,cAA2B,EAAE,SAAiB,EAAE,KAAoC;IACxI,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,CAAC;QACpC,OAAO,IAAI,CAAC;IAEd,OAAO,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
import { IDesignerCanvas } from '../../widgets/designerView/IDesignerCanvas.js';
|
|
3
|
+
import { IUndoChangeEvent, UndoChangeSource } from '../undoService/IUndoChangeEvent.js';
|
|
4
|
+
import { CollaborationConnectionState, ICollaborationComment, ICollaborationCommentsChangedEvent, ICollaborationDocumentSnapshot, ICollaborationPeerPresence, ICollaborationPeersChangedEvent, ICollaborationRemoteChange, ICollaborationSelectionEvent, ICollaborationService, ICollaborationSession, ICollaborationStateChangedEvent, ICollaborationTransport } from './ICollaborationService.js';
|
|
5
|
+
export declare class DefaultCollaborationService implements ICollaborationService {
|
|
6
|
+
private _designerCanvas;
|
|
7
|
+
private _state;
|
|
8
|
+
private _session;
|
|
9
|
+
private _transport;
|
|
10
|
+
private _peers;
|
|
11
|
+
private _comments;
|
|
12
|
+
private _applyingRemoteChanges;
|
|
13
|
+
private _lastLocalCursorPosition;
|
|
14
|
+
private _lastLocalCursorUpdate;
|
|
15
|
+
private _refreshExtensionsHandle;
|
|
16
|
+
constructor(_designerCanvas: IDesignerCanvas);
|
|
17
|
+
get state(): CollaborationConnectionState;
|
|
18
|
+
get session(): ICollaborationSession;
|
|
19
|
+
get peers(): readonly ICollaborationPeerPresence[];
|
|
20
|
+
get comments(): readonly ICollaborationComment[];
|
|
21
|
+
get transport(): ICollaborationTransport;
|
|
22
|
+
get isApplyingRemoteChanges(): boolean;
|
|
23
|
+
attachTransport(transport: ICollaborationTransport): void;
|
|
24
|
+
detachTransport(): void;
|
|
25
|
+
connect(sessionId: string, peerId: string, displayName?: string): void;
|
|
26
|
+
disconnect(): void;
|
|
27
|
+
createSnapshot(): ICollaborationDocumentSnapshot;
|
|
28
|
+
applyRemoteSnapshot(snapshot: ICollaborationDocumentSnapshot): Promise<void>;
|
|
29
|
+
applyRemoteChange(change: ICollaborationRemoteChange, snapshot?: ICollaborationDocumentSnapshot): Promise<void>;
|
|
30
|
+
updateRemoteSelection(peerId: string, selectedNodeIndexes: number[], primaryNodeIndex?: number): void;
|
|
31
|
+
updatePeerPresence(peer: ICollaborationPeerPresence, source?: UndoChangeSource): void;
|
|
32
|
+
removePeer(peerId: string, source?: UndoChangeSource): void;
|
|
33
|
+
upsertComment(comment: ICollaborationComment, source?: UndoChangeSource): void;
|
|
34
|
+
removeComment(commentId: string, source?: UndoChangeSource): void;
|
|
35
|
+
readonly onStateChanged: TypedEvent<ICollaborationStateChangedEvent>;
|
|
36
|
+
readonly onChange: TypedEvent<IUndoChangeEvent>;
|
|
37
|
+
readonly onSelectionChanged: TypedEvent<ICollaborationSelectionEvent>;
|
|
38
|
+
readonly onPeersChanged: TypedEvent<ICollaborationPeersChangedEvent>;
|
|
39
|
+
readonly onCommentsChanged: TypedEvent<ICollaborationCommentsChangedEvent>;
|
|
40
|
+
private storePeerPresence;
|
|
41
|
+
private requestExtensionRefresh;
|
|
42
|
+
private _handlePointerMove;
|
|
43
|
+
private _handlePointerLeave;
|
|
44
|
+
private getCurrentSelectionState;
|
|
45
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
import { DomConverter } from '../../widgets/designerView/DomConverter.js';
|
|
3
|
+
import { getCollaborationNodeIndex, getCollaborationNodeIndexes, getDesignItemByCollaborationNodeIndex } from './CollaborationNodeIndex.js';
|
|
4
|
+
function createPeerColor(peerId) {
|
|
5
|
+
let hash = 0;
|
|
6
|
+
for (let i = 0; i < peerId.length; i++)
|
|
7
|
+
hash = ((hash << 5) - hash) + peerId.charCodeAt(i);
|
|
8
|
+
const hue = Math.abs(hash) % 360;
|
|
9
|
+
return `hsl(${hue}deg 74% 48%)`;
|
|
10
|
+
}
|
|
11
|
+
function createSyntheticTransactionItem(title) {
|
|
12
|
+
return {
|
|
13
|
+
title: title ?? 'remote change',
|
|
14
|
+
affectedItems: [],
|
|
15
|
+
do: () => { },
|
|
16
|
+
undo: () => { },
|
|
17
|
+
mergeWith: () => false
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export class DefaultCollaborationService {
|
|
21
|
+
_designerCanvas;
|
|
22
|
+
_state = 'disconnected';
|
|
23
|
+
_session = null;
|
|
24
|
+
_transport = null;
|
|
25
|
+
_peers = new Map();
|
|
26
|
+
_comments = new Map();
|
|
27
|
+
_applyingRemoteChanges = false;
|
|
28
|
+
_lastLocalCursorPosition;
|
|
29
|
+
_lastLocalCursorUpdate = 0;
|
|
30
|
+
_refreshExtensionsHandle = null;
|
|
31
|
+
constructor(_designerCanvas) {
|
|
32
|
+
this._designerCanvas = _designerCanvas;
|
|
33
|
+
this._designerCanvas.instanceServiceContainer.undoService.onTransaction.on(change => {
|
|
34
|
+
if (this._applyingRemoteChanges)
|
|
35
|
+
return;
|
|
36
|
+
this.onChange.emit(change);
|
|
37
|
+
if (change.source !== 'remote')
|
|
38
|
+
void this._transport?.sendChange({ kind: change.kind, title: change.item?.title }, this.createSnapshot());
|
|
39
|
+
});
|
|
40
|
+
this._designerCanvas.instanceServiceContainer.selectionService.onSelectionChanged.on(() => {
|
|
41
|
+
if (!this._session || this._applyingRemoteChanges)
|
|
42
|
+
return;
|
|
43
|
+
const selectedElements = this._designerCanvas.instanceServiceContainer.selectionService.selectedElements;
|
|
44
|
+
const selectedNodeIndexes = getCollaborationNodeIndexes(selectedElements);
|
|
45
|
+
const primaryDesignItem = this._designerCanvas.instanceServiceContainer.selectionService.primarySelection;
|
|
46
|
+
const primaryNodeIndex = getCollaborationNodeIndex(primaryDesignItem);
|
|
47
|
+
const selectedDesignItemIds = selectedElements
|
|
48
|
+
.map(x => x?.id)
|
|
49
|
+
.filter(x => !!x);
|
|
50
|
+
const primaryDesignItemId = primaryDesignItem?.id;
|
|
51
|
+
this.storePeerPresence({
|
|
52
|
+
peerId: this._session.peerId,
|
|
53
|
+
displayName: this._session.displayName,
|
|
54
|
+
color: this._peers.get(this._session.peerId)?.color ?? createPeerColor(this._session.peerId),
|
|
55
|
+
activeDesignItemId: primaryDesignItemId,
|
|
56
|
+
activeNodeIndex: primaryNodeIndex,
|
|
57
|
+
selectedDesignItemIds,
|
|
58
|
+
selectedNodeIndexes,
|
|
59
|
+
updatedAt: Date.now()
|
|
60
|
+
}, 'local');
|
|
61
|
+
const event = {
|
|
62
|
+
source: 'local',
|
|
63
|
+
peerId: this._session.peerId,
|
|
64
|
+
selectedNodeIndexes,
|
|
65
|
+
primaryNodeIndex,
|
|
66
|
+
selectedDesignItemIds,
|
|
67
|
+
primaryDesignItemId
|
|
68
|
+
};
|
|
69
|
+
this.onSelectionChanged.emit(event);
|
|
70
|
+
void this._transport?.sendSelection(event);
|
|
71
|
+
});
|
|
72
|
+
this._designerCanvas.clickOverlay.addEventListener('pointermove', this._handlePointerMove);
|
|
73
|
+
this._designerCanvas.clickOverlay.addEventListener('pointerleave', this._handlePointerLeave);
|
|
74
|
+
}
|
|
75
|
+
get state() {
|
|
76
|
+
return this._state;
|
|
77
|
+
}
|
|
78
|
+
get session() {
|
|
79
|
+
return this._session;
|
|
80
|
+
}
|
|
81
|
+
get peers() {
|
|
82
|
+
return [...this._peers.values()];
|
|
83
|
+
}
|
|
84
|
+
get comments() {
|
|
85
|
+
return [...this._comments.values()];
|
|
86
|
+
}
|
|
87
|
+
get transport() {
|
|
88
|
+
return this._transport;
|
|
89
|
+
}
|
|
90
|
+
get isApplyingRemoteChanges() {
|
|
91
|
+
return this._applyingRemoteChanges;
|
|
92
|
+
}
|
|
93
|
+
attachTransport(transport) {
|
|
94
|
+
if (this._transport === transport)
|
|
95
|
+
return;
|
|
96
|
+
this.detachTransport();
|
|
97
|
+
this._transport = transport;
|
|
98
|
+
void this._transport?.attach(this);
|
|
99
|
+
if (this._session)
|
|
100
|
+
void this._transport?.connect(this._session);
|
|
101
|
+
}
|
|
102
|
+
detachTransport() {
|
|
103
|
+
if (this._transport) {
|
|
104
|
+
void this._transport.disconnect();
|
|
105
|
+
void this._transport.detach();
|
|
106
|
+
}
|
|
107
|
+
this._transport = null;
|
|
108
|
+
}
|
|
109
|
+
connect(sessionId, peerId, displayName) {
|
|
110
|
+
const currentSelection = this.getCurrentSelectionState();
|
|
111
|
+
this._state = 'connected';
|
|
112
|
+
this._session = { sessionId, peerId, displayName: displayName ?? `peer-${peerId.substring(0, 4)}` };
|
|
113
|
+
this.onStateChanged.emit({ state: this._state, session: this._session });
|
|
114
|
+
this.updatePeerPresence({
|
|
115
|
+
peerId,
|
|
116
|
+
displayName: this._session.displayName,
|
|
117
|
+
color: createPeerColor(peerId),
|
|
118
|
+
activeDesignItemId: currentSelection.primaryDesignItemId,
|
|
119
|
+
activeNodeIndex: currentSelection.primaryNodeIndex,
|
|
120
|
+
selectedDesignItemIds: currentSelection.selectedDesignItemIds,
|
|
121
|
+
selectedNodeIndexes: currentSelection.selectedNodeIndexes,
|
|
122
|
+
updatedAt: Date.now()
|
|
123
|
+
}, 'local');
|
|
124
|
+
void this._transport?.connect(this._session);
|
|
125
|
+
}
|
|
126
|
+
disconnect() {
|
|
127
|
+
const previousSession = this._session;
|
|
128
|
+
if (previousSession?.peerId)
|
|
129
|
+
this._peers.delete(previousSession.peerId);
|
|
130
|
+
this._lastLocalCursorPosition = undefined;
|
|
131
|
+
void this._transport?.disconnect();
|
|
132
|
+
this._session = null;
|
|
133
|
+
this._state = 'disconnected';
|
|
134
|
+
this.onStateChanged.emit({ state: this._state, session: previousSession });
|
|
135
|
+
this.onPeersChanged.emit({ source: 'local', peerId: previousSession?.peerId, peers: this.peers });
|
|
136
|
+
}
|
|
137
|
+
createSnapshot() {
|
|
138
|
+
const html = this._designerCanvas.rootDesignItem.childCount > 0
|
|
139
|
+
? DomConverter.ConvertToString(Array.from(this._designerCanvas.rootDesignItem.children()), true, true)
|
|
140
|
+
: '';
|
|
141
|
+
const stylesheets = this._designerCanvas.instanceServiceContainer.stylesheetService?.getStylesheets()?.map(x => ({ ...x })) ?? [];
|
|
142
|
+
return { html, stylesheets, updatedAt: Date.now() };
|
|
143
|
+
}
|
|
144
|
+
async applyRemoteSnapshot(snapshot) {
|
|
145
|
+
try {
|
|
146
|
+
this._applyingRemoteChanges = true;
|
|
147
|
+
const designItems = snapshot.html
|
|
148
|
+
? await this._designerCanvas.serviceContainer.htmlParserService.parse(snapshot.html, this._designerCanvas.serviceContainer, this._designerCanvas.instanceServiceContainer, false)
|
|
149
|
+
: [];
|
|
150
|
+
this._designerCanvas._internalSetDesignItems(designItems);
|
|
151
|
+
if (this._designerCanvas.instanceServiceContainer.stylesheetService)
|
|
152
|
+
await this._designerCanvas.instanceServiceContainer.stylesheetService.setStylesheets(snapshot.stylesheets ?? []);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
this._applyingRemoteChanges = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async applyRemoteChange(change, snapshot) {
|
|
159
|
+
if (snapshot)
|
|
160
|
+
await this.applyRemoteSnapshot(snapshot);
|
|
161
|
+
this.onChange.emit({
|
|
162
|
+
item: createSyntheticTransactionItem(change.title),
|
|
163
|
+
kind: change.kind,
|
|
164
|
+
source: 'remote'
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
updateRemoteSelection(peerId, selectedNodeIndexes, primaryNodeIndex) {
|
|
168
|
+
const rootDesignItem = this._designerCanvas.instanceServiceContainer.contentService.rootDesignItem;
|
|
169
|
+
const selectedDesignItemIds = selectedNodeIndexes
|
|
170
|
+
.map(x => getDesignItemByCollaborationNodeIndex(rootDesignItem, x)?.id)
|
|
171
|
+
.filter(x => !!x);
|
|
172
|
+
const primaryDesignItemId = primaryNodeIndex != null
|
|
173
|
+
? getDesignItemByCollaborationNodeIndex(rootDesignItem, primaryNodeIndex)?.id
|
|
174
|
+
: undefined;
|
|
175
|
+
this.storePeerPresence({
|
|
176
|
+
peerId,
|
|
177
|
+
activeDesignItemId: primaryDesignItemId,
|
|
178
|
+
activeNodeIndex: primaryNodeIndex,
|
|
179
|
+
selectedDesignItemIds,
|
|
180
|
+
selectedNodeIndexes,
|
|
181
|
+
updatedAt: Date.now()
|
|
182
|
+
}, 'remote');
|
|
183
|
+
this.onSelectionChanged.emit({
|
|
184
|
+
source: 'remote',
|
|
185
|
+
peerId,
|
|
186
|
+
selectedNodeIndexes,
|
|
187
|
+
primaryNodeIndex,
|
|
188
|
+
selectedDesignItemIds,
|
|
189
|
+
primaryDesignItemId
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
updatePeerPresence(peer, source = 'local') {
|
|
193
|
+
const normalizedPeer = { ...peer, color: peer.color ?? createPeerColor(peer.peerId) };
|
|
194
|
+
this.storePeerPresence(normalizedPeer, source);
|
|
195
|
+
if (source !== 'remote')
|
|
196
|
+
void this._transport?.sendPresence(normalizedPeer);
|
|
197
|
+
}
|
|
198
|
+
removePeer(peerId, source = 'local') {
|
|
199
|
+
this._peers.delete(peerId);
|
|
200
|
+
this.onPeersChanged.emit({ source, peerId, peers: this.peers });
|
|
201
|
+
if (source === 'remote')
|
|
202
|
+
this.requestExtensionRefresh();
|
|
203
|
+
}
|
|
204
|
+
upsertComment(comment, source = 'local') {
|
|
205
|
+
const normalizedComment = {
|
|
206
|
+
...comment,
|
|
207
|
+
updatedAt: comment.updatedAt ?? Date.now()
|
|
208
|
+
};
|
|
209
|
+
this._comments.set(normalizedComment.id, normalizedComment);
|
|
210
|
+
const event = {
|
|
211
|
+
source,
|
|
212
|
+
comment: normalizedComment,
|
|
213
|
+
comments: this.comments
|
|
214
|
+
};
|
|
215
|
+
this.onCommentsChanged.emit(event);
|
|
216
|
+
this.requestExtensionRefresh();
|
|
217
|
+
if (source !== 'remote')
|
|
218
|
+
void this._transport?.sendComment(event);
|
|
219
|
+
}
|
|
220
|
+
removeComment(commentId, source = 'local') {
|
|
221
|
+
this._comments.delete(commentId);
|
|
222
|
+
const event = {
|
|
223
|
+
source,
|
|
224
|
+
commentId,
|
|
225
|
+
comments: this.comments
|
|
226
|
+
};
|
|
227
|
+
this.onCommentsChanged.emit(event);
|
|
228
|
+
this.requestExtensionRefresh();
|
|
229
|
+
if (source !== 'remote')
|
|
230
|
+
void this._transport?.sendComment(event);
|
|
231
|
+
}
|
|
232
|
+
onStateChanged = new TypedEvent();
|
|
233
|
+
onChange = new TypedEvent();
|
|
234
|
+
onSelectionChanged = new TypedEvent();
|
|
235
|
+
onPeersChanged = new TypedEvent();
|
|
236
|
+
onCommentsChanged = new TypedEvent();
|
|
237
|
+
storePeerPresence(peer, source) {
|
|
238
|
+
const currentPeer = this._peers.get(peer.peerId);
|
|
239
|
+
const nextPeer = { ...currentPeer, ...peer, color: peer.color ?? currentPeer?.color ?? createPeerColor(peer.peerId), updatedAt: peer.updatedAt ?? Date.now() };
|
|
240
|
+
this._peers.set(peer.peerId, nextPeer);
|
|
241
|
+
this.onPeersChanged.emit({ source, peer: nextPeer, peers: this.peers });
|
|
242
|
+
if (source === 'remote')
|
|
243
|
+
this.requestExtensionRefresh();
|
|
244
|
+
}
|
|
245
|
+
requestExtensionRefresh() {
|
|
246
|
+
if (this._refreshExtensionsHandle != null)
|
|
247
|
+
return;
|
|
248
|
+
this._refreshExtensionsHandle = requestAnimationFrame(() => {
|
|
249
|
+
this._refreshExtensionsHandle = null;
|
|
250
|
+
this._designerCanvas.extensionManager?.refreshAllAppliedExtentions();
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
_handlePointerMove = (event) => {
|
|
254
|
+
if (!this._session || this._applyingRemoteChanges)
|
|
255
|
+
return;
|
|
256
|
+
const now = Date.now();
|
|
257
|
+
const cursorPosition = this._designerCanvas.getNormalizedEventCoordinates(event);
|
|
258
|
+
const previousPosition = this._lastLocalCursorPosition;
|
|
259
|
+
const hasMoved = !previousPosition
|
|
260
|
+
|| Math.abs(previousPosition.x - cursorPosition.x) >= 1
|
|
261
|
+
|| Math.abs(previousPosition.y - cursorPosition.y) >= 1;
|
|
262
|
+
if (!hasMoved && now - this._lastLocalCursorUpdate < 40)
|
|
263
|
+
return;
|
|
264
|
+
this._lastLocalCursorPosition = cursorPosition;
|
|
265
|
+
this._lastLocalCursorUpdate = now;
|
|
266
|
+
this.updatePeerPresence({
|
|
267
|
+
peerId: this._session.peerId,
|
|
268
|
+
displayName: this._session.displayName,
|
|
269
|
+
cursorPosition,
|
|
270
|
+
updatedAt: now
|
|
271
|
+
}, 'local');
|
|
272
|
+
};
|
|
273
|
+
_handlePointerLeave = () => {
|
|
274
|
+
if (!this._session)
|
|
275
|
+
return;
|
|
276
|
+
if (!this._lastLocalCursorPosition)
|
|
277
|
+
return;
|
|
278
|
+
this._lastLocalCursorPosition = undefined;
|
|
279
|
+
this._lastLocalCursorUpdate = Date.now();
|
|
280
|
+
this.updatePeerPresence({
|
|
281
|
+
peerId: this._session.peerId,
|
|
282
|
+
displayName: this._session.displayName,
|
|
283
|
+
cursorPosition: undefined,
|
|
284
|
+
updatedAt: this._lastLocalCursorUpdate
|
|
285
|
+
}, 'local');
|
|
286
|
+
};
|
|
287
|
+
getCurrentSelectionState() {
|
|
288
|
+
const selectedElements = this._designerCanvas.instanceServiceContainer.selectionService.selectedElements ?? [];
|
|
289
|
+
const primarySelection = this._designerCanvas.instanceServiceContainer.selectionService.primarySelection;
|
|
290
|
+
return {
|
|
291
|
+
selectedDesignItemIds: selectedElements.map(x => x?.id).filter(x => !!x),
|
|
292
|
+
selectedNodeIndexes: getCollaborationNodeIndexes(selectedElements),
|
|
293
|
+
primaryDesignItemId: primarySelection?.id,
|
|
294
|
+
primaryNodeIndex: getCollaborationNodeIndex(primarySelection)
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=DefaultCollaborationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultCollaborationService.js","sourceRoot":"","sources":["../../../../src/elements/services/collaborationService/DefaultCollaborationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { TypedEvent } from '@node-projects/base-custom-webcomponent';
|
|
2
|
+
import { IStylesheet } from '../stylesheetService/IStylesheetService.js';
|
|
3
|
+
import { IUndoChangeEvent, UndoChangeKind, UndoChangeSource } from '../undoService/IUndoChangeEvent.js';
|
|
4
|
+
import { IService } from '../IService.js';
|
|
5
|
+
export type CollaborationConnectionState = 'disconnected' | 'connecting' | 'connected';
|
|
6
|
+
export interface ICollaborationPeerPresence {
|
|
7
|
+
peerId: string;
|
|
8
|
+
displayName?: string;
|
|
9
|
+
color?: string;
|
|
10
|
+
activeDesignItemId?: string;
|
|
11
|
+
selectedDesignItemIds?: string[];
|
|
12
|
+
activeNodeIndex?: number;
|
|
13
|
+
selectedNodeIndexes?: number[];
|
|
14
|
+
cursorPosition?: {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
};
|
|
18
|
+
updatedAt: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ICollaborationComment {
|
|
21
|
+
id: string;
|
|
22
|
+
targetDesignItemId?: string;
|
|
23
|
+
targetNodeIndex?: number;
|
|
24
|
+
text: string;
|
|
25
|
+
authorPeerId: string;
|
|
26
|
+
createdAt: number;
|
|
27
|
+
updatedAt: number;
|
|
28
|
+
resolved?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface ICollaborationSession {
|
|
31
|
+
sessionId: string;
|
|
32
|
+
peerId: string;
|
|
33
|
+
displayName?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ICollaborationStateChangedEvent {
|
|
36
|
+
state: CollaborationConnectionState;
|
|
37
|
+
session?: ICollaborationSession;
|
|
38
|
+
}
|
|
39
|
+
export interface ICollaborationSelectionEvent {
|
|
40
|
+
source: UndoChangeSource;
|
|
41
|
+
peerId: string;
|
|
42
|
+
selectedNodeIndexes: number[];
|
|
43
|
+
primaryNodeIndex?: number;
|
|
44
|
+
selectedDesignItemIds: string[];
|
|
45
|
+
primaryDesignItemId?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface ICollaborationDocumentSnapshot {
|
|
48
|
+
html: string;
|
|
49
|
+
stylesheets: IStylesheet[];
|
|
50
|
+
updatedAt: number;
|
|
51
|
+
}
|
|
52
|
+
export interface ICollaborationRemoteChange {
|
|
53
|
+
kind: UndoChangeKind;
|
|
54
|
+
title?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface ICollaborationPeersChangedEvent {
|
|
57
|
+
source: UndoChangeSource;
|
|
58
|
+
peer?: ICollaborationPeerPresence;
|
|
59
|
+
peerId?: string;
|
|
60
|
+
peers: readonly ICollaborationPeerPresence[];
|
|
61
|
+
}
|
|
62
|
+
export interface ICollaborationCommentsChangedEvent {
|
|
63
|
+
source: UndoChangeSource;
|
|
64
|
+
comment?: ICollaborationComment;
|
|
65
|
+
commentId?: string;
|
|
66
|
+
comments: readonly ICollaborationComment[];
|
|
67
|
+
}
|
|
68
|
+
export interface ICollaborationTransport {
|
|
69
|
+
attach(service: ICollaborationService): void | Promise<void>;
|
|
70
|
+
detach(): void | Promise<void>;
|
|
71
|
+
connect(session: ICollaborationSession): void | Promise<void>;
|
|
72
|
+
disconnect(): void | Promise<void>;
|
|
73
|
+
sendChange(change: ICollaborationRemoteChange, snapshot: ICollaborationDocumentSnapshot): void | Promise<void>;
|
|
74
|
+
sendSelection(selection: ICollaborationSelectionEvent): void | Promise<void>;
|
|
75
|
+
sendPresence(peer: ICollaborationPeerPresence): void | Promise<void>;
|
|
76
|
+
sendComment(change: ICollaborationCommentsChangedEvent): void | Promise<void>;
|
|
77
|
+
}
|
|
78
|
+
export interface ICollaborationService extends IService {
|
|
79
|
+
readonly state: CollaborationConnectionState;
|
|
80
|
+
readonly session: ICollaborationSession;
|
|
81
|
+
readonly peers: readonly ICollaborationPeerPresence[];
|
|
82
|
+
readonly comments: readonly ICollaborationComment[];
|
|
83
|
+
readonly transport: ICollaborationTransport;
|
|
84
|
+
readonly isApplyingRemoteChanges: boolean;
|
|
85
|
+
attachTransport(transport: ICollaborationTransport): void;
|
|
86
|
+
detachTransport(): void;
|
|
87
|
+
connect(sessionId: string, peerId: string, displayName?: string): void;
|
|
88
|
+
disconnect(): void;
|
|
89
|
+
createSnapshot(): ICollaborationDocumentSnapshot;
|
|
90
|
+
applyRemoteSnapshot(snapshot: ICollaborationDocumentSnapshot): Promise<void>;
|
|
91
|
+
applyRemoteChange(change: ICollaborationRemoteChange, snapshot?: ICollaborationDocumentSnapshot): Promise<void>;
|
|
92
|
+
updateRemoteSelection(peerId: string, selectedNodeIndexes: number[], primaryNodeIndex?: number): void;
|
|
93
|
+
updatePeerPresence(peer: ICollaborationPeerPresence, source?: UndoChangeSource): void;
|
|
94
|
+
removePeer(peerId: string, source?: UndoChangeSource): void;
|
|
95
|
+
upsertComment(comment: ICollaborationComment, source?: UndoChangeSource): void;
|
|
96
|
+
removeComment(commentId: string, source?: UndoChangeSource): void;
|
|
97
|
+
readonly onStateChanged: TypedEvent<ICollaborationStateChangedEvent>;
|
|
98
|
+
readonly onChange: TypedEvent<IUndoChangeEvent>;
|
|
99
|
+
readonly onSelectionChanged: TypedEvent<ICollaborationSelectionEvent>;
|
|
100
|
+
readonly onPeersChanged: TypedEvent<ICollaborationPeersChangedEvent>;
|
|
101
|
+
readonly onCommentsChanged: TypedEvent<ICollaborationCommentsChangedEvent>;
|
|
102
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ICollaborationService.js","sourceRoot":"","sources":["../../../../src/elements/services/collaborationService/ICollaborationService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { ICollaborationComment, ICollaborationDocumentSnapshot, ICollaborationRemoteChange, ICollaborationService, ICollaborationSession, ICollaborationTransport } from './ICollaborationService.js';
|
|
2
|
+
export type WebRtcTabCollaborationSignalingChannelKind = 'broadcast-channel' | 'manual';
|
|
3
|
+
export interface WebRtcTabCollaborationTransportOptions {
|
|
4
|
+
enabledSignalingChannels?: readonly WebRtcTabCollaborationSignalingChannelKind[];
|
|
5
|
+
}
|
|
6
|
+
export interface IWebRtcManualSignalingBundle {
|
|
7
|
+
version: 1;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
fromPeerId: string;
|
|
10
|
+
connectionId: string;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
messages: SignalingMessage[];
|
|
13
|
+
}
|
|
14
|
+
export interface IWebRtcManualSignalingImportResult {
|
|
15
|
+
importedCount: number;
|
|
16
|
+
ignoredCount: number;
|
|
17
|
+
}
|
|
18
|
+
type SignalingMessage = {
|
|
19
|
+
id: string;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
connectionId: string;
|
|
22
|
+
sessionId: string;
|
|
23
|
+
fromPeerId: string;
|
|
24
|
+
toPeerId?: string;
|
|
25
|
+
type: 'hello' | 'hello-ack' | 'offer' | 'answer' | 'ice' | 'bye';
|
|
26
|
+
requestInitialSnapshot?: boolean;
|
|
27
|
+
description?: RTCSessionDescriptionInit;
|
|
28
|
+
candidate?: RTCIceCandidateInit;
|
|
29
|
+
};
|
|
30
|
+
export declare const defaultWebRtcTabCollaborationSignalingChannels: readonly WebRtcTabCollaborationSignalingChannelKind[];
|
|
31
|
+
export declare class WebRtcTabCollaborationTransport implements ICollaborationTransport {
|
|
32
|
+
private _service;
|
|
33
|
+
private _session;
|
|
34
|
+
private _broadcastSignalingChannel;
|
|
35
|
+
private _enabledSignalingChannels;
|
|
36
|
+
private _manualSignalingMessages;
|
|
37
|
+
private _peerConnections;
|
|
38
|
+
private _dataChannels;
|
|
39
|
+
private _initiatedPeers;
|
|
40
|
+
private _peersNeedingInitialSnapshot;
|
|
41
|
+
private _pendingCandidates;
|
|
42
|
+
private _processedSignalIds;
|
|
43
|
+
private _remoteConnectionIds;
|
|
44
|
+
private _localConnectionId;
|
|
45
|
+
constructor(options?: WebRtcTabCollaborationTransportOptions);
|
|
46
|
+
get enabledSignalingChannels(): readonly WebRtcTabCollaborationSignalingChannelKind[];
|
|
47
|
+
setEnabledSignalingChannels(channels: readonly WebRtcTabCollaborationSignalingChannelKind[]): void;
|
|
48
|
+
getManualSignalingBundle(): IWebRtcManualSignalingBundle | null;
|
|
49
|
+
exportManualSignalingData(space?: number): string;
|
|
50
|
+
importManualSignalingData(data: string | IWebRtcManualSignalingBundle): Promise<IWebRtcManualSignalingImportResult>;
|
|
51
|
+
attach(service: ICollaborationService): Promise<void>;
|
|
52
|
+
detach(): Promise<void>;
|
|
53
|
+
connect(session: ICollaborationSession): Promise<void>;
|
|
54
|
+
disconnect(): Promise<void>;
|
|
55
|
+
sendChange(change: ICollaborationRemoteChange, snapshot: ICollaborationDocumentSnapshot): Promise<void>;
|
|
56
|
+
sendSelection(selection: {
|
|
57
|
+
peerId: string;
|
|
58
|
+
selectedNodeIndexes: number[];
|
|
59
|
+
primaryNodeIndex?: number;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
sendPresence(peer: {
|
|
62
|
+
peerId: string;
|
|
63
|
+
displayName?: string;
|
|
64
|
+
color?: string;
|
|
65
|
+
activeNodeIndex?: number;
|
|
66
|
+
selectedNodeIndexes?: number[];
|
|
67
|
+
updatedAt: number;
|
|
68
|
+
}): Promise<void>;
|
|
69
|
+
sendComment(change: {
|
|
70
|
+
comment?: ICollaborationComment;
|
|
71
|
+
commentId?: string;
|
|
72
|
+
}): Promise<void>;
|
|
73
|
+
private ensureBroadcastChannelState;
|
|
74
|
+
private hasAvailableSignalingChannel;
|
|
75
|
+
private isSignalingMessage;
|
|
76
|
+
private rememberRemoteConnection;
|
|
77
|
+
private shouldRequestInitialSnapshot;
|
|
78
|
+
private updateInitialSnapshotRequest;
|
|
79
|
+
private handleSignalMessage;
|
|
80
|
+
private shouldInitiate;
|
|
81
|
+
private getOrCreatePeerConnection;
|
|
82
|
+
private ensureOffer;
|
|
83
|
+
private acceptOffer;
|
|
84
|
+
private acceptAnswer;
|
|
85
|
+
private acceptIceCandidate;
|
|
86
|
+
private flushPendingCandidates;
|
|
87
|
+
private registerDataChannel;
|
|
88
|
+
private handleOpenChannel;
|
|
89
|
+
private handleDataMessage;
|
|
90
|
+
private sendSignal;
|
|
91
|
+
private enqueueManualSignal;
|
|
92
|
+
private sendData;
|
|
93
|
+
private cleanupPeer;
|
|
94
|
+
}
|
|
95
|
+
export {};
|