@textbus/collaborate 4.1.0 → 4.2.1
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/bundles/base/_api.d.ts +6 -0
- package/bundles/base/message-bus.d.ts +28 -0
- package/bundles/{sync-connector.d.ts → base/sync-connector.d.ts} +2 -6
- package/bundles/collaborate-module.d.ts +2 -3
- package/bundles/connectors/hocuspocus-connector.d.ts +1 -1
- package/bundles/connectors/y-websocket-connector.d.ts +1 -1
- package/bundles/index.esm.js +146 -152
- package/bundles/index.js +146 -151
- package/bundles/multiple-document-collaborate-module.d.ts +2 -1
- package/bundles/public-api.d.ts +1 -6
- package/package.json +2 -2
- package/bundles/user-activity.d.ts +0 -23
- /package/bundles/{collab-history.d.ts → base/collab-history.d.ts} +0 -0
- /package/bundles/{collaborate.d.ts → base/collaborate.d.ts} +0 -0
- /package/bundles/{multiple-doc-collab-history.d.ts → base/multiple-doc-collab-history.d.ts} +0 -0
- /package/bundles/{sub-model-loader.d.ts → base/sub-model-loader.d.ts} +0 -0
| @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            import { Observable, Subject } from '@tanbo/stream';
         | 
| 2 | 
            +
            import { Textbus } from '@textbus/core';
         | 
| 3 | 
            +
            export interface Message<T> {
         | 
| 4 | 
            +
                clientId: number;
         | 
| 5 | 
            +
                message: T;
         | 
| 6 | 
            +
            }
         | 
| 7 | 
            +
            /**
         | 
| 8 | 
            +
             * 协作消息总线,用于同步各终端消息
         | 
| 9 | 
            +
             */
         | 
| 10 | 
            +
            export declare abstract class MessageBus<T> {
         | 
| 11 | 
            +
                onSync: Observable<void>;
         | 
| 12 | 
            +
                protected syncEvent: Subject<void>;
         | 
| 13 | 
            +
                constructor();
         | 
| 14 | 
            +
                /**
         | 
| 15 | 
            +
                 * 立即同步消息
         | 
| 16 | 
            +
                 */
         | 
| 17 | 
            +
                sync(): void;
         | 
| 18 | 
            +
                /**
         | 
| 19 | 
            +
                 * 当需要同步协作消息是,Textbus 会自动调用,并把返回数据同步到其它终端
         | 
| 20 | 
            +
                 */
         | 
| 21 | 
            +
                abstract get(textbus: Textbus): T;
         | 
| 22 | 
            +
                /**
         | 
| 23 | 
            +
                 * 当远程消息更新时,Textbus 会自动调用
         | 
| 24 | 
            +
                 * @param message
         | 
| 25 | 
            +
                 * @param textbus
         | 
| 26 | 
            +
                 */
         | 
| 27 | 
            +
                abstract consume(message: Message<T>[], textbus: Textbus): void;
         | 
| 28 | 
            +
            }
         | 
| @@ -1,8 +1,4 @@ | |
| 1 1 | 
             
            import { Observable, Subject } from '@tanbo/stream';
         | 
| 2 | 
            -
            export interface SyncState {
         | 
| 3 | 
            -
                clientId: number;
         | 
| 4 | 
            -
                state: Record<string, any>;
         | 
| 5 | 
            -
            }
         | 
| 6 2 | 
             
            /**
         | 
| 7 3 | 
             
             * 协作通信通用接口
         | 
| 8 4 | 
             
             */
         | 
