@univerjs/rpc 1.0.0-alpha.8 → 1.0.0-beta.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/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
  }
@@ -523,10 +527,9 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends _univerj
523
527
  * sync other types of documents, you should manually call this method with that document's id.
524
528
  */
525
529
  syncUnit(unitId) {
526
- var _this$_univerInstance;
527
530
  const alreadySyncing = this._syncingUnits.has(unitId);
528
531
  this._syncingUnits.add(unitId);
529
- const unit = (_this$_univerInstance = this._univerInstanceService.getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_SHEET)) !== null && _this$_univerInstance !== void 0 ? _this$_univerInstance : this._univerInstanceService.getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_BASE);
532
+ const unit = this._univerInstanceService.getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_SHEET) ?? this._univerInstanceService.getUnit(unitId, _univerjs_core.UniverInstanceType.UNIVER_BASE);
530
533
  if (!alreadySyncing && unit) this._remoteInstanceService.createInstance({
531
534
  unitID: unit.getUnitId(),
532
535
  type: unit.type,
@@ -545,10 +548,20 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends _univerj
545
548
  if (!alreadySyncing) this._syncingUnits.delete(unitId);
546
549
  });
547
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
+ }
548
560
  _initRPCChannels() {
549
561
  this._rpcChannelService.registerChannel(RemoteSyncServiceName, fromModule(this._remoteSyncService));
550
562
  this._injector.add([IRemoteInstanceService, { useFactory: () => toModule(this._rpcChannelService.requestChannel(RemoteInstanceServiceName)) }]);
551
563
  this._remoteInstanceService = this._injector.get(IRemoteInstanceService);
564
+ this._remoteReady = this._remoteInstanceService.whenReady();
552
565
  }
553
566
  _init() {
554
567
  this._univerInstanceService.getTypeOfUnitAdded$(_univerjs_core.UniverInstanceType.UNIVER_SHEET).pipe((0, rxjs_operators.takeUntil)(this.dispose$)).subscribe((event) => {
@@ -567,10 +580,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends _univerj
567
580
  this.disposeWithMe(this._commandService.onCommandExecuted((commandInfo, options) => {
568
581
  const { type, params, id } = commandInfo;
569
582
  const unitId = (params === null || params === void 0 ? void 0 : params.unitId) || "";
570
- if (type === _univerjs_core.CommandType.MUTATION && (!unitId || this._syncingUnits.has(unitId)) && !(options === null || options === void 0 ? void 0 : options.fromSync) && this._syncingMutations.has(id)) {
571
- const sync = () => this._remoteInstanceService.syncMutation({ mutationInfo: commandInfo }, options);
572
- this._syncMutationQueue = this._syncMutationQueue.then(sync, sync).catch(() => false);
573
- }
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);
574
584
  }));
575
585
  }
576
586
  };
@@ -616,7 +626,7 @@ DataSyncReplicaController = __decorate([
616
626
  //#endregion
617
627
  //#region package.json
618
628
  var name = "@univerjs/rpc";
619
- var version = "1.0.0-alpha.8";
629
+ var version = "1.0.0-beta.1";
620
630
 
621
631
  //#endregion
622
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
  }
@@ -522,10 +526,9 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
522
526
  * sync other types of documents, you should manually call this method with that document's id.
523
527
  */
524
528
  syncUnit(unitId) {
525
- var _this$_univerInstance;
526
529
  const alreadySyncing = this._syncingUnits.has(unitId);
527
530
  this._syncingUnits.add(unitId);
528
- const unit = (_this$_univerInstance = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET)) !== null && _this$_univerInstance !== void 0 ? _this$_univerInstance : this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_BASE);
531
+ const unit = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET) ?? this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_BASE);
529
532
  if (!alreadySyncing && unit) this._remoteInstanceService.createInstance({
530
533
  unitID: unit.getUnitId(),
531
534
  type: unit.type,
@@ -544,10 +547,20 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
544
547
  if (!alreadySyncing) this._syncingUnits.delete(unitId);
545
548
  });
546
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
+ }
547
559
  _initRPCChannels() {
548
560
  this._rpcChannelService.registerChannel(RemoteSyncServiceName, fromModule(this._remoteSyncService));
549
561
  this._injector.add([IRemoteInstanceService, { useFactory: () => toModule(this._rpcChannelService.requestChannel(RemoteInstanceServiceName)) }]);
550
562
  this._remoteInstanceService = this._injector.get(IRemoteInstanceService);
563
+ this._remoteReady = this._remoteInstanceService.whenReady();
551
564
  }
