@univerjs/rpc 1.0.0-beta.0 → 1.0.0-beta.2
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/lib/cjs/index.js +19 -8
- package/lib/es/index.js +20 -9
- package/lib/index.js +20 -9
- package/lib/types/controllers/data-sync/data-sync-primary.controller.d.ts +5 -1
- package/lib/types/services/remote-instance/remote-instance.service.d.ts +3 -2
- package/lib/umd/index.js +1 -1
- package/package.json +3 -3
package/lib/cjs/index.js
CHANGED
|
@@ -75,13 +75,15 @@ const RemoteInstanceServiceName = "univer.remote-instance-service";
|
|
|
75
75
|
*/
|
|
76
76
|
const IRemoteInstanceService = (0, _univerjs_core.createIdentifier)(RemoteInstanceServiceName);
|
|
77
77
|
let WebWorkerRemoteInstanceService = class WebWorkerRemoteInstanceService {
|
|
78
|
-
constructor(_univerInstanceService, _commandService, _logService) {
|
|
78
|
+
constructor(_univerInstanceService, _commandService, _logService, _lifecycleService) {
|
|
79
79
|
this._univerInstanceService = _univerInstanceService;
|
|
80
80
|
this._commandService = _commandService;
|
|
81
81
|
this._logService = _logService;
|
|
82
|
+
this._lifecycleService = _lifecycleService;
|
|
82
83
|
}
|
|
83
84
|
whenReady() {
|
|
84
|
-
return Promise.resolve(true);
|
|
85
|
+
if (this._lifecycleService.stage >= _univerjs_core.LifecycleStages.Ready) return Promise.resolve(true);
|
|
86
|
+
return this._lifecycleService.onStage(_univerjs_core.LifecycleStages.Ready).then(() => true);
|
|
85
87
|
}
|
|
86
88
|
async syncMutation(params, options) {
|
|
87
89
|
return this._applyMutation(params.mutationInfo, options);
|
|
@@ -121,7 +123,8 @@ let WebWorkerRemoteInstanceService = class WebWorkerRemoteInstanceService {
|
|
|
121
123
|
WebWorkerRemoteInstanceService = __decorate([
|
|
122
124
|
__decorateParam(0, _univerjs_core.IUniverInstanceService),
|
|
123
125
|
__decorateParam(1, _univerjs_core.ICommandService),
|
|
124
|
-
__decorateParam(2, _univerjs_core.ILogService)
|
|
126
|
+
__decorateParam(2, _univerjs_core.ILogService),
|
|
127
|
+
__decorateParam(3, (0, _univerjs_core.Inject)(_univerjs_core.LifecycleService))
|
|
125
128
|
], WebWorkerRemoteInstanceService);
|
|
126
129
|
|
|
127
130
|
//#endregion
|
|
@@ -512,6 +515,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends _univerj
|
|
|
512
515
|
_defineProperty(this, "_syncingUnits", /* @__PURE__ */ new Set());
|
|
513
516
|
_defineProperty(this, "_syncingMutations", /* @__PURE__ */ new Set());
|
|
514
517
|
_defineProperty(this, "_syncMutationQueue", Promise.resolve());
|
|
518
|
+
_defineProperty(this, "_remoteReady", Promise.resolve(true));
|
|
515
519
|
this._initRPCChannels();
|
|
516
520
|
this._init();
|
|
517
521
|
}
|
|
@@ -544,10 +548,20 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends _univerj
|
|
|
544
548
|
if (!alreadySyncing) this._syncingUnits.delete(unitId);
|
|
545
549
|
});
|
|
546
550
|
}
|
|
551
|
+
async syncMutation(commandInfo, options) {
|
|
552
|
+
const sync = () => this._remoteReady.then(() => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options));
|
|
553
|
+
const result = this._syncMutationQueue.then(sync, sync);
|
|
554
|
+
this._syncMutationQueue = result.catch(() => false);
|
|
555
|
+
return result;
|
|
556
|
+
}
|
|
557
|
+
async waitForPendingMutations() {
|
|
558
|
+
await this._syncMutationQueue.catch(() => false);
|
|
559
|
+
}
|
|
547
560
|
_initRPCChannels() {
|
|
548
561
|
this._rpcChannelService.registerChannel(RemoteSyncServiceName, fromModule(this._remoteSyncService));
|
|
549
562
|
this._injector.add([IRemoteInstanceService, { useFactory: () => toModule(this._rpcChannelService.requestChannel(RemoteInstanceServiceName)) }]);
|
|
550
563
|
this._remoteInstanceService = this._injector.get(IRemoteInstanceService);
|
|
564
|
+
this._remoteReady = this._remoteInstanceService.whenReady();
|
|
551
565
|
}
|
|
552
566
|
_init() {
|
|
553
567
|
this._univerInstanceService.getTypeOfUnitAdded$(_univerjs_core.UniverInstanceType.UNIVER_SHEET).pipe((0, rxjs_operators.takeUntil)(this.dispose$)).subscribe((event) => {
|
|
@@ -566,10 +580,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends _univerj
|
|
|
566
580
|
this.disposeWithMe(this._commandService.onCommandExecuted((commandInfo, options) => {
|
|
567
581
|
const { type, params, id } = commandInfo;
|
|
568
582
|
const unitId = (params === null || params === void 0 ? void 0 : params.unitId) || "";
|
|
569
|
-
if (type === _univerjs_core.CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id))
|
|
570
|
-
const sync = () => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options);
|
|
571
|
-
this._syncMutationQueue = this._syncMutationQueue.then(sync, sync).catch(() => false);
|
|
572
|
-
}
|
|
583
|
+
if (type === _univerjs_core.CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id)) this.syncMutation(commandInfo, options);
|
|
573
584
|
}));
|
|
574
585
|
}
|
|
575
586
|
};
|
|
@@ -615,7 +626,7 @@ DataSyncReplicaController = __decorate([
|
|
|
615
626
|
//#endregion
|
|
616
627
|
//#region package.json
|
|
617
628
|
var name = "@univerjs/rpc";
|
|
618
|
-
var version = "1.0.0-beta.
|
|
629
|
+
var version = "1.0.0-beta.2";
|
|
619
630
|
|
|
620
631
|
//#endregion
|
|
621
632
|
//#region src/services/rpc/implementations/web-worker-rpc.service.ts
|
package/lib/es/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CommandType, Disposable, ICommandService, IConfigService, ILogService, IUniverInstanceService, Inject, Injector, Plugin, RxDisposable, UniverInstanceType, createIdentifier, merge, toDisposable } from "@univerjs/core";
|
|
1
|
+
import { CommandType, Disposable, ICommandService, IConfigService, ILogService, IUniverInstanceService, Inject, Injector, LifecycleService, LifecycleStages, Plugin, RxDisposable, UniverInstanceType, createIdentifier, merge, toDisposable } from "@univerjs/core";
|
|
2
2
|
import { filter, take, takeUntil } from "rxjs/operators";
|
|
3
3
|
import { BehaviorSubject, Observable, firstValueFrom, isObservable, of, shareReplay } from "rxjs";
|
|
4
4
|
|
|
@@ -74,13 +74,15 @@ const RemoteInstanceServiceName = "univer.remote-instance-service";
|
|
|
74
74
|
*/
|
|
75
75
|
const IRemoteInstanceService = createIdentifier(RemoteInstanceServiceName);
|
|
76
76
|
let WebWorkerRemoteInstanceService = class WebWorkerRemoteInstanceService {
|
|
77
|
-
constructor(_univerInstanceService, _commandService, _logService) {
|
|
77
|
+
constructor(_univerInstanceService, _commandService, _logService, _lifecycleService) {
|
|
78
78
|
this._univerInstanceService = _univerInstanceService;
|
|
79
79
|
this._commandService = _commandService;
|
|
80
80
|
this._logService = _logService;
|
|
81
|
+
this._lifecycleService = _lifecycleService;
|
|
81
82
|
}
|
|
82
83
|
whenReady() {
|
|
83
|
-
return Promise.resolve(true);
|
|
84
|
+
if (this._lifecycleService.stage >= LifecycleStages.Ready) return Promise.resolve(true);
|
|
85
|
+
return this._lifecycleService.onStage(LifecycleStages.Ready).then(() => true);
|
|
84
86
|
}
|
|
85
87
|
async syncMutation(params, options) {
|
|
86
88
|
return this._applyMutation(params.mutationInfo, options);
|
|
@@ -120,7 +122,8 @@ let WebWorkerRemoteInstanceService = class WebWorkerRemoteInstanceService {
|
|
|
120
122
|
WebWorkerRemoteInstanceService = __decorate([
|
|
121
123
|
__decorateParam(0, IUniverInstanceService),
|
|
122
124
|
__decorateParam(1, ICommandService),
|
|
123
|
-
__decorateParam(2, ILogService)
|
|
125
|
+
__decorateParam(2, ILogService),
|
|
126
|
+
__decorateParam(3, Inject(LifecycleService))
|
|
124
127
|
], WebWorkerRemoteInstanceService);
|
|
125
128
|
|
|
126
129
|
//#endregion
|
|
@@ -511,6 +514,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
|
|
|
511
514
|
_defineProperty(this, "_syncingUnits", /* @__PURE__ */ new Set());
|
|
512
515
|
_defineProperty(this, "_syncingMutations", /* @__PURE__ */ new Set());
|
|
513
516
|
_defineProperty(this, "_syncMutationQueue", Promise.resolve());
|
|
517
|
+
_defineProperty(this, "_remoteReady", Promise.resolve(true));
|
|
514
518
|
this._initRPCChannels();
|
|
515
519
|
this._init();
|
|
516
520
|
}
|
|
@@ -543,10 +547,20 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
|
|
|
543
547
|
if (!alreadySyncing) this._syncingUnits.delete(unitId);
|
|
544
548
|
});
|
|
545
549
|
}
|
|
550
|
+
async syncMutation(commandInfo, options) {
|
|
551
|
+
const sync = () => this._remoteReady.then(() => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options));
|
|
552
|
+
const result = this._syncMutationQueue.then(sync, sync);
|
|
553
|
+
this._syncMutationQueue = result.catch(() => false);
|
|
554
|
+
return result;
|
|
555
|
+
}
|
|
556
|
+
async waitForPendingMutations() {
|
|
557
|
+
await this._syncMutationQueue.catch(() => false);
|
|
558
|
+
}
|
|
546
559
|
_initRPCChannels() {
|
|
547
560
|
this._rpcChannelService.registerChannel(RemoteSyncServiceName, fromModule(this._remoteSyncService));
|
|
548
561
|
this._injector.add([IRemoteInstanceService, { useFactory: () => toModule(this._rpcChannelService.requestChannel(RemoteInstanceServiceName)) }]);
|
|
549
562
|
this._remoteInstanceService = this._injector.get(IRemoteInstanceService);
|
|
563
|
+
this._remoteReady = this._remoteInstanceService.whenReady();
|
|
550
564
|
}
|
|
551
565
|
_init() {
|
|
552
566
|
this._univerInstanceService.getTypeOfUnitAdded$(UniverInstanceType.UNIVER_SHEET).pipe(takeUntil(this.dispose$)).subscribe((event) => {
|
|
@@ -565,10 +579,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
|
|
|
565
579
|
this.disposeWithMe(this._commandService.onCommandExecuted((commandInfo, options) => {
|
|
566
580
|
const { type, params, id } = commandInfo;
|
|
567
581
|
const unitId = (params === null || params === void 0 ? void 0 : params.unitId) || "";
|
|
568
|
-
if (type === CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id))
|
|
569
|
-
const sync = () => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options);
|
|
570
|
-
this._syncMutationQueue = this._syncMutationQueue.then(sync, sync).catch(() => false);
|
|
571
|
-
}
|
|
582
|
+
if (type === CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id)) this.syncMutation(commandInfo, options);
|
|
572
583
|
}));
|
|
573
584
|
}
|
|
574
585
|
};
|
|
@@ -614,7 +625,7 @@ DataSyncReplicaController = __decorate([
|
|
|
614
625
|
//#endregion
|
|
615
626
|
//#region package.json
|
|
616
627
|
var name = "@univerjs/rpc";
|
|
617
|
-
var version = "1.0.0-beta.
|
|
628
|
+
var version = "1.0.0-beta.2";
|
|
618
629
|
|
|
619
630
|
//#endregion
|
|
620
631
|
//#region src/services/rpc/implementations/web-worker-rpc.service.ts
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CommandType, Disposable, ICommandService, IConfigService, ILogService, IUniverInstanceService, Inject, Injector, Plugin, RxDisposable, UniverInstanceType, createIdentifier, merge, toDisposable } from "@univerjs/core";
|
|
1
|
+
import { CommandType, Disposable, ICommandService, IConfigService, ILogService, IUniverInstanceService, Inject, Injector, LifecycleService, LifecycleStages, Plugin, RxDisposable, UniverInstanceType, createIdentifier, merge, toDisposable } from "@univerjs/core";
|
|
2
2
|
import { filter, take, takeUntil } from "rxjs/operators";
|
|
3
3
|
import { BehaviorSubject, Observable, firstValueFrom, isObservable, of, shareReplay } from "rxjs";
|
|
4
4
|
|
|
@@ -74,13 +74,15 @@ const RemoteInstanceServiceName = "univer.remote-instance-service";
|
|
|
74
74
|
*/
|
|
75
75
|
const IRemoteInstanceService = createIdentifier(RemoteInstanceServiceName);
|
|
76
76
|
let WebWorkerRemoteInstanceService = class WebWorkerRemoteInstanceService {
|
|
77
|
-
constructor(_univerInstanceService, _commandService, _logService) {
|
|
77
|
+
constructor(_univerInstanceService, _commandService, _logService, _lifecycleService) {
|
|
78
78
|
this._univerInstanceService = _univerInstanceService;
|
|
79
79
|
this._commandService = _commandService;
|
|
80
80
|
this._logService = _logService;
|
|
81
|
+
this._lifecycleService = _lifecycleService;
|
|
81
82
|
}
|
|
82
83
|
whenReady() {
|
|
83
|
-
return Promise.resolve(true);
|
|
84
|
+
if (this._lifecycleService.stage >= LifecycleStages.Ready) return Promise.resolve(true);
|
|
85
|
+
return this._lifecycleService.onStage(LifecycleStages.Ready).then(() => true);
|
|
84
86
|
}
|
|
85
87
|
async syncMutation(params, options) {
|
|
86
88
|
return this._applyMutation(params.mutationInfo, options);
|
|
@@ -120,7 +122,8 @@ let WebWorkerRemoteInstanceService = class WebWorkerRemoteInstanceService {
|
|
|
120
122
|
WebWorkerRemoteInstanceService = __decorate([
|
|
121
123
|
__decorateParam(0, IUniverInstanceService),
|
|
122
124
|
__decorateParam(1, ICommandService),
|
|
123
|
-
__decorateParam(2, ILogService)
|
|
125
|
+
__decorateParam(2, ILogService),
|
|
126
|
+
__decorateParam(3, Inject(LifecycleService))
|
|
124
127
|
], WebWorkerRemoteInstanceService);
|
|
125
128
|
|
|
126
129
|
//#endregion
|
|
@@ -511,6 +514,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
|
|
|
511
514
|
_defineProperty(this, "_syncingUnits", /* @__PURE__ */ new Set());
|
|
512
515
|
_defineProperty(this, "_syncingMutations", /* @__PURE__ */ new Set());
|
|
513
516
|
_defineProperty(this, "_syncMutationQueue", Promise.resolve());
|
|
517
|
+
_defineProperty(this, "_remoteReady", Promise.resolve(true));
|
|
514
518
|
this._initRPCChannels();
|
|
515
519
|
this._init();
|
|
516
520
|
}
|
|
@@ -543,10 +547,20 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
|
|
|
543
547
|
if (!alreadySyncing) this._syncingUnits.delete(unitId);
|
|
544
548
|
});
|
|
545
549
|
}
|
|
550
|
+
async syncMutation(commandInfo, options) {
|
|
551
|
+
const sync = () => this._remoteReady.then(() => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options));
|
|
552
|
+
const result = this._syncMutationQueue.then(sync, sync);
|
|
553
|
+
this._syncMutationQueue = result.catch(() => false);
|
|
554
|
+
return result;
|
|
555
|
+
}
|
|
556
|
+
async waitForPendingMutations() {
|
|
557
|
+
await this._syncMutationQueue.catch(() => false);
|
|
558
|
+
}
|
|
546
559
|
_initRPCChannels() {
|
|
547
560
|
this._rpcChannelService.registerChannel(RemoteSyncServiceName, fromModule(this._remoteSyncService));
|
|
548
561
|
this._injector.add([IRemoteInstanceService, { useFactory: () => toModule(this._rpcChannelService.requestChannel(RemoteInstanceServiceName)) }]);
|
|
549
562
|
this._remoteInstanceService = this._injector.get(IRemoteInstanceService);
|
|
563
|
+
this._remoteReady = this._remoteInstanceService.whenReady();
|
|
550
564
|
}
|
|
551
565
|
_init() {
|
|
552
566
|
this._univerInstanceService.getTypeOfUnitAdded$(UniverInstanceType.UNIVER_SHEET).pipe(takeUntil(this.dispose$)).subscribe((event) => {
|
|
@@ -565,10 +579,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
|
|
|
565
579
|
this.disposeWithMe(this._commandService.onCommandExecuted((commandInfo, options) => {
|
|
566
580
|
const { type, params, id } = commandInfo;
|
|
567
581
|
const unitId = (params === null || params === void 0 ? void 0 : params.unitId) || "";
|
|
568
|
-
if (type === CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id))
|
|
569
|
-
const sync = () => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options);
|
|
570
|
-
this._syncMutationQueue = this._syncMutationQueue.then(sync, sync).catch(() => false);
|
|
571
|
-
}
|
|
582
|
+
if (type === CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id)) this.syncMutation(commandInfo, options);
|
|
572
583
|
}));
|
|
573
584
|
}
|
|
574
585
|
};
|
|
@@ -614,7 +625,7 @@ DataSyncReplicaController = __decorate([
|
|
|
614
625
|
//#endregion
|
|
615
626
|
//#region package.json
|
|
616
627
|
var name = "@univerjs/rpc";
|
|
617
|
-
var version = "1.0.0-beta.
|
|
628
|
+
var version = "1.0.0-beta.2";
|
|
618
629
|
|
|
619
630
|
//#endregion
|
|
620
631
|
//#region src/services/rpc/implementations/web-worker-rpc.service.ts
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
-
import type { IDisposable, IMutation } from '@univerjs/core';
|
|
16
|
+
import type { IDisposable, IMutation, IMutationInfo } from '@univerjs/core';
|
|
17
|
+
import type { IRemoteSyncMutationOptions } from '../../services/remote-instance/remote-instance.service';
|
|
17
18
|
import { ICommandService, Injector, IUniverInstanceService, RxDisposable } from '@univerjs/core';
|
|
18
19
|
import { IRemoteSyncService } from '../../services/remote-instance/remote-instance.service';
|
|
19
20
|
import { IRPCChannelService } from '../../services/rpc/channel.service';
|
|
@@ -33,6 +34,7 @@ export declare class DataSyncPrimaryController extends RxDisposable {
|
|
|
33
34
|
private readonly _syncingUnits;
|
|
34
35
|
private readonly _syncingMutations;
|
|
35
36
|
private _syncMutationQueue;
|
|
37
|
+
private _remoteReady;
|
|
36
38
|
constructor(_injector: Injector, _commandService: ICommandService, _univerInstanceService: IUniverInstanceService, _rpcChannelService: IRPCChannelService, _remoteSyncService: IRemoteSyncService);
|
|
37
39
|
registerSyncingMutations(mutation: IMutation<object>): void;
|
|
38
40
|
/**
|
|
@@ -42,6 +44,8 @@ export declare class DataSyncPrimaryController extends RxDisposable {
|
|
|
42
44
|
syncUnit(unitId: string): IDisposable;
|
|
43
45
|
/** Sync registered mutations for a unit without creating a replica unit. */
|
|
44
46
|
syncUnitMutations(unitId: string): IDisposable;
|
|
47
|
+
syncMutation(commandInfo: IMutationInfo, options?: IRemoteSyncMutationOptions): Promise<boolean>;
|
|
48
|
+
waitForPendingMutations(): Promise<void>;
|
|
45
49
|
private _initRPCChannels;
|
|
46
50
|
private _init;
|
|
47
51
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import type { IBaseSnapshot, IExecutionOptions, IMutationInfo, IWorkbookData } from '@univerjs/core';
|
|
17
|
-
import { ICommandService, ILogService, IUniverInstanceService, UniverInstanceType } from '@univerjs/core';
|
|
17
|
+
import { ICommandService, ILogService, IUniverInstanceService, LifecycleService, UniverInstanceType } from '@univerjs/core';
|
|
18
18
|
export interface IRemoteSyncMutationOptions extends IExecutionOptions {
|
|
19
19
|
/** If this mutation is executed after it was sent from the peer univer instance (e.g. in a web worker). */
|
|
20
20
|
fromSync?: boolean;
|
|
@@ -65,7 +65,8 @@ export declare class WebWorkerRemoteInstanceService implements IRemoteInstanceSe
|
|
|
65
65
|
protected readonly _univerInstanceService: IUniverInstanceService;
|
|
66
66
|
protected readonly _commandService: ICommandService;
|
|
67
67
|
protected readonly _logService: ILogService;
|
|
68
|
-
|
|
68
|
+
protected readonly _lifecycleService: LifecycleService;
|
|
69
|
+
constructor(_univerInstanceService: IUniverInstanceService, _commandService: ICommandService, _logService: ILogService, _lifecycleService: LifecycleService);
|
|
69
70
|
whenReady(): Promise<true>;
|
|
70
71
|
syncMutation(params: {
|
|
71
72
|
mutationInfo: IMutationInfo;
|
package/lib/umd/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@univerjs/core"),require("rxjs/operators"),require("rxjs")):typeof define==`function`&&define.amd?define([`exports`,`@univerjs/core`,`rxjs/operators`,`rxjs`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UniverRpc={},e.UniverCore,e.rxjs.operators,e.rxjs))})(this,function(e,t,n,r){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let i=`rpc.main-thread.config`,a={},o=`rpc.worker-thread.config`,s={};function c(e,t){return function(n,r){t(n,r,e)}}function l(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}let u=`rpc.remote-sync.service`,d=(0,t.createIdentifier)(u),f=class{constructor(e){this._commandService=e}async syncMutation(e,t){let{fromCollab:n,...r}=t||{};return this._commandService.syncExecuteCommand(e.mutationInfo.id,e.mutationInfo.params,{...r,onlyLocal:!0,fromSync:!0})}};f=l([c(0,t.ICommandService)],f);let p=`univer.remote-instance-service`,m=(0,t.createIdentifier)(p),h=class{constructor(e,t,n){this._univerInstanceService=e,this._commandService=t,this._logService=n}whenReady(){return Promise.resolve(!0)}async syncMutation(e,t){return this._applyMutation(e.mutationInfo,t)}async createInstance(e){this._logService.debug(`[WebWorkerRemoteInstanceService]: Creating instance with id ${e.unitID}`);let{type:n,snapshot:r}=e;try{switch(n){case t.UniverInstanceType.UNIVER_SHEET:return this._univerInstanceService.createUnit(t.UniverInstanceType.UNIVER_SHEET,r),!0;case t.UniverInstanceType.UNIVER_BASE:return this._univerInstanceService.createUnit(t.UniverInstanceType.UNIVER_BASE,r),!0;default:throw Error(`[WebWorkerRemoteInstanceService]: cannot create replica for document type: ${n}.`)}}catch(e){throw e instanceof Error?e:TypeError(`${e}`)}}async disposeInstance(e){return this._logService.debug(`[WebWorkerRemoteInstanceService]: Disposing instance with id ${e.unitID}`),this._univerInstanceService.disposeUnit(e.unitID)}_applyMutation(e,t){let{id:n,params:r}=e,{fromCollab:i,...a}=t||{};return this._commandService.syncExecuteCommand(n,r,{...a,onlyLocal:!0,fromSync:!0})}};h=l([c(0,t.IUniverInstanceService),c(1,t.ICommandService),c(2,t.ILogService)],h);function g(e){"@babel/helpers - typeof";return g=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},g(e)}function _(e,t){if(g(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(g(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function v(e){var t=_(e,`string`);return g(t)==`symbol`?t:t+``}function y(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function b(e){let t=e;return new class{call(e,n){let r=t[e];if(typeof r==`function`){let e=n?r.apply(t,n):r.call(t);return e instanceof Promise||(e=Promise.resolve(e)),e}throw Error(`[RPC]: method not found for ${e}!`)}subscribe(e,n){let i=t[e];if(typeof i==`function`){let e=n?i.apply(t,n):i.call(t);return(0,r.isObservable)(e)?e:(0,r.of)(e)}throw Error(`[RPC]: observable method not found for ${e}!`)}}}function x(e){return new Proxy({},{get(t,n){if(n!==`dispose`)return function(...t){return S(n)?e.subscribe(n,t):e.call(n,t)}}})}function S(e){return e.endsWith(`$`)}var C=class extends t.RxDisposable{constructor(e){super(),this._protocol=e,y(this,`_initialized`,new r.BehaviorSubject(!1)),y(this,`_lastRequestCounter`,0),y(this,`_pendingRequests`,new Map),this._protocol.send({type:50}),this._protocol.onMessage.pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>this._onMessage(e))}dispose(){this._pendingRequests.clear()}getChannel(e){return{call:(t,n)=>this._disposed?Promise.reject(Error(`[ChannelClient]: client is disposed!`)):this._remoteCall(e,t,n),subscribe:(t,n)=>{if(this._disposed)throw Error(`[ChannelClient]: client is disposed!`);return this._remoteSubscribe(e,t,n)}}}_whenReady(){return(0,r.firstValueFrom)(this._initialized.pipe((0,n.filter)(e=>e),(0,n.take)(1)))}_remoteCall(e,t,n){return this._initialized.getValue()?this._doRemoteCall(e,t,n):this._whenReady().then(()=>this._doRemoteCall(e,t,n))}_doRemoteCall(e,t,n){let r=++this._lastRequestCounter,i={seq:r,type:100,channelName:e,method:t,args:n},a=this._pendingRequests;return new Promise((e,t)=>{this._pendingRequests.set(r,{handle(n){switch(n.type){case 201:a.delete(r),e(n.data);break;case 202:a.delete(r),t(n.data);break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(i)})}_remoteSubscribe(e,t,n){return new r.Observable(r=>{let i=-1,a=()=>{i=++this._lastRequestCounter;let a={seq:i,type:101,channelName:e,method:t,args:n};this._pendingRequests.set(i,{handle(e){switch(e.type){case 300:r.next(e.data);break;case 301:r.error(e.data);break;case 302:r.complete();break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(a)};return this._initialized.getValue()?a():this._whenReady().then(a),()=>{if(i===-1)return;let n={type:102,seq:i,channelName:e,method:t};this._sendRequest(n)}})}_sendRequest(e){this._protocol.send(e)}_onMessage(e){let{type:t,seq:n}=e;switch(t){case 0:this._initialized.next(!0);break;case 201:case 202:case 300:case 302:case 301:{var r;let{_pendingRequests:i}=this;(r=i.get(n))==null||r.handle(e),t!==300&&i.delete(n);break}}}},w=class extends t.RxDisposable{constructor(e){super(),this._protocol=e,y(this,`_channels`,new Map),y(this,`_subscriptions`,new Map),this._protocol.onMessage.pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>this._onRequest(e)),this._sendInitialize()}dispose(){super.dispose(),this._subscriptions.clear(),this._channels.clear()}registerChannel(e,t){this._channels.set(e,t)}_onRequest(e){switch(e.type){case 50:this._sendInitialize();break;case 100:this._onMethodCall(e);break;case 101:this._onSubscribe(e);break;case 102:this._onUnsubscribe(e);break;default:break}}_sendInitialize(){this._sendResponse({seq:-1,type:0})}_onMethodCall(e){let{channelName:t,method:n,args:r}=e,i=this._channels.get(t),a;try{if(!i)throw Error(`[ChannelServer]: Channel ${t} not found!`);a=r?i.call(n,r):i.call(n)}catch(e){a=Promise.reject(e instanceof Error?e:Error(String(e)))}a.then(t=>{this._sendResponse({seq:e.seq,type:201,data:t})}).catch(t=>{t instanceof Error?this._sendResponse({seq:e.seq,type:202,data:t.message}):this._sendResponse({seq:e.seq,type:202,data:String(t)})})}_onSubscribe(e){let{channelName:t,seq:n}=e,r=this._channels.get(t);try{if(!r)throw Error(`[ChannelServer]: Channel ${t} not found!`);let i=r.subscribe(e.method,e.args).subscribe({next:e=>{this._sendResponse({seq:n,type:300,data:e})},error:e=>{this._sendResponse({seq:n,type:301,data:e.message}),this._sendResponse({seq:n,type:302})},complete:()=>{this._sendResponse({seq:n,type:302})}});this._subscriptions.set(e.seq,i)}catch(t){t instanceof Error?this._sendResponse({seq:e.seq,type:301,data:t.message}):this._sendResponse({seq:e.seq,type:301,data:String(t)})}}_onUnsubscribe(e){let t=this._subscriptions.get(e.seq);t&&(t.unsubscribe(),this._subscriptions.delete(e.seq))}_sendResponse(e){this._protocol.send(e)}};let T=(0,t.createIdentifier)(`IRPCChannelService`);var E=class{constructor(e){y(this,`_client`,void 0),y(this,`_server`,void 0),this._client=new C(e),this._server=new w(e)}dispose(){this._client.dispose(),this._server.dispose()}requestChannel(e){return this._client.getChannel(e)}registerChannel(e,t){this._server.registerChannel(e,t)}};let D=class extends t.RxDisposable{constructor(e,t,n,r,i){super(),this._injector=e,this._commandService=t,this._univerInstanceService=n,this._rpcChannelService=r,this._remoteSyncService=i,y(this,`_remoteInstanceService`,void 0),y(this,`_syncingUnits`,new Set),y(this,`_syncingMutations`,new Set),y(this,`_syncMutationQueue`,Promise.resolve()),this._initRPCChannels(),this._init()}registerSyncingMutations(e){this._syncingMutations.add(e.id)}syncUnit(e){let n=this._syncingUnits.has(e);this._syncingUnits.add(e);let r=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_SHEET)??this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_BASE);return!n&&r&&this._remoteInstanceService.createInstance({unitID:r.getUnitId(),type:r.type,snapshot:r.getSnapshot()}),(0,t.toDisposable)(()=>{n||this._syncingUnits.delete(e),!n&&r&&this._remoteInstanceService.disposeInstance({unitID:r.getUnitId()})})}syncUnitMutations(e){let n=this._syncingUnits.has(e);return this._syncingUnits.add(e),(0,t.toDisposable)(()=>{n||this._syncingUnits.delete(e)})}_initRPCChannels(){this._rpcChannelService.registerChannel(u,b(this._remoteSyncService)),this._injector.add([m,{useFactory:()=>x(this._rpcChannelService.requestChannel(p))}]),this._remoteInstanceService=this._injector.get(m)}_init(){this._univerInstanceService.getTypeOfUnitAdded$(t.UniverInstanceType.UNIVER_SHEET).pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>{let{unit:n}=e;this._syncingUnits.add(n.getUnitId()),this._remoteInstanceService.createInstance({unitID:n.getUnitId(),type:t.UniverInstanceType.UNIVER_SHEET,snapshot:n.getSnapshot()})}),this._univerInstanceService.getTypeOfUnitDisposed$(t.UniverInstanceType.UNIVER_SHEET).pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>{this._syncingUnits.delete(e.getUnitId()),this._remoteInstanceService.disposeInstance({unitID:e.getUnitId()})}),this.disposeWithMe(this._commandService.onCommandExecuted((e,n)=>{let{type:r,params:i,id:a}=e,o=(i==null?void 0:i.unitId)||``;if(r===t.CommandType.MUTATION&&(!o||this._syncingUnits.has(o))&&!(n!=null&&n.fromSync)&&this._syncingMutations.has(a)){let t=()=>this._remoteInstanceService.syncMutation({mutationInfo:e},n);this._syncMutationQueue=this._syncMutationQueue.then(t,t).catch(()=>!1)}}))}};D=l([c(0,(0,t.Inject)(t.Injector)),c(1,t.ICommandService),c(2,t.IUniverInstanceService),c(3,T),c(4,d)],D);let O=class extends t.Disposable{constructor(e,t,n,r){super(),this._injector=e,this._remoteInstanceService=t,this._commandService=n,this._rpcChannelService=r,y(this,`_remoteSyncService`,void 0),this._initRPCChannels(),this._init()}_initRPCChannels(){this._rpcChannelService.registerChannel(p,b(this._remoteInstanceService)),this._injector.add([d,{useFactory:()=>x(this._rpcChannelService.requestChannel(u))}]),this._remoteSyncService=this._injector.get(d)}_init(){this.disposeWithMe(this._commandService.onCommandExecuted((e,n)=>{e.type===t.CommandType.MUTATION&&!(n!=null&&n.fromSync)&&this._remoteSyncService.syncMutation({mutationInfo:e},n)}))}};O=l([c(0,(0,t.Inject)(t.Injector)),c(1,m),c(2,t.ICommandService),c(3,T)],O);var k=`@univerjs/rpc`,A=`1.0.0-beta.0`;function j(){return{send(e){postMessage(e)},onMessage:new r.Observable(e=>{let t=t=>{e.next(t.data)};return addEventListener(`message`,t),()=>removeEventListener(`message`,t)}).pipe((0,r.shareReplay)({bufferSize:1,refCount:!0}))}}function M(e){return{send(t){e.postMessage(t)},onMessage:new r.Observable(t=>{let n=e=>{t.next(e.data)};return e.addEventListener(`message`,n),()=>e.removeEventListener(`message`,n)}).pipe((0,r.shareReplay)({bufferSize:1,refCount:!0}))}}let N=class extends t.Plugin{constructor(e=a,n,r){super(),this._config=e,this._injector=n,this._configService=r,y(this,`_internalWorker`,null);let{...o}=(0,t.merge)({},a,this._config);this._configService.setConfig(i,o)}dispose(){super.dispose(),this._internalWorker&&=(this._internalWorker.terminate(),null)}onStarting(){let{workerURL:e}=this._config;if(!e)throw Error(`[UniverRPCMainThreadPlugin]: The workerURL is required for the RPC main thread plugin.`);let t=e instanceof Worker?e:new Worker(e);this._internalWorker=e instanceof Worker?null:t;let n=M(t);[[T,{useFactory:()=>new E(n)}],[D],[d,{useClass:f}]].forEach(e=>this._injector.add(e)),this._injector.get(D)}};y(N,`pluginName`,`UNIVER_RPC_MAIN_THREAD_PLUGIN`),y(N,`packageName`,k),y(N,`version`,A),N=l([c(1,(0,t.Inject)(t.Injector)),c(2,t.IConfigService)],N);let P=class extends t.Plugin{constructor(e=s,n,r){super(),this._config=e,this._injector=n,this._configService=r;let{...i}=(0,t.merge)({},s,this._config);this._configService.setConfig(o,i)}onStarting(){[[O],[T,{useFactory:()=>new E(j())}],[m,{useClass:h}]].forEach(e=>this._injector.add(e)),this._injector.get(O)}};y(P,`pluginName`,`UNIVER_RPC_WORKER_THREAD_PLUGIN`),y(P,`packageName`,k),y(P,`version`,A),P=l([c(1,(0,t.Inject)(t.Injector)),c(2,t.IConfigService)],P),e.ChannelClient=C,e.ChannelServer=w,e.ChannelService=E,Object.defineProperty(e,"DataSyncPrimaryController",{enumerable:!0,get:function(){return D}}),Object.defineProperty(e,"DataSyncReplicaController",{enumerable:!0,get:function(){return O}}),e.IRPCChannelService=T,e.IRemoteInstanceService=m,e.IRemoteSyncService=d,e.PLUGIN_CONFIG_KEY_MAIN_THREAD=i,e.PLUGIN_CONFIG_KEY_WORKER_THREAD=o,e.RemoteInstanceServiceName=p,Object.defineProperty(e,"RemoteSyncPrimaryService",{enumerable:!0,get:function(){return f}}),e.RemoteSyncServiceName=u,Object.defineProperty(e,"UniverRPCMainThreadPlugin",{enumerable:!0,get:function(){return N}}),Object.defineProperty(e,"UniverRPCWorkerThreadPlugin",{enumerable:!0,get:function(){return P}}),Object.defineProperty(e,"WebWorkerRemoteInstanceService",{enumerable:!0,get:function(){return h}}),e.fromModule=b,e.toModule=x});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("@univerjs/core"),require("rxjs/operators"),require("rxjs")):typeof define==`function`&&define.amd?define([`exports`,`@univerjs/core`,`rxjs/operators`,`rxjs`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.UniverRpc={},e.UniverCore,e.rxjs.operators,e.rxjs))})(this,function(e,t,n,r){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});let i=`rpc.main-thread.config`,a={},o=`rpc.worker-thread.config`,s={};function c(e,t){return function(n,r){t(n,r,e)}}function l(e,t,n,r){var i=arguments.length,a=i<3?t:r===null?r=Object.getOwnPropertyDescriptor(t,n):r,o;if(typeof Reflect==`object`&&typeof Reflect.decorate==`function`)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a}let u=`rpc.remote-sync.service`,d=(0,t.createIdentifier)(u),f=class{constructor(e){this._commandService=e}async syncMutation(e,t){let{fromCollab:n,...r}=t||{};return this._commandService.syncExecuteCommand(e.mutationInfo.id,e.mutationInfo.params,{...r,onlyLocal:!0,fromSync:!0})}};f=l([c(0,t.ICommandService)],f);let p=`univer.remote-instance-service`,m=(0,t.createIdentifier)(p),h=class{constructor(e,t,n,r){this._univerInstanceService=e,this._commandService=t,this._logService=n,this._lifecycleService=r}whenReady(){return this._lifecycleService.stage>=t.LifecycleStages.Ready?Promise.resolve(!0):this._lifecycleService.onStage(t.LifecycleStages.Ready).then(()=>!0)}async syncMutation(e,t){return this._applyMutation(e.mutationInfo,t)}async createInstance(e){this._logService.debug(`[WebWorkerRemoteInstanceService]: Creating instance with id ${e.unitID}`);let{type:n,snapshot:r}=e;try{switch(n){case t.UniverInstanceType.UNIVER_SHEET:return this._univerInstanceService.createUnit(t.UniverInstanceType.UNIVER_SHEET,r),!0;case t.UniverInstanceType.UNIVER_BASE:return this._univerInstanceService.createUnit(t.UniverInstanceType.UNIVER_BASE,r),!0;default:throw Error(`[WebWorkerRemoteInstanceService]: cannot create replica for document type: ${n}.`)}}catch(e){throw e instanceof Error?e:TypeError(`${e}`)}}async disposeInstance(e){return this._logService.debug(`[WebWorkerRemoteInstanceService]: Disposing instance with id ${e.unitID}`),this._univerInstanceService.disposeUnit(e.unitID)}_applyMutation(e,t){let{id:n,params:r}=e,{fromCollab:i,...a}=t||{};return this._commandService.syncExecuteCommand(n,r,{...a,onlyLocal:!0,fromSync:!0})}};h=l([c(0,t.IUniverInstanceService),c(1,t.ICommandService),c(2,t.ILogService),c(3,(0,t.Inject)(t.LifecycleService))],h);function g(e){"@babel/helpers - typeof";return g=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},g(e)}function _(e,t){if(g(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(g(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function v(e){var t=_(e,`string`);return g(t)==`symbol`?t:t+``}function y(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function b(e){let t=e;return new class{call(e,n){let r=t[e];if(typeof r==`function`){let e=n?r.apply(t,n):r.call(t);return e instanceof Promise||(e=Promise.resolve(e)),e}throw Error(`[RPC]: method not found for ${e}!`)}subscribe(e,n){let i=t[e];if(typeof i==`function`){let e=n?i.apply(t,n):i.call(t);return(0,r.isObservable)(e)?e:(0,r.of)(e)}throw Error(`[RPC]: observable method not found for ${e}!`)}}}function x(e){return new Proxy({},{get(t,n){if(n!==`dispose`)return function(...t){return S(n)?e.subscribe(n,t):e.call(n,t)}}})}function S(e){return e.endsWith(`$`)}var C=class extends t.RxDisposable{constructor(e){super(),this._protocol=e,y(this,`_initialized`,new r.BehaviorSubject(!1)),y(this,`_lastRequestCounter`,0),y(this,`_pendingRequests`,new Map),this._protocol.send({type:50}),this._protocol.onMessage.pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>this._onMessage(e))}dispose(){this._pendingRequests.clear()}getChannel(e){return{call:(t,n)=>this._disposed?Promise.reject(Error(`[ChannelClient]: client is disposed!`)):this._remoteCall(e,t,n),subscribe:(t,n)=>{if(this._disposed)throw Error(`[ChannelClient]: client is disposed!`);return this._remoteSubscribe(e,t,n)}}}_whenReady(){return(0,r.firstValueFrom)(this._initialized.pipe((0,n.filter)(e=>e),(0,n.take)(1)))}_remoteCall(e,t,n){return this._initialized.getValue()?this._doRemoteCall(e,t,n):this._whenReady().then(()=>this._doRemoteCall(e,t,n))}_doRemoteCall(e,t,n){let r=++this._lastRequestCounter,i={seq:r,type:100,channelName:e,method:t,args:n},a=this._pendingRequests;return new Promise((e,t)=>{this._pendingRequests.set(r,{handle(n){switch(n.type){case 201:a.delete(r),e(n.data);break;case 202:a.delete(r),t(n.data);break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(i)})}_remoteSubscribe(e,t,n){return new r.Observable(r=>{let i=-1,a=()=>{i=++this._lastRequestCounter;let a={seq:i,type:101,channelName:e,method:t,args:n};this._pendingRequests.set(i,{handle(e){switch(e.type){case 300:r.next(e.data);break;case 301:r.error(e.data);break;case 302:r.complete();break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(a)};return this._initialized.getValue()?a():this._whenReady().then(a),()=>{if(i===-1)return;let n={type:102,seq:i,channelName:e,method:t};this._sendRequest(n)}})}_sendRequest(e){this._protocol.send(e)}_onMessage(e){let{type:t,seq:n}=e;switch(t){case 0:this._initialized.next(!0);break;case 201:case 202:case 300:case 302:case 301:{var r;let{_pendingRequests:i}=this;(r=i.get(n))==null||r.handle(e),t!==300&&i.delete(n);break}}}},w=class extends t.RxDisposable{constructor(e){super(),this._protocol=e,y(this,`_channels`,new Map),y(this,`_subscriptions`,new Map),this._protocol.onMessage.pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>this._onRequest(e)),this._sendInitialize()}dispose(){super.dispose(),this._subscriptions.clear(),this._channels.clear()}registerChannel(e,t){this._channels.set(e,t)}_onRequest(e){switch(e.type){case 50:this._sendInitialize();break;case 100:this._onMethodCall(e);break;case 101:this._onSubscribe(e);break;case 102:this._onUnsubscribe(e);break;default:break}}_sendInitialize(){this._sendResponse({seq:-1,type:0})}_onMethodCall(e){let{channelName:t,method:n,args:r}=e,i=this._channels.get(t),a;try{if(!i)throw Error(`[ChannelServer]: Channel ${t} not found!`);a=r?i.call(n,r):i.call(n)}catch(e){a=Promise.reject(e instanceof Error?e:Error(String(e)))}a.then(t=>{this._sendResponse({seq:e.seq,type:201,data:t})}).catch(t=>{t instanceof Error?this._sendResponse({seq:e.seq,type:202,data:t.message}):this._sendResponse({seq:e.seq,type:202,data:String(t)})})}_onSubscribe(e){let{channelName:t,seq:n}=e,r=this._channels.get(t);try{if(!r)throw Error(`[ChannelServer]: Channel ${t} not found!`);let i=r.subscribe(e.method,e.args).subscribe({next:e=>{this._sendResponse({seq:n,type:300,data:e})},error:e=>{this._sendResponse({seq:n,type:301,data:e.message}),this._sendResponse({seq:n,type:302})},complete:()=>{this._sendResponse({seq:n,type:302})}});this._subscriptions.set(e.seq,i)}catch(t){t instanceof Error?this._sendResponse({seq:e.seq,type:301,data:t.message}):this._sendResponse({seq:e.seq,type:301,data:String(t)})}}_onUnsubscribe(e){let t=this._subscriptions.get(e.seq);t&&(t.unsubscribe(),this._subscriptions.delete(e.seq))}_sendResponse(e){this._protocol.send(e)}};let T=(0,t.createIdentifier)(`IRPCChannelService`);var E=class{constructor(e){y(this,`_client`,void 0),y(this,`_server`,void 0),this._client=new C(e),this._server=new w(e)}dispose(){this._client.dispose(),this._server.dispose()}requestChannel(e){return this._client.getChannel(e)}registerChannel(e,t){this._server.registerChannel(e,t)}};let D=class extends t.RxDisposable{constructor(e,t,n,r,i){super(),this._injector=e,this._commandService=t,this._univerInstanceService=n,this._rpcChannelService=r,this._remoteSyncService=i,y(this,`_remoteInstanceService`,void 0),y(this,`_syncingUnits`,new Set),y(this,`_syncingMutations`,new Set),y(this,`_syncMutationQueue`,Promise.resolve()),y(this,`_remoteReady`,Promise.resolve(!0)),this._initRPCChannels(),this._init()}registerSyncingMutations(e){this._syncingMutations.add(e.id)}syncUnit(e){let n=this._syncingUnits.has(e);this._syncingUnits.add(e);let r=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_SHEET)??this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_BASE);return!n&&r&&this._remoteInstanceService.createInstance({unitID:r.getUnitId(),type:r.type,snapshot:r.getSnapshot()}),(0,t.toDisposable)(()=>{n||this._syncingUnits.delete(e),!n&&r&&this._remoteInstanceService.disposeInstance({unitID:r.getUnitId()})})}syncUnitMutations(e){let n=this._syncingUnits.has(e);return this._syncingUnits.add(e),(0,t.toDisposable)(()=>{n||this._syncingUnits.delete(e)})}async syncMutation(e,t){let n=()=>this._remoteReady.then(()=>this._remoteInstanceService.syncMutation({mutationInfo:e},t)),r=this._syncMutationQueue.then(n,n);return this._syncMutationQueue=r.catch(()=>!1),r}async waitForPendingMutations(){await this._syncMutationQueue.catch(()=>!1)}_initRPCChannels(){this._rpcChannelService.registerChannel(u,b(this._remoteSyncService)),this._injector.add([m,{useFactory:()=>x(this._rpcChannelService.requestChannel(p))}]),this._remoteInstanceService=this._injector.get(m),this._remoteReady=this._remoteInstanceService.whenReady()}_init(){this._univerInstanceService.getTypeOfUnitAdded$(t.UniverInstanceType.UNIVER_SHEET).pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>{let{unit:n}=e;this._syncingUnits.add(n.getUnitId()),this._remoteInstanceService.createInstance({unitID:n.getUnitId(),type:t.UniverInstanceType.UNIVER_SHEET,snapshot:n.getSnapshot()})}),this._univerInstanceService.getTypeOfUnitDisposed$(t.UniverInstanceType.UNIVER_SHEET).pipe((0,n.takeUntil)(this.dispose$)).subscribe(e=>{this._syncingUnits.delete(e.getUnitId()),this._remoteInstanceService.disposeInstance({unitID:e.getUnitId()})}),this.disposeWithMe(this._commandService.onCommandExecuted((e,n)=>{let{type:r,params:i,id:a}=e,o=(i==null?void 0:i.unitId)||``;r===t.CommandType.MUTATION&&(!o||this._syncingUnits.has(o))&&!(n!=null&&n.fromSync)&&this._syncingMutations.has(a)&&this.syncMutation(e,n)}))}};D=l([c(0,(0,t.Inject)(t.Injector)),c(1,t.ICommandService),c(2,t.IUniverInstanceService),c(3,T),c(4,d)],D);let O=class extends t.Disposable{constructor(e,t,n,r){super(),this._injector=e,this._remoteInstanceService=t,this._commandService=n,this._rpcChannelService=r,y(this,`_remoteSyncService`,void 0),this._initRPCChannels(),this._init()}_initRPCChannels(){this._rpcChannelService.registerChannel(p,b(this._remoteInstanceService)),this._injector.add([d,{useFactory:()=>x(this._rpcChannelService.requestChannel(u))}]),this._remoteSyncService=this._injector.get(d)}_init(){this.disposeWithMe(this._commandService.onCommandExecuted((e,n)=>{e.type===t.CommandType.MUTATION&&!(n!=null&&n.fromSync)&&this._remoteSyncService.syncMutation({mutationInfo:e},n)}))}};O=l([c(0,(0,t.Inject)(t.Injector)),c(1,m),c(2,t.ICommandService),c(3,T)],O);var k=`@univerjs/rpc`,A=`1.0.0-beta.2`;function j(){return{send(e){postMessage(e)},onMessage:new r.Observable(e=>{let t=t=>{e.next(t.data)};return addEventListener(`message`,t),()=>removeEventListener(`message`,t)}).pipe((0,r.shareReplay)({bufferSize:1,refCount:!0}))}}function M(e){return{send(t){e.postMessage(t)},onMessage:new r.Observable(t=>{let n=e=>{t.next(e.data)};return e.addEventListener(`message`,n),()=>e.removeEventListener(`message`,n)}).pipe((0,r.shareReplay)({bufferSize:1,refCount:!0}))}}let N=class extends t.Plugin{constructor(e=a,n,r){super(),this._config=e,this._injector=n,this._configService=r,y(this,`_internalWorker`,null);let{...o}=(0,t.merge)({},a,this._config);this._configService.setConfig(i,o)}dispose(){super.dispose(),this._internalWorker&&=(this._internalWorker.terminate(),null)}onStarting(){let{workerURL:e}=this._config;if(!e)throw Error(`[UniverRPCMainThreadPlugin]: The workerURL is required for the RPC main thread plugin.`);let t=e instanceof Worker?e:new Worker(e);this._internalWorker=e instanceof Worker?null:t;let n=M(t);[[T,{useFactory:()=>new E(n)}],[D],[d,{useClass:f}]].forEach(e=>this._injector.add(e)),this._injector.get(D)}};y(N,`pluginName`,`UNIVER_RPC_MAIN_THREAD_PLUGIN`),y(N,`packageName`,k),y(N,`version`,A),N=l([c(1,(0,t.Inject)(t.Injector)),c(2,t.IConfigService)],N);let P=class extends t.Plugin{constructor(e=s,n,r){super(),this._config=e,this._injector=n,this._configService=r;let{...i}=(0,t.merge)({},s,this._config);this._configService.setConfig(o,i)}onStarting(){[[O],[T,{useFactory:()=>new E(j())}],[m,{useClass:h}]].forEach(e=>this._injector.add(e)),this._injector.get(O)}};y(P,`pluginName`,`UNIVER_RPC_WORKER_THREAD_PLUGIN`),y(P,`packageName`,k),y(P,`version`,A),P=l([c(1,(0,t.Inject)(t.Injector)),c(2,t.IConfigService)],P),e.ChannelClient=C,e.ChannelServer=w,e.ChannelService=E,Object.defineProperty(e,"DataSyncPrimaryController",{enumerable:!0,get:function(){return D}}),Object.defineProperty(e,"DataSyncReplicaController",{enumerable:!0,get:function(){return O}}),e.IRPCChannelService=T,e.IRemoteInstanceService=m,e.IRemoteSyncService=d,e.PLUGIN_CONFIG_KEY_MAIN_THREAD=i,e.PLUGIN_CONFIG_KEY_WORKER_THREAD=o,e.RemoteInstanceServiceName=p,Object.defineProperty(e,"RemoteSyncPrimaryService",{enumerable:!0,get:function(){return f}}),e.RemoteSyncServiceName=u,Object.defineProperty(e,"UniverRPCMainThreadPlugin",{enumerable:!0,get:function(){return N}}),Object.defineProperty(e,"UniverRPCWorkerThreadPlugin",{enumerable:!0,get:function(){return P}}),Object.defineProperty(e,"WebWorkerRemoteInstanceService",{enumerable:!0,get:function(){return h}}),e.fromModule=b,e.toModule=x});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@univerjs/rpc",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Browser RPC layer for Univer main-thread and worker communication.",
|
|
6
6
|
"author": "DreamNum Co., Ltd. <developer@univer.ai>",
|
|
@@ -52,13 +52,13 @@
|
|
|
52
52
|
"rxjs": ">=7.0.0"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@univerjs/core": "1.0.0-beta.
|
|
55
|
+
"@univerjs/core": "1.0.0-beta.2"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"rxjs": "^7.8.2",
|
|
59
59
|
"typescript": "^6.0.3",
|
|
60
60
|
"vitest": "^4.1.10",
|
|
61
|
-
"@univerjs-infra/shared": "1.0.0-beta.
|
|
61
|
+
"@univerjs-infra/shared": "1.0.0-beta.2"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"test": "vitest run",
|