| @@ -14,9 +10,9 @@ export declare abstract class SyncConnector { | |
| 14 10 | 
             
                /**
         | 
| 15 11 | 
             
                 * 当文档 awareness 状态变更时触发的观察者
         | 
| 16 12 | 
             
                 */
         | 
| 17 | 
            -
                onStateChange: Observable< | 
| 13 | 
            +
                onStateChange: Observable<any[]>;
         | 
| 18 14 | 
             
                protected loadEvent: Subject<void>;
         | 
| 19 | 
            -
                protected stateChangeEvent: Subject< | 
| 15 | 
            +
                protected stateChangeEvent: Subject<any[]>;
         | 
| 20 16 | 
             
                protected constructor();
         | 
| 21 17 | 
             
                /**
         | 
| 22 18 | 
             
                 * 设置 awareness 状态
         | 
| @@ -1,14 +1,13 @@ | |
| 1 1 | 
             
            import { Module, Textbus } from '@textbus/core';
         | 
| 2 2 | 
             
            import { Provider } from '@viewfly/core';
         | 
| 3 3 | 
             
            import { Doc as YDoc } from 'yjs';
         | 
| 4 | 
            -
            import {  | 
| 5 | 
            -
            import { SyncConnector } from './sync-connector';
         | 
| 4 | 
            +
            import { SyncConnector } from './base/_api';
         | 
| 6 5 | 
             
            export interface CollaborateConfig {
         | 
| 7 | 
            -
                userinfo: UserInfo;
         | 
| 8 6 | 
             
                createConnector(yDoc: YDoc): SyncConnector;
         | 
| 9 7 | 
             
            }
         | 
| 10 8 | 
             
            export declare class CollaborateModule implements Module {
         | 
| 11 9 | 
             
                config: CollaborateConfig;
         | 
| 10 | 
            +
                private subscription;
         | 
| 12 11 | 
             
                providers: Provider[];
         | 
| 13 12 | 
             
                constructor(config: CollaborateConfig);
         | 
| 14 13 | 
             
                setup(textbus: Textbus): Promise<(() => void) | void> | (() => void) | void;
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            import { HocuspocusProvider } from '@hocuspocus/provider';
         | 
| 2 2 | 
             
            import { HocuspocusProviderConfiguration } from '@hocuspocus/provider';
         | 
| 3 | 
            -
            import { SyncConnector } from '../sync-connector';
         | 
| 3 | 
            +
            import { SyncConnector } from '../base/sync-connector';
         | 
| 4 4 | 
             
            export declare class HocuspocusConnector extends SyncConnector {
         | 
| 5 5 | 
             
                provide: HocuspocusProvider;
         | 
| 6 6 | 
             
                constructor(config: HocuspocusProviderConfiguration);
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            import { Doc as YDoc } from 'yjs';
         | 
| 2 2 | 
             
            import { WebsocketProvider } from 'y-websocket';
         | 
| 3 | 
            -
            import { SyncConnector } from '../sync-connector';
         | 
| 3 | 
            +
            import { SyncConnector } from '../base/sync-connector';
         | 
| 4 4 | 
             
            export declare class YWebsocketConnector extends SyncConnector {
         | 
| 5 5 | 
             
                provide: WebsocketProvider;
         | 
| 6 6 | 
             
                constructor(url: string, roomName: string, yDoc: YDoc);
         | 
    
        package/bundles/index.esm.js
    CHANGED
    
    | @@ -1,79 +1,9 @@ | |
| 1 | 
            -
            import { HocuspocusProvider } from '@hocuspocus/provider';
         | 
| 2 | 
            -
            import { Subject, map, filter, Subscription } from '@tanbo/stream';
         | 
| 3 | 
            -
            import { WebsocketProvider } from 'y-websocket';
         | 
| 4 1 | 
             
            import { Injectable, Inject, Optional } from '@viewfly/core';
         | 
| 5 2 | 
             
            import { makeError, ChangeOrigin, Slot, createObjectProxy, createArrayProxy, AsyncSlot, AsyncComponent, Component, Scheduler, Registry, Selection, HISTORY_STACK_SIZE, RootComponentRef, History } from '@textbus/core';
         | 
| 3 | 
            +
            import { Subject, map, filter, Subscription } from '@tanbo/stream';
         | 
| 6 4 | 
             
            import { Doc, createAbsolutePositionFromRelativePosition, createRelativePositionFromTypeIndex, Map, Array as Array$1, Text, UndoManager } from 'yjs';
         | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             * 协作通信通用接口
         | 
| 10 | 
            -
             */
         | 
| 11 | 
            -
            class SyncConnector {
         | 
| 12 | 
            -
                constructor() {
         | 
| 13 | 
            -
                    this.loadEvent = new Subject();
         | 
| 14 | 
            -
                    this.stateChangeEvent = new Subject();
         | 
| 15 | 
            -
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 16 | 
            -
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 17 | 
            -
                }
         | 
| 18 | 
            -
            }
         | 
| 19 | 
            -
             | 
| 20 | 
            -
            class HocuspocusConnector extends SyncConnector {
         | 
| 21 | 
            -
                constructor(config) {
         | 
| 22 | 
            -
                    super();
         | 
| 23 | 
            -
                    this.provide = new HocuspocusProvider(Object.assign(Object.assign({}, config), { onSynced: (data) => {
         | 
| 24 | 
            -
                            var _a;
         | 
| 25 | 
            -
                            (_a = config.onSynced) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 26 | 
            -
                            this.loadEvent.next();
         | 
| 27 | 
            -
                        }, onAwarenessUpdate: (data) => {
         | 
| 28 | 
            -
                            var _a;
         | 
| 29 | 
            -
                            (_a = config.onAwarenessUpdate) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 30 | 
            -
                            const states = data.states.map(state => {
         | 
| 31 | 
            -
                                return {
         | 
| 32 | 
            -
                                    clientId: state.clientId,
         | 
| 33 | 
            -
                                    state: Object.assign({}, state)
         | 
| 34 | 
            -
                                };
         | 
| 35 | 
            -
                            });
         | 
| 36 | 
            -
                            this.stateChangeEvent.next(states);
         | 
| 37 | 
            -
                        } }));
         | 
| 38 | 
            -
                }
         | 
| 39 | 
            -
                setLocalStateField(key, data) {
         | 
| 40 | 
            -
                    this.provide.setAwarenessField(key, data);
         | 
| 41 | 
            -
                }
         | 
| 42 | 
            -
                onDestroy() {
         | 
| 43 | 
            -
                    this.provide.disconnect();
         | 
| 44 | 
            -
                    this.provide.destroy();
         | 
| 45 | 
            -
                }
         | 
| 46 | 
            -
            }
         | 
| 47 | 
            -
             | 
| 48 | 
            -
            class YWebsocketConnector extends SyncConnector {
         | 
| 49 | 
            -
                constructor(url, roomName, yDoc) {
         | 
| 50 | 
            -
                    super();
         | 
| 51 | 
            -
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 52 | 
            -
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 53 | 
            -
                    this.provide = new WebsocketProvider(url, roomName, yDoc);
         | 
| 54 | 
            -
                    this.provide.on('sync', (is) => {
         | 
| 55 | 
            -
                        if (is) {
         | 
| 56 | 
            -
                            this.loadEvent.next();
         | 
| 57 | 
            -
                        }
         | 
| 58 | 
            -
                    });
         | 
| 59 | 
            -
                    this.provide.awareness.on('update', () => {
         | 
| 60 | 
            -
                        const syncStates = [];
         | 
| 61 | 
            -
                        this.provide.awareness.getStates().forEach((state, id) => {
         | 
| 62 | 
            -
                            syncStates.push({
         | 
| 63 | 
            -
                                clientId: id,
         | 
| 64 | 
            -
                                state: state,
         | 
| 65 | 
            -
                            });
         | 
| 66 | 
            -
                        });
         | 
| 67 | 
            -
                        this.stateChangeEvent.next(syncStates);
         | 
| 68 | 
            -
                    });
         | 
| 69 | 
            -
                }
         | 
| 70 | 
            -
                setLocalStateField(key, data) {
         | 
| 71 | 
            -
                    this.provide.awareness.setLocalStateField(key, data);
         | 
| 72 | 
            -
                }
         | 
| 73 | 
            -
                onDestroy() {
         | 
| 74 | 
            -
                    this.provide.disconnect();
         | 
| 75 | 
            -
                }
         | 
| 76 | 
            -
            }
         | 
| 5 | 
            +
            import { HocuspocusProvider } from '@hocuspocus/provider';
         | 
| 6 | 
            +
            import { WebsocketProvider } from 'y-websocket';
         | 
| 77 7 |  | 
| 78 8 | 
             
            /******************************************************************************
         | 
| 79 9 | 
             
            Copyright (c) Microsoft Corporation.
         | 
| @@ -1033,81 +963,19 @@ CollabHistory = __decorate([ | |
| 1033 963 | 
             
                    Selection, Number, CustomUndoManagerConfig])
         | 
| 1034 964 | 
             
            ], CollabHistory);
         | 
| 1035 965 |  | 
| 1036 | 
            -
             | 
| 1037 | 
            -
             | 
| 1038 | 
            -
             | 
| 1039 | 
            -
             | 
| 1040 | 
            -
             | 
| 1041 | 
            -
                    this. | 
| 1042 | 
            -
                    this. | 
| 1043 | 
            -
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 1044 | 
            -
                    this.onUserChange = this.userChangeEvent.asObservable();
         | 
| 1045 | 
            -
                }
         | 
| 1046 | 
            -
                init(userinfo) {
         | 
| 1047 | 
            -
                    this.syncConnector.setLocalStateField('user', userinfo);
         | 
| 1048 | 
            -
                    this.subscription.add(this.selection.onChange.subscribe(() => {
         | 
| 1049 | 
            -
                        const selection = this.selection.getPaths();
         | 
| 1050 | 
            -
                        this.syncConnector.setLocalStateField('selection', Object.assign(Object.assign({}, userinfo), { selection }));
         | 
| 1051 | 
            -
                    }), this.syncConnector.onStateChange.subscribe((states) => {
         | 
| 1052 | 
            -
                        const users = [];
         | 
| 1053 | 
            -
                        const remoteSelections = [];
         | 
| 1054 | 
            -
                        states.forEach(item => {
         | 
| 1055 | 
            -
                            const state = item.state;
         | 
| 1056 | 
            -
                            if (state.user) {
         | 
| 1057 | 
            -
                                users.push(state.user);
         | 
| 1058 | 
            -
                            }
         | 
| 1059 | 
            -
                            if (state.selection) {
         | 
| 1060 | 
            -
                                remoteSelections.push(state.selection);
         | 
| 1061 | 
            -
                            }
         | 
| 1062 | 
            -
                        });
         | 
| 1063 | 
            -
                        const selections = remoteSelections.filter(i => i.id !== userinfo.id);
         | 
| 1064 | 
            -
                        this.userChangeEvent.next(users);
         | 
| 1065 | 
            -
                        this.stateChangeEvent.next(selections);
         | 
| 1066 | 
            -
                    }));
         | 
| 1067 | 
            -
                }
         | 
| 1068 | 
            -
                destroy() {
         | 
| 1069 | 
            -
                    this.subscription.unsubscribe();
         | 
| 1070 | 
            -
                }
         | 
| 1071 | 
            -
            };
         | 
| 1072 | 
            -
            UserActivity = __decorate([
         | 
| 1073 | 
            -
                Injectable(),
         | 
| 1074 | 
            -
                __metadata("design:paramtypes", [SyncConnector,
         | 
| 1075 | 
            -
                    Selection])
         | 
| 1076 | 
            -
            ], UserActivity);
         | 
| 1077 | 
            -
             | 
| 1078 | 
            -
            class CollaborateModule {
         | 
| 1079 | 
            -
                constructor(config) {
         | 
| 1080 | 
            -
                    this.config = config;
         | 
| 1081 | 
            -
                    this.providers = [
         | 
| 1082 | 
            -
                        Collaborate,
         | 
| 1083 | 
            -
                        UserActivity,
         | 
| 1084 | 
            -
                        CollabHistory,
         | 
| 1085 | 
            -
                        {
         | 
| 1086 | 
            -
                            provide: History,
         | 
| 1087 | 
            -
                            useExisting: CollabHistory
         | 
| 1088 | 
            -
                        }, {
         | 
| 1089 | 
            -
                            provide: SyncConnector,
         | 
| 1090 | 
            -
                            useFactory: (collab) => {
         | 
| 1091 | 
            -
                                return this.config.createConnector(collab.yDoc);
         | 
| 1092 | 
            -
                            },
         | 
| 1093 | 
            -
                            deps: [Collaborate]
         | 
| 1094 | 
            -
                        }, {
         | 
| 1095 | 
            -
                            provide: SubModelLoader,
         | 
| 1096 | 
            -
                            useClass: NonSubModelLoader
         | 
| 1097 | 
            -
                        }
         | 
| 1098 | 
            -
                    ];
         | 
| 1099 | 
            -
                }
         | 
| 1100 | 
            -
                setup(textbus) {
         | 
| 1101 | 
            -
                    const connector = textbus.get(SyncConnector);
         | 
| 1102 | 
            -
                    const userActivity = textbus.get(UserActivity);
         | 
| 1103 | 
            -
                    userActivity.init(this.config.userinfo);
         | 
| 1104 | 
            -
                    return connector.onLoad.toPromise();
         | 
| 966 | 
            +
            /**
         | 
| 967 | 
            +
             * 协作消息总线,用于同步各终端消息
         | 
| 968 | 
            +
             */
         | 
| 969 | 
            +
            class MessageBus {
         | 
| 970 | 
            +
                constructor() {
         | 
| 971 | 
            +
                    this.syncEvent = new Subject();
         | 
| 972 | 
            +
                    this.onSync = this.syncEvent.asObservable();
         | 
| 1105 973 | 
             
                }
         | 
| 1106 | 
            -
                 | 
| 1107 | 
            -
             | 
| 1108 | 
            -
             | 
| 1109 | 
            -
             | 
| 1110 | 
            -
                     | 
| 974 | 
            +
                /**
         | 
| 975 | 
            +
                 * 立即同步消息
         | 
| 976 | 
            +
                 */
         | 
| 977 | 
            +
                sync() {
         | 
| 978 | 
            +
                    this.syncEvent.next();
         | 
| 1111 979 | 
             
                }
         | 
| 1112 980 | 
             
            }
         | 
| 1113 981 |  | 
| @@ -1289,12 +1157,128 @@ MultipleDocCollabHistory = __decorate([ | |
| 1289 1157 | 
             
                    RootComponentRef, Number, CustomUndoManagerConfig])
         | 
| 1290 1158 | 
             
            ], MultipleDocCollabHistory);
         | 