552
565
  _init() {
553
566
  this._univerInstanceService.getTypeOfUnitAdded$(UniverInstanceType.UNIVER_SHEET).pipe(takeUntil(this.dispose$)).subscribe((event) => {
@@ -566,10 +579,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
566
579
  this.disposeWithMe(this._commandService.onCommandExecuted((commandInfo, options) => {
567
580
  const { type, params, id } = commandInfo;
568
581
  const unitId = (params === null || params === void 0 ? void 0 : params.unitId) || "";
569
- if (type === 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
- }
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);
573
583
  }));
574
584
  }
575
585
  };
@@ -615,7 +625,7 @@ DataSyncReplicaController = __decorate([
615
625
  //#endregion
616
626
  //#region package.json
617
627
  var name = "@univerjs/rpc";
618
- var version = "1.0.0-alpha.8";
628
+ var version = "1.0.0-beta.1";
619
629
 
620
630
  //#endregion
621
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
  }
@@ -522,10 +526,9 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
522
526
  * sync other types of documents, you should manually call this method with that document's id.
523
527
  */
524
528
  syncUnit(unitId) {
525
- var _this$_univerInstance;
526
529
  const alreadySyncing = this._syncingUnits.has(unitId);
527
530
  this._syncingUnits.add(unitId);
528
- const unit = (_this$_univerInstance = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET)) !== null && _this$_univerInstance !== void 0 ? _this$_univerInstance : this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_BASE);
531
+ const unit = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET) ?? this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_BASE);
529
532
  if (!alreadySyncing && unit) this._remoteInstanceService.createInstance({
530
533
  unitID: unit.getUnitId(),
531
534
  type: unit.type,
@@ -544,10 +547,20 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
544
547
  if (!alreadySyncing) this._syncingUnits.delete(unitId);
545
548
  });
546
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
+ }
547
559
  _initRPCChannels() {
548
560
  this._rpcChannelService.registerChannel(RemoteSyncServiceName, fromModule(this._remoteSyncService));
549
561
  this._injector.add([IRemoteInstanceService, { useFactory: () => toModule(this._rpcChannelService.requestChannel(RemoteInstanceServiceName)) }]);
550
562
  this._remoteInstanceService = this._injector.get(IRemoteInstanceService);
563
+ this._remoteReady = this._remoteInstanceService.whenReady();
551
564
  }
552
565
  _init() {
553
566
  this._univerInstanceService.getTypeOfUnitAdded$(UniverInstanceType.UNIVER_SHEET).pipe(takeUntil(this.dispose$)).subscribe((event) => {
@@ -566,10 +579,7 @@ let DataSyncPrimaryController = class DataSyncPrimaryController extends RxDispos
566
579
  this.disposeWithMe(this._commandService.onCommandExecuted((commandInfo, options) => {
567
580
  const { type, params, id } = commandInfo;
568
581
  const unitId = (params === null || params === void 0 ? void 0 : params.unitId) || "";
569
- if (type === 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
- }
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);
573
583
  }));
574
584
  }
575
585
  };
@@ -615,7 +625,7 @@ DataSyncReplicaController = __decorate([
615
625
  //#endregion
616
626
  //#region package.json
617
627
  var name = "@univerjs/rpc";
618
- var version = "1.0.0-alpha.8";
628
+ var version = "1.0.0-beta.1";
619
629
 
620
630
  //#endregion
621
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
- constructor(_univerInstanceService: IUniverInstanceService, _commandService: ICommandService, _logService: ILogService);
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){var n;let r=this._syncingUnits.has(e);this._syncingUnits.add(e);let i=(n=this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_SHEET))==null?this._univerInstanceService.getUnit(e,t.UniverInstanceType.UNIVER_BASE):n;return!r&&i&&this._remoteInstanceService.createInstance({unitID:i.getUnitId(),type:i.type,snapshot:i.getSnapshot()}),(0,t.toDisposable)(()=>{r||this._syncingUnits.delete(e),!r&&i&&this._remoteInstanceService.disposeInstance({unitID:i.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-alpha.8`;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(),this._internalWorker=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.1`;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-alpha.8",
3
+ "version": "1.0.0-beta.1",
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-alpha.8"
55
+ "@univerjs/core": "1.0.0-beta.1"
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-alpha.8"
61
+ "@univerjs-infra/shared": "1.0.0-beta.1"
62
62
  },
63
63
  "scripts": {
64
64
  "test": "vitest run",