@univerjs/rpc 0.17.0 → 0.18.0

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
@@ -1 +1 @@
1
- "use strict";var L=Object.defineProperty;var H=(i,n,e)=>n in i?L(i,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[n]=e;var l=(i,n,e)=>H(i,typeof n!="symbol"?n+"":n,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("@univerjs/core"),u=require("rxjs/operators"),_=require("rxjs"),q="rpc.main-thread.config",T={},O="rpc.worker-thread.config",D={};var A=Object.getOwnPropertyDescriptor,j=(i,n,e,t)=>{for(var s=t>1?void 0:t?A(n,e):n,r=i.length-1,c;r>=0;r--)(c=i[r])&&(s=c(s)||s);return s},R=(i,n)=>(e,t)=>n(e,t,i);const b="rpc.remote-sync.service",S=o.createIdentifier(b);exports.RemoteSyncPrimaryService=class{constructor(n){this._commandService=n}async syncMutation(n,e){const{fromCollab:t,...s}=e||{};return this._commandService.syncExecuteCommand(n.mutationInfo.id,n.mutationInfo.params,{...s,onlyLocal:!0,fromSync:!0})}};exports.RemoteSyncPrimaryService=j([R(0,o.ICommandService)],exports.RemoteSyncPrimaryService);const P="univer.remote-instance-service",y=o.createIdentifier(P);exports.WebWorkerRemoteInstanceService=class{constructor(n,e,t){this._univerInstanceService=n,this._commandService=e,this._logService=t}whenReady(){return Promise.resolve(!0)}async syncMutation(n,e){return this._applyMutation(n.mutationInfo,e)}async createInstance(n){this._logService.debug(`[WebWorkerRemoteInstanceService]: Creating instance with id ${n.unitID}`);const{type:e,snapshot:t}=n;try{if(e===o.UniverInstanceType.UNIVER_SHEET)return this._univerInstanceService.createUnit(o.UniverInstanceType.UNIVER_SHEET,t),!0;throw new Error(`[WebWorkerRemoteInstanceService]: cannot create replica for document type: ${e}.`)}catch(s){throw s instanceof Error?s:new TypeError(`${s}`)}}async disposeInstance(n){return this._logService.debug(`[WebWorkerRemoteInstanceService]: Disposing instance with id ${n.unitID}`),this._univerInstanceService.disposeUnit(n.unitID)}_applyMutation(n,e){const{id:t,params:s}=n,{fromCollab:r,...c}=e||{};return this._commandService.syncExecuteCommand(t,s,{...c,onlyLocal:!0,fromSync:!0})}};exports.WebWorkerRemoteInstanceService=j([R(0,o.IUniverInstanceService),R(1,o.ICommandService),R(2,o.ILogService)],exports.WebWorkerRemoteInstanceService);function M(i){const n=i;return new class{call(e,t){const s=n[e];if(typeof s=="function"){let r=t?s.apply(n,t):s.call(n);return r instanceof Promise||(r=Promise.resolve(r)),r}throw new Error(`[RPC]: method not found for ${e}!`)}subscribe(e,t){const s=n[e];if(typeof s=="function"){const r=t?s.apply(n,t):s.call(n);return _.isObservable(r)?r:_.of(r)}throw new Error(`[RPC]: observable method not found for ${e}!`)}}}function k(i){return new Proxy({},{get(n,e){if(e!=="dispose")return function(...t){return G(e)?i.subscribe(e,t):i.call(e,t)}}})}function G(i){return i.endsWith("$")}class N extends o.RxDisposable{constructor(e){super();l(this,"_initialized",new _.BehaviorSubject(!1));l(this,"_lastRequestCounter",0);l(this,"_pendingRequests",new Map);this._protocol=e,this._protocol.send({type:50}),this._protocol.onMessage.pipe(u.takeUntil(this.dispose$)).subscribe(t=>this._onMessage(t))}dispose(){this._pendingRequests.clear()}getChannel(e){return{call:(t,s)=>this._disposed?Promise.reject(new Error("[ChannelClient]: client is disposed!")):this._remoteCall(e,t,s),subscribe:(t,s)=>{if(this._disposed)throw new Error("[ChannelClient]: client is disposed!");return this._remoteSubscribe(e,t,s)}}}_whenReady(){return _.firstValueFrom(this._initialized.pipe(u.filter(e=>e),u.take(1)))}_remoteCall(e,t,s){return this._initialized.getValue()?this._doRemoteCall(e,t,s):this._whenReady().then(()=>this._doRemoteCall(e,t,s))}_doRemoteCall(e,t,s){const r=++this._lastRequestCounter,h={seq:r,type:100,channelName:e,method:t,args:s},a=this._pendingRequests;return new Promise((w,E)=>{const d={handle(U){switch(U.type){case 201:a.delete(r),w(U.data);break;case 202:a.delete(r),E(U.data);break;default:throw new Error("[ChannelClient]: unknown response type!")}}};this._pendingRequests.set(r,d),this._sendRequest(h)})}_remoteSubscribe(e,t,s){return new _.Observable(r=>{let c=-1;const h=()=>{c=++this._lastRequestCounter;const w={seq:c,type:101,channelName:e,method:t,args:s},E={handle(d){switch(d.type){case 300:r.next(d.data);break;case 301:r.error(d.data);break;case 302:r.complete();break;default:throw new Error("[ChannelClient]: unknown response type!")}}};this._pendingRequests.set(c,E),this._sendRequest(w)};return this._initialized.getValue()?h():this._whenReady().then(h),()=>{if(c===-1)return;const a={type:102,seq:c,channelName:e,method:t};this._sendRequest(a)}})}_sendRequest(e){this._protocol.send(e)}_onMessage(e){var r;const{type:t,seq:s}=e;switch(t){case 0:this._initialized.next(!0);break;case 201:case 202:case 300:case 302:case 301:{const{_pendingRequests:c}=this;(r=c.get(s))==null||r.handle(e),t!==300&&c.delete(s);break}}}}class $ extends o.RxDisposable{constructor(e){super();l(this,"_channels",new Map);l(this,"_subscriptions",new Map);this._protocol=e,this._protocol.onMessage.pipe(u.takeUntil(this.dispose$)).subscribe(t=>this._onRequest(t)),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}}_sendInitialize(){this._sendResponse({seq:-1,type:0})}_onMethodCall(e){const{channelName:t,method:s,args:r}=e,c=this._channels.get(t);let h;try{if(!c)throw new Error(`[ChannelServer]: Channel ${t} not found!`);h=r?c.call(s,r):c.call(s)}catch(a){h=Promise.reject(a instanceof Error?a:new Error(String(a)))}h.then(a=>{this._sendResponse({seq:e.seq,type:201,data:a})}).catch(a=>{a instanceof Error?this._sendResponse({seq:e.seq,type:202,data:a.message}):this._sendResponse({seq:e.seq,type:202,data:String(a)})})}_onSubscribe(e){const{channelName:t,seq:s}=e,r=this._channels.get(t);try{if(!r)throw new Error(`[ChannelServer]: Channel ${t} not found!`);const h=r.subscribe(e.method,e.args).subscribe({next:a=>{this._sendResponse({seq:s,type:300,data:a})},error:a=>{this._sendResponse({seq:s,type:301,data:a.message}),this._sendResponse({seq:s,type:302})},complete:()=>{this._sendResponse({seq:s,type:302})}});this._subscriptions.set(e.seq,h)}catch(c){c instanceof Error?this._sendResponse({seq:e.seq,type:301,data:c.message}):this._sendResponse({seq:e.seq,type:301,data:String(c)})}}_onUnsubscribe(e){const t=this._subscriptions.get(e.seq);t&&(t.unsubscribe(),this._subscriptions.delete(e.seq))}_sendResponse(e){this._protocol.send(e)}}const g=o.createIdentifier("IRPCChannelService");class W{constructor(n){l(this,"_client");l(this,"_server");this._client=new N(n),this._server=new $(n)}dispose(){this._client.dispose(),this._server.dispose()}requestChannel(n){return this._client.getChannel(n)}registerChannel(n,e){this._server.registerChannel(n,e)}}var V=Object.getOwnPropertyDescriptor,F=(i,n,e,t)=>{for(var s=t>1?void 0:t?V(n,e):n,r=i.length-1,c;r>=0;r--)(c=i[r])&&(s=c(s)||s);return s},p=(i,n)=>(e,t)=>n(e,t,i);exports.DataSyncPrimaryController=class extends o.RxDisposable{constructor(e,t,s,r,c){super();l(this,"_remoteInstanceService");l(this,"_syncingUnits",new Set);l(this,"_syncingMutations",new Set);this._injector=e,this._commandService=t,this._univerInstanceService=s,this._rpcChannelService=r,this._remoteSyncService=c,this._initRPCChannels(),this._init()}registerSyncingMutations(e){this._syncingMutations.add(e.id)}syncUnit(e){return this._syncingUnits.add(e),o.toDisposable(()=>this._syncingUnits.delete(e))}_initRPCChannels(){this._rpcChannelService.registerChannel(b,M(this._remoteSyncService)),this._injector.add([y,{useFactory:()=>k(this._rpcChannelService.requestChannel(P))}]),this._remoteInstanceService=this._injector.get(y)}_init(){this._univerInstanceService.getTypeOfUnitAdded$(o.UniverInstanceType.UNIVER_SHEET).pipe(u.takeUntil(this.dispose$)).subscribe(e=>{this._syncingUnits.add(e.getUnitId()),this._remoteInstanceService.createInstance({unitID:e.getUnitId(),type:o.UniverInstanceType.UNIVER_SHEET,snapshot:e.getSnapshot()})}),this._univerInstanceService.getTypeOfUnitDisposed$(o.UniverInstanceType.UNIVER_SHEET).pipe(u.takeUntil(this.dispose$)).subscribe(e=>{this._syncingUnits.delete(e.getUnitId()),this._remoteInstanceService.disposeInstance({unitID:e.getUnitId()})}),this.disposeWithMe(this._commandService.onCommandExecuted((e,t)=>{const{type:s,params:r,id:c}=e,h=(r==null?void 0:r.unitId)||"";s===o.CommandType.MUTATION&&(!h||this._syncingUnits.has(h))&&!(t!=null&&t.fromSync)&&this._syncingMutations.has(c)&&this._remoteInstanceService.syncMutation({mutationInfo:e},t)}))}};exports.DataSyncPrimaryController=F([p(0,o.Inject(o.Injector)),p(1,o.ICommandService),p(2,o.IUniverInstanceService),p(3,g),p(4,S)],exports.DataSyncPrimaryController);var z=Object.getOwnPropertyDescriptor,K=(i,n,e,t)=>{for(var s=t>1?void 0:t?z(n,e):n,r=i.length-1,c;r>=0;r--)(c=i[r])&&(s=c(s)||s);return s},C=(i,n)=>(e,t)=>n(e,t,i);exports.DataSyncReplicaController=class extends o.Disposable{constructor(e,t,s,r){super();l(this,"_remoteSyncService");this._injector=e,this._remoteInstanceService=t,this._commandService=s,this._rpcChannelService=r,this._initRPCChannels(),this._init()}_initRPCChannels(){this._rpcChannelService.registerChannel(P,M(this._remoteInstanceService)),this._injector.add([S,{useFactory:()=>k(this._rpcChannelService.requestChannel(b))}]),this._remoteSyncService=this._injector.get(S)}_init(){this.disposeWithMe(this._commandService.onCommandExecuted((e,t)=>{e.type===o.CommandType.MUTATION&&!(t!=null&&t.fromSync)&&this._remoteSyncService.syncMutation({mutationInfo:e},t)}))}};exports.DataSyncReplicaController=K([C(0,o.Inject(o.Injector)),C(1,y),C(2,o.ICommandService),C(3,g)],exports.DataSyncReplicaController);const Y="@univerjs/rpc",B="0.17.0",I={name:Y,version:B};function J(){return{send(i){postMessage(i)},onMessage:new _.Observable(i=>{const n=e=>{i.next(e.data)};return addEventListener("message",n),()=>removeEventListener("message",n)}).pipe(_.shareReplay(1))}}function Q(i){return{send(n){i.postMessage(n)},onMessage:new _.Observable(n=>{const e=t=>{n.next(t.data)};return i.addEventListener("message",e),()=>i.removeEventListener("message",e)}).pipe(_.shareReplay(1))}}var X=Object.getOwnPropertyDescriptor,x=(i,n,e,t)=>{for(var s=t>1?void 0:t?X(n,e):n,r=i.length-1,c;r>=0;r--)(c=i[r])&&(s=c(s)||s);return s},f=(i,n)=>(e,t)=>n(e,t,i),v;exports.UniverRPCMainThreadPlugin=(v=class extends o.Plugin{constructor(e=T,t,s){super();l(this,"_internalWorker",null);this._config=e,this._injector=t,this._configService=s;const{...r}=o.merge({},T,this._config);this._configService.setConfig(q,r)}dispose(){super.dispose(),this._internalWorker&&(this._internalWorker.terminate(),this._internalWorker=null)}onStarting(){const{workerURL:e}=this._config;if(!e)throw new Error("[UniverRPCMainThreadPlugin]: The workerURL is required for the RPC main thread plugin.");const t=e instanceof Worker?e:new Worker(e);this._internalWorker=e instanceof Worker?null:t;const s=Q(t);[[g,{useFactory:()=>new W(s)}],[exports.DataSyncPrimaryController],[S,{useClass:exports.RemoteSyncPrimaryService}]].forEach(c=>this._injector.add(c)),this._injector.get(exports.DataSyncPrimaryController)}},l(v,"pluginName","UNIVER_RPC_MAIN_THREAD_PLUGIN"),l(v,"packageName",I.name),l(v,"version",I.version),v);exports.UniverRPCMainThreadPlugin=x([f(1,o.Inject(o.Injector)),f(2,o.IConfigService)],exports.UniverRPCMainThreadPlugin);var m;exports.UniverRPCWorkerThreadPlugin=(m=class extends o.Plugin{constructor(n=D,e,t){super(),this._config=n,this._injector=e,this._configService=t;const{...s}=o.merge({},D,this._config);this._configService.setConfig(O,s)}onStarting(){[[exports.DataSyncReplicaController],[g,{useFactory:()=>new W(J())}],[y,{useClass:exports.WebWorkerRemoteInstanceService}]].forEach(n=>this._injector.add(n)),this._injector.get(exports.DataSyncReplicaController)}},l(m,"pluginName","UNIVER_RPC_WORKER_THREAD_PLUGIN"),l(m,"packageName",I.name),l(m,"version",I.version),m);exports.UniverRPCWorkerThreadPlugin=x([f(1,o.Inject(o.Injector)),f(2,o.IConfigService)],exports.UniverRPCWorkerThreadPlugin);exports.ChannelClient=N;exports.ChannelServer=$;exports.ChannelService=W;exports.IRPCChannelService=g;exports.IRemoteInstanceService=y;exports.IRemoteSyncService=S;exports.PLUGIN_CONFIG_KEY_MAIN_THREAD=q;exports.PLUGIN_CONFIG_KEY_WORKER_THREAD=O;exports.RemoteInstanceServiceName=P;exports.RemoteSyncServiceName=b;exports.fromModule=M;exports.toModule=k;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@univerjs/core`),t=require(`rxjs/operators`),n=require(`rxjs`);const r=`rpc.main-thread.config`;Symbol(r);const i={},a=`rpc.worker-thread.config`;Symbol(a);const o={};function s(e,t){return function(n,r){t(n,r,e)}}function c(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}const l=`rpc.remote-sync.service`,u=(0,e.createIdentifier)(l);let d=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})}};d=c([s(0,e.ICommandService)],d);const f=`univer.remote-instance-service`,p=(0,e.createIdentifier)(f);let m=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(t){this._logService.debug(`[WebWorkerRemoteInstanceService]: Creating instance with id ${t.unitID}`);let{type:n,snapshot:r}=t;try{switch(n){case e.UniverInstanceType.UNIVER_SHEET:return this._univerInstanceService.createUnit(e.UniverInstanceType.UNIVER_SHEET,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})}};m=c([s(0,e.IUniverInstanceService),s(1,e.ICommandService),s(2,e.ILogService)],m);function h(e){"@babel/helpers - typeof";return h=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},h(e)}function g(e,t){if(h(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(h(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function _(e){var t=g(e,`string`);return h(t)==`symbol`?t:t+``}function v(e,t,n){return(t=_(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function y(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,r){let i=t[e];if(typeof i==`function`){let e=r?i.apply(t,r):i.call(t);return(0,n.isObservable)(e)?e:(0,n.of)(e)}throw Error(`[RPC]: observable method not found for ${e}!`)}}}function b(e){return new Proxy({},{get(t,n){if(n!==`dispose`)return function(...t){return x(n)?e.subscribe(n,t):e.call(n,t)}}})}function x(e){return e.endsWith(`$`)}var S=function(e){return e[e.REQUEST_INITIALIZATION=50]=`REQUEST_INITIALIZATION`,e[e.CALL=100]=`CALL`,e[e.SUBSCRIBE=101]=`SUBSCRIBE`,e[e.UNSUBSCRIBE=102]=`UNSUBSCRIBE`,e}(S||{}),C=function(e){return e[e.INITIALIZE=0]=`INITIALIZE`,e[e.CALL_SUCCESS=201]=`CALL_SUCCESS`,e[e.CALL_FAILURE=202]=`CALL_FAILURE`,e[e.SUBSCRIBE_NEXT=300]=`SUBSCRIBE_NEXT`,e[e.SUBSCRIBE_ERROR=301]=`SUBSCRIBE_ERROR`,e[e.SUBSCRIBE_COMPLETE=302]=`SUBSCRIBE_COMPLETE`,e}(C||{}),w=class extends e.RxDisposable{constructor(e){super(),this._protocol=e,v(this,`_initialized`,new n.BehaviorSubject(!1)),v(this,`_lastRequestCounter`,0),v(this,`_pendingRequests`,new Map),this._protocol.send({type:S.REQUEST_INITIALIZATION}),this._protocol.onMessage.pipe((0,t.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,n.firstValueFrom)(this._initialized.pipe((0,t.filter)(e=>e),(0,t.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:S.CALL,channelName:e,method:t,args:n},a=this._pendingRequests;return new Promise((e,t)=>{this._pendingRequests.set(r,{handle(n){switch(n.type){case C.CALL_SUCCESS:a.delete(r),e(n.data);break;case C.CALL_FAILURE:a.delete(r),t(n.data);break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(i)})}_remoteSubscribe(e,t,r){return new n.Observable(n=>{let i=-1,a=()=>{i=++this._lastRequestCounter;let a=S.SUBSCRIBE,o={seq:i,type:a,channelName:e,method:t,args:r};this._pendingRequests.set(i,{handle(e){switch(e.type){case C.SUBSCRIBE_NEXT:n.next(e.data);break;case C.SUBSCRIBE_ERROR:n.error(e.data);break;case C.SUBSCRIBE_COMPLETE:n.complete();break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(o)};return this._initialized.getValue()?a():this._whenReady().then(a),()=>{if(i===-1)return;let n={type:S.UNSUBSCRIBE,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 C.INITIALIZE:this._initialized.next(!0);break;case C.CALL_SUCCESS:case C.CALL_FAILURE:case C.SUBSCRIBE_NEXT:case C.SUBSCRIBE_COMPLETE:case C.SUBSCRIBE_ERROR:{var r;let{_pendingRequests:i}=this;(r=i.get(n))==null||r.handle(e),t!==C.SUBSCRIBE_NEXT&&i.delete(n);break}}}},T=class extends e.RxDisposable{constructor(e){super(),this._protocol=e,v(this,`_channels`,new Map),v(this,`_subscriptions`,new Map),this._protocol.onMessage.pipe((0,t.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 S.REQUEST_INITIALIZATION:this._sendInitialize();break;case S.CALL:this._onMethodCall(e);break;case S.SUBSCRIBE:this._onSubscribe(e);break;case S.UNSUBSCRIBE:this._onUnsubscribe(e);break;default:break}}_sendInitialize(){this._sendResponse({seq:-1,type:C.INITIALIZE})}_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:C.CALL_SUCCESS,data:t})}).catch(t=>{t instanceof Error?this._sendResponse({seq:e.seq,type:C.CALL_FAILURE,data:t.message}):this._sendResponse({seq:e.seq,type:C.CALL_FAILURE,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:C.SUBSCRIBE_NEXT,data:e})},error:e=>{this._sendResponse({seq:n,type:C.SUBSCRIBE_ERROR,data:e.message}),this._sendResponse({seq:n,type:C.SUBSCRIBE_COMPLETE})},complete:()=>{this._sendResponse({seq:n,type:C.SUBSCRIBE_COMPLETE})}});this._subscriptions.set(e.seq,i)}catch(t){t instanceof Error?this._sendResponse({seq:e.seq,type:C.SUBSCRIBE_ERROR,data:t.message}):this._sendResponse({seq:e.seq,type:C.SUBSCRIBE_ERROR,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)}};const E=(0,e.createIdentifier)(`IRPCChannelService`);var D=class{constructor(e){v(this,`_client`,void 0),v(this,`_server`,void 0),this._client=new w(e),this._server=new T(e)}dispose(){this._client.dispose(),this._server.dispose()}requestChannel(e){return this._client.getChannel(e)}registerChannel(e,t){this._server.registerChannel(e,t)}};let O=class extends e.RxDisposable{constructor(e,t,n,r,i){super(),this._injector=e,this._commandService=t,this._univerInstanceService=n,this._rpcChannelService=r,this._remoteSyncService=i,v(this,`_remoteInstanceService`,void 0),v(this,`_syncingUnits`,new Set),v(this,`_syncingMutations`,new Set),this._initRPCChannels(),this._init()}registerSyncingMutations(e){this._syncingMutations.add(e.id)}syncUnit(t){return this._syncingUnits.add(t),(0,e.toDisposable)(()=>this._syncingUnits.delete(t))}_initRPCChannels(){this._rpcChannelService.registerChannel(l,y(this._remoteSyncService)),this._injector.add([p,{useFactory:()=>b(this._rpcChannelService.requestChannel(f))}]),this._remoteInstanceService=this._injector.get(p)}_init(){this._univerInstanceService.getTypeOfUnitAdded$(e.UniverInstanceType.UNIVER_SHEET).pipe((0,t.takeUntil)(this.dispose$)).subscribe(t=>{this._syncingUnits.add(t.getUnitId()),this._remoteInstanceService.createInstance({unitID:t.getUnitId(),type:e.UniverInstanceType.UNIVER_SHEET,snapshot:t.getSnapshot()})}),this._univerInstanceService.getTypeOfUnitDisposed$(e.UniverInstanceType.UNIVER_SHEET).pipe((0,t.takeUntil)(this.dispose$)).subscribe(e=>{this._syncingUnits.delete(e.getUnitId()),this._remoteInstanceService.disposeInstance({unitID:e.getUnitId()})}),this.disposeWithMe(this._commandService.onCommandExecuted((t,n)=>{let{type:r,params:i,id:a}=t,o=(i==null?void 0:i.unitId)||``;r===e.CommandType.MUTATION&&(!o||this._syncingUnits.has(o))&&!(n!=null&&n.fromSync)&&this._syncingMutations.has(a)&&this._remoteInstanceService.syncMutation({mutationInfo:t},n)}))}};O=c([s(0,(0,e.Inject)(e.Injector)),s(1,e.ICommandService),s(2,e.IUniverInstanceService),s(3,E),s(4,u)],O);let k=class extends e.Disposable{constructor(e,t,n,r){super(),this._injector=e,this._remoteInstanceService=t,this._commandService=n,this._rpcChannelService=r,v(this,`_remoteSyncService`,void 0),this._initRPCChannels(),this._init()}_initRPCChannels(){this._rpcChannelService.registerChannel(f,y(this._remoteInstanceService)),this._injector.add([u,{useFactory:()=>b(this._rpcChannelService.requestChannel(l))}]),this._remoteSyncService=this._injector.get(u)}_init(){this.disposeWithMe(this._commandService.onCommandExecuted((t,n)=>{t.type===e.CommandType.MUTATION&&!(n!=null&&n.fromSync)&&this._remoteSyncService.syncMutation({mutationInfo:t},n)}))}};k=c([s(0,(0,e.Inject)(e.Injector)),s(1,p),s(2,e.ICommandService),s(3,E)],k);var A=`@univerjs/rpc`,j=`0.18.0`;function M(){return{send(e){postMessage(e)},onMessage:new n.Observable(e=>{let t=t=>{e.next(t.data)};return addEventListener(`message`,t),()=>removeEventListener(`message`,t)}).pipe((0,n.shareReplay)(1))}}function N(e){return{send(t){e.postMessage(t)},onMessage:new n.Observable(t=>{let n=e=>{t.next(e.data)};return e.addEventListener(`message`,n),()=>e.removeEventListener(`message`,n)}).pipe((0,n.shareReplay)(1))}}let P=class extends e.Plugin{constructor(t=i,n,a){super(),this._config=t,this._injector=n,this._configService=a,v(this,`_internalWorker`,null);let{...o}=(0,e.merge)({},i,this._config);this._configService.setConfig(r,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=N(t);[[E,{useFactory:()=>new D(n)}],[O],[u,{useClass:d}]].forEach(e=>this._injector.add(e)),this._injector.get(O)}};v(P,`pluginName`,`UNIVER_RPC_MAIN_THREAD_PLUGIN`),v(P,`packageName`,A),v(P,`version`,j),P=c([s(1,(0,e.Inject)(e.Injector)),s(2,e.IConfigService)],P);let F=class extends e.Plugin{constructor(t=o,n,r){super(),this._config=t,this._injector=n,this._configService=r;let{...i}=(0,e.merge)({},o,this._config);this._configService.setConfig(a,i)}onStarting(){[[k],[E,{useFactory:()=>new D(M())}],[p,{useClass:m}]].forEach(e=>this._injector.add(e)),this._injector.get(k)}};v(F,`pluginName`,`UNIVER_RPC_WORKER_THREAD_PLUGIN`),v(F,`packageName`,A),v(F,`version`,j),F=c([s(1,(0,e.Inject)(e.Injector)),s(2,e.IConfigService)],F),exports.ChannelClient=w,exports.ChannelServer=T,exports.ChannelService=D,Object.defineProperty(exports,`DataSyncPrimaryController`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`DataSyncReplicaController`,{enumerable:!0,get:function(){return k}}),exports.IRPCChannelService=E,exports.IRemoteInstanceService=p,exports.IRemoteSyncService=u,exports.PLUGIN_CONFIG_KEY_MAIN_THREAD=r,exports.PLUGIN_CONFIG_KEY_WORKER_THREAD=a,exports.RemoteInstanceServiceName=f,Object.defineProperty(exports,`RemoteSyncPrimaryService`,{enumerable:!0,get:function(){return d}}),exports.RemoteSyncServiceName=l,Object.defineProperty(exports,`UniverRPCMainThreadPlugin`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`UniverRPCWorkerThreadPlugin`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`WebWorkerRemoteInstanceService`,{enumerable:!0,get:function(){return m}}),exports.fromModule=y,exports.toModule=b;
package/lib/es/index.js CHANGED
@@ -1,539 +1 @@
1
- var Z = Object.defineProperty;
2
- var ee = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
3
- var a = (s, t, e) => ee(s, typeof t != "symbol" ? t + "" : t, e);
4
- import { createIdentifier as W, UniverInstanceType as p, ICommandService as I, IUniverInstanceService as V, ILogService as te, RxDisposable as T, Inject as w, Injector as E, toDisposable as ne, CommandType as A, Disposable as se, IConfigService as z, Plugin as F, merge as G } from "@univerjs/core";
5
- import { takeUntil as g, filter as re, take as ie } from "rxjs/operators";
6
- import { BehaviorSubject as oe, firstValueFrom as ce, Observable as D, isObservable as ae, of as he, shareReplay as Y } from "rxjs";
7
- const le = "rpc.main-thread.config", N = {}, _e = "rpc.worker-thread.config", x = {};
8
- var ue = Object.getOwnPropertyDescriptor, B = (s, t, e, n) => {
9
- for (var r = n > 1 ? void 0 : n ? ue(t, e) : t, i = s.length - 1, o; i >= 0; i--)
10
- (o = s[i]) && (r = o(r) || r);
11
- return r;
12
- }, m = (s, t) => (e, n) => t(e, n, s);
13
- const $ = "rpc.remote-sync.service", f = W($);
14
- let k = class {
15
- constructor(s) {
16
- this._commandService = s;
17
- }
18
- async syncMutation(s, t) {
19
- const { fromCollab: e, ...n } = t || {};
20
- return this._commandService.syncExecuteCommand(s.mutationInfo.id, s.mutationInfo.params, {
21
- ...n,
22
- onlyLocal: !0,
23
- fromSync: !0
24
- });
25
- }
26
- };
27
- k = B([
28
- m(0, I)
29
- ], k);
30
- const j = "univer.remote-instance-service", y = W(j);
31
- let O = class {
32
- constructor(s, t, e) {
33
- this._univerInstanceService = s, this._commandService = t, this._logService = e;
34
- }
35
- whenReady() {
36
- return Promise.resolve(!0);
37
- }
38
- async syncMutation(s, t) {
39
- return this._applyMutation(s.mutationInfo, t);
40
- }
41
- async createInstance(s) {
42
- this._logService.debug(`[WebWorkerRemoteInstanceService]: Creating instance with id ${s.unitID}`);
43
- const { type: t, snapshot: e } = s;
44
- try {
45
- if (t === p.UNIVER_SHEET)
46
- return this._univerInstanceService.createUnit(p.UNIVER_SHEET, e), !0;
47
- throw new Error(
48
- `[WebWorkerRemoteInstanceService]: cannot create replica for document type: ${t}.`
49
- );
50
- } catch (n) {
51
- throw n instanceof Error ? n : new TypeError(`${n}`);
52
- }
53
- }
54
- async disposeInstance(s) {
55
- return this._logService.debug(`[WebWorkerRemoteInstanceService]: Disposing instance with id ${s.unitID}`), this._univerInstanceService.disposeUnit(s.unitID);
56
- }
57
- _applyMutation(s, t) {
58
- const { id: e, params: n } = s, { fromCollab: r, ...i } = t || {};
59
- return this._commandService.syncExecuteCommand(e, n, {
60
- ...i,
61
- onlyLocal: !0,
62
- fromSync: !0
63
- });
64
- }
65
- };
66
- O = B([
67
- m(0, V),
68
- m(1, I),
69
- m(2, te)
70
- ], O);
71
- function K(s) {
72
- const t = s;
73
- return new class {
74
- call(e, n) {
75
- const r = t[e];
76
- if (typeof r == "function") {
77
- let i = n ? r.apply(t, n) : r.call(t);
78
- return i instanceof Promise || (i = Promise.resolve(i)), i;
79
- }
80
- throw new Error(`[RPC]: method not found for ${e}!`);
81
- }
82
- subscribe(e, n) {
83
- const r = t[e];
84
- if (typeof r == "function") {
85
- const i = n ? r.apply(t, n) : r.call(t);
86
- return ae(i) ? i : he(i);
87
- }
88
- throw new Error(`[RPC]: observable method not found for ${e}!`);
89
- }
90
- }();
91
- }
92
- function J(s) {
93
- return new Proxy({}, {
94
- get(t, e) {
95
- if (e !== "dispose")
96
- return function(...n) {
97
- return de(e) ? s.subscribe(e, n) : s.call(e, n);
98
- };
99
- }
100
- });
101
- }
102
- function de(s) {
103
- return s.endsWith("$");
104
- }
105
- class pe extends T {
106
- constructor(e) {
107
- super();
108
- a(this, "_initialized", new oe(!1));
109
- a(this, "_lastRequestCounter", 0);
110
- a(this, "_pendingRequests", /* @__PURE__ */ new Map());
111
- this._protocol = e, this._protocol.send({
112
- type: 50
113
- /* REQUEST_INITIALIZATION */
114
- }), this._protocol.onMessage.pipe(g(this.dispose$)).subscribe((n) => this._onMessage(n));
115
- }
116
- dispose() {
117
- this._pendingRequests.clear();
118
- }
119
- getChannel(e) {
120
- return {
121
- call: (n, r) => this._disposed ? Promise.reject(new Error("[ChannelClient]: client is disposed!")) : this._remoteCall(e, n, r),
122
- subscribe: (n, r) => {
123
- if (this._disposed)
124
- throw new Error("[ChannelClient]: client is disposed!");
125
- return this._remoteSubscribe(e, n, r);
126
- }
127
- };
128
- }
129
- _whenReady() {
130
- return ce(
131
- this._initialized.pipe(
132
- re((e) => e),
133
- ie(1)
134
- )
135
- );
136
- }
137
- _remoteCall(e, n, r) {
138
- return this._initialized.getValue() ? this._doRemoteCall(e, n, r) : this._whenReady().then(() => this._doRemoteCall(e, n, r));
139
- }
140
- _doRemoteCall(e, n, r) {
141
- const i = ++this._lastRequestCounter, h = { seq: i, type: 100, channelName: e, method: n, args: r }, c = this._pendingRequests;
142
- return new Promise((U, M) => {
143
- const l = {
144
- handle(q) {
145
- switch (q.type) {
146
- case 201:
147
- c.delete(i), U(q.data);
148
- break;
149
- case 202:
150
- c.delete(i), M(q.data);
151
- break;
152
- default:
153
- throw new Error("[ChannelClient]: unknown response type!");
154
- }
155
- }
156
- };
157
- this._pendingRequests.set(i, l), this._sendRequest(h);
158
- });
159
- }
160
- _remoteSubscribe(e, n, r) {
161
- return new D((i) => {
162
- let o = -1;
163
- const h = () => {
164
- o = ++this._lastRequestCounter;
165
- const U = { seq: o, type: 101, channelName: e, method: n, args: r }, M = {
166
- handle(l) {
167
- switch (l.type) {
168
- case 300:
169
- i.next(l.data);
170
- break;
171
- case 301:
172
- i.error(l.data);
173
- break;
174
- case 302:
175
- i.complete();
176
- break;
177
- default:
178
- throw new Error("[ChannelClient]: unknown response type!");
179
- }
180
- }
181
- };
182
- this._pendingRequests.set(o, M), this._sendRequest(U);
183
- };
184
- return this._initialized.getValue() ? h() : this._whenReady().then(h), () => {
185
- if (o === -1)
186
- return;
187
- const c = {
188
- type: 102,
189
- seq: o,
190
- channelName: e,
191
- method: n
192
- };
193
- this._sendRequest(c);
194
- };
195
- });
196
- }
197
- _sendRequest(e) {
198
- this._protocol.send(e);
199
- }
200
- _onMessage(e) {
201
- var i;
202
- const { type: n, seq: r } = e;
203
- switch (n) {
204
- case 0:
205
- this._initialized.next(!0);
206
- break;
207
- case 201:
208
- case 202:
209
- case 300:
210
- case 302:
211
- case 301: {
212
- const { _pendingRequests: o } = this;
213
- (i = o.get(r)) == null || i.handle(e), n !== 300 && o.delete(r);
214
- break;
215
- }
216
- }
217
- }
218
- }
219
- class ve extends T {
220
- constructor(e) {
221
- super();
222
- a(this, "_channels", /* @__PURE__ */ new Map());
223
- a(this, "_subscriptions", /* @__PURE__ */ new Map());
224
- this._protocol = e, this._protocol.onMessage.pipe(g(this.dispose$)).subscribe((n) => this._onRequest(n)), this._sendInitialize();
225
- }
226
- dispose() {
227
- super.dispose(), this._subscriptions.clear(), this._channels.clear();
228
- }
229
- registerChannel(e, n) {
230
- this._channels.set(e, n);
231
- }
232
- _onRequest(e) {
233
- switch (e.type) {
234
- case 50:
235
- this._sendInitialize();
236
- break;
237
- case 100:
238
- this._onMethodCall(e);
239
- break;
240
- case 101:
241
- this._onSubscribe(e);
242
- break;
243
- case 102:
244
- this._onUnsubscribe(e);
245
- break;
246
- }
247
- }
248
- _sendInitialize() {
249
- this._sendResponse({
250
- seq: -1,
251
- type: 0
252
- /* INITIALIZE */
253
- });
254
- }
255
- _onMethodCall(e) {
256
- const { channelName: n, method: r, args: i } = e, o = this._channels.get(n);
257
- let h;
258
- try {
259
- if (!o)
260
- throw new Error(`[ChannelServer]: Channel ${n} not found!`);
261
- h = i ? o.call(r, i) : o.call(r);
262
- } catch (c) {
263
- h = Promise.reject(c instanceof Error ? c : new Error(String(c)));
264
- }
265
- h.then((c) => {
266
- this._sendResponse({ seq: e.seq, type: 201, data: c });
267
- }).catch((c) => {
268
- c instanceof Error ? this._sendResponse({ seq: e.seq, type: 202, data: c.message }) : this._sendResponse({ seq: e.seq, type: 202, data: String(c) });
269
- });
270
- }
271
- _onSubscribe(e) {
272
- const { channelName: n, seq: r } = e, i = this._channels.get(n);
273
- try {
274
- if (!i)
275
- throw new Error(`[ChannelServer]: Channel ${n} not found!`);
276
- const h = i.subscribe(e.method, e.args).subscribe({
277
- next: (c) => {
278
- this._sendResponse({ seq: r, type: 300, data: c });
279
- },
280
- error: (c) => {
281
- this._sendResponse({ seq: r, type: 301, data: c.message }), this._sendResponse({
282
- seq: r,
283
- type: 302
284
- /* SUBSCRIBE_COMPLETE */
285
- });
286
- },
287
- complete: () => {
288
- this._sendResponse({
289
- seq: r,
290
- type: 302
291
- /* SUBSCRIBE_COMPLETE */
292
- });
293
- }
294
- });
295
- this._subscriptions.set(e.seq, h);
296
- } catch (o) {
297
- o instanceof Error ? this._sendResponse({ seq: e.seq, type: 301, data: o.message }) : this._sendResponse({ seq: e.seq, type: 301, data: String(o) });
298
- }
299
- }
300
- _onUnsubscribe(e) {
301
- const n = this._subscriptions.get(e.seq);
302
- n && (n.unsubscribe(), this._subscriptions.delete(e.seq));
303
- }
304
- _sendResponse(e) {
305
- this._protocol.send(e);
306
- }
307
- }
308
- const P = W("IRPCChannelService");
309
- class Q {
310
- constructor(t) {
311
- a(this, "_client");
312
- a(this, "_server");
313
- this._client = new pe(t), this._server = new ve(t);
314
- }
315
- dispose() {
316
- this._client.dispose(), this._server.dispose();
317
- }
318
- requestChannel(t) {
319
- return this._client.getChannel(t);
320
- }
321
- registerChannel(t, e) {
322
- this._server.registerChannel(t, e);
323
- }
324
- }
325
- var me = Object.getOwnPropertyDescriptor, ge = (s, t, e, n) => {
326
- for (var r = n > 1 ? void 0 : n ? me(t, e) : t, i = s.length - 1, o; i >= 0; i--)
327
- (o = s[i]) && (r = o(r) || r);
328
- return r;
329
- }, _ = (s, t) => (e, n) => t(e, n, s);
330
- let S = class extends T {
331
- constructor(t, e, n, r, i) {
332
- super();
333
- a(this, "_remoteInstanceService");
334
- a(this, "_syncingUnits", /* @__PURE__ */ new Set());
335
- a(this, "_syncingMutations", /* @__PURE__ */ new Set());
336
- this._injector = t, this._commandService = e, this._univerInstanceService = n, this._rpcChannelService = r, this._remoteSyncService = i, this._initRPCChannels(), this._init();
337
- }
338
- registerSyncingMutations(t) {
339
- this._syncingMutations.add(t.id);
340
- }
341
- /**
342
- * Only spreadsheets would be synced to the web worker in normal situations. If you would like to
343
- * sync other types of documents, you should manually call this method with that document's id.
344
- */
345
- syncUnit(t) {
346
- return this._syncingUnits.add(t), ne(() => this._syncingUnits.delete(t));
347
- }
348
- _initRPCChannels() {
349
- this._rpcChannelService.registerChannel($, K(this._remoteSyncService)), this._injector.add([
350
- y,
351
- // eslint-disable-next-line react/no-unnecessary-use-prefix
352
- { useFactory: () => J(this._rpcChannelService.requestChannel(j)) }
353
- ]), this._remoteInstanceService = this._injector.get(y);
354
- }
355
- _init() {
356
- this._univerInstanceService.getTypeOfUnitAdded$(p.UNIVER_SHEET).pipe(g(this.dispose$)).subscribe((t) => {
357
- this._syncingUnits.add(t.getUnitId()), this._remoteInstanceService.createInstance({
358
- unitID: t.getUnitId(),
359
- type: p.UNIVER_SHEET,
360
- snapshot: t.getSnapshot()
361
- });
362
- }), this._univerInstanceService.getTypeOfUnitDisposed$(p.UNIVER_SHEET).pipe(g(this.dispose$)).subscribe((t) => {
363
- this._syncingUnits.delete(t.getUnitId()), this._remoteInstanceService.disposeInstance({
364
- unitID: t.getUnitId()
365
- });
366
- }), this.disposeWithMe(this._commandService.onCommandExecuted((t, e) => {
367
- const { type: n, params: r, id: i } = t, o = (r == null ? void 0 : r.unitId) || "";
368
- n === A.MUTATION && // only sync mutations to the worker thread
369
- (!o || this._syncingUnits.has(o)) && // do not sync mutations from the web worker back to the web worker
370
- !(e != null && e.fromSync) && // do not sync mutations those are not meant to be synced
371
- this._syncingMutations.has(i) && this._remoteInstanceService.syncMutation({ mutationInfo: t }, e);
372
- }));
373
- }
374
- };
375
- S = ge([
376
- _(0, w(E)),
377
- _(1, I),
378
- _(2, V),
379
- _(3, P),
380
- _(4, f)
381
- ], S);
382
- var fe = Object.getOwnPropertyDescriptor, ye = (s, t, e, n) => {
383
- for (var r = n > 1 ? void 0 : n ? fe(t, e) : t, i = s.length - 1, o; i >= 0; i--)
384
- (o = s[i]) && (r = o(r) || r);
385
- return r;
386
- }, v = (s, t) => (e, n) => t(e, n, s);
387
- let C = class extends se {
388
- constructor(t, e, n, r) {
389
- super();
390
- a(this, "_remoteSyncService");
391
- this._injector = t, this._remoteInstanceService = e, this._commandService = n, this._rpcChannelService = r, this._initRPCChannels(), this._init();
392
- }
393
- _initRPCChannels() {
394
- this._rpcChannelService.registerChannel(j, K(this._remoteInstanceService)), this._injector.add([
395
- f,
396
- // eslint-disable-next-line react/no-unnecessary-use-prefix
397
- { useFactory: () => J(this._rpcChannelService.requestChannel($)) }
398
- ]), this._remoteSyncService = this._injector.get(f);
399
- }
400
- _init() {
401
- this.disposeWithMe(
402
- // Mutations executed on the main thread should be synced to the worker thread.
403
- this._commandService.onCommandExecuted((t, e) => {
404
- t.type === A.MUTATION && !(e != null && e.fromSync) && this._remoteSyncService.syncMutation({
405
- mutationInfo: t
406
- }, e);
407
- })
408
- );
409
- }
410
- };
411
- C = ye([
412
- v(0, w(E)),
413
- v(1, y),
414
- v(2, I),
415
- v(3, P)
416
- ], C);
417
- const Se = "@univerjs/rpc", Ce = "0.17.0", b = {
418
- name: Se,
419
- version: Ce
420
- };
421
- function be() {
422
- return {
423
- send(s) {
424
- postMessage(s);
425
- },
426
- onMessage: new D((s) => {
427
- const t = (e) => {
428
- s.next(e.data);
429
- };
430
- return addEventListener("message", t), () => removeEventListener("message", t);
431
- }).pipe(Y(1))
432
- };
433
- }
434
- function Re(s) {
435
- return {
436
- send(t) {
437
- s.postMessage(t);
438
- },
439
- onMessage: new D((t) => {
440
- const e = (n) => {
441
- t.next(n.data);
442
- };
443
- return s.addEventListener("message", e), () => s.removeEventListener("message", e);
444
- }).pipe(Y(1))
445
- };
446
- }
447
- var Ie = Object.getOwnPropertyDescriptor, X = (s, t, e, n) => {
448
- for (var r = n > 1 ? void 0 : n ? Ie(t, e) : t, i = s.length - 1, o; i >= 0; i--)
449
- (o = s[i]) && (r = o(r) || r);
450
- return r;
451
- }, R = (s, t) => (e, n) => t(e, n, s), u;
452
- let L = (u = class extends F {
453
- constructor(t = N, e, n) {
454
- super();
455
- a(this, "_internalWorker", null);
456
- this._config = t, this._injector = e, this._configService = n;
457
- const { ...r } = G(
458
- {},
459
- N,
460
- this._config
461
- );
462
- this._configService.setConfig(le, r);
463
- }
464
- dispose() {
465
- super.dispose(), this._internalWorker && (this._internalWorker.terminate(), this._internalWorker = null);
466
- }
467
- onStarting() {
468
- const { workerURL: t } = this._config;
469
- if (!t)
470
- throw new Error("[UniverRPCMainThreadPlugin]: The workerURL is required for the RPC main thread plugin.");
471
- const e = t instanceof Worker ? t : new Worker(t);
472
- this._internalWorker = t instanceof Worker ? null : e;
473
- const n = Re(e);
474
- [
475
- [
476
- P,
477
- {
478
- // eslint-disable-next-line react/no-unnecessary-use-prefix
479
- useFactory: () => new Q(n)
480
- }
481
- ],
482
- [S],
483
- [f, { useClass: k }]
484
- ].forEach((i) => this._injector.add(i)), this._injector.get(S);
485
- }
486
- }, a(u, "pluginName", "UNIVER_RPC_MAIN_THREAD_PLUGIN"), a(u, "packageName", b.name), a(u, "version", b.version), u);
487
- L = X([
488
- R(1, w(E)),
489
- R(2, z)
490
- ], L);
491
- var d;
492
- let H = (d = class extends F {
493
- constructor(s = x, t, e) {
494
- super(), this._config = s, this._injector = t, this._configService = e;
495
- const { ...n } = G(
496
- {},
497
- x,
498
- this._config
499
- );
500
- this._configService.setConfig(_e, n);
501
- }
502
- onStarting() {
503
- [
504
- [C],
505
- [
506
- P,
507
- {
508
- // eslint-disable-next-line react/no-unnecessary-use-prefix
509
- useFactory: () => new Q(be())
510
- }
511
- ],
512
- [y, { useClass: O }]
513
- ].forEach((s) => this._injector.add(s)), this._injector.get(C);
514
- }
515
- }, a(d, "pluginName", "UNIVER_RPC_WORKER_THREAD_PLUGIN"), a(d, "packageName", b.name), a(d, "version", b.version), d);
516
- H = X([
517
- R(1, w(E)),
518
- R(2, z)
519
- ], H);
520
- export {
521
- pe as ChannelClient,
522
- ve as ChannelServer,
523
- Q as ChannelService,
524
- S as DataSyncPrimaryController,
525
- C as DataSyncReplicaController,
526
- P as IRPCChannelService,
527
- y as IRemoteInstanceService,
528
- f as IRemoteSyncService,
529
- le as PLUGIN_CONFIG_KEY_MAIN_THREAD,
530
- _e as PLUGIN_CONFIG_KEY_WORKER_THREAD,
531
- j as RemoteInstanceServiceName,
532
- k as RemoteSyncPrimaryService,
533
- $ as RemoteSyncServiceName,
534
- L as UniverRPCMainThreadPlugin,
535
- H as UniverRPCWorkerThreadPlugin,
536
- O as WebWorkerRemoteInstanceService,
537
- K as fromModule,
538
- J as toModule
539
- };
1
+ import{CommandType as e,Disposable as t,ICommandService as n,IConfigService as r,ILogService as i,IUniverInstanceService as a,Inject as o,Injector as s,Plugin as c,RxDisposable as l,UniverInstanceType as u,createIdentifier as d,merge as f,toDisposable as p}from"@univerjs/core";import{filter as m,take as ee,takeUntil as h}from"rxjs/operators";import{BehaviorSubject as g,Observable as _,firstValueFrom as v,isObservable as te,of as y,shareReplay as b}from"rxjs";const x=`rpc.main-thread.config`;Symbol(x);const S={},C=`rpc.worker-thread.config`;Symbol(C);const w={};function T(e,t){return function(n,r){t(n,r,e)}}function E(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}const D=`rpc.remote-sync.service`,O=d(D);let k=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})}};k=E([T(0,n)],k);const A=`univer.remote-instance-service`,j=d(A);let M=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:t,snapshot:n}=e;try{switch(t){case u.UNIVER_SHEET:return this._univerInstanceService.createUnit(u.UNIVER_SHEET,n),!0;default:throw Error(`[WebWorkerRemoteInstanceService]: cannot create replica for document type: ${t}.`)}}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})}};M=E([T(0,a),T(1,n),T(2,i)],M);function N(e){"@babel/helpers - typeof";return N=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},N(e)}function P(e,t){if(N(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(N(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function F(e){var t=P(e,`string`);return N(t)==`symbol`?t:t+``}function I(e,t,n){return(t=F(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function L(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 r=t[e];if(typeof r==`function`){let e=n?r.apply(t,n):r.call(t);return te(e)?e:y(e)}throw Error(`[RPC]: observable method not found for ${e}!`)}}}function R(e){return new Proxy({},{get(t,n){if(n!==`dispose`)return function(...t){return z(n)?e.subscribe(n,t):e.call(n,t)}}})}function z(e){return e.endsWith(`$`)}var B=function(e){return e[e.REQUEST_INITIALIZATION=50]=`REQUEST_INITIALIZATION`,e[e.CALL=100]=`CALL`,e[e.SUBSCRIBE=101]=`SUBSCRIBE`,e[e.UNSUBSCRIBE=102]=`UNSUBSCRIBE`,e}(B||{}),V=function(e){return e[e.INITIALIZE=0]=`INITIALIZE`,e[e.CALL_SUCCESS=201]=`CALL_SUCCESS`,e[e.CALL_FAILURE=202]=`CALL_FAILURE`,e[e.SUBSCRIBE_NEXT=300]=`SUBSCRIBE_NEXT`,e[e.SUBSCRIBE_ERROR=301]=`SUBSCRIBE_ERROR`,e[e.SUBSCRIBE_COMPLETE=302]=`SUBSCRIBE_COMPLETE`,e}(V||{}),H=class extends l{constructor(e){super(),this._protocol=e,I(this,`_initialized`,new g(!1)),I(this,`_lastRequestCounter`,0),I(this,`_pendingRequests`,new Map),this._protocol.send({type:B.REQUEST_INITIALIZATION}),this._protocol.onMessage.pipe(h(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 v(this._initialized.pipe(m(e=>e),ee(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:B.CALL,channelName:e,method:t,args:n},a=this._pendingRequests;return new Promise((e,t)=>{this._pendingRequests.set(r,{handle(n){switch(n.type){case V.CALL_SUCCESS:a.delete(r),e(n.data);break;case V.CALL_FAILURE:a.delete(r),t(n.data);break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(i)})}_remoteSubscribe(e,t,n){return new _(r=>{let i=-1,a=()=>{i=++this._lastRequestCounter;let a=B.SUBSCRIBE,o={seq:i,type:a,channelName:e,method:t,args:n};this._pendingRequests.set(i,{handle(e){switch(e.type){case V.SUBSCRIBE_NEXT:r.next(e.data);break;case V.SUBSCRIBE_ERROR:r.error(e.data);break;case V.SUBSCRIBE_COMPLETE:r.complete();break;default:throw Error(`[ChannelClient]: unknown response type!`)}}}),this._sendRequest(o)};return this._initialized.getValue()?a():this._whenReady().then(a),()=>{if(i===-1)return;let n={type:B.UNSUBSCRIBE,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 V.INITIALIZE:this._initialized.next(!0);break;case V.CALL_SUCCESS:case V.CALL_FAILURE:case V.SUBSCRIBE_NEXT:case V.SUBSCRIBE_COMPLETE:case V.SUBSCRIBE_ERROR:{var r;let{_pendingRequests:i}=this;(r=i.get(n))==null||r.handle(e),t!==V.SUBSCRIBE_NEXT&&i.delete(n);break}}}},U=class extends l{constructor(e){super(),this._protocol=e,I(this,`_channels`,new Map),I(this,`_subscriptions`,new Map),this._protocol.onMessage.pipe(h(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 B.REQUEST_INITIALIZATION:this._sendInitialize();break;case B.CALL:this._onMethodCall(e);break;case B.SUBSCRIBE:this._onSubscribe(e);break;case B.UNSUBSCRIBE:this._onUnsubscribe(e);break;default:break}}_sendInitialize(){this._sendResponse({seq:-1,type:V.INITIALIZE})}_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:V.CALL_SUCCESS,data:t})}).catch(t=>{t instanceof Error?this._sendResponse({seq:e.seq,type:V.CALL_FAILURE,data:t.message}):this._sendResponse({seq:e.seq,type:V.CALL_FAILURE,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:V.SUBSCRIBE_NEXT,data:e})},error:e=>{this._sendResponse({seq:n,type:V.SUBSCRIBE_ERROR,data:e.message}),this._sendResponse({seq:n,type:V.SUBSCRIBE_COMPLETE})},complete:()=>{this._sendResponse({seq:n,type:V.SUBSCRIBE_COMPLETE})}});this._subscriptions.set(e.seq,i)}catch(t){t instanceof Error?this._sendResponse({seq:e.seq,type:V.SUBSCRIBE_ERROR,data:t.message}):this._sendResponse({seq:e.seq,type:V.SUBSCRIBE_ERROR,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)}};const W=d(`IRPCChannelService`);var G=class{constructor(e){I(this,`_client`,void 0),I(this,`_server`,void 0),this._client=new H(e),this._server=new U(e)}dispose(){this._client.dispose(),this._server.dispose()}requestChannel(e){return this._client.getChannel(e)}registerChannel(e,t){this._server.registerChannel(e,t)}};let K=class extends l{constructor(e,t,n,r,i){super(),this._injector=e,this._commandService=t,this._univerInstanceService=n,this._rpcChannelService=r,this._remoteSyncService=i,I(this,`_remoteInstanceService`,void 0),I(this,`_syncingUnits`,new Set),I(this,`_syncingMutations`,new Set),this._initRPCChannels(),this._init()}registerSyncingMutations(e){this._syncingMutations.add(e.id)}syncUnit(e){return this._syncingUnits.add(e),p(()=>this._syncingUnits.delete(e))}_initRPCChannels(){this._rpcChannelService.registerChannel(D,L(this._remoteSyncService)),this._injector.add([j,{useFactory:()=>R(this._rpcChannelService.requestChannel(A))}]),this._remoteInstanceService=this._injector.get(j)}_init(){this._univerInstanceService.getTypeOfUnitAdded$(u.UNIVER_SHEET).pipe(h(this.dispose$)).subscribe(e=>{this._syncingUnits.add(e.getUnitId()),this._remoteInstanceService.createInstance({unitID:e.getUnitId(),type:u.UNIVER_SHEET,snapshot:e.getSnapshot()})}),this._univerInstanceService.getTypeOfUnitDisposed$(u.UNIVER_SHEET).pipe(h(this.dispose$)).subscribe(e=>{this._syncingUnits.delete(e.getUnitId()),this._remoteInstanceService.disposeInstance({unitID:e.getUnitId()})}),this.disposeWithMe(this._commandService.onCommandExecuted((t,n)=>{let{type:r,params:i,id:a}=t,o=(i==null?void 0:i.unitId)||``;r===e.MUTATION&&(!o||this._syncingUnits.has(o))&&!(n!=null&&n.fromSync)&&this._syncingMutations.has(a)&&this._remoteInstanceService.syncMutation({mutationInfo:t},n)}))}};K=E([T(0,o(s)),T(1,n),T(2,a),T(3,W),T(4,O)],K);let q=class extends t{constructor(e,t,n,r){super(),this._injector=e,this._remoteInstanceService=t,this._commandService=n,this._rpcChannelService=r,I(this,`_remoteSyncService`,void 0),this._initRPCChannels(),this._init()}_initRPCChannels(){this._rpcChannelService.registerChannel(A,L(this._remoteInstanceService)),this._injector.add([O,{useFactory:()=>R(this._rpcChannelService.requestChannel(D))}]),this._remoteSyncService=this._injector.get(O)}_init(){this.disposeWithMe(this._commandService.onCommandExecuted((t,n)=>{t.type===e.MUTATION&&!(n!=null&&n.fromSync)&&this._remoteSyncService.syncMutation({mutationInfo:t},n)}))}};q=E([T(0,o(s)),T(1,j),T(2,n),T(3,W)],q);var J=`@univerjs/rpc`,Y=`0.18.0`;function X(){return{send(e){postMessage(e)},onMessage:new _(e=>{let t=t=>{e.next(t.data)};return addEventListener(`message`,t),()=>removeEventListener(`message`,t)}).pipe(b(1))}}function Z(e){return{send(t){e.postMessage(t)},onMessage:new _(t=>{let n=e=>{t.next(e.data)};return e.addEventListener(`message`,n),()=>e.removeEventListener(`message`,n)}).pipe(b(1))}}let Q=class extends c{constructor(e=S,t,n){super(),this._config=e,this._injector=t,this._configService=n,I(this,`_internalWorker`,null);let{...r}=f({},S,this._config);this._configService.setConfig(x,r)}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=Z(t);[[W,{useFactory:()=>new G(n)}],[K],[O,{useClass:k}]].forEach(e=>this._injector.add(e)),this._injector.get(K)}};I(Q,`pluginName`,`UNIVER_RPC_MAIN_THREAD_PLUGIN`),I(Q,`packageName`,J),I(Q,`version`,Y),Q=E([T(1,o(s)),T(2,r)],Q);let $=class extends c{constructor(e=w,t,n){super(),this._config=e,this._injector=t,this._configService=n;let{...r}=f({},w,this._config);this._configService.setConfig(C,r)}onStarting(){[[q],[W,{useFactory:()=>new G(X())}],[j,{useClass:M}]].forEach(e=>this._injector.add(e)),this._injector.get(q)}};I($,`pluginName`,`UNIVER_RPC_WORKER_THREAD_PLUGIN`),I($,`packageName`,J),I($,`version`,Y),$=E([T(1,o(s)),T(2,r)],$);export{H as ChannelClient,U as ChannelServer,G as ChannelService,K as DataSyncPrimaryController,q as DataSyncReplicaController,W as IRPCChannelService,j as IRemoteInstanceService,O as IRemoteSyncService,x as PLUGIN_CONFIG_KEY_MAIN_THREAD,C as PLUGIN_CONFIG_KEY_WORKER_THREAD,A as RemoteInstanceServiceName,k as RemoteSyncPrimaryService,D as RemoteSyncServiceName,Q as UniverRPCMainThreadPlugin,$ as UniverRPCWorkerThreadPlugin,M as WebWorkerRemoteInstanceService,L as fromModule,R as toModule};