| 1291 1159 |  | 
| 1160 | 
            +
            /**
         | 
| 1161 | 
            +
             * 协作通信通用接口
         | 
| 1162 | 
            +
             */
         | 
| 1163 | 
            +
            class SyncConnector {
         | 
| 1164 | 
            +
                constructor() {
         | 
| 1165 | 
            +
                    this.loadEvent = new Subject();
         | 
| 1166 | 
            +
                    this.stateChangeEvent = new Subject();
         | 
| 1167 | 
            +
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 1168 | 
            +
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 1169 | 
            +
                }
         | 
| 1170 | 
            +
            }
         | 
| 1171 | 
            +
             | 
| 1172 | 
            +
            class HocuspocusConnector extends SyncConnector {
         | 
| 1173 | 
            +
                constructor(config) {
         | 
| 1174 | 
            +
                    super();
         | 
| 1175 | 
            +
                    this.provide = new HocuspocusProvider(Object.assign(Object.assign({}, config), { onSynced: (data) => {
         | 
| 1176 | 
            +
                            var _a;
         | 
| 1177 | 
            +
                            (_a = config.onSynced) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 1178 | 
            +
                            this.loadEvent.next();
         | 
| 1179 | 
            +
                        }, onAwarenessUpdate: (data) => {
         | 
| 1180 | 
            +
                            var _a;
         | 
| 1181 | 
            +
                            (_a = config.onAwarenessUpdate) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 1182 | 
            +
                            const states = data.states.map(state => {
         | 
| 1183 | 
            +
                                return {
         | 
| 1184 | 
            +
                                    clientId: state.clientId,
         | 
| 1185 | 
            +
                                    message: state.message
         | 
| 1186 | 
            +
                                };
         | 
| 1187 | 
            +
                            });
         | 
| 1188 | 
            +
                            this.stateChangeEvent.next(states);
         | 
| 1189 | 
            +
                        } }));
         | 
| 1190 | 
            +
                }
         | 
| 1191 | 
            +
                setLocalStateField(key, data) {
         | 
| 1192 | 
            +
                    this.provide.setAwarenessField(key, data);
         | 
| 1193 | 
            +
                }
         | 
| 1194 | 
            +
                onDestroy() {
         | 
| 1195 | 
            +
                    this.provide.disconnect();
         | 
| 1196 | 
            +
                    this.provide.destroy();
         | 
| 1197 | 
            +
                }
         | 
| 1198 | 
            +
            }
         | 
| 1199 | 
            +
             | 
