@veltdev/sdk-staging 6.0.14-beta.1 → 6.0.14
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/{chunk-I63T4QWP.js → chunk-2XFRSBAE.js} +1 -1
- package/{chunk-7TFVNMHJ.js → chunk-3MNQES2P.js} +1 -1
- package/{chunk-VJLHHQ2Z.js → chunk-6HNU2FG2.js} +1 -1
- package/{chunk-L4QMAEKA.js → chunk-C7NBAS5V.js} +1 -1
- package/{chunk-PWTBCAPJ.js → chunk-CSN6ATAA.js} +1 -1
- package/{chunk-KWLMOL5X.js → chunk-DEQNXKWW.js} +1 -1
- package/{chunk-O3FUWWWQ.js → chunk-FS6KTSNQ.js} +1 -1
- package/{chunk-NMPXJFDX.js → chunk-FUR2EFO6.js} +1 -1
- package/{chunk-HRCWTVRH.js → chunk-FWPOKU7S.js} +1 -1
- package/{chunk-KQPNTB77.js → chunk-GUHU4CU5.js} +1 -1
- package/{chunk-2KTYC2AG.js → chunk-H57PY57T.js} +1 -1
- package/{chunk-UI2CRSTN.js → chunk-H6ZQEQFJ.js} +1 -1
- package/{chunk-77FADRSO.js → chunk-HALPIS6O.js} +1 -1
- package/{chunk-C5JOX4MX.js → chunk-HRU6STNE.js} +1 -1
- package/{chunk-MRY4A7N6.js → chunk-I6ELSCG4.js} +1 -1
- package/{chunk-HWS7Y4LE.js → chunk-K35QXS7N.js} +1 -1
- package/{chunk-UVKIGEOH.js → chunk-KBXVJ2AO.js} +1 -1
- package/{chunk-IQ22I2I3.js → chunk-L5SOVVIR.js} +1 -1
- package/{chunk-6NWFM6PC.js → chunk-LTKCIADR.js} +1 -1
- package/{chunk-ZHXLO4CC.js → chunk-LUXKOQSC.js} +1 -1
- package/{chunk-YO4HNOAN.js → chunk-NM32S6ZH.js} +1 -1
- package/{chunk-IMH5OESK.js → chunk-O3CLK76M.js} +1 -1
- package/{chunk-VW5ND7U4.js → chunk-OBDK4TJR.js} +1 -1
- package/{chunk-FZSZ6AV3.js → chunk-OCCE2UTF.js} +1 -1
- package/{chunk-KNQJBBQA.js → chunk-PHGOP6XJ.js} +1 -1
- package/{chunk-YFBAHLK6.js → chunk-RV7ZJ7J2.js} +23 -23
- package/{chunk-GULBDPIM.js → chunk-SC3WVEMZ.js} +1 -1
- package/{chunk-TQNLXTQA.js → chunk-TAOBMSMM.js} +1 -1
- package/{chunk-45X5JRZ6.js → chunk-TJT3IIS7.js} +1 -1
- package/{chunk-DZYXTTOX.js → chunk-U4L2FEIW.js} +1 -1
- package/{chunk-3AL5S762.js → chunk-VOMZ73T5.js} +1 -1
- package/{chunk-DFEL6HM7.js → chunk-XCOVQJPR.js} +1 -1
- package/{chunk-WMDZMDJS.js → chunk-YNFDUIYD.js} +1 -1
- package/{chunk-2HGCWC7B.js → chunk-ZSCDUVYV.js} +1 -1
- package/package.json +1 -1
- package/velt-activity-log.js +1 -1
- package/velt-area.js +1 -1
- package/velt-arrow.js +1 -1
- package/velt-comment.js +6 -6
- package/velt-crdt.js +1 -1
- package/velt-cursor.js +1 -1
- package/velt-huddle.js +1 -1
- package/velt-live-state-sync.js +1 -1
- package/velt-notification.js +1 -1
- package/velt-portable.js +1 -1
- package/velt-presence.js +1 -1
- package/velt-reaction.js +1 -1
- package/velt-recorder.js +1 -1
- package/velt-rewriter.js +1 -1
- package/velt-selection.js +1 -1
- package/velt-tag.js +1 -1
- package/velt-user-invite.js +1 -1
- package/velt-user-request.js +1 -1
- package/velt-video-player.js +1 -1
- package/velt-views.js +1 -1
- package/velt.js +2 -2
package/velt-crdt.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as Ce}from"./chunk-2HGCWC7B.js";import{e as me,s as be,t as fe}from"./chunk-MRY4A7N6.js";import{D as re,E as O,H as R,J as q,Me as ae,Ni as he,Pi as ue,Rc as oe,Rf as H,Ri as M,Sf as G,Si as ge,Ti as u,Ui as pe,V as U,Va as ne,Xa as se,Y as x,Yd as y,Yf as m,a as k,b as X,ba as _,ca as ie,ea as I,g as v,i as Z,ie as $,ji as de,k as N,l as ee,lj as F,me as ce,mi as le,nj as V,oj as J,r as w,rg as Y,rj as ve,w as te,wj as Se,xj as ye}from"./chunk-YFBAHLK6.js";var K=(()=>{let i=class i{constructor(e){this.loggingService=e,this.actionSubjects=new Map,this.subscriptions=[]}triggerAction(e,t){try{this.actionSubjects.has(e)||this.actionSubjects.set(e,new N),this.actionSubjects.get(e)?.next(t)}catch(n){this.loggingService.catch("Error in CrdtActionsService triggerAction: ",n)}}onAction(e){try{this.actionSubjects.has(e)||this.actionSubjects.set(e,new N);let t=this.actionSubjects.get(e);return t?t.asObservable():w(null)}catch(t){return this.loggingService.catch("Error in CrdtActionsService onAction: ",t),w(null)}}};i.\u0275fac=function(t){return new(t||i)(I(u))},i.\u0275prov=_({token:i,factory:i.\u0275fac,providedIn:"root"});let S=i;return S})();var P=(()=>{let i=class i{static generateKey(){return v(this,null,function*(){try{return yield window.crypto.subtle.generateKey({name:"AES-GCM",length:this.KEY_LENGTH},!1,["encrypt","decrypt"])}catch(e){return y.catch("Failed to generate key: ",e),null}})}static deriveKeyFromPassword(e,t){return v(this,null,function*(){try{if(!t){let o=yield window.crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));t=new Uint8Array(o).slice(0,this.SALT_LENGTH)}let n=new TextEncoder().encode(e),r=yield window.crypto.subtle.importKey("raw",n,"PBKDF2",!1,["deriveBits","deriveKey"]);return{key:yield window.crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:this.PBKDF2_ITERATIONS,hash:"SHA-256"},r,{name:"AES-GCM",length:this.KEY_LENGTH},!1,["encrypt","decrypt"]),salt:t}}catch(n){return y.catch("Failed to derive key from password: ",n),null}})}static resolveKey(e){return v(this,null,function*(){try{if(e.customKey){if(e.customKey instanceof CryptoKey)return{key:e.customKey};if(typeof e.customKey=="string"){let n=yield this.deriveKeyFromPassword(e.customKey,e.customSalt);if(!n)return y.catch("Failed to derive key from password"),null;let{key:r,salt:s}=n;return{key:r,salt:s}}}let t=yield this.generateKey();return t?{key:t}:(y.catch("Failed to generate key"),null)}catch(t){return y.catch("Failed to resolve key: ",t),null}})}static encrypt(n){return v(this,arguments,function*(e,t={}){try{if(t.customEncryptCallback)try{return yield t.customEncryptCallback(e)}catch(a){return y.catch("Custom encryption callback failed: ",a),""}let r=yield this.resolveKey(t);if(!r)return y.catch("Failed to resolve key"),"";let{key:s,salt:o}=r,c;if(t.customIV){if(t.customIV.length!==this.IV_LENGTH)return y.catch(`Custom IV must be exactly ${this.IV_LENGTH} bytes`),"";c=t.customIV}else c=window.crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));let d=new TextEncoder().encode(e),l={name:"AES-GCM",iv:c,tagLength:128};t.additionalData&&(l.additionalData=t.additionalData);try{let a=yield window.crypto.subtle.encrypt(l,s,d),g=new Uint8Array(c.length+a.byteLength);g.set(c,0),g.set(new Uint8Array(a),c.length);let p=8192,f=[];for(let D=0;D<g.length;D+=p){let T=g.slice(D,Math.min(D+p,g.length)),E="";for(let C=0;C<T.length;C++)E+=String.fromCharCode(T[C]);f.push(E)}return btoa(f.join(""))}catch(a){return y.catch("Encryption failed: ",a),""}}catch(r){return y.catch("Failed to encrypt: ",r),null}})}static decrypt(n){return v(this,arguments,function*(e,t={}){try{if(t.customDecryptCallback)try{return yield t.customDecryptCallback(e)}catch(a){return y.catch("Custom decryption callback failed: ",a),""}let r=yield this.resolveKey(t);if(!r)return y.catch("Failed to resolve key"),"";let{key:s}=r,o=new Uint8Array(atob(e).split("").map(a=>a.charCodeAt(0)));if(o.length<this.IV_LENGTH)return y.catch("Invalid encrypted data: Too short"),"";let c;if(t.customIV){if(t.customIV.length!==this.IV_LENGTH)return y.catch(`Custom IV must be exactly ${this.IV_LENGTH} bytes`),"";c=t.customIV}else c=o.slice(0,this.IV_LENGTH);let d=o.slice(this.IV_LENGTH),l={name:"AES-GCM",iv:c,tagLength:128};t.additionalData&&(l.additionalData=t.additionalData);try{let a=yield window.crypto.subtle.decrypt(l,s,d);return new TextDecoder().decode(a)}catch(a){return y.catch("Decryption failed: ",a),""}}catch(r){return y.catch("Failed to decrypt: ",r),""}})}static encryptData(n){return v(this,arguments,function*(e,t={}){try{let r=JSON.stringify(e);return(yield this.encrypt(r,t))??""}catch(r){return y.catch("Failed to encrypt data: ",r),""}})}static decryptData(n){return v(this,arguments,function*(e,t={}){try{let r=yield this.decrypt(e,t);return JSON.parse(r)}catch(r){return y.catch("Failed to decrypt data: ",r),null}})}};i.IV_LENGTH=12,i.SALT_LENGTH=16,i.PBKDF2_ITERATIONS=1e5,i.KEY_LENGTH=256;let S=i;return S})();function Q(S){try{let i=new TextEncoder().encode(JSON.stringify(S)),h="";for(let e=0;e<i.length;e+=32768)h+=String.fromCharCode(...i.subarray(e,e+32768));return btoa(h)}catch(i){return y.catch("Error in wrapCrdtPayload: ",i),null}}function De(S){try{let i=atob(S),h=new Uint8Array(i.length);for(let t=0;t<i.length;t++)h[t]=i.charCodeAt(t);let e=JSON.parse(new TextDecoder().decode(h));return e!==null&&typeof e=="object"?e:null}catch{return null}}var j=class{constructor(){this.log=[],this.composite=null,this.compositeUptoSeq=0,this.lastSeq=0,this.seenVeltIds=new Set,this.listeners=new Set,this.snapshotListeners=new Set,this.denied=!1,this.primed=!1,this.primedWaiters=[],this.deliveredSeq=new Map,this.foldUnsafe=!1}ingest(i){try{if(this.denied||i?.type==="removed")return;if(i?.id==="snapshot"){this.resetLog();let r=i.data,s=typeof r?.payloadB64=="string"?De(r.payloadB64):null;if(s&&s.version===1&&s.editors&&typeof s.editors=="object"){this.composite=s;for(let o of Object.keys(this.composite.editors))this.seenVeltIds.add(o)}else s!==null?(this.foldUnsafe=!0,y.catch("CrdtPortableChannelStore: unrecognized composite snapshot shape \u2014 ignored (folds disabled)",void 0)):typeof r?.payloadB64=="string"&&(this.foldUnsafe=!0);if(this.compositeUptoSeq=Number.isInteger(r?.uptoSeq)?r.uptoSeq:0,this.lastSeq=this.compositeUptoSeq,this.composite)for(let o of this.snapshotListeners)try{o(this.composite,this.compositeUptoSeq)}catch(c){y.catch("Error in CrdtPortableChannelStore snapshot listener: ",c)}return}let h=Number.isInteger(i?.seq)?i.seq:Number(i?.id);if(!Number.isFinite(h)){this.foldUnsafe=!0;return}(this.log.length>0||this.compositeUptoSeq>0)&&h<=this.lastSeq&&(this.resetLog(),this.composite=null,this.compositeUptoSeq=0);let e=i.data?.payloadB64,t=typeof e=="string"?De(e):null;if(t===null){this.foldUnsafe=!0,y.catch(`CrdtPortableChannelStore: dropping malformed crdt item seq=${h} (folds disabled)`,void 0);return}(typeof t.veltId!="string"||t.veltId.length===0)&&(this.foldUnsafe=!0),this.lastSeq=h,typeof t.veltId=="string"&&t.veltId.length>0&&this.seenVeltIds.add(t.veltId);let n={seq:h,envelope:t};this.log.push(n);for(let r of this.listeners)try{r(n)}catch(s){y.catch("Error in CrdtPortableChannelStore listener: ",s)}}catch(h){y.catch("Error in CrdtPortableChannelStore ingest: ",h)}}markDenied(){this.denied=!0,this.resetLog(),this.composite=null,this.compositeUptoSeq=0,this.markPrimed()}beginEpoch(){this.primed=!1,this.denied=!1}markPrimed(){this.primed=!0;let i=this.primedWaiters;this.primedWaiters=[];for(let h of i)try{h()}catch(e){y.catch("Error in CrdtPortableChannelStore primed waiter: ",e)}}awaitPrimed(){return this.primed?Promise.resolve():new Promise(i=>this.primedWaiters.push(i))}markDelivered(i,h){Number.isFinite(h)&&h>(this.deliveredSeq.get(i)??0)&&this.deliveredSeq.set(i,h)}getFoldUptoSeq(i){return Math.max(this.deliveredSeq.get(i)??0,this.compositeUptoSeq)}listen(i){return this.listeners.add(i),()=>this.listeners.delete(i)}listenSnapshot(i){return this.snapshotListeners.add(i),()=>this.snapshotListeners.delete(i)}entriesFor(i,h){return this.log.filter(e=>e.envelope.veltId===i&&(h===void 0||typeof e.envelope.timestamp!="number"||e.envelope.timestamp>h))}snapshotFor(i){return this.composite?.editors?.[i]??null}getLastSeq(){return this.lastSeq}isSoleEditor(i){return this.foldUnsafe?!1:this.seenVeltIds.size===0?!0:this.seenVeltIds.size===1&&this.seenVeltIds.has(i)}resetLog(){this.log=[]}};var b=(()=>{let i=class i{constructor(e,t,n,r,s,o,c,d,l,a,g){this.adapterSelectorService=e,this.analyticsService=t,this.authService=n,this.commonDbService=r,this.commonDbUtilsService=s,this.configService=o,this.crdtActionsService=c,this.docService=d,this.domService=l,this.loggingService=a,this.serviceBook=g,this.MIN_WEBHOOK_DEBOUNCE_TIME=5*1e3,this.webhookDebounceTime=this.MIN_WEBHOOK_DEBOUNCE_TIME,this.updateDataWebhookTrigger$=new N,this.updateDataWebhookDebounceSubscription=null,this.pendingWebhookEvent=null,this.webhookEnabled$=new ee(!1),this.lastCrdtDataUpdatedId=null,this.MIN_ACTIVITY_DEBOUNCE_TIME=10*1e3,this.activityDebounceTime=600*1e3,this.editorEditTrackers=new Map,this.activityService=null,this.notificationService=null,this.portableCrdtChannels=new Map,this.portableCrdtChannelInvalidator=null;try{this.loggingService.log("%c[WB] Creating CLASS: CrdtService","color: blue;"),this.serviceBook.observe(he).subscribe(p=>{this.activityService=p}),this.serviceBook.observe(le).subscribe(p=>{this.notificationService=p}),this.setupUpdateDataWebhookDebounce(),this.docService.addPreDocumentIdChangeFunction("crdt-service",()=>(this.lastCrdtDataUpdatedId=null,Promise.resolve())),this.authService.addPreSignOutFuction("crdt-service",()=>(this.lastCrdtDataUpdatedId=null,Promise.resolve()))}catch(p){this.loggingService.catch("Error in CrdtService constructor: ",p)}}trackCrdtDataUpdated(e){try{if(this.lastCrdtDataUpdatedId===e)return;this.lastCrdtDataUpdatedId=e,this.analyticsService.trackEvent(de.Events.Crdt.CRDT_DATA_UPDATED,{id:e})}catch(t){this.loggingService.catch("Error in CrdtService trackCrdtDataUpdated: ",t)}}setupUpdateDataWebhookDebounce(){try{this.updateDataWebhookDebounceSubscription&&(this.updateDataWebhookDebounceSubscription.unsubscribe(),this.updateDataWebhookDebounceSubscription=null,this.pendingWebhookEvent=null),this.updateDataWebhookDebounceSubscription=this.updateDataWebhookTrigger$.pipe(x(e=>{this.pendingWebhookEvent=e}),q(this.webhookDebounceTime)).subscribe(e=>{this.pendingWebhookEvent=null,this.webhookEnabled$.value&&e&&this.triggerUpdateDataWebhook(e)},e=>{this.loggingService.catch("Error in CrdtService setupUpdateDataWebhookDebounce subscription: ",e)})}catch(e){this.loggingService.catch("Error in CrdtService setupUpdateDataWebhookDebounce: ",e)}}setWebhookDebounceTime(e){try{e<this.MIN_WEBHOOK_DEBOUNCE_TIME&&(this.loggingService.catch("Error in CrdtService setWebhookDebounceTime: Value must be at least "+this.MIN_WEBHOOK_DEBOUNCE_TIME/1e3+" seconds ("+this.MIN_WEBHOOK_DEBOUNCE_TIME+"ms). Using minimum value."),e=this.MIN_WEBHOOK_DEBOUNCE_TIME),this.pendingWebhookEvent&&this.webhookEnabled$.value&&(this.triggerUpdateDataWebhook(this.pendingWebhookEvent),this.pendingWebhookEvent=null),this.webhookDebounceTime=e,this.setupUpdateDataWebhookDebounce()}catch(t){this.loggingService.catch("Error in CrdtService setWebhookDebounceTime: ",t)}}updateData(r){return v(this,arguments,function*({id:e,state:t,data:n}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: updateData","color: green;");let s=this.docService.getDocumentPaths(),o=this.authService.getUser(),c=this.domService.getTabId();if(o?.userId&&s){let d=m(e),l=o.userId,a=m(o.userId),g=new Date().toISOString(),p=null,f=this.configService.getEncryptionProvider();if(f?.encrypt&&typeof f.encrypt=="function")p=yield f.encrypt({data:t});else{let C={};C.customKey=d,p=yield P.encryptData(t,C)}let D={id:e,veltId:d,encryptedState:p,lastUpdate:g,lastUpdatedBy:l,lastUpdatedByVeltUserId:a,sessionId:c},T={methodName:G.UPDATE_DATA,uniqueId:Y(),timestamp:new Date().getTime(),source:H.INTERNAL,payload:{id:e,data:n,lastUpdatedBy:l,sessionId:c,lastUpdate:g}},E=yield this.commonDbService.updateData({feature:"crdtData",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:d,skipFirestore:!0},data:D});return this.crdtActionsService.triggerAction($.UPDATE_DATA,T),this.trackCrdtDataUpdated(e),this.updateDataWebhookTrigger$.next(T?.payload),this.trackEditForActivity(e),E}return Promise.resolve(null)}catch(s){return this.loggingService.catch("Error in CrdtService updateData: ",s),Promise.resolve(null)}})}triggerUpdateDataWebhook(e){try{this.updateNotificationsDatabase(e,ce.UPDATE_DATA)}catch(t){this.loggingService.catch("Error in CrdtService triggerUpdateDataWebhook: ",t)}}onDataChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onDataChange","color: green;");let n=m(e),r=this.docService.getDocumentPaths$().pipe(U(s=>s?this.commonDbService.dbListener({feature:"crdtData",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:n,skipFirestore:!0}}).pipe(U(o=>v(this,null,function*(){try{if(o?.data){if(o.data.encryptedState){let c=null,d=this.configService.getEncryptionProvider();if(d?.decrypt&&typeof d.decrypt=="function")c=yield d.decrypt({data:o.data.encryptedState});else{let l={};l.customKey=n,c=yield P.decryptData(o.data.encryptedState,l)}o.data.state=c,delete o.data?.encryptedState}return o}else{if(o?.encryptedState){let c=null,d=this.configService.getEncryptionProvider();if(d?.decrypt&&typeof d.decrypt=="function")c=yield d.decrypt({data:o.encryptedState});else{let l={};l.customKey=n,c=yield P.decryptData(o.encryptedState,l)}o.state=c,delete o?.encryptedState}return o}}catch(c){return this.loggingService.catch("Error in CrdtService onDataChange subscription: ",c),null}}))):w(null))).subscribe(s=>{s&&(s.data?t(s.data):t(s))});return()=>r.unsubscribe()}catch(n){return this.loggingService.catch("Error in CrdtService onDataChange: ",n),()=>{}}}getData(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getData","color: green;");let n=this.docService.getDocumentPaths();if(n){let r=m(e),s=yield this.commonDbService.getData({feature:"crdtData",properties:{documentId:n?.documentId??"",organizationId:n?.organizationId??"",id:r,skipFirestore:!0}});if(s?.encryptedState){let o=null,c=this.configService.getEncryptionProvider();if(c?.decrypt&&typeof c.decrypt=="function")o=yield c.decrypt({data:s.encryptedState});else{let d={};d.customKey=r,o=yield P.decryptData(s.encryptedState,d)}s.state=o,delete s?.encryptedState}return s}return Promise.resolve(null)}catch(n){return this.loggingService.catch("Error in CrdtService getData: ",n),Promise.resolve(null)}})}onStateChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onStateChange","color: green;");let n=m(e),r=this.docService.getDocumentPaths$().pipe(U(s=>s?this.commonDbService.dbListener({feature:"crdtSyncState",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:n,skipFirestore:!0}}).pipe(U(o=>v(this,null,function*(){try{if(o?.data){if(o.data.encryptedState){let c=null,d=this.configService.getEncryptionProvider();if(d?.decrypt&&typeof d.decrypt=="function")c=yield d.decrypt({data:o.data.encryptedState});else{let l={};l.customKey=n,c=yield P.decryptData(o.data.encryptedState,l)}o.data.state=c,delete o.data?.encryptedState}return o}else{if(o?.encryptedState){let c=null,d=this.configService.getEncryptionProvider();if(d?.decrypt&&typeof d.decrypt=="function")c=yield d.decrypt({data:o.encryptedState});else{let l={};l.customKey=n,c=yield P.decryptData(o.encryptedState,l)}o.state=c,delete o?.encryptedState}return o}}catch(c){return this.loggingService.catch("Error in CrdtService onStateChange subscription: ",c),null}}))):w(null))).subscribe(s=>{s&&(s.data?t(s.data):t(s))});return()=>r.unsubscribe()}catch(n){return this.loggingService.catch("Error in CrdtService onStateChange: ",n),()=>{}}}updateState(n){return v(this,arguments,function*({id:e,state:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: updateState","color: green;");let r=this.docService.getDocumentPaths(),s=this.authService.getUser(),o=this.domService.getTabId();if(s?.userId&&r){let c=m(e),d=s.userId,l=m(d),a=null,g=this.configService.getEncryptionProvider();if(g?.encrypt&&typeof g.encrypt=="function")a=yield g.encrypt({data:t});else{let p={};p.customKey=c,a=yield P.encryptData(t,p)}return this.commonDbService.setData({feature:"crdtSyncState",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:c,skipFirestore:!0},data:{id:e,veltId:c,encryptedState:a,lastUpdate:new Date().toISOString(),lastUpdatedBy:d,lastUpdatedByVeltUserId:l,sessionId:o}})}return Promise.resolve(null)}catch(r){return this.loggingService.catch("Error in CrdtService updateState: ",r),Promise.resolve(null)}})}registerSyncUser(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: registerSyncUser","color: green;");let n=this.authService.getUser(),r=this.docService.getDocumentPaths(),s=this.configService.getApiKey(),o=m(e),c=this.domService.getTabId();if(n?.userId&&r&&s){let d=n.userId,l=m(d),a={documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:o,userId:l,apiKey:s,skipFirestore:!0},g={userId:d,veltUserId:l,status:"online",lastSeen:Date.now(),sessionId:c};yield this.commonDbService.setData({feature:"crdtSyncPresence",properties:a,data:g});let p=this.commonDbUtilsService.getDocumentPath({feature:"crdtSyncPresence",properties:a,defaultDocumentPaths:r,apiKey:s});p&&(yield this.commonDbService.setupOnDisconnect(p,{status:"offline",lastSeen:new Date().getTime(),sessionId:c},"crdtSyncPresence",a))}}catch(n){this.loggingService.catch("Error in CrdtService registerSyncUser: ",n)}})}onRegisteredUserChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onRegisteredUserChange","color: green;");let n=m(e);return this.subscribeCrdtRosterFeed("allCrdtSyncPresence","onRegisteredUserChange",n,t)}catch(n){return this.loggingService.catch("Error in CrdtService onRegisteredUserChange: ",n),()=>{}}}subscribeCrdtRosterFeed(e,t,n,r){let s=new Z(c=>V(()=>c.next(null))),o=te([this.docService.getDocumentPaths$(),re(w(null),s)]).pipe(U(([c])=>c?this.commonDbService.dbListener({feature:e,properties:{documentId:c?.documentId??"",organizationId:c?.organizationId??"",id:n,skipFirestore:!0}}).pipe(x(d=>{try{d?.data?r(d.data):r(d)}catch(l){this.loggingService.catch(`Error in CrdtService ${t} subscription: `,l)}})):w(null))).subscribe(()=>{});return()=>o.unsubscribe()}setPresence(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: setPresence","color: green;");let n=this.authService.getUser(),r=this.docService.getDocumentPaths(),s=this.configService.getApiKey(),o=m(e),c=this.domService.getTabId();if(n?.userId&&r&&s){let d=n.userId,l=m(d),a={documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:o,userId:l,apiKey:s,skipFirestore:!0},g={userId:d,veltUserId:l,status:"online",lastSeen:Date.now(),sessionId:c};yield this.commonDbService.setData({feature:"crdtPresence",properties:a,data:g});let p=this.commonDbUtilsService.getDocumentPath({feature:"crdtPresence",properties:a,defaultDocumentPaths:r,apiKey:s});p&&(yield this.commonDbService.setupOnDisconnect(p,{status:"offline",lastSeen:new Date().getTime(),sessionId:c},"crdtPresence",a))}}catch(n){this.loggingService.catch("Error in CrdtService setPresence: ",n)}})}onPresenceChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onPresenceChange","color: green;");let n=m(e);return this.subscribeCrdtRosterFeed("allCrdtPresence","onPresenceChange",n,t)}catch(n){return this.loggingService.catch("Error in CrdtService onPresenceChange: ",n),()=>{}}}saveVersion(s){return v(this,arguments,function*({id:e,versionId:t,versionName:n,state:r}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: saveVersion","color: green;");let o=this.docService.getDocumentPaths();if(o){let c=m(e),d="",l=this.configService.getEncryptionProvider();if(l?.encrypt&&typeof l.encrypt=="function")d=yield l.encrypt({data:r});else{let g={};g.customKey=c,d=yield P.encryptData(r,g)}let a={versionId:t,versionName:n,encryptedState:d,timestamp:new Date().getTime()};return this.commonDbService.setData({feature:"crdtVersion",properties:{documentId:o?.documentId??"",organizationId:o?.organizationId??"",id:c,versionId:t,skipFirestore:!0},data:k({id:e},a)})}return Promise.resolve(null)}catch(o){return this.loggingService.catch("Error in CrdtService saveVersion: ",o),Promise.resolve(null)}})}getVersion(n){return v(this,arguments,function*({id:e,versionId:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getVersion","color: green;");let r=this.docService.getDocumentPaths();if(r){let s=m(e),o=yield this.commonDbService.getData({feature:"crdtVersion",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,versionId:t,skipFirestore:!0}});if(o?.encryptedState){let c=null,d=this.configService.getEncryptionProvider();if(d?.decrypt&&typeof d.decrypt=="function")c=yield d.decrypt({data:o.encryptedState});else{let l={};l.customKey=s,c=yield P.decryptData(o.encryptedState,l)}o.state=c,delete o.encryptedState}return o}return Promise.resolve(null)}catch(r){return this.loggingService.catch("Error in CrdtService getVersion: ",r),Promise.resolve(null)}})}getVersions(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getVersions","color: green;");let n=this.docService.getDocumentPaths();if(n){let r=m(e),s=yield this.commonDbService.getData({feature:"crdtVersions",properties:{documentId:n?.documentId??"",organizationId:n?.organizationId??"",id:r,skipFirestore:!0}}),o=null;if(s){o=[];for(let c of Object.values(s))if(c?.encryptedState){let d=null,l=this.configService.getEncryptionProvider();if(l?.decrypt&&typeof l.decrypt=="function")d=yield l.decrypt({data:c.encryptedState});else{let g={};g.customKey=r,d=yield P.decryptData(c.encryptedState,g)}let a=X(k({},c),{state:d});delete a?.encryptedState,o.push(a)}else o.push(c)}return o}return Promise.resolve(null)}catch(n){return this.loggingService.catch("Error in CrdtService getVersions: ",n),Promise.resolve(null)}})}encryptCrdtData(e,t){return v(this,null,function*(){try{let n=this.configService.getEncryptionProvider();if(n?.encrypt&&typeof n.encrypt=="function")return yield n.encrypt({data:e});let r={};return r.customKey=t,yield P.encryptData(e,r)}catch(n){return this.loggingService.catch("Error in CrdtService encryptCrdtData: ",n),null}})}decryptCrdtData(e,t){return v(this,null,function*(){try{let n=this.configService.getEncryptionProvider();if(n?.decrypt&&typeof n.decrypt=="function")return yield n.decrypt({data:e});let r={};return r.customKey=t,yield P.decryptData(e,r)}catch(n){return this.loggingService.catch("Error in CrdtService decryptCrdtData: ",n),null}})}isPortableCrdtActive(){try{return this.adapterSelectorService.isPortableBackendActive()}catch(e){return this.loggingService.catch("Error in CrdtService isPortableCrdtActive: ",e),!1}}shouldAwaitPortableActivation(){try{return this.adapterSelectorService.isPortableBackendPending()===!0}catch(e){return this.loggingService.catch("Error in CrdtService shouldAwaitPortableActivation: ",e),!1}}buildPortableCrdtChannelKey(){try{let e=this.docService.getDocumentPaths(),t=this.configService.getApiKey();return!e?.documentId||!t?null:{scope:"doc",feature:"crdt",apiKey:t,organizationId:e.organizationId!=null&&e.organizationId!==""?String(e.organizationId):void 0,documentId:String(e.documentId)}}catch(e){return this.loggingService.catch("Error in CrdtService buildPortableCrdtChannelKey: ",e),null}}ensurePortableCrdtChannel(){try{let e=this.buildPortableCrdtChannelKey();if(!e)return null;this.portableCrdtChannelInvalidator||(this.portableCrdtChannelInvalidator=V(()=>this.resubscribePortableCrdtChannels()));let t=`${e.apiKey}:${e.organizationId??""}:${e.documentId}`,n=this.portableCrdtChannels.get(t);if(n)return n.store;let r=new j,s=F("crdt")?.mode??"persistent",o=this.adapterSelectorService.resolveRealtimeAdapter().subscribe(e,s,c=>r.ingest(c),{onError:()=>r.markDenied(),onSnapshotComplete:()=>r.markPrimed()});return this.portableCrdtChannels.set(t,{store:r,sub:o,key:e}),r}catch(e){return this.loggingService.catch("Error in CrdtService ensurePortableCrdtChannel: ",e),null}}resubscribePortableCrdtChannels(){try{let e=F("crdt")?.mode??"persistent";for(let[t,n]of Array.from(this.portableCrdtChannels.entries())){try{n.sub?.unsubscribe()}catch(r){this.loggingService.catch("Error unsubscribing a portable CRDT channel: ",r)}try{n.store.beginEpoch(),n.sub=this.adapterSelectorService.resolveRealtimeAdapter().subscribe(n.key,e,r=>n.store.ingest(r),{onError:()=>n.store.markDenied(),onSnapshotComplete:()=>n.store.markPrimed()})}catch(r){this.loggingService.catch("Error re-subscribing a portable CRDT channel: ",r),n.sub=null}}}catch(e){this.loggingService.catch("Error in CrdtService resubscribePortableCrdtChannels: ",e)}}getPortableServerTimestamp(){return v(this,null,function*(){try{let e=yield this.adapterSelectorService.resolveRealtimeAdapter().getServerTimeOffset();return Date.now()+(e??0)}catch(e){return this.loggingService.catch("Error in CrdtService getPortableServerTimestamp: ",e),Date.now()}})}decryptSnapshotRecord(e,t){return v(this,null,function*(){if(e?.encryptedState){let n=yield this.decryptCrdtData(e.encryptedState,t);if(n==null)return null;e.state=n,delete e?.encryptedState}if(e?.encryptedVector){let n=yield this.decryptCrdtData(e.encryptedVector,t);if(n==null)return null;e.vector=n,delete e?.encryptedVector}return e})}pushMessage(l){return v(this,arguments,function*({id:e,data:t,yjsClientId:n,messageType:r,eventData:s,type:o,contentKey:c,source:d}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: pushMessage","color: green;");let a=this.docService.getDocumentPaths(),g=this.authService.getUser();if(g?.userId&&a){let p=m(e),f=yield this.encryptCrdtData(t,p);if(f==null)return;let D=g.userId,T=m(g.userId),E=this.domService.getTabId();if(this.isPortableCrdtActive()){let C=this.buildPortableCrdtChannelKey(),A={id:e,veltId:p,encryptedData:f,yjsClientId:n,messageType:r??null,type:o??null,contentKey:c??null,source:d??"unknown",updatedByUserId:D,updatedByVeltUserId:T,sessionId:E,timestamp:yield this.getPortableServerTimestamp()},W=C?Q(A):null;if(!C||W===null)return;let L=F("crdt")?.mode??"persistent",B=yield this.adapterSelectorService.resolveRealtimeAdapter().publish(C,L,{payloadB64:W});if(!B.ok){console.error("Velt [portable backend]: crdt update dropped: ",B);return}}else yield this.commonDbService.pushData({feature:"crdtMessages",properties:{documentId:a?.documentId??"",organizationId:a?.organizationId??"",id:p,skipFirestore:!0},data:{id:e,veltId:p,encryptedData:f,yjsClientId:n,messageType:r??null,type:o??null,contentKey:c??null,source:d??"unknown",updatedByUserId:D,updatedByVeltUserId:T,sessionId:E,timestamp:this.commonDbService.getServerTimestamp()}});if(r==="sync"){let C=new Date().toISOString(),A={methodName:G.UPDATE_DATA,uniqueId:Y(),timestamp:new Date().getTime(),source:H.INTERNAL,payload:{id:e,data:s,lastUpdatedBy:D,sessionId:E,lastUpdate:C}};this.crdtActionsService.triggerAction($.UPDATE_DATA,A),this.trackCrdtDataUpdated(e),this.updateDataWebhookTrigger$.next(A?.payload),this.trackEditForActivity(e)}}}catch(a){this.loggingService.catch("Error in CrdtService pushMessage: ",a)}})}onMessage(e){return this.bindOnMessageInternal(e)}bindOnMessageInternal({id:e,callback:t,afterTs:n}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onMessage","color: green;");let r=m(e);if(this.isPortableCrdtActive())return this.subscribePortableCrdtMessages(r,t,n);let s=!1,o=this.subscribeFirebaseCrdtMessages(r,t,n),c=null;return c=V(()=>{try{if(s||!this.isPortableCrdtActive())return;c?.(),c=null,o(),o=this.subscribePortableCrdtMessages(r,t,n)}catch(d){this.loggingService.catch("Error rebinding CrdtService onMessage to the portable channel: ",d)}}),()=>{s=!0;try{c?.(),c=null}finally{o()}}}catch(r){return this.loggingService.catch("Error in CrdtService onMessage: ",r),()=>{}}}subscribePortableCrdtMessages(e,t,n){let r=this.ensurePortableCrdtChannel();if(!r)return()=>{};let s=new N,o=s.pipe(R(p=>v(this,[p],function*({message:a,seq:g}){try{if(a.encryptedData){let f=yield this.decryptCrdtData(a.encryptedData,e);if(f==null)return null;a.data=f,delete a.encryptedData}else if(!a.data)return null;return{message:a,seq:g}}catch(f){return this.loggingService.catch("Error in CrdtService onMessage decryption: ",f),null}})),O(a=>!!a)).subscribe(({message:a,seq:g})=>{try{t(a),r.markDelivered(e,g)}catch(p){this.loggingService.catch("Error in CrdtService onMessage subscription: ",p)}}),c=a=>{a.envelope.veltId===e&&(n!=null&&typeof a.envelope.timestamp=="number"&&a.envelope.timestamp<=n||s.next({message:k({},a.envelope),seq:a.seq}))};for(let a of r.entriesFor(e,n??void 0))c(a);let d=r.listen(c),l=r.listenSnapshot(a=>{let g=a.editors?.[e];g&&g.encryptedState&&s.next({message:{veltId:e,encryptedData:g.encryptedState,yjsClientId:g.yjsClientId??null,messageType:"sync",sessionId:g.sessionId,timestamp:g.timestamp},seq:0})});return()=>{d(),l(),o.unsubscribe()}}subscribeFirebaseCrdtMessages(e,t,n){let r=this.docService.getDocumentPaths$().pipe(U(s=>s?this.commonDbService.streamChildAdded({feature:"crdtMessages",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:e,skipFirestore:!0},afterTs:n}):w(null))).pipe(O(s=>!!s),R(s=>v(this,null,function*(){try{if(s.encryptedData){let o=yield this.decryptCrdtData(s.encryptedData,e);if(o==null)return null;s.data=o,delete s.encryptedData}else if(!s.data)return null;return s}catch(o){return this.loggingService.catch("Error in CrdtService onMessage decryption: ",o),null}})),O(s=>!!s)).subscribe(s=>{try{t(s)}catch(o){this.loggingService.catch("Error in CrdtService onMessage subscription: ",o)}});return()=>r.unsubscribe()}getMessages(n){return v(this,arguments,function*({id:e,afterTs:t}){try{if(this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getMessages","color: green;"),this.shouldAwaitPortableActivation()&&(yield J(i.PORTABLE_ACTIVATION_WAIT_MS)),this.isPortableCrdtActive()){let s=m(e),o=this.ensurePortableCrdtChannel();if(!o)return[];yield o.awaitPrimed();let c=[],d=0;for(let l of o.entriesFor(s,t??void 0)){let a=k({},l.envelope);if(a.encryptedData){let g=yield this.decryptCrdtData(a.encryptedData,s);if(g==null)continue;c.push({data:g,yjsClientId:a.yjsClientId,timestamp:a.timestamp})}else if(a.data)c.push({data:a.data,yjsClientId:a.yjsClientId,timestamp:a.timestamp});else continue;d=Math.max(d,l.seq)}return d>0&&o.markDelivered(s,d),c.sort((l,a)=>l.timestamp-a.timestamp),c}let r=this.docService.getDocumentPaths();if(r){let s=m(e),o=yield this.commonDbService.getData({feature:"crdtMessages",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,skipFirestore:!0}});if(!o||typeof o!="object"||o?.errorCode)return[];let c=[];for(let d of Object.keys(o)){let l=o[d];if(!(!l||typeof l!="object")&&!(t!=null&&l.timestamp!=null&&l.timestamp<=t))if(l.encryptedData){let a=yield this.decryptCrdtData(l.encryptedData,s);if(a==null)continue;c.push({data:a,yjsClientId:l.yjsClientId,timestamp:l.timestamp})}else l.data&&c.push({data:l.data,yjsClientId:l.yjsClientId,timestamp:l.timestamp})}return c.sort((d,l)=>d.timestamp-l.timestamp),c}return[]}catch(r){return this.loggingService.catch("Error in CrdtService getMessages: ",r),[]}})}getSnapshot(t){return v(this,arguments,function*({id:e}){try{if(this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getSnapshot","color: green;"),this.shouldAwaitPortableActivation()&&(yield J(i.PORTABLE_ACTIVATION_WAIT_MS)),this.isPortableCrdtActive()){let r=m(e),s=this.ensurePortableCrdtChannel();if(!s)return null;yield s.awaitPrimed();let o=s.snapshotFor(r);return!o||Object.keys(o).length===0?null:yield this.decryptSnapshotRecord(k({},o),r)}let n=this.docService.getDocumentPaths();if(n){let r=m(e),s=yield this.commonDbService.getData({feature:"crdtSnapshot",properties:{documentId:n?.documentId??"",organizationId:n?.organizationId??"",id:r,skipFirestore:!0}});return!s||typeof s!="object"||Object.keys(s).length===0||s?.errorCode?null:yield this.decryptSnapshotRecord(s,r)}return Promise.resolve(null)}catch(n){return this.loggingService.catch("Error in CrdtService getSnapshot: ",n),Promise.resolve(null)}})}saveSnapshot(c){return v(this,arguments,function*({id:e,state:t,vector:n,type:r,contentKey:s,source:o}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: saveSnapshot","color: green;");let d=this.docService.getDocumentPaths(),l=this.authService.getUser();if(l?.userId&&d){let a=m(e),g=yield this.encryptCrdtData(t,a),p=yield this.encryptCrdtData(n,a);if(g==null||p==null)return;let f=l.userId,D=m(l.userId),T=this.domService.getTabId();if(this.isPortableCrdtActive()){let E=this.ensurePortableCrdtChannel(),C=this.buildPortableCrdtChannelKey();if(!E||!C)return;if(yield E.awaitPrimed(),!E.isSoleEditor(a)){this.loggingService.log("Velt [portable backend]: crdt snapshot fold skipped \u2014 multi-editor channel (v1 limitation; log replay stays authoritative)");return}let A={id:e,veltId:a,encryptedState:g,encryptedVector:p,type:r??null,contentKey:s??null,source:o??"unknown",updatedByUserId:f,updatedByVeltUserId:D,sessionId:T,timestamp:yield this.getPortableServerTimestamp()},W=Q({version:1,editors:{[a]:A}});if(W===null)return;let L=F("crdt")?.mode??"persistent",B=yield this.adapterSelectorService.resolveRealtimeAdapter().publish(C,L,{payloadB64:W,uptoSeq:E.getFoldUptoSeq(a)});B.ok||this.loggingService.catch("Velt [portable backend]: crdt snapshot fold rejected (log NOT trimmed; feed unaffected): ",B);return}yield this.commonDbService.setData({feature:"crdtSnapshot",properties:{documentId:d?.documentId??"",organizationId:d?.organizationId??"",id:a,skipFirestore:!0},data:{id:e,veltId:a,encryptedState:g,encryptedVector:p,type:r??null,contentKey:s??null,source:o??"unknown",updatedByUserId:f,updatedByVeltUserId:D,sessionId:T,timestamp:this.commonDbService.getServerTimestamp()}})}}catch(d){this.loggingService.catch("Error in CrdtService saveSnapshot: ",d)}})}pruneMessages(n){return v(this,arguments,function*({id:e,beforeTs:t}){try{if(this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: pruneMessages","color: green;"),this.isPortableCrdtActive()){this.loggingService.log("Velt [portable backend]: pruneMessages is a no-op (writeCrdtSnapshot folds own the trim)");return}let r=this.docService.getDocumentPaths();if(r){let s=m(e),o=yield this.commonDbService.getData({feature:"crdtMessages",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,skipFirestore:!0}});if(o&&typeof o=="object"&&!o?.errorCode){let c=[];for(let d of Object.keys(o)){let l=o[d];l?.timestamp!=null&&l.timestamp<t&&c.push(this.commonDbService.deleteData({feature:"crdtMessage",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,messageId:d,skipFirestore:!0}}))}yield Promise.all(c)}}}catch(r){this.loggingService.catch("Error in CrdtService pruneMessages: ",r)}})}updateNotificationsDatabase(e,t,n={}){try{let r=k({crdtData:e,actionType:t,notificationSource:"crdt"},n);this.notificationService?.updateNotificationDatabase(r)}catch(r){this.loggingService.catch("Error in CrdtService updateNotificationsDatabase: ",r)}}enableWebhook(){try{if(this.webhookEnabled$.value===!0)return;this.webhookEnabled$.next(!0)}catch(e){this.loggingService.catch("Error in CrdtService enableWebhook: ",e)}}disableWebhook(){try{if(this.webhookEnabled$.value===!1)return;this.webhookEnabled$.next(!1)}catch(e){this.loggingService.catch("Error in CrdtService disableWebhook: ",e)}}trackEditForActivity(e){try{let t=this.editorEditTrackers.get(e);if(!t){let n=new N,r=n.pipe(q(this.activityDebounceTime)).subscribe(()=>{this.flushEditorActivity(e)});t={count:0,subject$:n,subscription:r},this.editorEditTrackers.set(e,t)}t.count++,t.subject$.next()}catch(t){this.loggingService.catch("Error in CrdtService trackEditForActivity: ",t)}}flushEditorActivity(e){try{let t=this.editorEditTrackers.get(e);if(!t||t.count===0)return;let n=t.count;t.count=0;let r={featureType:"crdt",actionType:ae.EDITOR_EDIT,targetEntityId:e,entityData:{editCount:n}};this.activityService?.createActivity(r)}catch(t){this.loggingService.catch("Error in CrdtService flushEditorActivity: ",t)}}setActivityDebounceTime(e){try{e<this.MIN_ACTIVITY_DEBOUNCE_TIME&&(this.loggingService.catch("Error in CrdtService setActivityDebounceTime: Value must be at least "+this.MIN_ACTIVITY_DEBOUNCE_TIME/1e3+" seconds ("+this.MIN_ACTIVITY_DEBOUNCE_TIME+"ms). Using minimum value."),e=this.MIN_ACTIVITY_DEBOUNCE_TIME),this.flushAllEditorActivities(),this.activityDebounceTime=e}catch(t){this.loggingService.catch("Error in CrdtService setActivityDebounceTime: ",t)}}flushAllEditorActivities(){try{for(let[e,t]of this.editorEditTrackers)t.count>0&&this.flushEditorActivity(e),t.subject$.complete(),t.subscription.unsubscribe();this.editorEditTrackers.clear()}catch(e){this.loggingService.catch("Error in CrdtService flushAllEditorActivities: ",e)}}};i.PORTABLE_ACTIVATION_WAIT_MS=1e4,i.\u0275fac=function(t){return new(t||i)(I(ve),I(ge),I(ye),I(fe),I(be),I(pe),I(K),I(me),I(Se),I(u),I(M))},i.\u0275prov=_({token:i,factory:i.\u0275fac,providedIn:"root"});let S=i;return S})();var z=class extends Ce{constructor(i){super(i),this.getService(u).log("%c[WB] Creating CLASS: CrdtElement","color: blue;"),this.updateData=this._updateData,this.onDataChange=this._onDataChange,this.getData=this._getData,this.onStateChange=this._onStateChange,this.updateState=this._updateState,this.registerSyncUser=this._registerSyncUser,this.onRegisteredUserChange=this._onRegisteredUserChange,this.setPresence=this._setPresence,this.onPresenceChange=this._onPresenceChange,this.saveVersion=this._saveVersion,this.getVersion=this._getVersion,this.getVersions=this._getVersions,this.pushMessage=this._pushMessage,this.onMessage=this._onMessage,this.getMessages=this._getMessages,this.getSnapshot=this._getSnapshot,this.saveSnapshot=this._saveSnapshot,this.pruneMessages=this._pruneMessages,this.enableWebhook=this._enableWebhook,this.disableWebhook=this._disableWebhook,this.setWebhookDebounceTime=this._setWebhookDebounceTime,this.setActivityDebounceTime=this._setActivityDebounceTime,this.on=this._on}_updateData(i){this.getService(u).log("%c[WB] Calling FUNCTION: updateData","color: green;");try{return this.getService(b).updateData(i)}catch(h){return this.getService(u).catch("Error in updateData: ",h),Promise.resolve(null)}}_onDataChange(i){this.getService(u).log("%c[WB] Calling FUNCTION: onDataChange","color: green;");try{return this.getService(b).onDataChange(i)}catch(h){return this.getService(u).catch("Error in onDataChange: ",h),()=>{}}}_getData(i){this.getService(u).log("%c[WB] Calling FUNCTION: getData","color: green;");try{return this.getService(b).getData(i)}catch(h){return this.getService(u).catch("Error in getData: ",h),Promise.resolve(null)}}_onStateChange(i){this.getService(u).log("%c[WB] Calling FUNCTION: onStateChange","color: green;");try{return this.getService(b).onStateChange(i)}catch(h){return this.getService(u).catch("Error in onStateChange: ",h),()=>{}}}_updateState(i){this.getService(u).log("%c[WB] Calling FUNCTION: updateState","color: green;");try{return this.getService(b).updateState(i)}catch(h){return this.getService(u).catch("Error in updateState: ",h),Promise.resolve(null)}}_registerSyncUser(i){this.getService(u).log("%c[WB] Calling FUNCTION: registerSyncUser","color: green;");try{return this.getService(b).registerSyncUser(i)}catch(h){return this.getService(u).catch("Error in registerSyncUser: ",h),Promise.resolve()}}_onRegisteredUserChange(i){this.getService(u).log("%c[WB] Calling FUNCTION: onRegisteredUserChange","color: green;");try{return this.getService(b).onRegisteredUserChange(i)}catch(h){return this.getService(u).catch("Error in onRegisteredUserChange: ",h),()=>{}}}_setPresence(i){this.getService(u).log("%c[WB] Calling FUNCTION: setPresence","color: green;");try{return this.getService(b).setPresence(i)}catch(h){return this.getService(u).catch("Error in setPresence: ",h),Promise.resolve()}}_onPresenceChange(i){this.getService(u).log("%c[WB] Calling FUNCTION: onPresenceChange","color: green;");try{return this.getService(b).onPresenceChange(i)}catch(h){return this.getService(u).catch("Error in onPresenceChange: ",h),()=>{}}}_saveVersion(i){this.getService(u).log("%c[WB] Calling FUNCTION: saveVersion","color: green;");try{return this.getService(b).saveVersion(i)}catch(h){return this.getService(u).catch("Error in saveVersion: ",h),Promise.resolve(null)}}_getVersion(i){this.getService(u).log("%c[WB] Calling FUNCTION: getVersion","color: green;");try{return this.getService(b).getVersion(i)}catch(h){return this.getService(u).catch("Error in getVersion: ",h),Promise.resolve(null)}}_getVersions(i){this.getService(u).log("%c[WB] Calling FUNCTION: getVersions","color: green;");try{return this.getService(b).getVersions(i)}catch(h){return this.getService(u).catch("Error in getVersions: ",h),Promise.resolve(null)}}_pushMessage(i){this.getService(u).log("%c[WB] Calling FUNCTION: pushMessage","color: green;");try{return this.getService(b).pushMessage(i)}catch(h){return this.getService(u).catch("Error in pushMessage: ",h),Promise.resolve()}}_onMessage(i){this.getService(u).log("%c[WB] Calling FUNCTION: onMessage","color: green;");try{return this.getService(b).onMessage(i)}catch(h){return this.getService(u).catch("Error in onMessage: ",h),()=>{}}}_getMessages(i){this.getService(u).log("%c[WB] Calling FUNCTION: getMessages","color: green;");try{return this.getService(b).getMessages(i)}catch(h){return this.getService(u).catch("Error in getMessages: ",h),Promise.resolve([])}}_getSnapshot(i){this.getService(u).log("%c[WB] Calling FUNCTION: getSnapshot","color: green;");try{return this.getService(b).getSnapshot(i)}catch(h){return this.getService(u).catch("Error in getSnapshot: ",h),Promise.resolve(null)}}_saveSnapshot(i){this.getService(u).log("%c[WB] Calling FUNCTION: saveSnapshot","color: green;");try{return this.getService(b).saveSnapshot(i)}catch(h){return this.getService(u).catch("Error in saveSnapshot: ",h),Promise.resolve()}}_pruneMessages(i){this.getService(u).log("%c[WB] Calling FUNCTION: pruneMessages","color: green;");try{return this.getService(b).pruneMessages(i)}catch(h){return this.getService(u).catch("Error in pruneMessages: ",h),Promise.resolve()}}_enableWebhook(){this.getService(u).log("%c[WB] Calling FUNCTION: enableWebhook","color: green;");try{return this.getService(b).enableWebhook()}catch(i){this.getService(u).catch("Error in enableWebhook: ",i);return}}_disableWebhook(){this.getService(u).log("%c[WB] Calling FUNCTION: disableWebhook","color: green;");try{return this.getService(b).disableWebhook()}catch(i){this.getService(u).catch("Error in disableWebhook: ",i);return}}_setWebhookDebounceTime(i){this.getService(u).log("%c[WB] Calling FUNCTION: setWebhookDebounceTime","color: green;");try{!isNaN(i)&&i>0?this.getService(b).setWebhookDebounceTime(i):this.getService(u).catch("Error in setWebhookDebounceTime: ","Provided value must be a positive number greater than zero.")}catch(h){this.getService(u).catch("Error in setWebhookDebounceTime: ",h)}}_setActivityDebounceTime(i){this.getService(u).log("%c[WB] Calling FUNCTION: setActivityDebounceTime","color: green;");try{!isNaN(i)&&i>=1e4?this.getService(b).setActivityDebounceTime(i):this.getService(u).catch("Error in setActivityDebounceTime: ","Provided value must be a number >= 10000ms (10 seconds).")}catch(h){this.getService(u).catch("Error in setActivityDebounceTime: ",h)}}_on(i){this.getService(u).log("%c[WB] Calling FUNCTION: on","color: green;");try{return this.getService(K).onAction(i)}catch(h){return this.getService(u).catch("Error in on: ",h),w(null)}}};var Ee=(()=>{let i=class i{};i.\u0275fac=function(t){return new(t||i)},i.\u0275mod=se({type:i}),i.\u0275inj=ie({imports:[oe]});let S=i;return S})();function we(S){return S.get(u).log("%c[WB] Loading CRDT feature chunk","color: blue;"),S.get(M).set(ue,S.get(b)),ne(Ee,S),new z(S)}export{we as default};
|
|
1
|
+
import{a as Te}from"./chunk-ZSCDUVYV.js";import{e as De,s as Ee,t as Pe}from"./chunk-I6ELSCG4.js";import{D as ce,E as O,H as x,J as q,Me as ge,Ni as Se,Pi as ye,Rc as he,Rf as G,Ri as V,Sf as Y,Si as me,Ti as g,Ui as be,V as N,Va as de,Xa as le,Y as $,Yd as y,Yf as m,a as W,b as ie,ba as _,ca as ae,ea as I,g as v,i as ne,ie as H,ji as pe,k as U,l as oe,lj as M,me as ue,mi as ve,nj as K,oj as Q,r as P,rg as J,rj as fe,w as se,wj as Ce,xj as Ie}from"./chunk-RV7ZJ7J2.js";var j=(()=>{let i=class i{constructor(e){this.loggingService=e,this.actionSubjects=new Map,this.subscriptions=[]}triggerAction(e,t){try{this.actionSubjects.has(e)||this.actionSubjects.set(e,new U),this.actionSubjects.get(e)?.next(t)}catch(n){this.loggingService.catch("Error in CrdtActionsService triggerAction: ",n)}}onAction(e){try{this.actionSubjects.has(e)||this.actionSubjects.set(e,new U);let t=this.actionSubjects.get(e);return t?t.asObservable():P(null)}catch(t){return this.loggingService.catch("Error in CrdtActionsService onAction: ",t),P(null)}}};i.\u0275fac=function(t){return new(t||i)(I(g))},i.\u0275prov=_({token:i,factory:i.\u0275fac,providedIn:"root"});let h=i;return h})();var E=(()=>{let i=class i{static generateKey(){return v(this,null,function*(){try{return yield window.crypto.subtle.generateKey({name:"AES-GCM",length:this.KEY_LENGTH},!1,["encrypt","decrypt"])}catch(e){return y.catch("Failed to generate key: ",e),null}})}static deriveKeyFromPassword(e,t){return v(this,null,function*(){try{if(!t){let o=yield window.crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));t=new Uint8Array(o).slice(0,this.SALT_LENGTH)}let n=new TextEncoder().encode(e),r=yield window.crypto.subtle.importKey("raw",n,"PBKDF2",!1,["deriveBits","deriveKey"]);return{key:yield window.crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:this.PBKDF2_ITERATIONS,hash:"SHA-256"},r,{name:"AES-GCM",length:this.KEY_LENGTH},!1,["encrypt","decrypt"]),salt:t}}catch(n){return y.catch("Failed to derive key from password: ",n),null}})}static resolveKey(e){return v(this,null,function*(){try{if(e.customKey){if(e.customKey instanceof CryptoKey)return{key:e.customKey};if(typeof e.customKey=="string"){let n=yield this.deriveKeyFromPassword(e.customKey,e.customSalt);if(!n)return y.catch("Failed to derive key from password"),null;let{key:r,salt:s}=n;return{key:r,salt:s}}}let t=yield this.generateKey();return t?{key:t}:(y.catch("Failed to generate key"),null)}catch(t){return y.catch("Failed to resolve key: ",t),null}})}static encrypt(n){return v(this,arguments,function*(e,t={}){try{if(t.customEncryptCallback)try{return yield t.customEncryptCallback(e)}catch(d){return y.catch("Custom encryption callback failed: ",d),""}let r=yield this.resolveKey(t);if(!r)return y.catch("Failed to resolve key"),"";let{key:s,salt:o}=r,c;if(t.customIV){if(t.customIV.length!==this.IV_LENGTH)return y.catch(`Custom IV must be exactly ${this.IV_LENGTH} bytes`),"";c=t.customIV}else c=window.crypto.getRandomValues(new Uint8Array(this.IV_LENGTH));let a=new TextEncoder().encode(e),u={name:"AES-GCM",iv:c,tagLength:128};t.additionalData&&(u.additionalData=t.additionalData);try{let d=yield window.crypto.subtle.encrypt(u,s,a),p=new Uint8Array(c.length+d.byteLength);p.set(c,0),p.set(new Uint8Array(d),c.length);let S=8192,f=[];for(let D=0;D<p.length;D+=S){let w=p.slice(D,Math.min(D+S,p.length)),T="";for(let C=0;C<w.length;C++)T+=String.fromCharCode(w[C]);f.push(T)}return btoa(f.join(""))}catch(d){return y.catch("Encryption failed: ",d),""}}catch(r){return y.catch("Failed to encrypt: ",r),null}})}static decrypt(n){return v(this,arguments,function*(e,t={}){try{if(t.customDecryptCallback)try{return yield t.customDecryptCallback(e)}catch(d){return y.catch("Custom decryption callback failed: ",d),""}let r=yield this.resolveKey(t);if(!r)return y.catch("Failed to resolve key"),"";let{key:s}=r,o=new Uint8Array(atob(e).split("").map(d=>d.charCodeAt(0)));if(o.length<this.IV_LENGTH)return y.catch("Invalid encrypted data: Too short"),"";let c;if(t.customIV){if(t.customIV.length!==this.IV_LENGTH)return y.catch(`Custom IV must be exactly ${this.IV_LENGTH} bytes`),"";c=t.customIV}else c=o.slice(0,this.IV_LENGTH);let a=o.slice(this.IV_LENGTH),u={name:"AES-GCM",iv:c,tagLength:128};t.additionalData&&(u.additionalData=t.additionalData);try{let d=yield window.crypto.subtle.decrypt(u,s,a);return new TextDecoder().decode(d)}catch(d){return y.catch("Decryption failed: ",d),""}}catch(r){return y.catch("Failed to decrypt: ",r),""}})}static encryptData(n){return v(this,arguments,function*(e,t={}){try{let r=JSON.stringify(e);return(yield this.encrypt(r,t))??""}catch(r){return y.catch("Failed to encrypt data: ",r),""}})}static decryptData(n){return v(this,arguments,function*(e,t={}){try{let r=yield this.decrypt(e,t);return JSON.parse(r)}catch(r){return y.catch("Failed to decrypt data: ",r),null}})}};i.IV_LENGTH=12,i.SALT_LENGTH=16,i.PBKDF2_ITERATIONS=1e5,i.KEY_LENGTH=256;let h=i;return h})();function X(h){try{let i=new TextEncoder().encode(JSON.stringify(h)),l="";for(let e=0;e<i.length;e+=32768)l+=String.fromCharCode(...i.subarray(e,e+32768));return btoa(l)}catch(i){return y.catch("Error in wrapCrdtPayload: ",i),null}}function ke(h){try{let i=atob(h),l=new Uint8Array(i.length);for(let t=0;t<i.length;t++)l[t]=i.charCodeAt(t);let e=JSON.parse(new TextDecoder().decode(l));return e!==null&&typeof e=="object"?e:null}catch{return null}}var R=class{constructor(){this.log=[],this.composite=null,this.compositeUptoSeq=0,this.lastSeq=0,this.seenVeltIds=new Set,this.listeners=new Set,this.snapshotListeners=new Set,this.denied=!1,this.primed=!1,this.primedWaiters=[],this.deliveredSeq=new Map,this.foldUnsafe=!1}ingest(i){try{if(this.denied||i?.type==="removed")return;if(i?.id==="snapshot"){this.resetLog();let r=i.data,s=typeof r?.payloadB64=="string"?ke(r.payloadB64):null;if(s&&s.version===1&&s.editors&&typeof s.editors=="object"){this.composite=s;for(let o of Object.keys(this.composite.editors))this.seenVeltIds.add(o)}else s!==null?(this.foldUnsafe=!0,y.catch("CrdtPortableChannelStore: unrecognized composite snapshot shape \u2014 ignored (folds disabled)",void 0)):typeof r?.payloadB64=="string"&&(this.foldUnsafe=!0);if(this.compositeUptoSeq=Number.isInteger(r?.uptoSeq)?r.uptoSeq:0,this.lastSeq=this.compositeUptoSeq,this.composite)for(let o of this.snapshotListeners)try{o(this.composite,this.compositeUptoSeq)}catch(c){y.catch("Error in CrdtPortableChannelStore snapshot listener: ",c)}return}let l=Number.isInteger(i?.seq)?i.seq:Number(i?.id);if(!Number.isFinite(l)){this.foldUnsafe=!0;return}(this.log.length>0||this.compositeUptoSeq>0)&&l<=this.lastSeq&&(this.resetLog(),this.composite=null,this.compositeUptoSeq=0);let e=i.data?.payloadB64,t=typeof e=="string"?ke(e):null;if(t===null){this.foldUnsafe=!0,y.catch(`CrdtPortableChannelStore: dropping malformed crdt item seq=${l} (folds disabled)`,void 0);return}(typeof t.veltId!="string"||t.veltId.length===0)&&(this.foldUnsafe=!0),this.lastSeq=l,typeof t.veltId=="string"&&t.veltId.length>0&&this.seenVeltIds.add(t.veltId);let n={seq:l,envelope:t};this.log.push(n);for(let r of this.listeners)try{r(n)}catch(s){y.catch("Error in CrdtPortableChannelStore listener: ",s)}}catch(l){y.catch("Error in CrdtPortableChannelStore ingest: ",l)}}markDenied(){this.denied=!0,this.resetLog(),this.composite=null,this.compositeUptoSeq=0,this.markPrimed()}beginEpoch(){this.primed=!1,this.denied=!1}markPrimed(){this.primed=!0;let i=this.primedWaiters;this.primedWaiters=[];for(let l of i)try{l()}catch(e){y.catch("Error in CrdtPortableChannelStore primed waiter: ",e)}}awaitPrimed(){return this.primed?Promise.resolve():new Promise(i=>this.primedWaiters.push(i))}markDelivered(i,l){Number.isFinite(l)&&l>(this.deliveredSeq.get(i)??0)&&this.deliveredSeq.set(i,l)}getFoldUptoSeq(i){return Math.max(this.deliveredSeq.get(i)??0,this.compositeUptoSeq)}listen(i){return this.listeners.add(i),()=>this.listeners.delete(i)}listenSnapshot(i){return this.snapshotListeners.add(i),()=>this.snapshotListeners.delete(i)}entriesFor(i,l){return this.log.filter(e=>e.envelope.veltId===i&&(l===void 0||typeof e.envelope.timestamp!="number"||e.envelope.timestamp>l))}snapshotFor(i){return this.composite?.editors?.[i]??null}getLastSeq(){return this.lastSeq}isSoleEditor(i){return this.foldUnsafe?!1:this.seenVeltIds.size===0?!0:this.seenVeltIds.size===1&&this.seenVeltIds.has(i)}resetLog(){this.log=[]}};function Z(h,i){return{id:h.id,veltId:h.veltId,encryptedData:h.encryptedData,yjsClientId:h.yjsClientId,messageType:h.messageType??null,type:h.type??null,contentKey:h.contentKey??null,source:h.source??"unknown",updatedByUserId:h.updatedByUserId,updatedByVeltUserId:h.updatedByVeltUserId,sessionId:h.sessionId,timestamp:i}}function ee(h,i){return{id:h.id,veltId:h.veltId,encryptedState:h.encryptedState,encryptedVector:h.encryptedVector,type:h.type??null,contentKey:h.contentKey??null,source:h.source??"unknown",updatedByUserId:h.updatedByUserId,updatedByVeltUserId:h.updatedByVeltUserId,sessionId:h.sessionId,timestamp:i}}function te(h,i){return v(this,null,function*(){if(h.encryptedData){let l=yield i(h.encryptedData);if(l==null)return null;h.data=l,delete h.encryptedData}else if(!h.data)return null;return h})}function re(h,i){return v(this,null,function*(){if(h.encryptedData){let l=yield i(h.encryptedData);return l==null?null:{data:l,yjsClientId:h.yjsClientId,timestamp:h.timestamp}}return h.data?{data:h.data,yjsClientId:h.yjsClientId,timestamp:h.timestamp}:null})}var b=(()=>{let i=class i{constructor(e,t,n,r,s,o,c,a,u,d,p){this.adapterSelectorService=e,this.analyticsService=t,this.authService=n,this.commonDbService=r,this.commonDbUtilsService=s,this.configService=o,this.crdtActionsService=c,this.docService=a,this.domService=u,this.loggingService=d,this.serviceBook=p,this.MIN_WEBHOOK_DEBOUNCE_TIME=5*1e3,this.webhookDebounceTime=this.MIN_WEBHOOK_DEBOUNCE_TIME,this.updateDataWebhookTrigger$=new U,this.updateDataWebhookDebounceSubscription=null,this.pendingWebhookEvent=null,this.webhookEnabled$=new oe(!1),this.lastCrdtDataUpdatedId=null,this.MIN_ACTIVITY_DEBOUNCE_TIME=10*1e3,this.activityDebounceTime=600*1e3,this.editorEditTrackers=new Map,this.activityService=null,this.notificationService=null,this.portableCrdtChannels=new Map,this.portableCrdtChannelInvalidator=null;try{this.loggingService.log("%c[WB] Creating CLASS: CrdtService","color: blue;"),this.serviceBook.observe(Se).subscribe(S=>{this.activityService=S}),this.serviceBook.observe(ve).subscribe(S=>{this.notificationService=S}),this.setupUpdateDataWebhookDebounce(),this.docService.addPreDocumentIdChangeFunction("crdt-service",()=>(this.lastCrdtDataUpdatedId=null,Promise.resolve())),this.authService.addPreSignOutFuction("crdt-service",()=>(this.lastCrdtDataUpdatedId=null,Promise.resolve()))}catch(S){this.loggingService.catch("Error in CrdtService constructor: ",S)}}trackCrdtDataUpdated(e){try{if(this.lastCrdtDataUpdatedId===e)return;this.lastCrdtDataUpdatedId=e,this.analyticsService.trackEvent(pe.Events.Crdt.CRDT_DATA_UPDATED,{id:e})}catch(t){this.loggingService.catch("Error in CrdtService trackCrdtDataUpdated: ",t)}}setupUpdateDataWebhookDebounce(){try{this.updateDataWebhookDebounceSubscription&&(this.updateDataWebhookDebounceSubscription.unsubscribe(),this.updateDataWebhookDebounceSubscription=null,this.pendingWebhookEvent=null),this.updateDataWebhookDebounceSubscription=this.updateDataWebhookTrigger$.pipe($(e=>{this.pendingWebhookEvent=e}),q(this.webhookDebounceTime)).subscribe(e=>{this.pendingWebhookEvent=null,this.webhookEnabled$.value&&e&&this.triggerUpdateDataWebhook(e)},e=>{this.loggingService.catch("Error in CrdtService setupUpdateDataWebhookDebounce subscription: ",e)})}catch(e){this.loggingService.catch("Error in CrdtService setupUpdateDataWebhookDebounce: ",e)}}setWebhookDebounceTime(e){try{e<this.MIN_WEBHOOK_DEBOUNCE_TIME&&(this.loggingService.catch("Error in CrdtService setWebhookDebounceTime: Value must be at least "+this.MIN_WEBHOOK_DEBOUNCE_TIME/1e3+" seconds ("+this.MIN_WEBHOOK_DEBOUNCE_TIME+"ms). Using minimum value."),e=this.MIN_WEBHOOK_DEBOUNCE_TIME),this.pendingWebhookEvent&&this.webhookEnabled$.value&&(this.triggerUpdateDataWebhook(this.pendingWebhookEvent),this.pendingWebhookEvent=null),this.webhookDebounceTime=e,this.setupUpdateDataWebhookDebounce()}catch(t){this.loggingService.catch("Error in CrdtService setWebhookDebounceTime: ",t)}}updateData(r){return v(this,arguments,function*({id:e,state:t,data:n}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: updateData","color: green;");let s=this.docService.getDocumentPaths(),o=this.authService.getUser(),c=this.domService.getTabId();if(o?.userId&&s){let a=m(e),u=o.userId,d=m(o.userId),p=new Date().toISOString(),S=null,f=this.configService.getEncryptionProvider();if(f?.encrypt&&typeof f.encrypt=="function")S=yield f.encrypt({data:t});else{let C={};C.customKey=a,S=yield E.encryptData(t,C)}let D={id:e,veltId:a,encryptedState:S,lastUpdate:p,lastUpdatedBy:u,lastUpdatedByVeltUserId:d,sessionId:c},w={methodName:Y.UPDATE_DATA,uniqueId:J(),timestamp:new Date().getTime(),source:G.INTERNAL,payload:{id:e,data:n,lastUpdatedBy:u,sessionId:c,lastUpdate:p}},T=yield this.commonDbService.updateData({feature:"crdtData",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:a,skipFirestore:!0},data:D});return this.crdtActionsService.triggerAction(H.UPDATE_DATA,w),this.trackCrdtDataUpdated(e),this.updateDataWebhookTrigger$.next(w?.payload),this.trackEditForActivity(e),T}return Promise.resolve(null)}catch(s){return this.loggingService.catch("Error in CrdtService updateData: ",s),Promise.resolve(null)}})}triggerUpdateDataWebhook(e){try{this.updateNotificationsDatabase(e,ue.UPDATE_DATA)}catch(t){this.loggingService.catch("Error in CrdtService triggerUpdateDataWebhook: ",t)}}onDataChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onDataChange","color: green;");let n=m(e),r=this.docService.getDocumentPaths$().pipe(N(s=>s?this.commonDbService.dbListener({feature:"crdtData",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:n,skipFirestore:!0}}).pipe(N(o=>v(this,null,function*(){try{if(o?.data){if(o.data.encryptedState){let c=null,a=this.configService.getEncryptionProvider();if(a?.decrypt&&typeof a.decrypt=="function")c=yield a.decrypt({data:o.data.encryptedState});else{let u={};u.customKey=n,c=yield E.decryptData(o.data.encryptedState,u)}o.data.state=c,delete o.data?.encryptedState}return o}else{if(o?.encryptedState){let c=null,a=this.configService.getEncryptionProvider();if(a?.decrypt&&typeof a.decrypt=="function")c=yield a.decrypt({data:o.encryptedState});else{let u={};u.customKey=n,c=yield E.decryptData(o.encryptedState,u)}o.state=c,delete o?.encryptedState}return o}}catch(c){return this.loggingService.catch("Error in CrdtService onDataChange subscription: ",c),null}}))):P(null))).subscribe(s=>{s&&(s.data?t(s.data):t(s))});return()=>r.unsubscribe()}catch(n){return this.loggingService.catch("Error in CrdtService onDataChange: ",n),()=>{}}}getData(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getData","color: green;");let n=this.docService.getDocumentPaths();if(n){let r=m(e),s=yield this.commonDbService.getData({feature:"crdtData",properties:{documentId:n?.documentId??"",organizationId:n?.organizationId??"",id:r,skipFirestore:!0}});if(s?.encryptedState){let o=null,c=this.configService.getEncryptionProvider();if(c?.decrypt&&typeof c.decrypt=="function")o=yield c.decrypt({data:s.encryptedState});else{let a={};a.customKey=r,o=yield E.decryptData(s.encryptedState,a)}s.state=o,delete s?.encryptedState}return s}return Promise.resolve(null)}catch(n){return this.loggingService.catch("Error in CrdtService getData: ",n),Promise.resolve(null)}})}onStateChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onStateChange","color: green;");let n=m(e),r=this.docService.getDocumentPaths$().pipe(N(s=>s?this.commonDbService.dbListener({feature:"crdtSyncState",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:n,skipFirestore:!0}}).pipe(N(o=>v(this,null,function*(){try{if(o?.data){if(o.data.encryptedState){let c=null,a=this.configService.getEncryptionProvider();if(a?.decrypt&&typeof a.decrypt=="function")c=yield a.decrypt({data:o.data.encryptedState});else{let u={};u.customKey=n,c=yield E.decryptData(o.data.encryptedState,u)}o.data.state=c,delete o.data?.encryptedState}return o}else{if(o?.encryptedState){let c=null,a=this.configService.getEncryptionProvider();if(a?.decrypt&&typeof a.decrypt=="function")c=yield a.decrypt({data:o.encryptedState});else{let u={};u.customKey=n,c=yield E.decryptData(o.encryptedState,u)}o.state=c,delete o?.encryptedState}return o}}catch(c){return this.loggingService.catch("Error in CrdtService onStateChange subscription: ",c),null}}))):P(null))).subscribe(s=>{s&&(s.data?t(s.data):t(s))});return()=>r.unsubscribe()}catch(n){return this.loggingService.catch("Error in CrdtService onStateChange: ",n),()=>{}}}updateState(n){return v(this,arguments,function*({id:e,state:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: updateState","color: green;");let r=this.docService.getDocumentPaths(),s=this.authService.getUser(),o=this.domService.getTabId();if(s?.userId&&r){let c=m(e),a=s.userId,u=m(a),d=null,p=this.configService.getEncryptionProvider();if(p?.encrypt&&typeof p.encrypt=="function")d=yield p.encrypt({data:t});else{let S={};S.customKey=c,d=yield E.encryptData(t,S)}return this.commonDbService.setData({feature:"crdtSyncState",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:c,skipFirestore:!0},data:{id:e,veltId:c,encryptedState:d,lastUpdate:new Date().toISOString(),lastUpdatedBy:a,lastUpdatedByVeltUserId:u,sessionId:o}})}return Promise.resolve(null)}catch(r){return this.loggingService.catch("Error in CrdtService updateState: ",r),Promise.resolve(null)}})}registerSyncUser(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: registerSyncUser","color: green;");let n=this.authService.getUser(),r=this.docService.getDocumentPaths(),s=this.configService.getApiKey(),o=m(e),c=this.domService.getTabId();if(n?.userId&&r&&s){let a=n.userId,u=m(a),d={documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:o,userId:u,apiKey:s,skipFirestore:!0},p={userId:a,veltUserId:u,status:"online",lastSeen:Date.now(),sessionId:c};yield this.commonDbService.setData({feature:"crdtSyncPresence",properties:d,data:p});let S=this.commonDbUtilsService.getDocumentPath({feature:"crdtSyncPresence",properties:d,defaultDocumentPaths:r,apiKey:s});S&&(yield this.commonDbService.setupOnDisconnect(S,{status:"offline",lastSeen:new Date().getTime(),sessionId:c},"crdtSyncPresence",d))}}catch(n){this.loggingService.catch("Error in CrdtService registerSyncUser: ",n)}})}onRegisteredUserChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onRegisteredUserChange","color: green;");let n=m(e);return this.subscribeCrdtRosterFeed("allCrdtSyncPresence","onRegisteredUserChange",n,t)}catch(n){return this.loggingService.catch("Error in CrdtService onRegisteredUserChange: ",n),()=>{}}}subscribeCrdtRosterFeed(e,t,n,r){let s=new ne(c=>K(()=>c.next(null))),o=se([this.docService.getDocumentPaths$(),ce(P(null),s)]).pipe(N(([c])=>c?this.commonDbService.dbListener({feature:e,properties:{documentId:c?.documentId??"",organizationId:c?.organizationId??"",id:n,skipFirestore:!0}}).pipe($(a=>{try{a?.data?r(a.data):r(a)}catch(u){this.loggingService.catch(`Error in CrdtService ${t} subscription: `,u)}})):P(null))).subscribe(()=>{});return()=>o.unsubscribe()}setPresence(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: setPresence","color: green;");let n=this.authService.getUser(),r=this.docService.getDocumentPaths(),s=this.configService.getApiKey(),o=m(e),c=this.domService.getTabId();if(n?.userId&&r&&s){let a=n.userId,u=m(a),d={documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:o,userId:u,apiKey:s,skipFirestore:!0},p={userId:a,veltUserId:u,status:"online",lastSeen:Date.now(),sessionId:c};yield this.commonDbService.setData({feature:"crdtPresence",properties:d,data:p});let S=this.commonDbUtilsService.getDocumentPath({feature:"crdtPresence",properties:d,defaultDocumentPaths:r,apiKey:s});S&&(yield this.commonDbService.setupOnDisconnect(S,{status:"offline",lastSeen:new Date().getTime(),sessionId:c},"crdtPresence",d))}}catch(n){this.loggingService.catch("Error in CrdtService setPresence: ",n)}})}onPresenceChange({id:e,callback:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onPresenceChange","color: green;");let n=m(e);return this.subscribeCrdtRosterFeed("allCrdtPresence","onPresenceChange",n,t)}catch(n){return this.loggingService.catch("Error in CrdtService onPresenceChange: ",n),()=>{}}}saveVersion(s){return v(this,arguments,function*({id:e,versionId:t,versionName:n,state:r}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: saveVersion","color: green;");let o=this.docService.getDocumentPaths();if(o){let c=m(e),a="",u=this.configService.getEncryptionProvider();if(u?.encrypt&&typeof u.encrypt=="function")a=yield u.encrypt({data:r});else{let p={};p.customKey=c,a=yield E.encryptData(r,p)}let d={versionId:t,versionName:n,encryptedState:a,timestamp:new Date().getTime()};return this.commonDbService.setData({feature:"crdtVersion",properties:{documentId:o?.documentId??"",organizationId:o?.organizationId??"",id:c,versionId:t,skipFirestore:!0},data:W({id:e},d)})}return Promise.resolve(null)}catch(o){return this.loggingService.catch("Error in CrdtService saveVersion: ",o),Promise.resolve(null)}})}getVersion(n){return v(this,arguments,function*({id:e,versionId:t}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getVersion","color: green;");let r=this.docService.getDocumentPaths();if(r){let s=m(e),o=yield this.commonDbService.getData({feature:"crdtVersion",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,versionId:t,skipFirestore:!0}});if(o?.encryptedState){let c=null,a=this.configService.getEncryptionProvider();if(a?.decrypt&&typeof a.decrypt=="function")c=yield a.decrypt({data:o.encryptedState});else{let u={};u.customKey=s,c=yield E.decryptData(o.encryptedState,u)}o.state=c,delete o.encryptedState}return o}return Promise.resolve(null)}catch(r){return this.loggingService.catch("Error in CrdtService getVersion: ",r),Promise.resolve(null)}})}getVersions(t){return v(this,arguments,function*({id:e}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getVersions","color: green;");let n=this.docService.getDocumentPaths();if(n){let r=m(e),s=yield this.commonDbService.getData({feature:"crdtVersions",properties:{documentId:n?.documentId??"",organizationId:n?.organizationId??"",id:r,skipFirestore:!0}}),o=null;if(s){o=[];for(let c of Object.values(s))if(c?.encryptedState){let a=null,u=this.configService.getEncryptionProvider();if(u?.decrypt&&typeof u.decrypt=="function")a=yield u.decrypt({data:c.encryptedState});else{let p={};p.customKey=r,a=yield E.decryptData(c.encryptedState,p)}let d=ie(W({},c),{state:a});delete d?.encryptedState,o.push(d)}else o.push(c)}return o}return Promise.resolve(null)}catch(n){return this.loggingService.catch("Error in CrdtService getVersions: ",n),Promise.resolve(null)}})}encryptCrdtData(e,t){return v(this,null,function*(){try{let n=this.configService.getEncryptionProvider();if(n?.encrypt&&typeof n.encrypt=="function")return yield n.encrypt({data:e});let r={};return r.customKey=t,yield E.encryptData(e,r)}catch(n){return this.loggingService.catch("Error in CrdtService encryptCrdtData: ",n),null}})}decryptCrdtData(e,t){return v(this,null,function*(){try{let n=this.configService.getEncryptionProvider();if(n?.decrypt&&typeof n.decrypt=="function")return yield n.decrypt({data:e});let r={};return r.customKey=t,yield E.decryptData(e,r)}catch(n){return this.loggingService.catch("Error in CrdtService decryptCrdtData: ",n),null}})}isPortableCrdtActive(){try{return this.adapterSelectorService.isPortableBackendActive()}catch(e){return this.loggingService.catch("Error in CrdtService isPortableCrdtActive: ",e),!1}}shouldAwaitPortableActivation(){try{return this.adapterSelectorService.isPortableBackendPending()===!0}catch(e){return this.loggingService.catch("Error in CrdtService shouldAwaitPortableActivation: ",e),!1}}buildPortableCrdtChannelKey(){try{let e=this.docService.getDocumentPaths(),t=this.configService.getApiKey();return!e?.documentId||!t?null:{scope:"doc",feature:"crdt",apiKey:t,organizationId:e.organizationId!=null&&e.organizationId!==""?String(e.organizationId):void 0,documentId:String(e.documentId)}}catch(e){return this.loggingService.catch("Error in CrdtService buildPortableCrdtChannelKey: ",e),null}}ensurePortableCrdtChannel(){try{let e=this.buildPortableCrdtChannelKey();if(!e)return null;this.portableCrdtChannelInvalidator||(this.portableCrdtChannelInvalidator=K(()=>this.resubscribePortableCrdtChannels()));let t=`${e.apiKey}:${e.organizationId??""}:${e.documentId}`,n=this.portableCrdtChannels.get(t);if(n)return n.store;let r=new R,s=M("crdt")?.mode??"persistent",o=this.adapterSelectorService.resolveRealtimeAdapter().subscribe(e,s,c=>r.ingest(c),{onError:()=>r.markDenied(),onSnapshotComplete:()=>r.markPrimed()});return this.portableCrdtChannels.set(t,{store:r,sub:o,key:e}),r}catch(e){return this.loggingService.catch("Error in CrdtService ensurePortableCrdtChannel: ",e),null}}resubscribePortableCrdtChannels(){try{let e=M("crdt")?.mode??"persistent";for(let[t,n]of Array.from(this.portableCrdtChannels.entries())){try{n.sub?.unsubscribe()}catch(r){this.loggingService.catch("Error unsubscribing a portable CRDT channel: ",r)}try{n.store.beginEpoch(),n.sub=this.adapterSelectorService.resolveRealtimeAdapter().subscribe(n.key,e,r=>n.store.ingest(r),{onError:()=>n.store.markDenied(),onSnapshotComplete:()=>n.store.markPrimed()})}catch(r){this.loggingService.catch("Error re-subscribing a portable CRDT channel: ",r),n.sub=null}}}catch(e){this.loggingService.catch("Error in CrdtService resubscribePortableCrdtChannels: ",e)}}getPortableServerTimestamp(){return v(this,null,function*(){try{let e=yield this.adapterSelectorService.resolveRealtimeAdapter().getServerTimeOffset();return Date.now()+(e??0)}catch(e){return this.loggingService.catch("Error in CrdtService getPortableServerTimestamp: ",e),Date.now()}})}decryptSnapshotRecord(e,t){return v(this,null,function*(){if(e?.encryptedState){let n=yield this.decryptCrdtData(e.encryptedState,t);if(n==null)return null;e.state=n,delete e?.encryptedState}if(e?.encryptedVector){let n=yield this.decryptCrdtData(e.encryptedVector,t);if(n==null)return null;e.vector=n,delete e?.encryptedVector}return e})}pushMessage(u){return v(this,arguments,function*({id:e,data:t,yjsClientId:n,messageType:r,eventData:s,type:o,contentKey:c,source:a}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: pushMessage","color: green;");let d=this.docService.getDocumentPaths(),p=this.authService.getUser();if(p?.userId&&d){let S=m(e),f=yield this.encryptCrdtData(t,S);if(f==null)return;let D=p.userId,w=m(p.userId),T=this.domService.getTabId(),C={id:e,veltId:S,encryptedData:f,yjsClientId:n,messageType:r,type:o,contentKey:c,source:a,updatedByUserId:D,updatedByVeltUserId:w,sessionId:T};if(this.isPortableCrdtActive()){let k=this.buildPortableCrdtChannelKey(),A=Z(C,yield this.getPortableServerTimestamp()),B=k?X(A):null;if(!k||B===null)return;let L=M("crdt")?.mode??"persistent",F=yield this.adapterSelectorService.resolveRealtimeAdapter().publish(k,L,{payloadB64:B});if(!F.ok){console.error("Velt [portable backend]: crdt update dropped: ",F);return}}else yield this.commonDbService.pushData({feature:"crdtMessages",properties:{documentId:d?.documentId??"",organizationId:d?.organizationId??"",id:S,skipFirestore:!0},data:Z(C,this.commonDbService.getServerTimestamp())});if(r==="sync"){let k=new Date().toISOString(),A={methodName:Y.UPDATE_DATA,uniqueId:J(),timestamp:new Date().getTime(),source:G.INTERNAL,payload:{id:e,data:s,lastUpdatedBy:D,sessionId:T,lastUpdate:k}};this.crdtActionsService.triggerAction(H.UPDATE_DATA,A),this.trackCrdtDataUpdated(e),this.updateDataWebhookTrigger$.next(A?.payload),this.trackEditForActivity(e)}}}catch(d){this.loggingService.catch("Error in CrdtService pushMessage: ",d)}})}onMessage(e){return this.bindOnMessageInternal(e)}bindOnMessageInternal({id:e,callback:t,afterTs:n}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: onMessage","color: green;");let r=m(e);if(this.isPortableCrdtActive())return this.subscribePortableCrdtMessages(r,t,n);let s=!1,o=this.subscribeFirebaseCrdtMessages(r,t,n),c=null;return c=K(()=>{try{if(s||!this.isPortableCrdtActive())return;c?.(),c=null,o(),o=this.subscribePortableCrdtMessages(r,t,n)}catch(a){this.loggingService.catch("Error rebinding CrdtService onMessage to the portable channel: ",a)}}),()=>{s=!0;try{c?.(),c=null}finally{o()}}}catch(r){return this.loggingService.catch("Error in CrdtService onMessage: ",r),()=>{}}}subscribePortableCrdtMessages(e,t,n){let r=this.ensurePortableCrdtChannel();if(!r)return()=>{};let s=new U,o=s.pipe(x(S=>v(this,[S],function*({message:d,seq:p}){try{let f=yield te(d,D=>this.decryptCrdtData(D,e));return f?{message:f,seq:p}:null}catch(f){return this.loggingService.catch("Error in CrdtService onMessage decryption: ",f),null}})),O(d=>!!d)).subscribe(({message:d,seq:p})=>{try{t(d),r.markDelivered(e,p)}catch(S){this.loggingService.catch("Error in CrdtService onMessage subscription: ",S)}}),c=d=>{d.envelope.veltId===e&&(n!=null&&typeof d.envelope.timestamp=="number"&&d.envelope.timestamp<=n||s.next({message:W({},d.envelope),seq:d.seq}))};for(let d of r.entriesFor(e,n??void 0))c(d);let a=r.listen(c),u=r.listenSnapshot(d=>{let p=d.editors?.[e];p&&p.encryptedState&&s.next({message:{veltId:e,encryptedData:p.encryptedState,yjsClientId:p.yjsClientId??null,messageType:"sync",sessionId:p.sessionId,timestamp:p.timestamp},seq:0})});return()=>{a(),u(),o.unsubscribe()}}subscribeFirebaseCrdtMessages(e,t,n){let r=this.docService.getDocumentPaths$().pipe(N(s=>s?this.commonDbService.streamChildAdded({feature:"crdtMessages",properties:{documentId:s?.documentId??"",organizationId:s?.organizationId??"",id:e,skipFirestore:!0},afterTs:n}):P(null))).pipe(O(s=>!!s),x(s=>v(this,null,function*(){try{return yield te(s,o=>this.decryptCrdtData(o,e))}catch(o){return this.loggingService.catch("Error in CrdtService onMessage decryption: ",o),null}})),O(s=>!!s)).subscribe(s=>{try{t(s)}catch(o){this.loggingService.catch("Error in CrdtService onMessage subscription: ",o)}});return()=>r.unsubscribe()}getMessages(n){return v(this,arguments,function*({id:e,afterTs:t}){try{if(this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getMessages","color: green;"),this.shouldAwaitPortableActivation()&&(yield Q(i.PORTABLE_ACTIVATION_WAIT_MS)),this.isPortableCrdtActive()){let s=m(e),o=this.ensurePortableCrdtChannel();if(!o)return[];yield o.awaitPrimed();let c=[],a=0;for(let u of o.entriesFor(s,t??void 0)){let d=yield re(u.envelope,p=>this.decryptCrdtData(p,s));d&&(c.push(d),a=Math.max(a,u.seq))}return a>0&&o.markDelivered(s,a),c.sort((u,d)=>u.timestamp-d.timestamp),c}let r=this.docService.getDocumentPaths();if(r){let s=m(e),o=yield this.commonDbService.getData({feature:"crdtMessages",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,skipFirestore:!0}});if(!o||typeof o!="object"||o?.errorCode)return[];let c=[];for(let a of Object.keys(o)){let u=o[a];if(!u||typeof u!="object"||t!=null&&u.timestamp!=null&&u.timestamp<=t)continue;let d=yield re(u,p=>this.decryptCrdtData(p,s));d&&c.push(d)}return c.sort((a,u)=>a.timestamp-u.timestamp),c}return[]}catch(r){return this.loggingService.catch("Error in CrdtService getMessages: ",r),[]}})}getSnapshot(t){return v(this,arguments,function*({id:e}){try{if(this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: getSnapshot","color: green;"),this.shouldAwaitPortableActivation()&&(yield Q(i.PORTABLE_ACTIVATION_WAIT_MS)),this.isPortableCrdtActive()){let r=m(e),s=this.ensurePortableCrdtChannel();if(!s)return null;yield s.awaitPrimed();let o=s.snapshotFor(r);return!o||Object.keys(o).length===0?null:yield this.decryptSnapshotRecord(W({},o),r)}let n=this.docService.getDocumentPaths();if(n){let r=m(e),s=yield this.commonDbService.getData({feature:"crdtSnapshot",properties:{documentId:n?.documentId??"",organizationId:n?.organizationId??"",id:r,skipFirestore:!0}});return!s||typeof s!="object"||Object.keys(s).length===0||s?.errorCode?null:yield this.decryptSnapshotRecord(s,r)}return Promise.resolve(null)}catch(n){return this.loggingService.catch("Error in CrdtService getSnapshot: ",n),Promise.resolve(null)}})}saveSnapshot(c){return v(this,arguments,function*({id:e,state:t,vector:n,type:r,contentKey:s,source:o}){try{this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: saveSnapshot","color: green;");let a=this.docService.getDocumentPaths(),u=this.authService.getUser();if(u?.userId&&a){let d=m(e),p=yield this.encryptCrdtData(t,d),S=yield this.encryptCrdtData(n,d);if(p==null||S==null)return;let f=u.userId,D=m(u.userId),w=this.domService.getTabId(),T={id:e,veltId:d,encryptedState:p,encryptedVector:S,type:r,contentKey:s,source:o,updatedByUserId:f,updatedByVeltUserId:D,sessionId:w};if(this.isPortableCrdtActive()){let C=this.ensurePortableCrdtChannel(),k=this.buildPortableCrdtChannelKey();if(!C||!k)return;if(yield C.awaitPrimed(),!C.isSoleEditor(d)){this.loggingService.log("Velt [portable backend]: crdt snapshot fold skipped \u2014 multi-editor channel (v1 limitation; log replay stays authoritative)");return}let A=ee(T,yield this.getPortableServerTimestamp()),B=X({version:1,editors:{[d]:A}});if(B===null)return;let L=M("crdt")?.mode??"persistent",F=yield this.adapterSelectorService.resolveRealtimeAdapter().publish(k,L,{payloadB64:B,uptoSeq:C.getFoldUptoSeq(d)});F.ok||this.loggingService.catch("Velt [portable backend]: crdt snapshot fold rejected (log NOT trimmed; feed unaffected): ",F);return}yield this.commonDbService.setData({feature:"crdtSnapshot",properties:{documentId:a?.documentId??"",organizationId:a?.organizationId??"",id:d,skipFirestore:!0},data:ee(T,this.commonDbService.getServerTimestamp())})}}catch(a){this.loggingService.catch("Error in CrdtService saveSnapshot: ",a)}})}pruneMessages(n){return v(this,arguments,function*({id:e,beforeTs:t}){try{if(this.loggingService.log("%c[WB] Calling CrdtService FUNCTION: pruneMessages","color: green;"),this.isPortableCrdtActive()){this.loggingService.log("Velt [portable backend]: pruneMessages is a no-op (writeCrdtSnapshot folds own the trim)");return}let r=this.docService.getDocumentPaths();if(r){let s=m(e),o=yield this.commonDbService.getData({feature:"crdtMessages",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,skipFirestore:!0}});if(o&&typeof o=="object"&&!o?.errorCode){let c=[];for(let a of Object.keys(o)){let u=o[a];u?.timestamp!=null&&u.timestamp<t&&c.push(this.commonDbService.deleteData({feature:"crdtMessage",properties:{documentId:r?.documentId??"",organizationId:r?.organizationId??"",id:s,messageId:a,skipFirestore:!0}}))}yield Promise.all(c)}}}catch(r){this.loggingService.catch("Error in CrdtService pruneMessages: ",r)}})}updateNotificationsDatabase(e,t,n={}){try{let r=W({crdtData:e,actionType:t,notificationSource:"crdt"},n);this.notificationService?.updateNotificationDatabase(r)}catch(r){this.loggingService.catch("Error in CrdtService updateNotificationsDatabase: ",r)}}enableWebhook(){try{if(this.webhookEnabled$.value===!0)return;this.webhookEnabled$.next(!0)}catch(e){this.loggingService.catch("Error in CrdtService enableWebhook: ",e)}}disableWebhook(){try{if(this.webhookEnabled$.value===!1)return;this.webhookEnabled$.next(!1)}catch(e){this.loggingService.catch("Error in CrdtService disableWebhook: ",e)}}trackEditForActivity(e){try{let t=this.editorEditTrackers.get(e);if(!t){let n=new U,r=n.pipe(q(this.activityDebounceTime)).subscribe(()=>{this.flushEditorActivity(e)});t={count:0,subject$:n,subscription:r},this.editorEditTrackers.set(e,t)}t.count++,t.subject$.next()}catch(t){this.loggingService.catch("Error in CrdtService trackEditForActivity: ",t)}}flushEditorActivity(e){try{let t=this.editorEditTrackers.get(e);if(!t||t.count===0)return;let n=t.count;t.count=0;let r={featureType:"crdt",actionType:ge.EDITOR_EDIT,targetEntityId:e,entityData:{editCount:n}};this.activityService?.createActivity(r)}catch(t){this.loggingService.catch("Error in CrdtService flushEditorActivity: ",t)}}setActivityDebounceTime(e){try{e<this.MIN_ACTIVITY_DEBOUNCE_TIME&&(this.loggingService.catch("Error in CrdtService setActivityDebounceTime: Value must be at least "+this.MIN_ACTIVITY_DEBOUNCE_TIME/1e3+" seconds ("+this.MIN_ACTIVITY_DEBOUNCE_TIME+"ms). Using minimum value."),e=this.MIN_ACTIVITY_DEBOUNCE_TIME),this.flushAllEditorActivities(),this.activityDebounceTime=e}catch(t){this.loggingService.catch("Error in CrdtService setActivityDebounceTime: ",t)}}flushAllEditorActivities(){try{for(let[e,t]of this.editorEditTrackers)t.count>0&&this.flushEditorActivity(e),t.subject$.complete(),t.subscription.unsubscribe();this.editorEditTrackers.clear()}catch(e){this.loggingService.catch("Error in CrdtService flushAllEditorActivities: ",e)}}};i.PORTABLE_ACTIVATION_WAIT_MS=1e4,i.\u0275fac=function(t){return new(t||i)(I(fe),I(me),I(Ie),I(Pe),I(Ee),I(be),I(j),I(De),I(Ce),I(g),I(V))},i.\u0275prov=_({token:i,factory:i.\u0275fac,providedIn:"root"});let h=i;return h})();var z=class extends Te{constructor(i){super(i),this.getService(g).log("%c[WB] Creating CLASS: CrdtElement","color: blue;"),this.updateData=this._updateData,this.onDataChange=this._onDataChange,this.getData=this._getData,this.onStateChange=this._onStateChange,this.updateState=this._updateState,this.registerSyncUser=this._registerSyncUser,this.onRegisteredUserChange=this._onRegisteredUserChange,this.setPresence=this._setPresence,this.onPresenceChange=this._onPresenceChange,this.saveVersion=this._saveVersion,this.getVersion=this._getVersion,this.getVersions=this._getVersions,this.pushMessage=this._pushMessage,this.onMessage=this._onMessage,this.getMessages=this._getMessages,this.getSnapshot=this._getSnapshot,this.saveSnapshot=this._saveSnapshot,this.pruneMessages=this._pruneMessages,this.enableWebhook=this._enableWebhook,this.disableWebhook=this._disableWebhook,this.setWebhookDebounceTime=this._setWebhookDebounceTime,this.setActivityDebounceTime=this._setActivityDebounceTime,this.on=this._on}_updateData(i){this.getService(g).log("%c[WB] Calling FUNCTION: updateData","color: green;");try{return this.getService(b).updateData(i)}catch(l){return this.getService(g).catch("Error in updateData: ",l),Promise.resolve(null)}}_onDataChange(i){this.getService(g).log("%c[WB] Calling FUNCTION: onDataChange","color: green;");try{return this.getService(b).onDataChange(i)}catch(l){return this.getService(g).catch("Error in onDataChange: ",l),()=>{}}}_getData(i){this.getService(g).log("%c[WB] Calling FUNCTION: getData","color: green;");try{return this.getService(b).getData(i)}catch(l){return this.getService(g).catch("Error in getData: ",l),Promise.resolve(null)}}_onStateChange(i){this.getService(g).log("%c[WB] Calling FUNCTION: onStateChange","color: green;");try{return this.getService(b).onStateChange(i)}catch(l){return this.getService(g).catch("Error in onStateChange: ",l),()=>{}}}_updateState(i){this.getService(g).log("%c[WB] Calling FUNCTION: updateState","color: green;");try{return this.getService(b).updateState(i)}catch(l){return this.getService(g).catch("Error in updateState: ",l),Promise.resolve(null)}}_registerSyncUser(i){this.getService(g).log("%c[WB] Calling FUNCTION: registerSyncUser","color: green;");try{return this.getService(b).registerSyncUser(i)}catch(l){return this.getService(g).catch("Error in registerSyncUser: ",l),Promise.resolve()}}_onRegisteredUserChange(i){this.getService(g).log("%c[WB] Calling FUNCTION: onRegisteredUserChange","color: green;");try{return this.getService(b).onRegisteredUserChange(i)}catch(l){return this.getService(g).catch("Error in onRegisteredUserChange: ",l),()=>{}}}_setPresence(i){this.getService(g).log("%c[WB] Calling FUNCTION: setPresence","color: green;");try{return this.getService(b).setPresence(i)}catch(l){return this.getService(g).catch("Error in setPresence: ",l),Promise.resolve()}}_onPresenceChange(i){this.getService(g).log("%c[WB] Calling FUNCTION: onPresenceChange","color: green;");try{return this.getService(b).onPresenceChange(i)}catch(l){return this.getService(g).catch("Error in onPresenceChange: ",l),()=>{}}}_saveVersion(i){this.getService(g).log("%c[WB] Calling FUNCTION: saveVersion","color: green;");try{return this.getService(b).saveVersion(i)}catch(l){return this.getService(g).catch("Error in saveVersion: ",l),Promise.resolve(null)}}_getVersion(i){this.getService(g).log("%c[WB] Calling FUNCTION: getVersion","color: green;");try{return this.getService(b).getVersion(i)}catch(l){return this.getService(g).catch("Error in getVersion: ",l),Promise.resolve(null)}}_getVersions(i){this.getService(g).log("%c[WB] Calling FUNCTION: getVersions","color: green;");try{return this.getService(b).getVersions(i)}catch(l){return this.getService(g).catch("Error in getVersions: ",l),Promise.resolve(null)}}_pushMessage(i){this.getService(g).log("%c[WB] Calling FUNCTION: pushMessage","color: green;");try{return this.getService(b).pushMessage(i)}catch(l){return this.getService(g).catch("Error in pushMessage: ",l),Promise.resolve()}}_onMessage(i){this.getService(g).log("%c[WB] Calling FUNCTION: onMessage","color: green;");try{return this.getService(b).onMessage(i)}catch(l){return this.getService(g).catch("Error in onMessage: ",l),()=>{}}}_getMessages(i){this.getService(g).log("%c[WB] Calling FUNCTION: getMessages","color: green;");try{return this.getService(b).getMessages(i)}catch(l){return this.getService(g).catch("Error in getMessages: ",l),Promise.resolve([])}}_getSnapshot(i){this.getService(g).log("%c[WB] Calling FUNCTION: getSnapshot","color: green;");try{return this.getService(b).getSnapshot(i)}catch(l){return this.getService(g).catch("Error in getSnapshot: ",l),Promise.resolve(null)}}_saveSnapshot(i){this.getService(g).log("%c[WB] Calling FUNCTION: saveSnapshot","color: green;");try{return this.getService(b).saveSnapshot(i)}catch(l){return this.getService(g).catch("Error in saveSnapshot: ",l),Promise.resolve()}}_pruneMessages(i){this.getService(g).log("%c[WB] Calling FUNCTION: pruneMessages","color: green;");try{return this.getService(b).pruneMessages(i)}catch(l){return this.getService(g).catch("Error in pruneMessages: ",l),Promise.resolve()}}_enableWebhook(){this.getService(g).log("%c[WB] Calling FUNCTION: enableWebhook","color: green;");try{return this.getService(b).enableWebhook()}catch(i){this.getService(g).catch("Error in enableWebhook: ",i);return}}_disableWebhook(){this.getService(g).log("%c[WB] Calling FUNCTION: disableWebhook","color: green;");try{return this.getService(b).disableWebhook()}catch(i){this.getService(g).catch("Error in disableWebhook: ",i);return}}_setWebhookDebounceTime(i){this.getService(g).log("%c[WB] Calling FUNCTION: setWebhookDebounceTime","color: green;");try{!isNaN(i)&&i>0?this.getService(b).setWebhookDebounceTime(i):this.getService(g).catch("Error in setWebhookDebounceTime: ","Provided value must be a positive number greater than zero.")}catch(l){this.getService(g).catch("Error in setWebhookDebounceTime: ",l)}}_setActivityDebounceTime(i){this.getService(g).log("%c[WB] Calling FUNCTION: setActivityDebounceTime","color: green;");try{!isNaN(i)&&i>=1e4?this.getService(b).setActivityDebounceTime(i):this.getService(g).catch("Error in setActivityDebounceTime: ","Provided value must be a number >= 10000ms (10 seconds).")}catch(l){this.getService(g).catch("Error in setActivityDebounceTime: ",l)}}_on(i){this.getService(g).log("%c[WB] Calling FUNCTION: on","color: green;");try{return this.getService(j).onAction(i)}catch(l){return this.getService(g).catch("Error in on: ",l),P(null)}}};var Ue=(()=>{let i=class i{};i.\u0275fac=function(t){return new(t||i)},i.\u0275mod=le({type:i}),i.\u0275inj=ae({imports:[he]});let h=i;return h})();function We(h){return h.get(g).log("%c[WB] Loading CRDT feature chunk","color: blue;"),h.get(V).set(ye,h.get(b)),de(Ue,h),new z(h)}export{We as default};
|