| 1200 | 
            +
            class YWebsocketConnector extends SyncConnector {
         | 
| 1201 | 
            +
                constructor(url, roomName, yDoc) {
         | 
| 1202 | 
            +
                    super();
         | 
| 1203 | 
            +
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 1204 | 
            +
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 1205 | 
            +
                    this.provide = new WebsocketProvider(url, roomName, yDoc);
         | 
| 1206 | 
            +
                    this.provide.on('sync', (is) => {
         | 
| 1207 | 
            +
                        if (is) {
         | 
| 1208 | 
            +
                            this.loadEvent.next();
         | 
| 1209 | 
            +
                        }
         | 
| 1210 | 
            +
                    });
         | 
| 1211 | 
            +
                    this.provide.awareness.on('update', () => {
         | 
| 1212 | 
            +
                        const syncStates = [];
         | 
| 1213 | 
            +
                        this.provide.awareness.getStates().forEach((state, id) => {
         | 
| 1214 | 
            +
                            syncStates.push({
         | 
| 1215 | 
            +
                                clientId: id,
         | 
| 1216 | 
            +
                                message: state.message,
         | 
| 1217 | 
            +
                            });
         | 
| 1218 | 
            +
                        });
         | 
| 1219 | 
            +
                        this.stateChangeEvent.next(syncStates);
         | 
| 1220 | 
            +
                    });
         | 
| 1221 | 
            +
                }
         | 
| 1222 | 
            +
                setLocalStateField(key, data) {
         | 
| 1223 | 
            +
                    this.provide.awareness.setLocalStateField(key, data);
         | 
| 1224 | 
            +
                }
         | 
| 1225 | 
            +
                onDestroy() {
         | 
| 1226 | 
            +
                    this.provide.disconnect();
         | 
| 1227 | 
            +
                }
         | 
| 1228 | 
            +
            }
         | 
| 1229 | 
            +
             | 
| 1230 | 
            +
            class CollaborateModule {
         | 
| 1231 | 
            +
                constructor(config) {
         | 
| 1232 | 
            +
                    this.config = config;
         | 
| 1233 | 
            +
                    this.subscription = new Subscription();
         | 
| 1234 | 
            +
                    this.providers = [
         | 
| 1235 | 
            +
                        Collaborate,
         | 
| 1236 | 
            +
                        CollabHistory,
         | 
| 1237 | 
            +
                        {
         | 
| 1238 | 
            +
                            provide: History,
         | 
| 1239 | 
            +
                            useExisting: CollabHistory
         | 
| 1240 | 
            +
                        }, {
         | 
| 1241 | 
            +
                            provide: SyncConnector,
         | 
| 1242 | 
            +
                            useFactory: (collab) => {
         | 
| 1243 | 
            +
                                return this.config.createConnector(collab.yDoc);
         | 
| 1244 | 
            +
                            },
         | 
| 1245 | 
            +
                            deps: [Collaborate]
         | 
| 1246 | 
            +
                        }, {
         | 
| 1247 | 
            +
                            provide: SubModelLoader,
         | 
| 1248 | 
            +
                            useClass: NonSubModelLoader
         | 
| 1249 | 
            +
                        }
         | 
| 1250 | 
            +
                    ];
         | 
| 1251 | 
            +
                }
         | 
| 1252 | 
            +
                setup(textbus) {
         | 
| 1253 | 
            +
                    const messageBus = textbus.get(MessageBus, null);
         | 
| 1254 | 
            +
                    const connector = textbus.get(SyncConnector);
         | 
| 1255 | 
            +
                    if (messageBus) {
         | 
| 1256 | 
            +
                        const selection = textbus.get(Selection);
         | 
| 1257 | 
            +
                        connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1258 | 
            +
                        this.subscription.add(messageBus.onSync.subscribe(() => {
         | 
| 1259 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1260 | 
            +
                        }), selection.onChange.subscribe(() => {
         | 
| 1261 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1262 | 
            +
                        }), connector.onStateChange.subscribe((states) => {
         | 
| 1263 | 
            +
                            messageBus.consume(states, textbus);
         | 
| 1264 | 
            +
                        }));
         | 
| 1265 | 
            +
                    }
         | 
| 1266 | 
            +
                    return connector.onLoad.toPromise();
         | 
| 1267 | 
            +
                }
         | 
| 1268 | 
            +
                onDestroy(textbus) {
         | 
| 1269 | 
            +
                    this.subscription.unsubscribe();
         | 
| 1270 | 
            +
                    textbus.get(Collaborate).destroy();
         | 
| 1271 | 
            +
                    textbus.get(History).destroy();
         | 
| 1272 | 
            +
                    textbus.get(SyncConnector).onDestroy();
         | 
| 1273 | 
            +
                }
         | 
| 1274 | 
            +
            }
         | 
| 1275 | 
            +
             | 
| 1292 1276 | 
             
            class MultipleDocumentCollaborateModule {
         | 
| 1293 1277 | 
             
                constructor(config) {
         | 
| 1294 1278 | 
             
                    this.config = config;
         | 
| 1279 | 
            +
                    this.subscription = new Subscription();
         | 
| 1295 1280 | 
             
                    this.providers = [
         | 
| 1296 1281 | 
             
                        Collaborate,
         | 
| 1297 | 
            -
                        UserActivity,
         | 
| 1298 1282 | 
             
                        MultipleDocCollabHistory,
         | 
| 1299 1283 | 
             
                        {
         | 
| 1300 1284 | 
             
                            provide: History,
         | 
| @@ -1314,17 +1298,27 @@ class MultipleDocumentCollaborateModule { | |
| 1314 1298 | 
             
                    ];
         | 
| 1315 1299 | 
             
                }
         | 
| 1316 1300 | 
             
                setup(textbus) {
         | 
| 1301 | 
            +
                    const messageBus = textbus.get(MessageBus, null);
         | 
| 1317 1302 | 
             
                    const connector = textbus.get(SyncConnector);
         | 
| 1318 | 
            -
                     | 
| 1319 | 
            -
             | 
| 1303 | 
            +
                    if (messageBus) {
         | 
| 1304 | 
            +
                        const selection = textbus.get(Selection);
         | 
| 1305 | 
            +
                        connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1306 | 
            +
                        this.subscription.add(messageBus.onSync.subscribe(() => {
         | 
| 1307 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1308 | 
            +
                        }), selection.onChange.subscribe(() => {
         | 
| 1309 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1310 | 
            +
                        }), connector.onStateChange.subscribe((states) => {
         | 
| 1311 | 
            +
                            messageBus.consume(states, textbus);
         | 
| 1312 | 
            +
                        }));
         | 
| 1313 | 
            +
                    }
         | 
| 1320 1314 | 
             
                    return connector.onLoad.toPromise();
         | 
| 1321 1315 | 
             
                }
         | 
| 1322 1316 | 
             
                onDestroy(textbus) {
         | 
| 1317 | 
            +
                    this.subscription.unsubscribe();
         | 
| 1323 1318 | 
             
                    textbus.get(Collaborate).destroy();
         | 
| 1324 1319 | 
             
                    textbus.get(History).destroy();
         | 
| 1325 | 
            -
                    textbus.get(UserActivity).destroy();
         | 
| 1326 1320 | 
             
                    textbus.get(SyncConnector).onDestroy();
         | 
| 1327 1321 | 
             
                }
         | 
| 1328 1322 | 
             
            }
         | 
| 1329 1323 |  | 
| 1330 | 
            -
            export { CollabHistory, Collaborate, CollaborateModule, CustomUndoManagerConfig, HocuspocusConnector, MultipleDocCollabHistory, MultipleDocumentCollaborateModule, NonSubModelLoader, SubModelLoader, SyncConnector,  | 
| 1324 | 
            +
            export { CollabHistory, Collaborate, CollaborateModule, CustomUndoManagerConfig, HocuspocusConnector, MessageBus, MultipleDocCollabHistory, MultipleDocumentCollaborateModule, NonSubModelLoader, SubModelLoader, SyncConnector, YWebsocketConnector };
         | 
    
        package/bundles/index.js
    CHANGED
    
    | @@ -1,81 +1,11 @@ | |
| 1 1 | 
             
            'use strict';
         | 
| 2 2 |  | 
| 3 | 
            -
            var provider = require('@hocuspocus/provider');
         | 
| 4 | 
            -
            var stream = require('@tanbo/stream');
         | 
| 5 | 
            -
            var yWebsocket = require('y-websocket');
         | 
| 6 3 | 
             
            var core$1 = require('@viewfly/core');
         | 
| 7 4 | 
             
            var core = require('@textbus/core');
         | 
| 5 | 
            +
            var stream = require('@tanbo/stream');
         | 
| 8 6 | 
             
            var yjs = require('yjs');
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             * 协作通信通用接口
         | 
| 12 | 
            -
             */
         | 
| 13 | 
            -
            class SyncConnector {
         | 
| 14 | 
            -
                constructor() {
         | 
| 15 | 
            -
                    this.loadEvent = new stream.Subject();
         | 
| 16 | 
            -
                    this.stateChangeEvent = new stream.Subject();
         | 
| 17 | 
            -
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 18 | 
            -
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 19 | 
            -
                }
         | 
| 20 | 
            -
            }
         | 
| 21 | 
            -
             | 
| 22 | 
            -
            class HocuspocusConnector extends SyncConnector {
         | 
| 23 | 
            -
                constructor(config) {
         | 
| 24 | 
            -
                    super();
         | 
| 25 | 
            -
                    this.provide = new provider.HocuspocusProvider(Object.assign(Object.assign({}, config), { onSynced: (data) => {
         | 
| 26 | 
            -
                            var _a;
         | 
| 27 | 
            -
                            (_a = config.onSynced) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 28 | 
            -
                            this.loadEvent.next();
         | 
| 29 | 
            -
                        }, onAwarenessUpdate: (data) => {
         | 
| 30 | 
            -
                            var _a;
         | 
| 31 | 
            -
                            (_a = config.onAwarenessUpdate) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 32 | 
            -
                            const states = data.states.map(state => {
         | 
| 33 | 
            -
                                return {
         | 
| 34 | 
            -
                                    clientId: state.clientId,
         | 
| 35 | 
            -
                                    state: Object.assign({}, state)
         | 
| 36 | 
            -
                                };
         | 
| 37 | 
            -
                            });
         | 
| 38 | 
            -
                            this.stateChangeEvent.next(states);
         | 
| 39 | 
            -
                        } }));
         | 
| 40 | 
            -
                }
         | 
| 41 | 
            -
                setLocalStateField(key, data) {
         | 
| 42 | 
            -
                    this.provide.setAwarenessField(key, data);
         | 
| 43 | 
            -
                }
         | 
| 44 | 
            -
                onDestroy() {
         | 
| 45 | 
            -
                    this.provide.disconnect();
         | 
| 46 | 
            -
                    this.provide.destroy();
         | 
| 47 | 
            -
                }
         | 
| 48 | 
            -
            }
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            class YWebsocketConnector extends SyncConnector {
         | 
| 51 | 
            -
                constructor(url, roomName, yDoc) {
         | 
| 52 | 
            -
                    super();
         | 
| 53 | 
            -
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 54 | 
            -
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 55 | 
            -
                    this.provide = new yWebsocket.WebsocketProvider(url, roomName, yDoc);
         | 
| 56 | 
            -
                    this.provide.on('sync', (is) => {
         | 
| 57 | 
            -
                        if (is) {
         | 
| 58 | 
            -
                            this.loadEvent.next();
         | 
| 59 | 
            -
                        }
         | 
| 60 | 
            -
                    });
         | 
| 61 | 
            -
                    this.provide.awareness.on('update', () => {
         | 
| 62 | 
            -
                        const syncStates = [];
         | 
| 63 | 
            -
                        this.provide.awareness.getStates().forEach((state, id) => {
         | 
| 64 | 
            -
                            syncStates.push({
         | 
| 65 | 
            -
                                clientId: id,
         | 
| 66 | 
            -
                                state: state,
         | 
| 67 | 
            -
                            });
         | 
| 68 | 
            -
                        });
         | 
| 69 | 
            -
                        this.stateChangeEvent.next(syncStates);
         | 
| 70 | 
            -
                    });
         | 
| 71 | 
            -
                }
         | 
| 72 | 
            -
                setLocalStateField(key, data) {
         | 
| 73 | 
            -
                    this.provide.awareness.setLocalStateField(key, data);
         | 
| 74 | 
            -
                }
         | 
| 75 | 
            -
                onDestroy() {
         | 
| 76 | 
            -
                    this.provide.disconnect();
         | 
| 77 | 
            -
                }
         | 
| 78 | 
            -
            }
         | 
| 7 | 
            +
            var provider = require('@hocuspocus/provider');
         | 
| 8 | 
            +
            var yWebsocket = require('y-websocket');
         | 
| 79 9 |  | 
| 80 10 | 
             
            /******************************************************************************
         | 
| 81 11 | 
             
            Copyright (c) Microsoft Corporation.
         | 
| @@ -1035,81 +965,19 @@ exports.CollabHistory = __decorate([ | |
| 1035 965 | 
             
                    core.Selection, Number, CustomUndoManagerConfig])
         | 
| 1036 966 | 
             
            ], exports.CollabHistory);
         | 
| 1037 967 |  | 
| 1038 | 
            -
             | 
| 1039 | 
            -
             | 
| 1040 | 
            -
             | 
| 1041 | 
            -
             | 
| 1042 | 
            -
             | 
| 1043 | 
            -
                    this. | 
| 1044 | 
            -
                    this. | 
| 1045 | 
            -
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 1046 | 
            -
                    this.onUserChange = this.userChangeEvent.asObservable();
         | 
| 1047 | 
            -
                }
         | 
| 1048 | 
            -
                init(userinfo) {
         | 
| 1049 | 
            -
                    this.syncConnector.setLocalStateField('user', userinfo);
         | 
| 1050 | 
            -
                    this.subscription.add(this.selection.onChange.subscribe(() => {
         | 
| 1051 | 
            -
                        const selection = this.selection.getPaths();
         | 
| 1052 | 
            -
                        this.syncConnector.setLocalStateField('selection', Object.assign(Object.assign({}, userinfo), { selection }));
         | 
| 1053 | 
            -
                    }), this.syncConnector.onStateChange.subscribe((states) => {
         | 
| 1054 | 
            -
                        const users = [];
         | 
| 1055 | 
            -
                        const remoteSelections = [];
         | 
| 1056 | 
            -
                        states.forEach(item => {
         | 
| 1057 | 
            -
                            const state = item.state;
         | 
| 1058 | 
            -
                            if (state.user) {
         | 
| 1059 | 
            -
                                users.push(state.user);
         | 
| 1060 | 
            -
                            }
         | 
| 1061 | 
            -
                            if (state.selection) {
         | 
| 1062 | 
            -
                                remoteSelections.push(state.selection);
         | 
| 1063 | 
            -
                            }
         | 
| 1064 | 
            -
                        });
         | 
| 1065 | 
            -
                        const selections = remoteSelections.filter(i => i.id !== userinfo.id);
         | 
| 1066 | 
            -
                        this.userChangeEvent.next(users);
         | 
| 1067 | 
            -
                        this.stateChangeEvent.next(selections);
         | 
| 1068 | 
            -
                    }));
         | 
| 1069 | 
            -
                }
         | 
| 1070 | 
            -
                destroy() {
         | 
| 1071 | 
            -
                    this.subscription.unsubscribe();
         | 
| 1072 | 
            -
                }
         | 
| 1073 | 
            -
            };
         | 
| 1074 | 
            -
            exports.UserActivity = __decorate([
         | 
| 1075 | 
            -
                core$1.Injectable(),
         | 
| 1076 | 
            -
                __metadata("design:paramtypes", [SyncConnector,
         | 
| 1077 | 
            -
                    core.Selection])
         | 
| 1078 | 
            -
            ], exports.UserActivity);
         | 
| 1079 | 
            -
             | 
| 1080 | 
            -
            class CollaborateModule {
         | 
| 1081 | 
            -
                constructor(config) {
         | 
| 1082 | 
            -
                    this.config = config;
         | 
| 1083 | 
            -
                    this.providers = [
         | 
| 1084 | 
            -
                        exports.Collaborate,
         | 
| 1085 | 
            -
                        exports.UserActivity,
         | 
| 1086 | 
            -
                        exports.CollabHistory,
         | 
| 1087 | 
            -
                        {
         | 
| 1088 | 
            -
                            provide: core.History,
         | 
| 1089 | 
            -
                            useExisting: exports.CollabHistory
         | 
| 1090 | 
            -
                        }, {
         | 
| 1091 | 
            -
                            provide: SyncConnector,
         | 
| 1092 | 
            -
                            useFactory: (collab) => {
         | 
| 1093 | 
            -
                                return this.config.createConnector(collab.yDoc);
         | 
| 1094 | 
            -
                            },
         | 
| 1095 | 
            -
                            deps: [exports.Collaborate]
         | 
| 1096 | 
            -
                        }, {
         | 
| 1097 | 
            -
                            provide: SubModelLoader,
         | 
| 1098 | 
            -
                            useClass: exports.NonSubModelLoader
         | 
| 1099 | 
            -
                        }
         | 
| 1100 | 
            -
                    ];
         | 
| 1101 | 
            -
                }
         | 
| 1102 | 
            -
                setup(textbus) {
         | 
| 1103 | 
            -
                    const connector = textbus.get(SyncConnector);
         | 
| 1104 | 
            -
                    const userActivity = textbus.get(exports.UserActivity);
         | 
| 1105 | 
            -
                    userActivity.init(this.config.userinfo);
         | 
| 1106 | 
            -
                    return connector.onLoad.toPromise();
         | 
| 968 | 
            +
            /**
         | 
| 969 | 
            +
             * 协作消息总线,用于同步各终端消息
         | 
| 970 | 
            +
             */
         | 
| 971 | 
            +
            class MessageBus {
         | 
| 972 | 
            +
                constructor() {
         | 
| 973 | 
            +
                    this.syncEvent = new stream.Subject();
         | 
| 974 | 
            +
                    this.onSync = this.syncEvent.asObservable();
         | 
| 1107 975 | 
             
                }
         | 
| 1108 | 
            -
                 | 
| 1109 | 
            -
             | 
| 1110 | 
            -
             | 
| 1111 | 
            -
             | 
| 1112 | 
            -
                     | 
| 976 | 
            +
                /**
         | 
| 977 | 
            +
                 * 立即同步消息
         | 
| 978 | 
            +
                 */
         | 
| 979 | 
            +
                sync() {
         | 
| 980 | 
            +
                    this.syncEvent.next();
         | 
| 1113 981 | 
             
                }
         | 
| 1114 982 | 
             
            }
         | 
| 1115 983 |  | 
| @@ -1291,12 +1159,128 @@ exports.MultipleDocCollabHistory = __decorate([ | |
| 1291 1159 | 
             
                    core.RootComponentRef, Number, CustomUndoManagerConfig])
         | 
| 1292 1160 | 
             
            ], exports.MultipleDocCollabHistory);
         | 
| 1293 1161 |  | 
| 1162 | 
            +
            /**
         | 
| 1163 | 
            +
             * 协作通信通用接口
         | 
| 1164 | 
            +
             */
         | 
| 1165 | 
            +
            class SyncConnector {
         | 
| 1166 | 
            +
                constructor() {
         | 
| 1167 | 
            +
                    this.loadEvent = new stream.Subject();
         | 
| 1168 | 
            +
                    this.stateChangeEvent = new stream.Subject();
         | 
| 1169 | 
            +
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 1170 | 
            +
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 1171 | 
            +
                }
         | 
| 1172 | 
            +
            }
         | 
| 1173 | 
            +
             | 
| 1174 | 
            +
            class HocuspocusConnector extends SyncConnector {
         | 
| 1175 | 
            +
                constructor(config) {
         | 
| 1176 | 
            +
                    super();
         | 
| 1177 | 
            +
                    this.provide = new provider.HocuspocusProvider(Object.assign(Object.assign({}, config), { onSynced: (data) => {
         | 
| 1178 | 
            +
                            var _a;
         | 
| 1179 | 
            +
                            (_a = config.onSynced) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 1180 | 
            +
                            this.loadEvent.next();
         | 
| 1181 | 
            +
                        }, onAwarenessUpdate: (data) => {
         | 
| 1182 | 
            +
                            var _a;
         | 
| 1183 | 
            +
                            (_a = config.onAwarenessUpdate) === null || _a === void 0 ? void 0 : _a.call(config, data);
         | 
| 1184 | 
            +
                            const states = data.states.map(state => {
         | 
| 1185 | 
            +
                                return {
         | 
| 1186 | 
            +
                                    clientId: state.clientId,
         | 
| 1187 | 
            +
                                    message: state.message
         | 
| 1188 | 
            +
                                };
         | 
| 1189 | 
            +
                            });
         | 
| 1190 | 
            +
                            this.stateChangeEvent.next(states);
         | 
| 1191 | 
            +
                        } }));
         | 
| 1192 | 
            +
                }
         | 
| 1193 | 
            +
                setLocalStateField(key, data) {
         | 
| 1194 | 
            +
                    this.provide.setAwarenessField(key, data);
         | 
| 1195 | 
            +
                }
         | 
| 1196 | 
            +
                onDestroy() {
         | 
| 1197 | 
            +
                    this.provide.disconnect();
         | 
| 1198 | 
            +
                    this.provide.destroy();
         | 
| 1199 | 
            +
                }
         | 
| 1200 | 
            +
            }
         | 
| 1201 | 
            +
             | 
| 1202 | 
            +
            class YWebsocketConnector extends SyncConnector {
         | 
| 1203 | 
            +
                constructor(url, roomName, yDoc) {
         | 
| 1204 | 
            +
                    super();
         | 
| 1205 | 
            +
                    this.onLoad = this.loadEvent.asObservable();
         | 
| 1206 | 
            +
                    this.onStateChange = this.stateChangeEvent.asObservable();
         | 
| 1207 | 
            +
                    this.provide = new yWebsocket.WebsocketProvider(url, roomName, yDoc);
         | 
| 1208 | 
            +
                    this.provide.on('sync', (is) => {
         | 
| 1209 | 
            +
                        if (is) {
         | 
| 1210 | 
            +
                            this.loadEvent.next();
         | 
| 1211 | 
            +
                        }
         | 
| 1212 | 
            +
                    });
         | 
| 1213 | 
            +
                    this.provide.awareness.on('update', () => {
         | 
| 1214 | 
            +
                        const syncStates = [];
         | 
| 1215 | 
            +
                        this.provide.awareness.getStates().forEach((state, id) => {
         | 
| 1216 | 
            +
                            syncStates.push({
         | 
| 1217 | 
            +
                                clientId: id,
         | 
| 1218 | 
            +
                                message: state.message,
         | 
| 1219 | 
            +
                            });
         | 
| 1220 | 
            +
                        });
         | 
| 1221 | 
            +
                        this.stateChangeEvent.next(syncStates);
         | 
| 1222 | 
            +
                    });
         | 
| 1223 | 
            +
                }
         | 
| 1224 | 
            +
                setLocalStateField(key, data) {
         | 
| 1225 | 
            +
                    this.provide.awareness.setLocalStateField(key, data);
         | 
| 1226 | 
            +
                }
         | 
| 1227 | 
            +
                onDestroy() {
         | 
| 1228 | 
            +
                    this.provide.disconnect();
         | 
| 1229 | 
            +
                }
         | 
| 1230 | 
            +
            }
         | 
| 1231 | 
            +
             | 
| 1232 | 
            +
            class CollaborateModule {
         | 
| 1233 | 
            +
                constructor(config) {
         | 
| 1234 | 
            +
                    this.config = config;
         | 
| 1235 | 
            +
                    this.subscription = new stream.Subscription();
         | 
| 1236 | 
            +
                    this.providers = [
         | 
| 1237 | 
            +
                        exports.Collaborate,
         | 
| 1238 | 
            +
                        exports.CollabHistory,
         | 
| 1239 | 
            +
                        {
         | 
| 1240 | 
            +
                            provide: core.History,
         | 
| 1241 | 
            +
                            useExisting: exports.CollabHistory
         | 
| 1242 | 
            +
                        }, {
         | 
| 1243 | 
            +
                            provide: SyncConnector,
         | 
| 1244 | 
            +
                            useFactory: (collab) => {
         | 
| 1245 | 
            +
                                return this.config.createConnector(collab.yDoc);
         | 
| 1246 | 
            +
                            },
         | 
| 1247 | 
            +
                            deps: [exports.Collaborate]
         | 
| 1248 | 
            +
                        }, {
         | 
| 1249 | 
            +
                            provide: SubModelLoader,
         | 
| 1250 | 
            +
                            useClass: exports.NonSubModelLoader
         | 
| 1251 | 
            +
                        }
         | 
| 1252 | 
            +
                    ];
         | 
| 1253 | 
            +
                }
         | 
| 1254 | 
            +
                setup(textbus) {
         | 
| 1255 | 
            +
                    const messageBus = textbus.get(MessageBus, null);
         | 
| 1256 | 
            +
                    const connector = textbus.get(SyncConnector);
         | 
| 1257 | 
            +
                    if (messageBus) {
         | 
| 1258 | 
            +
                        const selection = textbus.get(core.Selection);
         | 
| 1259 | 
            +
                        connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1260 | 
            +
                        this.subscription.add(messageBus.onSync.subscribe(() => {
         | 
| 1261 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1262 | 
            +
                        }), selection.onChange.subscribe(() => {
         | 
| 1263 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1264 | 
            +
                        }), connector.onStateChange.subscribe((states) => {
         | 
| 1265 | 
            +
                            messageBus.consume(states, textbus);
         | 
| 1266 | 
            +
                        }));
         | 
| 1267 | 
            +
                    }
         | 
| 1268 | 
            +
                    return connector.onLoad.toPromise();
         | 
| 1269 | 
            +
                }
         | 
| 1270 | 
            +
                onDestroy(textbus) {
         | 
| 1271 | 
            +
                    this.subscription.unsubscribe();
         | 
| 1272 | 
            +
                    textbus.get(exports.Collaborate).destroy();
         | 
| 1273 | 
            +
                    textbus.get(core.History).destroy();
         | 
| 1274 | 
            +
                    textbus.get(SyncConnector).onDestroy();
         | 
| 1275 | 
            +
                }
         | 
| 1276 | 
            +
            }
         | 
| 1277 | 
            +
             | 
| 1294 1278 | 
             
            class MultipleDocumentCollaborateModule {
         | 
| 1295 1279 | 
             
                constructor(config) {
         | 
| 1296 1280 | 
             
                    this.config = config;
         | 
| 1281 | 
            +
                    this.subscription = new stream.Subscription();
         | 
| 1297 1282 | 
             
                    this.providers = [
         | 
| 1298 1283 | 
             
                        exports.Collaborate,
         | 
| 1299 | 
            -
                        exports.UserActivity,
         | 
| 1300 1284 | 
             
                        exports.MultipleDocCollabHistory,
         | 
| 1301 1285 | 
             
                        {
         | 
| 1302 1286 | 
             
                            provide: core.History,
         | 
| @@ -1316,15 +1300,25 @@ class MultipleDocumentCollaborateModule { | |
| 1316 1300 | 
             
                    ];
         | 
| 1317 1301 | 
             
                }
         | 
| 1318 1302 | 
             
                setup(textbus) {
         | 
| 1303 | 
            +
                    const messageBus = textbus.get(MessageBus, null);
         | 
| 1319 1304 | 
             
                    const connector = textbus.get(SyncConnector);
         | 
| 1320 | 
            -
                     | 
| 1321 | 
            -
             | 
| 1305 | 
            +
                    if (messageBus) {
         | 
| 1306 | 
            +
                        const selection = textbus.get(core.Selection);
         | 
| 1307 | 
            +
                        connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1308 | 
            +
                        this.subscription.add(messageBus.onSync.subscribe(() => {
         | 
| 1309 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1310 | 
            +
                        }), selection.onChange.subscribe(() => {
         | 
| 1311 | 
            +
                            connector.setLocalStateField('message', messageBus.get(textbus));
         | 
| 1312 | 
            +
                        }), connector.onStateChange.subscribe((states) => {
         | 
| 1313 | 
            +
                            messageBus.consume(states, textbus);
         | 
| 1314 | 
            +
                        }));
         | 
| 1315 | 
            +
                    }
         | 
| 1322 1316 | 
             
                    return connector.onLoad.toPromise();
         | 
| 1323 1317 | 
             
                }
         | 
| 1324 1318 | 
             
                onDestroy(textbus) {
         | 
| 1319 | 
            +
                    this.subscription.unsubscribe();
         | 
| 1325 1320 | 
             
                    textbus.get(exports.Collaborate).destroy();
         | 
| 1326 1321 | 
             
                    textbus.get(core.History).destroy();
         | 
| 1327 | 
            -
                    textbus.get(exports.UserActivity).destroy();
         | 
| 1328 1322 | 
             
                    textbus.get(SyncConnector).onDestroy();
         | 
| 1329 1323 | 
             
                }
         | 
| 1330 1324 | 
             
            }
         | 
| @@ -1332,6 +1326,7 @@ class MultipleDocumentCollaborateModule { | |
| 1332 1326 | 
             
            exports.CollaborateModule = CollaborateModule;
         | 
| 1333 1327 | 
             
            exports.CustomUndoManagerConfig = CustomUndoManagerConfig;
         | 
| 1334 1328 | 
             
            exports.HocuspocusConnector = HocuspocusConnector;
         | 
| 1329 | 
            +
            exports.MessageBus = MessageBus;
         | 
| 1335 1330 | 
             
            exports.MultipleDocumentCollaborateModule = MultipleDocumentCollaborateModule;
         | 
| 1336 1331 | 
             
            exports.SubModelLoader = SubModelLoader;
         | 
| 1337 1332 | 
             
            exports.SyncConnector = SyncConnector;
         | 
| @@ -1,12 +1,13 @@ | |
| 1 1 | 
             
            import { Module, Textbus } from '@textbus/core';
         | 
| 2 2 | 
             
            import { Provider } from '@viewfly/core';
         | 
| 3 | 
            +
            import { SubModelLoader } from './base/_api';
         | 
| 3 4 | 
             
            import { CollaborateConfig } from './collaborate-module';
         | 
| 4 | 
            -
            import { SubModelLoader } from './sub-model-loader';
         | 
| 5 5 | 
             
            export interface MultipleDocCollaborateConfig extends CollaborateConfig {
         | 
| 6 6 | 
             
                subModelLoader: SubModelLoader;
         | 
| 7 7 | 
             
            }
         | 
| 8 8 | 
             
            export declare class MultipleDocumentCollaborateModule implements Module {
         | 
| 9 9 | 
             
                config: MultipleDocCollaborateConfig;
         | 
| 10 | 
            +
                private subscription;
         | 
| 10 11 | 
             
                providers: Provider[];
         | 
| 11 12 | 
             
                constructor(config: MultipleDocCollaborateConfig);
         | 
| 12 13 | 
             
                setup(textbus: Textbus): Promise<(() => void) | void> | (() => void) | void;
         | 
    
        package/bundles/public-api.d.ts
    CHANGED
    
    | @@ -1,9 +1,4 @@ | |
| 1 | 
            +
            export * from './base/_api';
         | 
| 1 2 | 
             
            export * from './connectors/_api';
         | 
| 2 | 
            -
            export * from './collab-history';
         | 
| 3 | 
            -
            export * from './collaborate';
         | 
| 4 3 | 
             
            export * from './collaborate-module';
         | 
| 5 | 
            -
            export * from './multiple-doc-collab-history';
         | 
| 6 4 | 
             
            export * from './multiple-document-collaborate-module';
         | 
| 7 | 
            -
            export * from './sub-model-loader';
         | 
| 8 | 
            -
            export * from './sync-connector';
         | 
| 9 | 
            -
            export * from './user-activity';
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "@textbus/collaborate",
         | 
| 3 | 
            -
              "version": "4.1 | 
| 3 | 
            +
              "version": "4.2.1",
         | 
| 4 4 | 
             
              "description": "Textbus is a rich text editor and framework that is highly customizable and extensible to achieve rich wysiwyg effects.",
         | 
| 5 5 | 
             
              "main": "./bundles/index.js",
         | 
| 6 6 | 
             
              "module": "./bundles/index.esm.js",
         | 
| @@ -27,7 +27,7 @@ | |
| 27 27 | 
             
              "dependencies": {
         | 
| 28 28 | 
             
                "@hocuspocus/provider": "^2.13.6",
         | 
| 29 29 | 
             
                "@tanbo/stream": "^1.2.5",
         | 
| 30 | 
            -
                "@textbus/core": "^4.1 | 
| 30 | 
            +
                "@textbus/core": "^4.2.1",
         | 
| 31 31 | 
             
                "@viewfly/core": "^1.0.5",
         | 
| 32 32 | 
             
                "y-websocket": "^1.4.3",
         | 
| 33 33 | 
             
                "yjs": "^13.6.14"
         | 
| @@ -1,23 +0,0 @@ | |
| 1 | 
            -
            import { Observable } from '@tanbo/stream';
         | 
| 2 | 
            -
            import { Selection, SelectionPaths } from '@textbus/core';
         | 
| 3 | 
            -
            import { SyncConnector } from './sync-connector';
         | 
| 4 | 
            -
            export interface UserInfo {
         | 
| 5 | 
            -
                username: string;
         | 
| 6 | 
            -
                color: string;
         | 
| 7 | 
            -
                id: string;
         | 
| 8 | 
            -
            }
         | 
| 9 | 
            -
            export interface ActivityInfo extends UserInfo {
         | 
| 10 | 
            -
                selection: SelectionPaths;
         | 
| 11 | 
            -
            }
         | 
| 12 | 
            -
            export declare class UserActivity {
         | 
| 13 | 
            -
                private syncConnector;
         | 
| 14 | 
            -
                private selection;
         | 
| 15 | 
            -
                onStateChange: Observable<ActivityInfo[]>;
         | 
| 16 | 
            -
                onUserChange: Observable<UserInfo[]>;
         | 
| 17 | 
            -
                private stateChangeEvent;
         | 
| 18 | 
            -
                private userChangeEvent;
         | 
| 19 | 
            -
                private subscription;
         | 
| 20 | 
            -
                constructor(syncConnector: SyncConnector, selection: Selection);
         | 
| 21 | 
            -
                init(userinfo: UserInfo): void;
         | 
| 22 | 
            -
                destroy(): void;
         | 
| 23 | 
            -
            }
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |