harperdb 4.6.19 → 4.6.20

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.
@@ -14,7 +14,7 @@
14
14
  `,t)}var yl,kH,Pg,uh,dN,fN,dh,GH,Wr,Cg,qH,Og,$H,VH,KH,YH,MH,vH,wg,jH,Lse,Dse,xH,BH,JH,FH,HH,vse,ZH,Ga,Use,zi=ue(()=>{yl=require("worker_threads"),kH=w(rt());De();Pg=w(Q()),uh=require("path"),dN=require("fs/promises"),fN=w(In()),dh=w(oe());k();Mr();GH=w(require("node:fs"));lN();uN();Wr=(0,Pg.forComponent)("analytics").conditional;(0,dh.initSync)();Cg=new Map,qH=(0,dh.get)(U.ANALYTICS_AGGREGATEPERIOD)>-1;o(Ise,"setAnalyticsEnabled");o(Nse,"recordExistingAction");o(wse,"recordNewAction");o(st,"recordAction");Le.recordAnalytics=st;o(zr,"recordActionBinary");Og=0,$H=1e3,VH="analytics-report",KH=[];o(fh,"addAnalyticsListener");YH=[.01,.1,.25,.5,.75,.9,.95,.99,.999,1];o(Ose,"sendAnalytics");o(mN,"recordHostname");o(td,"storeMetric");o(WH,"calculateCPUUtilization");o(zH,"diffResourceUsage");o(Cse,"storeTableSizeMetrics");o(LH,"storeDBSizeMetrics");o(DH,"storeVolumeMetrics");o(Pse,"aggregation");MH=0,vH=0,wg={userCPUTime:0,systemCPUTime:0},jH=o(()=>new Promise(setImmediate),"rest");o(UH,"cleanup");Lse=36e5,Dse=31536e6;o(hN,"getRawAnalyticsTable");o(QH,"getAnalyticsTable");(0,kH.setChildListenerByType)(VH,XH);o(Mse,"startScheduledTasks");FH=0,HH=new Map,vse=!1;o(XH,"recordAnalytics");Use=1e6;o(xse,"logAnalytics")});function mh(e,t,r,n){if(e.append)e.append(t,r,n);else if(e.set){let s=e.get(t);if(s)if(n)r=(typeof s=="string"?s:s.join(", "))+", "+r;else if(typeof s=="string")r=[s,r];else{s.push(r);return}return e.set(t,r)}else e[t]=(e[t]?e[t]+", ":"")+r}function ek(e,t){(typeof e.set!="function"||typeof e.has!="function")&&(e=new Cs(e));for(let[r,n]of t)e.has(r)?r.toLowerCase()==="set-cookie"&&e.append?.(r,n,!0):e.set(r,n);return e}var Cs,hh=ue(()=>{Cs=class extends Map{static{o(this,"Headers")}constructor(t){if(t)if(t[Symbol.iterator])super(t);else{super();for(let r in t)this.set(r,t[r])}else super()}set(t,r){return typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r),super.set(t.toLowerCase(),[t,r])}get(t){return typeof t!="string"&&(t=""+t),super.get(t.toLowerCase())?.[1]}has(t){return typeof t!="string"&&(t=""+t),super.has(t.toLowerCase())}setIfNone(t,r){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let n=t.toLowerCase();if(!super.has(n))return super.set(n,[t,r])}append(t,r,n){typeof t!="string"&&(t=""+t),typeof r!="string"&&(r=""+r);let s=t.toLowerCase(),i=super.get(s);if(i){let a=i[1];if(n)r=(typeof a=="string"?a:a.join(", "))+", "+r;else if(typeof a=="string")r=[a,r];else{a.push(r);return}}return super.set(s,[t,r])}[Symbol.iterator](){return super.values()[Symbol.iterator]()}};o(mh,"appendHeader");o(ek,"mergeHeaders")});function Dg(e,t,r=Fse){let n;return function(...i){return n?n.length*pN>r?t(...i):new Promise((a,c)=>{n.push({args:i,fn(){try{let l=e(...i);a(l)}catch(l){c(l)}}})}):(n=[],s(performance.now(),i),e(...i))};function s(i,a){setImmediate(()=>{let c=performance.now();pN=(pN*4+c-i)/5;let l=n.shift();if(l){let{args:u,fn:d}=l;d(),s(c,u)}else n=null})}}var nk,Bse,Fse,tk,Hse,EN,rk,pN,_N=ue(()=>{nk=w(ri()),Bse=3e3,Fse=2e4,tk=0,Hse=3e4,EN=3e3,rk=performance.now()+EN,pN=0;o(Dg,"throttle");setInterval(()=>{let e=performance.now();e-rk-EN>Bse&&tk+Hse<e&&(nk.default.warn?.("JavaScript execution has taken too long and is not allowing proper event queue cycling, consider using 'await new Promise(setImmediate)' in code that will execute for a long duration"),tk=e),rk=e},EN).unref()});var mk={};Oe(mk,{EVICTED:()=>tl,INVALIDATED:()=>On,coerceType:()=>vg,makeTable:()=>xg});function xg(e){let{primaryKey:t,indices:r,tableId:n,tableName:s,primaryStore:i,databasePath:a,databaseName:c,auditStore:l,schemaDefined:u,dbisDB:d,sealed:f,splitSegments:m,replicate:h}=e,{expirationMS:p,evictionMS:_,audit:g,trackDeletes:y}=e;_??=0;let{attributes:T}=e;T||(T=[]);let R=ZA(i,n,l),N,O,F={},Z=Promise.resolve(),G,Y,q;for(let V of T)(V.assignCreatedTime||V.name==="__createdtime__")&&(G=V),(V.assignUpdatedTime||V.name==="__updatedtime__")&&(Y=V),V.expiresAt&&(q=V),V.isPrimaryKey&&(F=V);let K,ce=[],le=[],se=1,pe=2,Ne={},Ue={},xe=864e5,Rr=0,Jt,Mt,Xt,Uf=!1,Pc,Gt,xf,Bf=bl.get(U.REPLICATION_DATABASES);if(Array.isArray(Bf)){for(let V of Bf)if(V.name===c&&V.replicateTo>=0){xf=V.replicateTo;break}}let OE=i.getRange({start:!1,end:!1}).constructor,CE=10,Fy=6;g&&Gf(),Sm(i.env.path,V=>{if(O)return Ra(V)});class Ff extends dl{static{o(this,"Updatable")}getUpdatedTime(){return La.get(this.getRecord())?.version}getExpiresAt(){return La.get(this.getRecord())?.expiresAt}addTo(E,S){if(typeof S=="number"||typeof S=="bigint")this.set(E,new Qm(S));else throw new Error("Can not add or subtract a non-numeric value")}subtractFrom(E,S){return this.addTo(E,-S)}}class Pe extends xr{#e;#t;#r;#n;#s;#i;static name=s;static primaryStore=i;static auditStore=l;static primaryKey=t;static tableName=s;static tableId=n;static indices=r;static audit=g;static databasePath=a;static databaseName=c;static attributes=T;static replicate=h;static sealed=f;static splitSegments=m??!0;static createdTimeProperty=G;static updatedTimeProperty=Y;static propertyResolvers;static userResolvers={};static sources=[];static getResidencyById;static get expirationMS(){return p}static dbisDB=d;static schemaDefined=u;static sourcedFrom(E,S){if(S&&(this.sourceOptions=S,(S.expiration||S.eviction||S.scanInterval)&&this.setTTLExpiration(S)),S?.intermediateSource)E.intermediateSource=!0,this.sources.unshift(E);else{if(this.sources.some(L=>!L.intermediateSource)){if(this.sources.some(L=>L.name===E.name))return;throw new Error("Can not have multiple canonical (non-intermediate) sources")}this.sources.push(E)}O=O||E.get&&(!E.get.reliesOnPrototype||E.prototype.get),N=N||E.load;let A=o(L=>{let D=this.sources;if(D=D.filter(H=>H.intermediateSource&&H[L]&&(!H[L].reliesOnPrototype||H.prototype[L])),D.length>0)if(D.length===1){let H=D[0];return(C,x,z)=>{if(C?.source!==H)return H[L](x,z,C)}}else return(H,C,x)=>{let z=[];for(let ne of D){if(H?.source===ne)break;z.push(ne[L](C,x,H))}return Promise.all(z)}},"getApplyToIntermediateSource"),b=this.sources[this.sources.length-1];b.intermediateSource&&(b={});let I=o(L=>{if(b[L]&&(!b[L].reliesOnPrototype||b.prototype[L]))return(D,H,C)=>{if(!D?.source)return b[L](H,C,D)}},"getApplyToCanonicalSource");Ne={put:I("put"),patch:I("patch"),delete:I("delete"),publish:I("publish")},Ue={put:A("put"),patch:A("patch"),delete:A("delete"),publish:A("publish"),invalidate:A("invalidate")};let P=b.shouldRevalidateEvents;return(async()=>{let L=!1,D,H=o(async(C,x)=>{let z=C.value,ne=C.table?ke[c][C.table]:Pe;if(c===Yf&&(C.table===gu.ROLE_TABLE_NAME||C.table===gu.USER_TABLE_NAME)&&(L=!0),C.id===void 0&&(C.id=z[ne.primaryKey],C.id===void 0))throw new Error("Replication message without an id "+JSON.stringify(C));C.source=E;let re={residencyId:Mc(C.residencyList),isNotification:!0,ensureLoaded:!1,nodeId:C.nodeId,async:!0},B=C.id,de=await ne.getResource(B,x,re);switch(C.finished&&await C.finished,C.type){case"put":return P?de._writeInvalidate(B,z,re):de._writeUpdate(B,z,!0,re);case"patch":return P?de._writeInvalidate(B,z,re):de._writeUpdate(B,z,!1,re);case"delete":return de._writeDelete(B,re);case"publish":case"message":return de._writePublish(B,z,re);case"invalidate":return de._writeInvalidate(B,z,re);case"relocate":return de._writeRelocate(B,re);default:Me.default.error?.("Unknown operation",C.type,C.id)}},"writeUpdate");try{let C=E.subscribe;C&&y==null&&(y=!0);let x={crossThreads:!1,inTransactionUpdates:!0,supportsTransactions:!0,omitCurrent:!0},z=E.subscribeOnThisThread?E.subscribeOnThisThread((0,Al.getWorkerIndex)(),x):(0,Al.getWorkerIndex)()===0,ne=C&&z&&await E.subscribe?.(x);if(ne){let re;for await(let B of ne)try{if(!(B.type==="transaction"?B.writes[0]:B)){Me.default.error?.("Bad subscription event",B);continue}if(B.source=E,B.type==="end_txn"){if(re?.resolve(),B.localTime&&D!==B.localTime){if(B.remoteNodeIds?.length>0){let Se=[Symbol.for("seq"),B.remoteNodeIds[0]],ee=d.get(Se),j=ee?.nodes;j||(j=[]);for(let Te of B.remoteNodeIds.slice(1)){let fe=j.find(We=>We.id===Te);j=j.filter(We=>We.id!==Te||We===fe),fe||(fe={id:Te,seqId:0},j.push(fe)),fe.seqId=Math.max(ee?.seqId??1,B.localTime),Te===re?.nodeId&&(fe.lastTxnTime=B.timestamp)}let he=Math.max(ee?.seqId??1,B.localTime);Me.default.trace?.("Received txn",c,he,new Date(he),B.localTime,new Date(B.localTime),B.remoteNodeIds),d.put(Se,{seqId:he,nodes:j})}D=B.localTime}B.onCommit&&re?.committed.then(B.onCommit);continue}if(re)if(B.beginTxn)re.resolve();else{re.write_promises.push(H(B,re));continue}!B.timestamp&&B.version&&(B.timestamp=B.version);let me=Bt(B,()=>{if(B.type==="transaction"){let Se=[];for(let ee of B.writes)try{Se.push(H(ee,B))}catch(j){throw j.message+=" writing "+JSON.stringify(ee)+" of event "+JSON.stringify(B),j}return Promise.all(Se)}else if(B.type==="define_schema"){let Se=this.attributes.slice(0),ee=!1;for(let j of B.attributes)Se.find(he=>he.name===j.name)||(Se.push(j),ee=!0);ee&&(je({table:s,database:c,attributes:Se,origin:"cluster"}),Eh.signalSchemaChange(new _h.SchemaEventMsg(process.pid,$.CREATE_TABLE,c,s)))}else return B.beginTxn?(re=B,re.write_promises=[H(B,B)],new Promise(Se=>{re.resolve=()=>Se(Promise.all(re.write_promises))})):H(B,B)});re&&(re.committed=me),L&&me&&!me?.waitingForUserChange&&(me.then(()=>Eh.signalUserChange(new _h.UserEventMsg(process.pid))),me.waitingForUserChange=!0),B.onCommit&&(me?me.then(B.onCommit):B.onCommit())}catch(de){Me.default.error?.("error in subscription handler",de)}}}catch(C){Me.default.error?.(C)}})(),this}static get isCaching(){return O}static get shouldRevalidateEvents(){return this.prototype.get!==Pe.prototype.get}static getResource(E,S,A){let b=super.getResource(E,S,A);if(this.loadAsInstance===!1&&(S._freezeRecords=!0),E!=null&&this.loadAsInstance!==!1){Lr(E);try{if(b.getRecord?.())return b;if(typeof E=="object"&&E&&!Array.isArray(E))throw new Error(`Invalid id ${JSON.stringify(E)}`);let I=!A?.async||i.cache?.get?.(E),P=Dr(S),L=P.getReadTxn();if(L?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");return _a(E,S,{transaction:L,ensureLoaded:A?.ensureLoaded},I,D=>{if(D?Pe._updateResource(b,D):b.#e=null,S.onlyIfCached){if(!b.doesExist())throw new it.ServerError("Entry is not cached",504)}else if(A?.ensureLoaded){let H=Lc(E,D,S,b);if(H)return P?.disregardReadTxn(),b.#i=!0,S.loadedFromSource=!0,Ps(H,C=>(Pe._updateResource(b,C),b))}return b})}catch(I){throw I.message.includes("Unable to serialize object")&&(I.message+=": "+JSON.stringify(E)),I}}return b}static _updateResource(E,S){E.#n=S,E.#e=S?.value??null,E.#r=S?.version}ensureLoaded(){let E=Lc(this.getId(),this.#n,this.getContext());if(E)return this.#i=!0,this.getContext().loadedFromSource=!0,Ps(E,S=>{this.#n=S,this.#e=S.value,this.#r=S.version})}static getNewId(){let E=F?.type;if(E==="String"||E==="ID")return super.getNewId();if(!Gt){let I=i.getEntry(Symbol.for("id_allocation")),P=I?.value,L;if(P&&P.nodeName===server.hostname&&(!Qse(i)||P.pid===process.pid)){let D=P.start,H=P.end;L=D;for(let C of i.getKeys({start:H,end:D,limit:1,reverse:!0}))L=C}else P=b(I?.version??null),L=P.start;Gt=new BigInt64Array([BigInt(L)+1n]),Gt=new BigInt64Array(i.getUserSharedBuffer("id",Gt.buffer)),Gt.maxSafeId=P.end}let S=Number(Atomics.add(Gt,0,1n)),A=E==="Int"?512:1048576;if(S+A>=Gt.maxSafeId){let I=o(P=>{Gt.maxSafeId=S+(E==="Int"?1023:4194303);let L=(E==="Int"?Math.pow(2,31):Math.pow(2,49))-1,D=P?void 0:i.useReadTransaction(),H=Number(Gt[0]);for(let z of i.getKeys({start:H+1,end:L,limit:1,transaction:D}))L=z;D?.done();let{value:C,version:x}=i.getEntry(Symbol.for("id_allocation"));if(Gt.maxSafeId<L){if(C.end>Gt.maxSafeId-100)return;Me.default.info?.("New id allocation",S,Gt.maxSafeId,x),i.put(Symbol.for("id_allocation"),{start:C.start,end:Gt.maxSafeId,nodeName:server.hostname,pid:process.pid},Date.now(),x)}else{Me.default.warn?.(`Id conflict detected, starting new id allocation range, attempting to allocate to ${Gt.maxSafeId}, but id of ${L} detected`);let z=b(x);z.alreadyUpdated||Atomics.store(Gt,0,BigInt(z.start+1)),Gt.maxSafeId=z.end}},"updateEnd");S+A===Gt.maxSafeId?setImmediate(I):S+100>=Gt.maxSafeId&&(Me.default.warn?.(`Synchronous id allocation required on table ${s}${E=="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`),i.transactionSync(()=>I(!0)))}return S;function b(I){let P=(E==="Int"?Math.pow(2,31):Math.pow(2,49))-1,L=P/4,D,H,C=!1,x,z;do{x=Math.floor(Math.random()*P),z={start:x,end:x+(E==="Int"?1024:4194304),nodeName:server.hostname,pid:process.pid},D=0;for(let ne of i.getKeys({start:x,limit:1,reverse:!0}))D=ne;H=P;for(let ne of i.getKeys({start:x+1,end:P,limit:1}))H=ne;L*=.875,L<1e3&&!C&&(C=!0,Me.default.error?.(`Id allocation in table ${s} is very dense, limited safe range of numbers to allocate ids in${E==="Int"?", it is highly recommended that you use Long or Float as the type for auto-incremented primary keys":""}`,x,D,H,L))}while(!(L<H-x&&(L<x-D||D===0)));return i.transactionSync(()=>{let ne=i.getEntry(Symbol.for("id_allocation"));return(ne?.version??null)==I?(Me.default.info?.("Allocated new id range",z),i.put(Symbol.for("id_allocation"),z,Date.now()),z):(Me.default.debug?.("Looks like ids were already allocated"),{alreadyUpdated:!0,...ne.value})})}}static setTTLExpiration(E){if(typeof E=="number")p=E*1e3,_||(_=0);else if(E&&typeof E=="object")p=E.expiration*1e3,_=(E.eviction||0)*1e3,xe=E.scanInterval*1e3;else throw new Error("Invalid expiration value type");if(p<0)throw new Error("Expiration can not be negative");xe=xe||(p+_)/4,Ra()}static getResidencyRecord(E){return d.get([Symbol.for("residency_by_id"),E])}static setResidency(E){Pe.getResidency=E&&((S,A)=>{try{return E(S,A)}catch(b){throw b.message+=` in residency function for table ${s}`,b}})}static setResidencyById(E){Pe.getResidencyById=E&&(S=>{try{return E(S)}catch(A){throw A.message+=` in residency function for table ${s}`,A}})}static getResidency(E,S){if(Pe.getResidencyById)return Pe.getResidencyById(E[t]);let A=xf;if(S.replicateTo!=null){if(Array.isArray(S.replicateTo))return S.replicateTo.includes(server.hostname)?S.replicateTo:[server.hostname,...S.replicateTo];S.replicateTo>=0&&(A=S.replicateTo)}if(A>=0&&server.nodes){let b=[server.hostname];if(S.previousResidency)b.push(...S.previousResidency.slice(0,A));else{let I=server.nodes.map(D=>D.name),P=Math.floor(I.length*Math.random());b.push(...I.slice(P,P+A));let L=P+A-I.length;L>0&&b.push(...I.slice(0,L))}return b}}static enableAuditing(E=!0){g=E,E&&Gf(),Pe.audit=E}static coerceId(E){return E===""?null:vg(E,F)}static async dropTable(){delete ke[c][s];for(let E of i.getRange({versions:!0,snapshot:!1,lazy:!0}))E.metadataFlags&Vr&&E.value&&Ca(E.value);if(c===a){for(let E of T)d.remove(Pe.tableName+"/"+E.name),r[E.name]?.drop();d.remove(Pe.tableName+"/"),i.drop(),await d.committed}else console.log("legacy dropTable"),await i.close(),SN.default.unlinkSync(i.env.path);Eh.signalSchemaChange(new _h.SchemaEventMsg(process.pid,$.DROP_TABLE,c,s))}get(E){let S=this.constructor;if(typeof E=="string"&&S.loadAsInstance!==!1)return this.getProperty(E);if(kf(E))return this.search(E);if(E&&E.id===void 0&&!E.toString()){let A={records:"./",name:s,database:c,auditSize:l?.getStats().entryCount,attributes:T,recordCount:void 0,estimatedRecordRange:void 0};return this.getContext()?.includeExpensiveRecordCountEstimates?Pe.getRecordCount().then(b=>(A.recordCount=b.recordCount,A.estimatedRecordRange=b.estimatedRange,A)):A}if(E!==void 0&&S.loadAsInstance===!1){let A=this.getContext(),b=Dr(A),I=b.getReadTxn();if(I?.isDone)throw new Error("You can not read from a transaction that has already been committed/aborted");let P=yr(E);Lr(P);let L=!0;return E.checkPermission&&(L=this.allowRead(A.user,E)),Ps(Ps(L,D=>{if(!D)throw new it.AccessViolation(A.user);let H=!0;return _a(P,A,{transaction:I,ensureLoaded:H},!1,C=>{if(A.onlyIfCached){if(!C?.value)throw new it.ServerError("Entry is not cached",504)}else if(H){let x=Lc(P,C,A);if(x)return b?.disregardReadTxn(),A.loadedFromSource=!0,x.then(z=>z?.value)}return C?.value})}),D=>{let H=E?.select;return H&&D!=null?Fu(H,this.constructor)(D):D})}if(E?.property)return this.getProperty(E.property);if(this.doesExist()||E?.ensureLoaded===!1||this.getContext()?.returnNonexistent)return this}allowRead(E,S){let A=ga(E,S);if(A?.read){if(A.isSuperUser)return!0;let b=A.attribute_permissions,I=S?.select;if(b?.length>0||Uf&&I){if(S||(S={}),I){let P=Array.isArray(I)?I:[I],L=b?.length>0&&gN(b,"read");S.select=P.map(D=>{let H=D.name||D;if(!L||L[H]){let C=Xt[H]?.definition?.tableClass;if(C){if(D.name||(D={name:D}),!D.checkPermission&&S.checkPermission&&(D.checkPermission=S.checkPermission),!C.prototype.allowRead.call(null,E,D))return!1;if(!D.select)return D.name}return D}}).filter(Boolean)}else S.select=b.filter(P=>P.read&&!Xt[P.attribute_name]).map(P=>P.attribute_name);return S}else return!0}}allowUpdate(E,S,A){let b=ga(E,A);if(b?.update){let I=b.attribute_permissions;if(I?.length>0){let P=gN(I,"update");for(let L in S)if(!P[L])return!1;for(let L of I){let D=L.attribute_name;!L.update&&!(D in S)&&(S[D]=this.getProperty(D))}}return Ta(this.getContext())}}allowCreate(E,S,A){if(this.isCollection){let b=ga(E,A);if(b?.insert){let I=b.attribute_permissions;if(I?.length>0){let P=gN(I,"insert");for(let L in S)if(!P[L])return!1;return Ta(this.getContext())}else return Ta(this.getContext())}}else return this.allowUpdate(E,{})}allowDelete(E,S){return ga(E,S)?.delete&&Ta(this.getContext())}update(E,S){let A,b=typeof S=="boolean"||S===void 0&&(E==null||typeof E=="object"&&!(E instanceof URLSearchParams)),I=!1;b?(I=S,S=E,A=this.getId()):A=yr(E);let P=this.getContext();if(!Dr(P))throw new Error("Can not update a table resource outside of a transaction");if(S===!1)return this;if(typeof S=="object"&&S)if(I)Object.isFrozen(S)&&(S={...S}),this.#e={},this.#t=S;else if(b){let D=this.#t;D&&(S=Object.assign(D,S)),this.#t=S}else{let D=!0;if(E==null)throw new TypeError("Can not put a record without a target");return E.checkPermission&&(D=this.allowUpdate(P.user,S,E)),Ps(D,H=>{if(!H)throw new it.AccessViolation(P.user);return Ps(i.get(yr(E)),C=>{let x=new Ff(C);return x._setChanges(S),this._writeUpdate(A,x.getChanges(),!1),x})})}return this._writeUpdate(A,this.#t,I),this}addTo(E,S){if(typeof S=="number"||typeof S=="bigint")this.#s===ik?this.set(E,(+this.getProperty(E)||0)+S):(this.#s||this.update(),this.set(E,new Qm(S)));else throw new Error("Can not add a non-numeric value")}subtractFrom(E,S){if(typeof S=="number")return this.addTo(E,-S);throw new Error("Can not subtract a non-numeric value")}getMetadata(){return this.#n}getRecord(){return this.#e}getChanges(){return this.#t}_setChanges(E){this.#t=E}setRecord(E){this.#e=E}invalidate(E){let S=!0,A=this.getContext();return E?.checkPermission&&(S=this.allowDelete(A.user,E,A)),Ps(S,b=>{if(!b)throw new it.AccessViolation(A.user);this._writeInvalidate(E?yr(E):this.getId())})}_writeInvalidate(E,S,A){let b=this.getContext();Lr(E),Dr(this.getContext()).addWrite({key:E,store:i,invalidated:!0,entry:this.#n,before:Ne.invalidate?.bind(this,b,E),beforeIntermediate:ya(S,Ue.invalidate?.bind(this,b,E)),commit:o((P,L)=>{if(!(Sa(P,L,A?.nodeId)<=0)){S??=null;for(let D in r)S||(S={}),S[D]===void 0&&(S[D]=this.getProperty(D));Me.default.trace?.(`Invalidating entry in ${s} id: ${E}, timestamp: ${new Date(P).toISOString()}`),R(E,S,L,P,On,g,{user:b?.user,residencyId:A?.residencyId,nodeId:A?.nodeId},"invalidate")}},"commit")})}_writeRelocate(E,S){let A=this.getContext();Lr(E),Dr(this.getContext()).addWrite({key:E,store:i,invalidated:!0,entry:this.#n,before:Ne.relocate?.bind(this,A,E),beforeIntermediate:Ue.relocate?.bind(this,A,E),commit:o((I,P)=>{if(Sa(I,P,S?.nodeId)<=0)return;let L=Pe.getResidencyRecord(S.residencyId),D=0,H=null,C=P?.value;if(L&&!L.includes(server.hostname)){for(let x in r)H||(H={}),H[x]=C[x];D=On}else H=C;Me.default.trace?.(`Relocating entry id: ${E}, timestamp: ${new Date(I).toISOString()}`),R(E,H,P,I,D,g,{user:A.user,residencyId:S.residencyId,nodeId:S.nodeId,expiresAt:S.expiresAt},"relocate",!1,null)},"commit")})}static _recordRelocate(E,S){if(this.getResidencyById)return!1;let A={previousResidency:this.getResidencyRecord(E.residencyId),isRelocation:!0},b=Dc(this.getResidency(S.value,A)),I;if(b){if(!b.includes(server.hostname))return!1;I=Mc(b)}let P=0;Me.default.debug?.("Performing a relocate of an entry",existing_entry.key,S.value,b);let L=R(E.key,S.value,E,E.version,P,!0,{residencyId:I,expiresAt:S.expiresAt},"relocate",!1,null);return!0}static evict(E,S,A){let b=this.Source,I;if(!((O||g)&&(!S||(I=i.getEntry(E),!I||!S)||I.version!==A))){if(O){if(i.hasLock(E,I.version))return;let P;for(let L in r)P||(P={}),P[L]=S[L];if(P)return R(E,P,I,A,tl,null,null,null,!0)}return i.ifVersion(E,A,()=>{_o(E,S,null)}),el(i,I??i.getEntry(E),A)}}lock(){throw new Error("Not yet implemented")}static operation(E,S){return E.table||=s,E.schema||=c,global.operation(E,S)}put(E,S){if(S===void 0||S instanceof URLSearchParams)this.update(E,!0);else{let A=!0;if(E==null)throw new TypeError("Can not put a record without a target");let b=this.getContext();return E.checkPermission&&(A=this.allowUpdate(b.user,S,E)),Ps(A,I=>{if(!I)throw new it.AccessViolation(b.user);if(Array.isArray(S))for(let P of S){let L=P[t];this._writeUpdate(L,P,!0)}else{let P=yr(E);this._writeUpdate(P,S,!0)}})}}create(E,S){let A=!0,b=this.getContext();if(!S&&!(E instanceof URLSearchParams)&&(S=E,E=void 0),!S||typeof S!="object"||Array.isArray(S))throw new TypeError("Can not create a record without an object");return E?.checkPermission&&(A=this.allowCreate(b.user,S,E)),Ps(A,I=>{if(!I)throw new it.AccessViolation(b.user);let P=yr(E)??S[t];if(P===void 0)P=this.constructor.getNewId();else if(i.get(P))throw new it.ClientError("Record already exists",409);return this._writeUpdate(P,S,!0),S})}patch(E,S){if(S===void 0||S instanceof URLSearchParams)this.update(E,!1);else{let A=this.update(E,S);if(A?.then)return A.then(()=>{})}}_writeUpdate(E,S,A,b){let I=this.getContext(),P=Dr(I);Lr(E);let L=this.#n??i.getEntry(E);this.#s=A?ik:Yse;let D=o(C=>A?C.put?()=>C.put(I,E,S):null:C.patch?()=>C.patch(I,E,S):C.put?()=>C.put(I,E,fl(this)):null,"writeToSources"),H={key:E,store:i,entry:L,nodeName:I?.nodeName,validate:o(C=>{S||(S=this.#t),A||S&&ig(this.#t===S?this:S)?I?.source||(P.checkOverloaded(),this.validate(S,!A),Y&&(S[Y.name]=Y.type==="Date"?new Date(C):Y.type==="String"?new Date(C).toISOString():C),A&&(t&&S[t]!==E&&(S[t]=E),G&&(L?.value?S[G.name]=L?.value[G.name]:S[G.name]=G.type==="Date"?new Date(C):G.type==="String"?new Date(C).toISOString():C),S=fl(S))):P.removeWrite(H)},"validate"),before:D(Ne),beforeIntermediate:ya(S,D(Ue)),commit:o((C,x,z)=>{if(z){if(I&&x?.version>(I.lastModified||0)&&(I.lastModified=x.version),this.#n=x,x?.value&&x.value.getRecord)throw new Error("Can not assign a record to a record, check for circular references");A||(this.#e=x?.value??null)}this.#t=void 0,this.#r=C;let ne=x?.value,re=S;this.#s=0;let B=!1,de=Sa(C,x,b?.nodeId),me,Se=A?"put":"patch",ee;b?.residencyId!=null&&(ee=b.residencyId);let j=I?.expiresAt??(p?p+Date.now():-1);if(de<=0){if(g){let fe=x.localTime,We=x.version;Me.default.trace?.("Applying CRDT update to record with id: ",E,"txn time",new Date(C),"applying later update from:",new Date(We),"local recorded time",new Date(fe));let Et=[];for(;fe>C||We>=C&&fe>0;){let ut=l.get(fe);if(!ut)break;let Ee=bt(ut);if(We=Ee.version,We>=C){if(We===C){if(de=Sa(C,{version:We,localTime:fe},b?.nodeId),de===0)return Te(!1);if(de>0)continue}if(Ee.type==="patch")Et.push(Ee),me=S;else if(Ee.type==="put"||Ee.type==="delete")return Te(!1)}fe=Ee.previousLocalTime}fe||Me.default.debug?.("No further audit history, applying incremental updates based on available history",E,"existing version preserved",x),Et.sort((ut,Ee)=>ut.version-Ee.version);for(let ut of Et){let Ee=ut.getValue(i);if(Me.default.debug?.("Rebuilding update with future patch:",new Date(ut.version),Ee,ut),re=t_(re,Ee,A),!re)return Te(!1)}}else{if(A)return Te(!1);re=t_(re,ne,A),Me.default.debug?.("Rebuilding update without audit:",re)}Me.default.trace?.("Rebuilt record to save:",re," is full update:",A)}let he;if(A?he=re:this.constructor.loadAsInstance===!1?he=fl(ne,re):(this.#e=ne,he=fl(this,re)),this.#e=he,he&&he.getRecord)throw new Error("Can not assign a record to a record, check for circular references");if(ee==null){L?.residencyId&&(I.previousResidency=Pe.getResidencyRecord(L.residencyId));let fe=Dc(Pe.getResidency(he,I));if(fe&&!fe.includes(server.hostname))if(me??=he,B=!0,Pe.getResidencyById)he=void 0;else{he=null;for(let We in r)he||(he={}),he[We]=me[We]}ee=Mc(fe)}A||(me=S),Me.default.trace?.(`Saving record with id: ${E}, timestamp: ${new Date(C).toISOString()}${j?", expires at: "+new Date(j).toISOString():""}${x?", replaces entry from: "+new Date(x.version).toISOString():", new entry"}`,(()=>{try{return JSON.stringify(he).slice(0,100)}catch{return""}})()),_o(E,ne,he),Te(!0),I.expiresAt&&Ra();function Te(fe){R(E,fe?he:void 0,fe?x:{...x,value:void 0},C,B?On:0,g,{omitLocalRecord:B,user:I?.user,residencyId:ee,expiresAt:j,nodeId:b?.nodeId,originatingOperation:I?.originatingOperation},Se,!1,fe?me:me??S)}o(Te,"writeCommit")},"commit")};P.addWrite(H)}async delete(E){if(kf(E)){E.select=["$id"];for await(let S of this.search(E))this._writeDelete(S.$id);return!0}if(E){let S=!0,A=this.getContext();return E.checkPermission&&(S=this.allowDelete(A.user,E,A)),Ps(S,b=>{if(!b)throw new it.AccessViolation(A.user);let I=yr(E);return this._writeDelete(I),!0})}return this._writeDelete(this.getId()),!!this.#e}_writeDelete(E,S){let A=Dr(this.getContext());Lr(E);let b=this.getContext();return A.addWrite({key:E,store:i,entry:this.#n,nodeName:b?.nodeName,before:Ne.delete?.bind(this,b,E),beforeIntermediate:Ue.delete?.bind(this,b,E),commit:o((I,P,L)=>{let D=P?.value;L&&(b&&P?.version>(b.lastModified||0)&&(b.lastModified=P.version),Pe._updateResource(this,P)),!(Sa(I,P,S?.nodeId)<=0)&&(_o(this.getId(),D),Me.default.trace?.(`Deleting record with id: ${E}, txn timestamp: ${new Date(I).toISOString()}`),g||y?(R(E,null,P,I,0,g,{user:b?.user,nodeId:S?.nodeId},"delete"),g||Ra()):el(i,P))},"commit")}),!0}search(E){let S=this.getContext(),A=Dr(S);if(!E)throw new Error("No query provided");if(E.parseError)throw E.parseError;if(E.checkPermission&&!this.allowRead(S.user,E))throw new it.AccessViolation(S.user);let b=E.conditions;b?b.length===void 0&&(b=b[Symbol.iterator]?Array.from(b):[b]):b=Array.isArray(E)?E:E[Symbol.iterator]?Array.from(E):[];let I=E.id??this.getId();I&&(b=[{attribute:null,comparator:Array.isArray(I)?"prefix":"starts_with",value:I}].concat(b));let P,L={};function D(j,he){let Te;switch(he){case"and":case void 0:if(j.length<1)throw new Error('An "and" operator requires at least one condition');Te=!0;break;case"or":if(j.length<2)throw new Error('An "or" operator requires at least two conditions');break;default:throw new Error("Invalid operator "+he)}for(let fe of j){if(fe.conditions){fe.conditions=D(fe.conditions,fe.operator);continue}let We=fe[0]??fe.attribute,Et=We==null?F:Fi(T,We);if(Et)(Et.type||tb[fe.comparator])&&(fe[1]===void 0?fe.value=C(fe.value,Et):fe[1]=C(fe[1],Et));else if(We!=null&&!E.allowConditionsOnDynamicAttributes)throw(0,it.handleHDBError)(new Error,`${We} is not a defined attribute`,404);if(fe.chainedConditions)if(fe.chainedConditions.length===1&&(!fe.operator||fe.operator=="and")){let ut=fe.chainedConditions[0],Ee,ft;if(ut.comparator==="gt"||ut.comparator==="greater_than"||ut.comparator==="ge"||ut.comparator==="greater_than_equal"?(Ee=fe,ft=ut):(Ee=ut,ft=fe),Ee.comparator!=="lt"&&Ee.comparator!=="less_than"&&Ee.comparator!=="le"&&Ee.comparator!=="less_than_equal")throw new Error("Invalid chained condition, only less than and greater than conditions can be chained together");let tt=ft.comparator==="ge"||ft.comparator==="greater_than_equal",cr=Ee.comparator==="le"||Ee.comparator==="less_than_equal";fe.comparator=(tt?"ge":"gt")+(cr?"le":"lt"),fe.value=[ft.value,Ee.value]}else throw new Error("Multiple chained conditions are not currently supported")}return j}o(D,"prepareConditions");function H(j,he){if(E.enforceExecutionOrder)return j;for(let Te of j)Te.conditions&&(Te.conditions=H(Te.conditions,Te.operator));return j.length>1&&he!=="or"?kse(j,D_(Pe)):j}o(H,"orderConditions");function C(j,he){return Array.isArray(j)?j.map(Te=>vg(Te,he)):vg(j,he)}o(C,"coerceTypedValues");let x=E.operator;(b.length>0||x)&&(b=D(b,x));let z=typeof E.sort=="object"&&E.sort,ne;if(z&&x!=="or"){let j=z.attribute;if(j==null)throw new it.ClientError("Sort requires an attribute");if(P=b.find(he=>Uu(he.attribute)===Uu(j)),!P){let he=Fi(T,j);if(!he)throw(0,it.handleHDBError)(new Error,`${Array.isArray(j)?j.join("."):j} is not a defined attribute`,404);if(he.indexed)P={...z,comparator:"sort"},b.push(P);else if(b.length===0&&!E.allowFullScan)throw(0,it.handleHDBError)(new Error,`${Array.isArray(j)?j.join("."):j} is not indexed and not combined with any other conditions`,404)}P&&(P.descending=!!z.descending)}b=H(b,x),z&&(P&&b[0]===P?z.next&&(ne={dbOrderedAttribute:z.attribute,attribute:z.next.attribute,descending:z.next.descending,next:z.next.next}):(P&&b.splice(b.indexOf(P),1),ne=z));let re=E.select;if(b.length===0&&(b=[{attribute:t,comparator:"greater_than",value:!0}]),E.explain)return{conditions:b,operator:x,postOrdering:ne,selectApplied:!!re};let B=A.useReadTxn(),de=rb(b,x,Pe,B,E,S,(j,he)=>pu(j,re,S,B,he),L),me=E.ensureLoaded!==!1,Se=Pe.transformEntryForSelect(re,S,B,L,me,!0),ee=Pe.transformToOrderedSelect(de,re,ne,S,B,Se);return(E.offset||E.limit!==void 0)&&(ee=ee.slice(E.offset,E.limit!==void 0?(E.offset||0)+E.limit:void 0)),ee.onDone=()=>{ee.onDone=null,A.doneReadTxn()},ee.selectApplied=!0,ee.getColumns=()=>{if(re){let j=[];for(let he of re)he==="*"?j.push(...T.map(Te=>Te.name)):j.push(he.name||he);return j}return T.filter(j=>!j.computed&&!j.relationship).map(j=>j.name)},ee}static transformToOrderedSelect(E,S,A,b,I,P){let L=new OE;if(A){E=pu(E,S,b,I,null);let D;L.iterate=function(){let C,x=E[Symbol.asyncIterator]?E[Symbol.asyncIterator]():E[Symbol.iterator](),z,ne=A.dbOrderedAttribute,re,B,de=!0;function me(ee){let j=ee.next&&me(ee.next),he=ee.descending;return b.sort=ee,(Te,fe)=>{let We=hu(Te,ee.attribute,b),Et=hu(fe,ee.attribute,b),ut=he?(0,Il.compareKeys)(Et,We):(0,Il.compareKeys)(We,Et);return ut===0?j?.(Te,fe)||0:ut}}o(me,"createComparator");let Se=me(A);return{async next(){let ee;if(C)if(ee=C.next(),ee.done){if(z)return L.onDone&&L.onDone(),ee}else return{value:await P.call(this,ee.value)};D=[],re&&D.push(re);do if(ee=await x.next(),ee.done){if(z=!0,D.length)break;return L.onDone&&L.onDone(),ee}else{let j=ee.value;if(j?.then&&(j=await j),ne){let he=hu(j,ne,b);if(de)de=!1,B=he;else if(he!==B){B=he,re=j;break}}D.push(j)}while(!0);return A.isGrouped,D.sort(Se),C=D[Symbol.iterator](),ee=C.next(),ee.done?(L.onDone&&L.onDone(),ee):{value:await P.call(this,ee.value)}},return(){L.onDone&&L.onDone(),x.return()},throw(){L.onDone&&L.onDone(),x.throw()}}};let H=o(C=>{if(typeof S=="object"&&Array.isArray(C.attribute))for(let x=0;x<S.length;x++){let z=S[x],ne;if(z.name===C.attribute[0]){for(ne=z.sort||(z.sort={});ne.next;)ne=ne.next;ne.attribute=C.attribute.slice(1),ne.descending=C.descending}else z===C.attribute[0]&&(S[x]=ne={name:z,sort:{attribute:C.attribute.slice(1),descending:C.descending}})}C.next&&H(C.next)},"applySortingOnSelect");H(A)}else L.iterate=(E[Symbol.asyncIterator]||E[Symbol.iterator]).bind(E),L=L.map(function(D){try{let H=P.call(this,D);return typeof H?.catch=="function"?H.catch(C=>{throw C.partialObject={[t]:D.key},C}):H}catch(H){throw H.partialObject={[t]:D.key},H}});return L}static transformEntryForSelect(E,S,A,b,I,P){let L;I&&O&&!(typeof E=="string"?[E]:E)?.every(C=>{let x;return typeof C=="object"?x=C.name:x=C,r[x]||x===t})&&(L=!0);let D,H=o(function(C){let x;if(S?.transaction?.stale&&(S.transaction.stale=!1),C!=null){if(x=C.deref?C.deref():C.value,!x&&(C.key===void 0||C.deref)||C.metadataFlags&On){if(C.metadataFlags&On&&S.replicateFrom===!1&&P&&C.residencyId)return $a.SKIP;if(C=_a(C.key??C,S,{transaction:A,lazy:E?.length<4,ensureLoaded:I},this?.isSync,z=>z),C?.then)return C.then(H.bind(this));x=C?.value}if(L&&C?.metadataFlags&(On|tl)||C?.expiresAt!=null&&C?.expiresAt<Date.now()){if(S.onlyIfCached)return{[t]:C.key,message:"This entry has expired"};let z=Lc(C.key??C,C,S);if(z?.then)return z.then(H)}}if(x==null)return P?$a.SKIP:x;if(E&&!(E[0]==="*"&&E.length===1)){let z,ne=o((B,de)=>{let me;typeof B=="object"?me=B.name:me=B;let Se=Xt?.[me],ee;if(Se){let j=b?.[me];if(j)if(j.hasMappings){let Te=Se.from?x[Se.from]:Uu(C.key);ee=j.get(Te),ee||(ee=[])}else ee=j.fromRecord?.(x);else ee=Se(x,S,C,!0);let he=o(Te=>{if(Se.directReturn)return de(Te,me);if(Te&&typeof Te=="object"){let fe=Se.definition?.tableClass||Pe;D||(D={});let We=D[me]||(D[me]=fe.transformEntryForSelect(me===B?null:B.select||(Array.isArray(B)?B:null),S,A,j,I));if(Array.isArray(Te)){let Et=[],ut=fe.transformToOrderedSelect(Te,B.select,typeof B.sort=="object"&&B.sort,S,A,We)[this.isSync?Symbol.iterator:Symbol.asyncIterator](),Ee=o(tt=>{for(;!tt.done;){if(tt?.then)return tt.then(Ee);Et.push(tt.value),tt=ut.next()}de(Et,me)},"nextValue"),ft=Ee(ut.next());ft&&(z||(z=[]),z.push(ft));return}else if(Te=We.call(this,Te),Te?.then){z||(z=[]),z.push(Te.then(Et=>de(Et,me)));return}}de(Te,me)},"handleResolvedValue");ee?.then?(z||(z=[]),z.push(ee.then(he))):he(ee);return}else ee=x[me],ee&&typeof ee=="object"&&me!==B&&(ee=Pe.transformEntryForSelect(B.select||B,S,A,null)({value:ee}));de(ee,me)},"selectAttribute"),re;if(typeof E=="string")ne(E,B=>{re=B});else if(Array.isArray(E))if(E.asArray)re=[],E.forEach((B,de)=>{B==="*"?E[de]=x:ne(B,me=>re[de]=me)});else{re={};let B=E.forceNulls;for(let de of E)if(de==="*")for(let me in x)re[me]=x[me];else ne(de,(me,Se)=>{me===void 0&&B&&(me=null),re[Se]=me})}else throw new it.ClientError("Invalid select"+E);return z?Promise.all(z).then(()=>re):re}return x},"transform");return H}async subscribe(E){if(!l)throw new Error("Can not subscribe to a table without an audit log");g||je({table:s,database:c,schemaDefined:u,attributes:T,audit:!0}),E||(E={});let S=!E.rawEvents,A=[],b=this,I=cb(Pe,this.getId()??null,function(L,D,H,C){try{let x=D.getValue?.(i,S),z=D.type;if(!x&&z==="patch"&&S){let re=i.getEntry(L);re?.version===D.version?x=re.value:x=D.getValue?.(i,!0,H),z="put"}let ne={id:L,localTime:H,value:x,version:D.version,type:z,beginTxn:C};A?A.push(ne):this.send(ne)}catch(x){Me.default.error?.(x)}},E.startTime||0,E),P=(async()=>{this.isCollection&&(I.includeDescendants=!0,E.onlyChildren&&(I.onlyChildren=!0)),E.supportsTransactions&&(I.supportsTransactions=!0);let L=this.getId(),D=E.previousCount;D>1e3&&(D=1e3);let H=E.startTime;if(this.isCollection){if(H){if(D)throw new it.ClientError("startTime and previousCount can not be combined for a table level subscription");for(let{key:C,value:x}of l.getRange({start:H,exclusiveStart:!0,snapshot:!1})){let z=bt(x);if(z.tableId!==n)continue;let ne=z.recordId;if(L==null||lk(L,ne)){let re=z.getValue(i,S,C);if(I.send({id:ne,localTime:C,value:re,version:z.version,type:z.type}),I.queue?.length>ak&&await I.waitForDrain()===!1)return}I.startTime=C}}else if(D){let C=[];for(let{key:x,value:z}of l.getRange({start:"z",end:!1,reverse:!0}))try{let ne=bt(z);if(ne.tableId!==n)continue;let re=ne.recordId;if(L==null||lk(L,re)){let B=ne.getValue(i,S,x);if(C.push({id:re,localTime:x,value:B,version:ne.version,type:ne.type}),--D<=0)break}}catch(ne){Me.default.error("Error getting history entry",x,ne)}for(let x=C.length;x>0;)I.send(C[--x]);C[0]&&(I.startTime=C[0].localTime)}else if(!E.omitCurrent){for(let{key:C,value:x,version:z,localTime:ne}of i.getRange({start:L??!1,end:L==null?void 0:[L,Il.MAXIMUM_KEY],versions:!0,snapshot:!1}))if(x&&(I.send({id:C,localTime:ne,value:x,version:z,type:"put"}),I.queue?.length>ak&&await I.waitForDrain()===!1))return}}else{D&&!H&&(H=0);let C=this.#n?.localTime;if(C===XA&&(i.cache?.delete(L),this.#n=i.getEntry(L),Me.default.trace?.("re-retrieved record",C,this.#n?.localTime),C=this.#n?.localTime),Me.default.trace?.("Subscription from",H,"from",L,C),H<C){let x=[],z=C;do{let ne=l.get(z);if(ne){E.omitCurrent=!0;let re=bt(ne),B=re.getValue(i,S,z);S&&(re.type="put"),x.push({id:L,value:B,localTime:z,...re}),z=re.previousLocalTime}else break;D&&D--}while(z>H&&D!==0);for(let ne=x.length;ne>0;)I.send(x[--ne]);I.startTime=C}!E.omitCurrent&&this.doesExist()&&I.send({id:L,localTime:C,value:this.#e,version:this.#r,type:"put"})}for(let C of A)I.send(C);A=null})();return E.listener&&I.on("data",E.listener),I}static subscribeOnThisThread(E,S){return E===0||S?.crossThreads===!1}doesExist(){return!!(this.#e||this.#s)}publish(E,S,A){if(S===void 0||S instanceof URLSearchParams)this._writePublish(this.getId(),E,S);else{let b=!0,I=this.getContext();return E.checkPermission&&(b=this.allowCreate(I.user,E,I)),Ps(b,P=>{if(!P)throw new it.AccessViolation(I.user);let L=yr(E);this._writePublish(L,S,A)})}}_writePublish(E,S,A){let b=Dr(this.getContext());E??=null,E!==null&&Lr(E);let I=this.getContext();b.addWrite({key:E,store:i,entry:this.#n,nodeName:I?.nodeName,validate:o(()=>{I?.source||(b.checkOverloaded(),this.validate(S))},"validate"),before:Ne.publish?.bind(this,I,E,S),beforeIntermediate:ya(S,Ue.publish?.bind(this,I,E,S)),commit:o((P,L,D)=>{L===void 0&&y&&!g&&Ra(),Me.default.trace?.(`Publishing message to id: ${E}, timestamp: ${new Date(P).toISOString()}`),R(E,L?.value??null,L,L?.version||P,0,!0,{user:I?.user,residencyId:A?.residencyId,expiresAt:I?.expiresAt,nodeId:A?.nodeId},"message",!1,S)},"commit")})}validate(E,S){let A,b=o((I,P,L)=>{if(P.type&&I!=null)if(S&&I.__op__&&(I=I.value),P.properties){typeof I!="object"&&(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be an object${P.type?" ("+P.type+")":""}`);let D=P.properties;for(let H=0,C=D.length;H<C;H++){let x=D[H];if(x.relationship||x.computed){E.hasOwnProperty(x.name)&&(A||(A=[])).push(`Computed property ${L}.${x.name} may not be directly assigned a value`);continue}let z=b(I[x.name],x,L+"."+x.name);z&&(I[x.name]=z)}if(P.sealed&&I!=null&&typeof I=="object")for(let H in I)D.find(C=>C.name===H)||(A||(A=[])).push(`Property ${H} is not allowed within object in property ${L}`)}else switch(P.type){case"Int":(typeof I!="number"||I>>0!==I)&&(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be an integer (from -2147483648 to 2147483647)`);break;case"Long":(typeof I!="number"||!(Math.floor(I)===I&&Math.abs(I)<=9007199254740992))&&(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be an integer (from -9007199254740992 to 9007199254740992)`);break;case"Float":typeof I!="number"&&(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a number`);break;case"ID":typeof I=="string"||I?.length>0&&I.every?.(D=>typeof D=="string")||(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a string, or an array of strings`);break;case"String":typeof I!="string"&&(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a string`);break;case"Boolean":typeof I!="boolean"&&(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a boolean`);break;case"Date":if(!(I instanceof Date)){if(typeof I=="string"||typeof I=="number")return new Date(I);(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a Date`)}break;case"BigInt":if(typeof I!="bigint"){if(typeof I=="string"||typeof I=="number")return BigInt(I);(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a bigint`)}break;case"Bytes":if(!(I instanceof Uint8Array)){if(typeof I=="string")return Buffer.from(I);(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a Buffer or Uint8Array`)}break;case"Blob":if(!(I instanceof ys)){if(typeof I=="string"&&(I=Buffer.from(I)),I instanceof Buffer)return createBlob(I,{type:"text/plain"});(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be a Blob`)}break;case"array":if(Array.isArray(I)){if(P.elements)for(let D=0,H=I.length;D<H;D++){let C=I[D],x=b(C,P.elements,L+"[*]");x&&(I[D]=x)}}else(A||(A=[])).push(`Value ${Ls(I)} in property ${L} must be an Array`);break}P.nullable===!1&&I==null&&(A||(A=[])).push(`Property ${L} is required (and not does not allow null values)`)},"validateValue");for(let I=0,P=T.length;I<P;I++){let L=T[I];if(L.relationship||L.computed){Object.hasOwn(E,L.name)&&(A||(A=[])).push(`Computed property ${L.name} may not be directly assigned a value`);continue}if(!S||L.name in E){let D=b(E[L.name],L,L.name);D!==void 0&&(E[L.name]=D)}}if(f)for(let I in E)T.find(P=>P.name===I)||(A||(A=[])).push(`Property ${I} is not allowed`);if(A)throw new it.ClientError(A.join(". "))}getUpdatedTime(){return this.#r}wasLoadedFromSource(){return O?!!this.#i:void 0}static async addAttributes(E){let S=T.slice(0);for(let A of E){if(!A.name)throw new it.ClientError("Attribute name is required");if(A.name.match(/[`/]/))throw new it.ClientError("Attribute names cannot include backticks or forward slashes");Gse(A.name),S.push(A)}return je({table:s,database:c,schemaDefined:u,attributes:S}),Pe.indexingOperation}static async removeAttributes(E){let S=T.filter(A=>!E.includes(A.name));return je({table:s,database:c,schemaDefined:u,attributes:S}),Pe.indexingOperation}static getSize(){let E=i.getStats();return(E.treeBranchPageCount+E.treeLeafPageCount+E.overflowPages)*E.pageSize}static getAuditSize(){let E=l?.getStats();return E&&(E.treeBranchPageCount+E.treeLeafPageCount+E.overflowPages)*E.pageSize}static getStorageStats(){let E=i.env.path,S=SN.default.statfsSync?.(E)??{};return{available:S.bavail*S.bsize,free:S.bfree*S.bsize,size:S.blocks*S.bsize}}static async getRecordCount(E){let S=i.getStats().entryCount,A=1e3/2,b=performance.now(),I=Math.floor(S/2),P=E?.exactCount,L=0,D=0,H;for(let{value:C}of i.getRange({start:!0,lazy:!0,snapshot:!1}))if(C!=null&&L++,D++,await qa(),!P&&D<I&&performance.now()-b>A){H=D;break}if(H){let C=L;L=0;for(let{value:ee}of i.getRange({start:"\uFFFF",reverse:!0,lazy:!0,limit:H,snapshot:!1}))ee!=null&&L++,await qa();let x=H*2,z=(L+C)/x,ne=Math.pow((L-C+1)/H/2,2)+z*(1-z)/x,re=Math.max(Math.sqrt(ne)*S,1),B=Math.round(z*S),de=Math.max(B-1.96*re,L+C),me=Math.min(B+1.96*re,S),Se=Math.pow(10,Math.round(Math.log10(re)));return Se>B&&(Se=Se/10),L=Math.round(B/Se)*Se,{recordCount:L,estimatedRange:[Math.round(de),Math.round(me)]}}return{recordCount:L}}static updatedAttributes(){Xt=this.propertyResolvers={$id:o((E,S,A)=>({value:A.key}),"$id"),$updatedtime:o((E,S,A)=>A.version,"$updatedtime"),$updatedTime:o((E,S,A)=>A.version,"$updatedTime"),$expiresAt:o((E,S,A)=>A.expiresAt,"$expiresAt"),$record:o((E,S,A)=>A?{value:E}:E,"$record"),$distance:o((E,S,A)=>A&&(A.distance??S?.vectorDistances?.get(A)),"$distance")};for(let E of this.attributes){E.isPrimaryKey&&(F=E),E.resolve=null;let S=E.relationship,A=E.computed;if(S)if(E.indexed&&console.error("A relationship property can not be directly indexed, (but you may want to index the foreign key attribute)"),A&&console.error("A relationship property is already computed and can not be combined with a computed function (the relationship will be given precedence)"),Uf=!0,S.to)E.elements?.definition?(Xt[E.name]=E.resolve=(b,I,P,L)=>{let D=b[S.from?S.from:t],H=E.elements.definition.tableClass;return L?vu({attribute:S.to,value:D},Dr(I).getReadTxn(),!1,H,!1).map(C=>C&&C.key!==void 0?C:H.primaryStore.getEntry(C,{transaction:Dr(I).getReadTxn()})).asArray:H.search([{attribute:S.to,value:D}],I).asArray},E.set=()=>{},E.resolve.definition=E.elements.definition,E.resolve.to=S.to,S.from&&(E.resolve.from=S.from)):console.error(`The one-to-many/many-to-many relationship property "${E.name}" in table "${s}" must have an array type referencing a table as the elements`);else if(S.from){let b=E.definition||E.elements?.definition;b?(Xt[E.name]=E.resolve=(I,P,L,D)=>{let H=I[S.from];if(H===void 0)return;if(E.elements){let x,z=H?.map(ne=>{let re=b.tableClass.primaryStore[D?"getEntry":"get"](ne,{transaction:Dr(P).getReadTxn()});return re?.then&&(x=!0),Pe.loadAsInstance===!1&&Object.freeze(D?re?.value:re),re});return S.filterMissing?x?Promise.all(z).then(ne=>ne.filter(uk)):z.filter(uk):x?Promise.all(z):z}let C=b.tableClass.primaryStore[D?"getEntry":"get"](H,{transaction:Dr(P).getReadTxn()});return Pe.loadAsInstance===!1&&Object.freeze(D?C?.value:C),C},E.set=(I,P)=>{if(Array.isArray(P)){let L=P.map(D=>D.getId?.()||D[b.tableClass.primaryKey]);I[S.from]=L}else{let L=P.getId?.()||P[b.tableClass.primaryKey];I[S.from]=L}},E.resolve.definition=E.definition||E.elements?.definition,E.resolve.from=S.from):console.error(`The relationship property "${E.name}" in table "${s}" must be a type that references a table`)}else console.error(`The relationship directive on "${E.name}" in table "${s}" must use either "from" or "to" arguments`);else if(A)typeof A.from=="function"&&this.setComputedAttribute(E.name,A.from),Xt[E.name]=E.resolve=(b,I,P)=>{let L=typeof A.from=="string"?b[A.from]:b,D=this.userResolvers[E.name];if(D)return D(L,I,P);Me.default.warn(`Computed attribute "${E.name}" does not have a function assigned to it. Please use setComputedAttribute('${E.name}', resolver) to assign a resolver function.`),this.userResolvers[E.name]=()=>{}},E.resolve.directReturn=!0;else if(r[E.name]?.customIndex?.propertyResolver){let b=r[E.name].customIndex;Xt[E.name]=(I,P,L)=>{let D=I[E.name];return b.propertyResolver(D,P,L)},Xt[E.name].directReturn=!0}}Jm(this,this),Jm(Ff,this,!0);for(let E of T){let S=E.name;E.resolve&&Object.defineProperty(i.encoder.structPrototype,S,{get(){return E.resolve(this,Bu.getStore())},set(A){return E.set(this,A)},configurable:!0})}}static setComputedAttribute(E,S){let A=Fi(T,E);if(!A){console.error(`The attribute "${E}" does not exist in the table "${s}"`);return}if(!A.computed){console.error(`The attribute "${E}" is not defined as computed in the table "${s}"`);return}this.userResolvers[E]=S}static async deleteHistory(E=0,S=!1){let A;for(let{key:b,value:I}of l.getRange({start:0,end:E}))await qa(),bt(I).tableId===n&&(A=y_(l,b,I));if(S)for(let b of i.getRange({start:0,versions:!0})){let{key:I,value:P,localTime:L}=b;await qa(),P===null&&L<E&&(A=el(i,b))}await A}static async*getHistory(E=0,S=1/0){for(let{key:A,value:b}of l.getRange({start:E||1,end:S})){await qa();let I=bt(b);I.tableId===n&&(yield{id:I.recordId,localTime:A,version:I.version,type:I.type,value:I.getValue(i,!0,A),user:I.user,operation:I.originatingOperation})}}static async getHistoryOfRecord(E){let S=[];if(E==null)throw new Error("An id is required");let A=i.getEntry(E);if(!A)return S;let b=A.localTime;if(!b)throw new Error("The entry does not have a local audit time");let I=0;do{await qa();let P=l.get(b);if(P){let L=bt(P);S.push({id:L.recordId,localTime:b,version:L.version,type:L.type,value:L.getValue(i,!0,b),user:L.user}),b=L.previousLocalTime}else break}while(I<1e3&&b);return S.reverse()}static cleanup(){K?.remove()}}let PE=Dg(async(V,E,S)=>{for(let A of Pe.sources)if(A.get&&(!A.get.reliesOnPrototype||A.prototype.get)){if(A.available?.(S)===!1)continue;E.source=A;let b=await A.get(V,E);if(b)return b}},()=>{throw new it.ServerError("Service unavailable, exceeded request queue limit for resolving cache record",503)});Pe.updatedAttributes();let Hf=Pe.prototype;return p&&Pe.setTTLExpiration(p/1e3),q&&Eu(),Pe;function _o(V,E,S){let A;for(let b in r){let I=r[b],P=I.isIndexing,L=Xt[b],D=S&&(L?L(S):S[b]),H=E&&(L?L(E):E[b]);if(D===H&&!P)continue;if(I.customIndex){I.customIndex.index(V,D,H);continue}A=!0;let C=I.indexNulls,x=(0,ph.getIndexedValues)(D,C),z=(0,ph.getIndexedValues)(H,C);if(s==="OrganizationRole"&&Me.default.error?.({tableName:s,id:V,key:b,valuesToAdd:x,valuesToRemove:z}),z?.length>0){let ne=new Set(z);if(x=x?x.filter(re=>{if(ne.has(re))ne.delete(re);else return!0}):[],z=Array.from(ne),(z.length>0||x.length>0)&&sk){let re=z.concat(x).map(B=>({key:B,value:V}));I.prefetch(re,ck)}for(let re=0,B=z.length;re<B;re++)I.remove(z[re],V)}else x?.length>0&&sk&&I.prefetch(x.map(ne=>({key:ne,value:V})),ck);if(x)for(let ne=0,re=x.length;ne<re;ne++)I.put(x[ne],V)}return A}o(_o,"updateIndices");function Lr(V){switch(typeof V){case"number":return!0;case"string":if(V.length<659)return!0;if(V.length>ok)throw new Error("Primary key size is too large: "+V.length);break;case"object":if(V===null)throw new Error("Invalid primary key of null");break;case"bigint":if(V<2n**64n&&V>-(2n**64n))return!0;break;default:throw new Error("Invalid primary key type: "+typeof V)}if((0,Il.writeKey)(V,Wse,0)>ok)throw new Error("Primary key size is too large: "+V.length);return!0}o(Lr,"checkValidId");function yr(V){return typeof V=="object"&&V?V.id:V}o(yr,"requestTargetToId");function kf(V){return typeof V=="object"&&V&&V.isCollection}o(kf,"isSearchTarget");function Ss(V){}o(Ss,"isRequestTarget");function _a(V,E,S,A,b){if(Pe.getResidencyById&&S.ensureLoaded&&E?.replicateFrom!==!1){let P=Dc(Pe.getResidencyById(V));if(P&&!P.includes(server.hostname)&&N)return N({key:V,residency:P}).then(b)}let I=o(()=>{if(E?.transaction?.stale&&(E.transaction.stale=!1),S.transaction?.isDone)return b(null,V);let P=i.getEntry(V,S);return E?._freezeRecords&&Object.freeze(P?.value),P?.residencyId&&P.metadataFlags&On&&N&&S.ensureLoaded&&E?.replicateFrom!==!1?N(P).then(L=>b(L,V),L=>(Me.default.error?.("Error loading remote record",V,P,S,L),b(null,V))):(P&&E&&(P?.version>(E.lastModified||0)&&(E.lastModified=P.version),P?.localTime&&!E.lastRefreshed&&(E.lastRefreshed=P.localTime)),b(P,V))},"whenPrefetched");return A?I():se>0?(se--,I()):new Promise((P,L)=>{se===0?(se--,i.prefetch([V],()=>{D(),H()})):(ce.push(V),le.push(H),ce.length>Fy&&(se--,D()));function D(){if(ce.length>0){let C=le;i.prefetch(ce,()=>{se===-1?D():se++;for(let x of C)x()}),ce=[],le=[],pe>2&&pe--}else se=pe,pe<CE&&pe++}o(D,"prefetch");function H(){try{P(I())}catch(C){L(C)}}o(H,"load")})}o(_a,"loadLocalRecord");function ga(V,E){let S=E?.checkPermission;if(typeof S!="object"){if(!V?.role)return;S=V.role.permission}if(S.super_user)return zse;let A=S[c],b,I=A?.tables;if(I)return I[s];if(c==="data"&&(b=S[s])&&!b.tables)return b}o(ga,"getTablePermissions");function Lc(V,E,S,A){if(O){let b=!1;if(S.noCache?b=!0:(E?(!E.value||E.metadataFlags&(On|tl)||E.expiresAt!=null&&E.expiresAt<Date.now())&&(b=!0):b=!0,zr(!b,"cache-hit",s)),b){let I=LE(V,E,S).then(P=>(P?.value&&P?.value.getRecord?.()&&Me.default.error?.("Can not assign a record that is already a resource"),S&&(P?.version>(S.lastModified||0)&&(S.lastModified=P.version),S.lastRefreshed=Date.now()),P));if(S?.onlyIfCached||E?.value&&A?.allowStaleWhileRevalidate?.(E,V)){if(I.catch(P=>Me.default.warn?.(P)),S?.onlyIfCached&&!A.doesExist())throw new it.ServerError("Entry is not cached",504);return}else return I}}else if(E?.value&&E.expiresAt!=null&&E.expiresAt<Date.now())return Pe.evict(E.key,E.value,E.version),E.value=null,{then(b){return b(E)}}}o(Lc,"ensureLoadedFromSource");function Dr(V){let E=V?.transaction;if(E){if(!E.lmdbDb)return E.lmdbDb=i,E;do{if(E.lmdbDb?.path===i.path)return E;let S=E.next;if(!S)return E=E.next=new To,E.lmdbDb=i,E;E=S}while(!0)}else return new ZE}o(Dr,"txnForContext");function hu(V,E,S){if(!V)return;let A=(V.deref?V.deref():V.value)??i.getEntry(V.key)?.value;if(typeof E=="object"){let I=Xt,P=A;for(let L=0,D=E.length;L<D;L++){let H=E[L],C=I?.[H];P=C&&P?C(P,S,V):P?.[H],V=null,I=C?.definition?.tableClass?.propertyResolvers}return P}let b=Xt[E];return b?b(A,S,V):A[E]}o(hu,"getAttributeValue");function pu(V,E,S,A,b){let I=b?.length,P={transaction:A,lazy:I>0||typeof E=="string"||E?.length<4,alwaysPrefetch:!0},L;function D(H,C){let x=H?.value;if(!x)return $a.SKIP;for(let z=0;z<I;z++)if(!L?.includes(z)&&!b[z](x,H))return $a.SKIP;return C!==void 0&&(H.key=C),H}if(o(D,"processEntry"),I>0||!V.hasEntries){let H=V.map(C=>{if(L=null,typeof C=="object"&&C?.key!==void 0)return I>0?D(C):C;if(C==null)return $a.SKIP;for(let x=0;x<I;x++){let ne=b[x].idFilter;if(ne){if(!ne(C))return $a.SKIP;L||(L=[]),L.push(x)}}return _a(C,S,P,!1,D)});return Array.isArray(V)&&(H=H.filter(C=>C!==$a.SKIP)),H.hasEntries=!0,H}return V}o(pu,"transformToEntries");function Sa(V,E,S=server.replication?.getThisNodeId(l)){if(V<=E?.version){if(E?.version===V&&S!==void 0){let A=server.replication?.exportIdMapping(l),b=E.localTime,I=b&&l.get(b);if(I){let P,L,D=bt(I);for(let H in A)A[H]===S&&(P=H),A[H]===D.nodeId&&(L=H);if(P>L)return 1;if(P===L)return 0}}return-1}return 1}o(Sa,"precedesExistingVersion");async function LE(V,E,S){let A=E?.metadataFlags,b=E?.version,I,P;if(!i.attemptLock(V,b,()=>{clearTimeout(P);let C=i.getEntry(V);!C||!C.value||C.metadataFlags&(On|tl)?I(LE(V,i.getEntry(V),S)):I(C)}))return new Promise(C=>{I=C,P=setTimeout(()=>{i.unlock(V,b)},Kse)});let L=E?.value,D={requestContext:S,replacingRecord:L,replacingEntry:E,replacingVersion:b,noCacheStore:!1,source:null,resourceCache:S?.resourceCache,transaction:void 0,expiresAt:void 0,lastModified:void 0},H=S?.responseHeaders;return new Promise((C,x)=>{let z;Ps(Bt(D,async ne=>{let re=performance.now(),B,de,me;try{B=await PE(V,D,E),me=A&On;let ee=D.lastModified||me&&b;ee||(ee=(0,ph.getNextMonotonicTime)()),de=me||ee>b||!L;let j=performance.now()-re;if(st(j,"cache-resolution",s,null,"success"),H&&mh(H,"Server-Timing",`cache-resolve;dur=${j.toFixed(2)}`,!0),ne.timestamp=ee,p&&D.expiresAt==null&&(D.expiresAt=Date.now()+p),B){if(typeof B!="object")throw new Error("Only objects can be cached and stored in tables");if(B.status>0&&B.headers)if(B.status>=300)if(B.status===304)B=L,ee=b;else throw new it.ServerError(B.body||"Error from source",B.status);else B=B.body;typeof B.toJSON=="function"&&(B=B.toJSON()),t&&B[t]!==V&&(B[t]=V)}z=!0,C({key:V,version:ee,value:B})}catch(ee){ee.message+=` while resolving record ${V} for ${s}`,L&&((ee.code==="ECONNRESET"||ee.code==="ECONNREFUSED"||ee.code==="EAI_AGAIN")&&!S?.mustRevalidate||S?.staleIfError&&(ee.statusCode===500||ee.statusCode===502||ee.statusCode===503||ee.statusCode===504))?(C({key:V,version:b,value:L}),Me.default.trace?.(ee.message,"(returned stale record)")):x(ee);let j=performance.now()-re;st(j,"cache-resolution",s,null,"fail"),H&&mh(H,"Server-Timing",`cache-resolve;dur=${j.toFixed(2)}`,!0),D.transaction.abort();return}if(S?.noCacheStore||D.noCacheStore){D.transaction.abort();return}Dr(D).addWrite({key:V,store:i,entry:E,nodeName:"source",before:ya(B),commit:o((ee,j)=>{if(j?.version!==b)return;let he=_o(V,L,B);if(B){Ue.put?.(D,V,B),j&&(S.previousResidency=Pe.getResidencyRecord(j.residencyId));let Te,fe=!1,We,Et=Dc(Pe.getResidency(B,S));if(Et){if(!Et.includes(server.hostname))if(Te=B,fe=!0,Pe.getResidencyById)B=void 0;else{B=null;for(let ut in r)B||(B={}),B[ut]=Te[ut]}We=Mc(Et)}Me.default.trace?.(`Writing resolved record from source with id: ${V}, timestamp: ${new Date(ee).toISOString()}`),R(V,B,j,ee,fe?On:0,g&&(de||fe)||null,{user:D?.user,expiresAt:D.expiresAt,residencyId:We},"put",!!me,Te)}else j&&(Ue.delete?.(D,V),Me.default.trace?.(`Deleting resolved record from source with id: ${V}, timestamp: ${new Date(ee).toISOString()}`),g||y?R(V,null,j,ee,0,g&&de||null,{user:D?.user},"delete",!!me):el(i,j,b))},"commit")})}),()=>{i.unlock(V,b)},ne=>{i.unlock(V,b),z&&Me.default.error?.("Error committing cache update",ne)})})}o(LE,"getFromSource");function Ta(V){if(!V||V.user?.role?.permission?.super_user)return!0;if(V.replicateTo)throw new it.ClientError("Can not specify replication parameters without super user permissions",403);if(V.replicatedConfirmation)throw new it.ClientError("Can not specify replication confirmation without super user permissions",403);return!0}o(Ta,"checkContextPermissions");function Ra(V){let E=!1;if(V&&(V-Rr>1&&(E=!0),Rr=V),!(xe===Jt&&!E)&&(Jt=xe,(0,Al.getWorkerIndex)()===(0,Al.getWorkerCount)()-1))return Mt&&clearTimeout(Mt),xe?new Promise(S=>{let A=new Date;A.setMonth(0),A.setDate(1),A.setHours(0),A.setMinutes(0),A.setSeconds(0);let b=xe/(1+Rr),I=E?Date.now():Math.ceil((Date.now()-A.getTime())/b)*b+A.getTime(),P=o(L=>{Me.default.trace?.(`Scheduled next cleanup scan at ${new Date(L)}`),Mt=setTimeout(()=>Z=Z.then(async()=>{if(P(Math.max(L+xe,Date.now())),i.rootStore.status!=="open"){clearTimeout(Mt);return}let D=50,H=new Array(D),C=0,x=Math.pow(Rr,8)*(bl.get(U.STORAGE_RECLAMATION_EVICTIONFACTOR)??1e5),z=_/Math.pow(Math.max(Rr,1),4);Me.default.info?.(`Starting cleanup scan for ${s}, evict threshold ${x}, adjusted eviction ${z}ms`);function ne(re,B,de,me){let Se=re+z-Date.now();if(Se<0)return!0;if(Rr){let ee=i.lastSize;return de&Vr&&Vc(me,j=>{j.size&&(ee+=j.size)}),Me.default.trace?.(`shouldEvict adjusted ${Se} ${ee}, ${Se*(re-B)/ee} < ${x}`),Se*(re-B)/ee<x}return!1}o(ne,"shouldEvict");try{let re=0;for(let B of i.getRange({start:!1,snapshot:!1,versions:!0,lazy:!0})){let{key:de,value:me,version:Se,expiresAt:ee,metadataFlags:j}=B,he;me===null&&!g&&Se+Vse<Date.now()?he=el(i,B,Se):ee!=null&&ne(ee,Se,j,me)&&(he=Pe.evict(de,me,Se),re++),he&&(await H[C],H[C]=he.catch(Te=>{Me.default.error?.("Cleanup error",Te)}),++C>=D&&(C=0)),await qa()}Me.default.info?.(`Finished cleanup scan for ${s}, evicted ${re} entries`)}catch(re){Me.default.warn?.(`Error in cleanup scan for ${s}:`,re)}S(void 0),Rr=0}),Math.min(L-Date.now(),2147483647)).unref()},"startNextTimer");P(I)}):void 0}o(Ra,"scheduleCleanup");function Gf(){K=l?.addDeleteRemovalCallback(n,i,(V,E)=>{i.remove(V,E)})}o(Gf,"addDeleteRemoval");function Eu(){(0,Al.getWorkerIndex)()===0&&setInterval(async()=>{if(!Pc){Pc=!0;try{let V=q.name,E=r[V];if(!E)throw new Error(`expiresAt attribute ${q} must be indexed`);for(let S of E.getRange({start:!0,values:!1,end:Date.now(),snapshot:!1})){for(let A of E.getValues(S)){let b=i.getEntry(A);b?.value?b.value[V]<Date.now()&&Pe.evict(A,b.value,b.version):i.ifVersion(A,b?.version,()=>E.remove(S,A))}await qa()}}catch(V){Me.default.error?.("Error in evicting old records",V)}finally{Pc=!1}}},$se).unref()}o(Eu,"runRecordExpirationEviction");function Dc(V){if(V!=null){if(Array.isArray(V))return V;if(typeof V=="number"){if(V>=65536)throw new Error(`Shard id ${V} must be below 65536`);let E=server.shards?.get?.(V);if(E)return Me.default.trace?.(`Shard ${V} mapped to ${E.map(S=>S.name).join(", ")}`),E.map(S=>S.name);throw new Error(`Shard ${V} is not defined`)}throw new Error(`Shard or residency list ${V} is not a valid type, must be a shard number or residency list of node hostnames`)}}o(Dc,"residencyFromFunction");function Mc(V){if(V){let E=V.join(","),S=d.get([Symbol.for("residency_by_set"),E]);return S||(d.put([Symbol.for("residency_by_set"),E],S=Math.floor(Math.random()*2147418112)+65535),d.put([Symbol.for("residency_by_id"),S],V),S)}}o(Mc,"getResidencyId");function ya(V,E){let S=xA(V,i.rootStore);if(S){let A=E;return A?async()=>{await A(),await S}:()=>S}return E}o(ya,"preCommitBlobsForRecordBefore")}function gN(e,t){let r=e.attr_object||(e.attr_object={}),n=r[t];if(n)return n;n=r[t]=Object.create(null);for(let s of e)n[s.attribute_name]=s[t];return n}function ck(){}function vg(e,t){let r=t?.type;if(e===null)return e;if(e===""&&r&&r!=="String"&&r!=="Any")return null;try{switch(r){case"Int":case"Long":if(e[0]==="$")return Mg(parseInt(e.slice(1),36));if(e==="null")return null;if(!/^-?[0-9]+$/.test(e)&&!(e instanceof Date))throw new SyntaxError;return Mg(+e);case"Float":return e==="null"?null:Mg(+e);case"BigInt":return e==="null"?null:BigInt(e);case"Boolean":return e==="true"?!0:e==="false"?!1:e;case"Date":if(isNaN(e)){if(e==="null")return null;jse.test(e)||(e+="Z");let n=new Date(e);return Mg(n.getTime()),n}return new Date(+e);case void 0:case"Any":return(0,Ug.autoCast)(e);default:return e}}catch(n){throw n.message=`Invalid value for attribute ${t.name}: "${e}", expecting ${r}`,n.statusCode=400,n}}function Mg(e){if(isNaN(e))throw new SyntaxError;return e}function lk(e,t){if(e==null)return!0;if(!Array.isArray(t))return e===t||t.startsWith?.(e);if(Array.isArray(e)){let r=e.length;if(e[r-1]===null&&r--,t.length>=r){for(let n=0;n<r;n++)if(t[n]!==e[n])return!1;return!0}return!1}else if(t[0]===e)return!0}function Ps(e,t,r){return e?.then?e.then(t,r):t(e)}function uk(e){return e!=null}function Ls(e){try{return JSON.stringify(e)}catch{return e}}function Qse(e){let t=process.pid;return e.env.readerList().slice(1).some(r=>+r.match(/\d+/)?.[0]!=t)}var $a,ph,dk,fk,bl,it,Eh,_h,Me,Il,Al,Ug,SN,kse,Gse,qse,$se,Vse,sk,Kse,ik,Yse,On,tl,Wse,ok,ak,zse,nDe,jse,qa,U_=ue(()=>{k();$a=require("lmdb"),ph=w(In()),dk=w(require("lodash")),fk=w(om());Ma();cm();bl=w(oe());lb();it=w(ge()),Eh=w(Do()),_h=w(ai());De();v_();Me=w(ri());yI();kc();Il=require("ordered-binary"),Al=w(rt());Mi();Ug=w(ie());Jc();zi();r_();hh();SN=w(require("node:fs"));Wn();g_();_N();({sortBy:kse}=dk.default),{validateAttribute:Gse}=fk.default,qse=new Uint8Array(9);qse[8]=192;$se=6e4,Vse=864e5;bl.initSync();sk=bl.get(U.STORAGE_PREFETCHWRITES),Kse=1e4,ik=1,Yse=2,On=1,tl=8,Wse=Buffer.allocUnsafeSlow(8192),ok=1978,ak=100,zse={read:!0,insert:!0,update:!0,delete:!0,isSuperUser:!0},nDe=(0,Ug.convertToMS)(bl.get(U.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE))||864e5;o(xg,"makeTable");o(gN,"attributesAsObject");o(ck,"noop");jse=/[+-][0-9]{2}:[0-9]{2}|[a-zA-Z]$/;o(vg,"coerceType");o(Mg,"rejectNaN");o(lk,"isDescendantId");qa=o(()=>new Promise(setImmediate),"rest");o(Ps,"when");o(uk,"exists");o(Ls,"stringify");o(Qse,"hasOtherProcesses")});function Bg(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Euclidean distance comparison requires an array");let r=0,n=Math.max(e.length,t.length);for(let s=0;s<n;s++){let i=e[s]||0,a=t[s]||0,c=i-a;r+=c*c}return r}function Fg(e,t){if(!Array.isArray(e)||!Array.isArray(t))throw new Error("Cosine distance comparison requires an array");let r=0,n=0,s=0,i=Math.max(e.length,t.length);for(let a=0;a<i;a++){let c=e[a]||0,l=t[a]||0;r+=c*l,n+=c*c,s+=l*l}return n=Math.sqrt(n),s=Math.sqrt(s),1-r/(n*s||1)}var hk=ue(()=>{o(Bg,"euclideanDistance");o(Fg,"cosineDistance")});var pk,Ek,nd,ji,rd,Jse,Xse,Hg,_k=ue(()=>{hk();pk=require("msgpackr"),Ek=w(ri()),nd=w(ge()),ji=(0,Ek.loggerWithTag)("HNSW"),rd=Symbol.for("entryPoint"),Jse=Symbol.for("key"),Xse=10,Hg=class{static{o(this,"HierarchicalNavigableSmallWorld")}static useObjectStore=!0;indexStore;M=16;efConstruction=100;efConstructionSearch=50;mL=1/Math.log(this.M);optimizeRouting=.5;nodesVisitedCount=0;idIncrementer;distance;constructor(t,r){this.indexStore=t,t&&(this.indexStore.encoder.useFloat32=pk.FLOAT32_OPTIONS.ALWAYS),this.distance=r?.distance==="euclidean"?Bg:Fg,r&&(r.M!==void 0&&(this.M=r.M,this.mL=1/Math.log(this.M)),r.efConstruction!==void 0&&(this.efConstruction=this.efConstructionSearch=r.efConstruction),r.efConstructionSearch!==void 0&&(this.efConstructionSearch=r.efConstructionSearch),r.mL!==void 0&&(this.mL=r.mL),r.optimizeRouting!==void 0&&(this.optimizeRouting=r.optimizeRouting))}index(t,r,n){let s=typeof t=="number"?[Jse,t]:t,i=this.indexStore.get(s);if(!i){if(!r)return;if(!this.idIncrementer){let f=0;for(let m of this.indexStore.getKeys({reverse:!0,limit:1,start:1/0,end:0}))typeof m=="number"&&(f=m);this.idIncrementer=new BigInt64Array([BigInt(f)+1n]),this.idIncrementer=new BigInt64Array(this.indexStore.getUserSharedBuffer("next-id",this.idIncrementer.buffer))}i=Number(Atomics.add(this.idIncrementer,0,1n)),this.indexStore.put(s,i)}let a=new Map,c,l=this.indexStore.get(rd);if(n?c={...this.indexStore.get(i)}:c={},r){let f=l&&this.indexStore.get(l);if(f===void 0){let _=Math.floor(-Math.log(Math.random())*this.mL),g={vector:r,level:_,primaryKey:t};for(let y=0;y<=_;y++)g[y]=[];if(this.indexStore.put(i,g),typeof i!="number")throw new Error("Invalid nodeId: "+i);ji.debug?.("setting entry point to",i),this.indexStore.put(rd,i);return}let m=c.level??Math.min(Math.floor(-Math.log(Math.random())*this.mL),Xse),h=f.level;if(m>=h){if(typeof i!="number")throw new Error("Invalid nodeId: "+i);ji.debug?.("setting entry point to",i),this.indexStore.put(rd,i)}for(;h>m;){let _=this.searchLayer(r,l,f,this.efConstruction,h);_.length>0&&(l=_[0].id,f=_[0].node),h--}let p=new Array(m+1);for(let _=0;_<=m;_++)p[_]=[];for(let _=Math.min(m,h);_>=0;_--){let g=this.searchLayer(r,l,f,this.efConstruction,_);g=g.slice(0,this.M<<1),g.length===0&&_===0&&ji.info?.("should not have zero connections for",l);let y=p[_];for(let T=0;T<g.length;T++){let{id:R,distance:N,node:O}=g[T];if(R===i)continue;let F=[];if(this.optimizeRouting){let Y=!1,q=O[_],K=1+this.optimizeRouting*(1+.5*T/this.M);for(let ce=0;ce<q.length;ce++){let{id:le,distance:se}=q[ce],pe=1+this.optimizeRouting*(1+.5*ce/this.M);for(let Ne=0;Ne<y.length;Ne++){let{id:Ue,distance:xe}=y[Ne];if(Ue===le){N*K>xe+se?Y=!0:se*pe>N+xe&&(F.push({fromId:Ue,toId:R}),F.push({fromId:R,toId:Ue}));break}}if(Y)break}if(Y)continue}else if(T>=(_>0?this.M:this.M<<1))continue;y.push({id:R,distance:N});for(let{fromId:Y,toId:q}of F){let K=d(Y);K||(K=d(Y,this.indexStore.get(Y)));for(let ce=0;ce<K[_].length;ce++)if(K[_][ce].id===q){Object.isFrozen(K[_])&&(K[_]=K[_].slice()),K[_].splice(ce,1);break}}let Z=c[_],G=Z?.find(({id:Y})=>Y===R);if(G){let Y=Z?.indexOf(G);Z.copied||(Z=[...Z],Z.copied=!0,c[_]=Z),Z.splice(Y,1)}else this.addConnection(R,d(R,O),i,_,N,d)}}this.indexStore.put(i,{vector:r,level:m,primaryKey:t,...p})}else{if(l===i){let f=c.level??0;for(let m=f;m>=0&&(l=c[m][0]?.id,l===void 0);m--);if(l===void 0){let m=-1;for(let{key:h,value:p}of this.indexStore.getRange({start:0,end:1/0}))if(p.level>m){if(l=h,p.level===f)break;m=p.level}}if(l===void 0)this.indexStore.remove(rd);else{if(typeof l!="number")throw new Error("Invalid nodeId: "+l);ji.debug?.("setting entry point to",l),this.indexStore.put(rd,l)}}this.indexStore.remove(i)}let u=new Map;if(c.level!==void 0)for(let f=0;f<=c.level;f++){let m=c[f];for(let{id:h}of m){let p=d(h,this.indexStore.get(h));for(let _=0;_<=f;_++)p[_]=p[_]?.filter(({id:g})=>g!==i),p[_].length===0&&(ji.info?.("node was left orphaned, will reindex",h),u.set(p.primaryKey,p.vector))}}function d(f,m){let h=a.get(f);return!h&&m&&(h={...m},a.set(f,h)),h}o(d,"updateNode");for(let[f,m]of a)this.indexStore.put(f,m);for(let[f,m]of u)this.index(f,m,m);this.checkSymmetry(i,this.indexStore.get(i))}getEntryPoint(){let t=this.indexStore.get(rd);if(t===void 0)return;let r=this.indexStore.get(t);return{id:t,...r}}searchLayer(t,r,n,s,i,a=this.distance){let c=new Set([r]),l=[{id:r,distance:this.distance(t,n.vector),node:n}],u=[...l];for(;l.length>0;){l.sort((h,p)=>h.distance-p.distance);let d=l.shift(),f=u[u.length-1].distance;if(d.distance>f)break;let m=d.node;for(let{id:h}of m[i]||[]){if(c.has(h)||h===void 0)continue;c.add(h);let p=this.indexStore.get(h);if(!p)continue;this.nodesVisitedCount++;let _=a(t,p.vector);if(_<f||u.length<s){let g={id:h,distance:_,node:p};l.push(g),u.push(g)}}u.sort((h,p)=>h.distance-p.distance),u.length>s&&u.splice(s,u.length-s)}return u.visited=c.size,u}search({target:t,value:r,descending:n,distance:s,comparator:i}){let a=0;switch(i){case"lt":case"le":a=r;case"sort":break;default:throw new nd.ClientError(`Can not use "${i}" comparator with HNSW`)}if(n)throw new nd.ClientError("Can not use descending sort order with HNSW");let c;if(s==="cosine")c=Fg;else if(s==="euclidean")c=Bg;else{if(s)throw new nd.ClientError("Unknown distance function");c=this.distance}if(!t)throw new nd.ClientError("A target vector must be provided for an HNSW query");if(!Array.isArray(t))throw new nd.ClientError("The target vector must be an array");let l=this.getEntryPoint();if(!l)return[];let u=l.id,d=[];for(let f=l.level;f>=0;f--)if(d=this.searchLayer(t,u,l,this.efConstructionSearch,f,c),d.length>0){let m=d[0];l=m.node,u=m.id}return a&&(d=d.filter(f=>f.distance<a)),d.map(f=>({key:f.node.primaryKey,distance:f.distance}))}checkSymmetry(t,r){if(!r)return;let n=0,s;for(;(s=r[n])&&s.length!==0;){for(let{id:i}of s){let a=this.indexStore.get(i);if(!a){ji.info?.("could not find neighbor node",a);continue}a[n]?.find(({id:l})=>l==t)||ji.info?.("asymmetry detected",a[n])}n++}}addConnection(t,r,n,s,i,a){r[s]||(r[s]=[]);let c=s===0?this.M<<1:this.M;if(this.optimizeRouting&&(c<<=2),r[s].length>=c+(c>>2)){ji.warn?.("maxConnections reached, removing some connections",c);let l=[...r[s]];l.sort((f,m)=>f.distance-m.distance);let u=l.slice(0,c),d=l.slice(c);r[s]=u;for(let f of d){let m=a(f.id)??this.indexStore.get(f.id);m&&m[s]&&(m=a(f.id,m),m[s]=m[s].filter(({id:h})=>h!==t),s===0&&m[s].length===0&&ji.info?.("should not remove last connection",t,n))}}r[s].find(({id:l})=>l===n)?ji.debug?.("already connected",t,n):r[s]=[...r[s],{id:n,distance:i}]}validateConnectivity(t=0){let r=this.getEntryPoint(),n=new Set,s=[r.id];n.add(r.id);let i=0;for(;s.length>0;){let a=s.shift(),c=this.indexStore.get(a);for(let l=t;l<=c.level;l++)for(let{id:u}of c[l]||[])i++,n.has(u)||(n.add(u),s.push(u))}return n.size!==this.totalNodes&&console.log("visited",n.size,"total",this.totalNodes),{isFullyConnected:n.size===this.totalNodes,averageConnections:i/n.size}}get totalNodes(){return Array.from(this.indexStore.getKeys({start:0,end:1/0})).length}estimateCountAsSort(){return Math.sqrt(this.indexStore.getStats().entryCount*this.efConstructionSearch)}propertyResolver(t,r,n){let s=r?.sort;if(s){let i=s.vectorDistances;if(i){let l=i.get(n);if(l)return l}else i=r.vectorDistances=s.vectorDistances=new Map;let a=this.distance;s.type&&(a=s.distance==="euclidean"?Bg:Fg);let c=a(s.target,t);return i.set(n,c),c}return t}}});var TN,gk=ue(()=>{_k();TN={HNSW:Hg}});var mt={};Oe(mt,{database:()=>ju,databaseEnvs:()=>Fo,databases:()=>ke,dropDatabase:()=>wI,dropTableMeta:()=>nie,getDatabases:()=>nt,getDefaultCompression:()=>Kg,getTables:()=>Zse,onRemovedDB:()=>Ah,onUpdatedTable:()=>Nl,readMetaDb:()=>gh,resetDatabases:()=>ld,table:()=>je,tables:()=>un});function Zse(){return $g||nt(),un||{}}function nt(){if($g)return ke;$g=!0,od=new Map;let e=(0,Vt.getHdbBasePath)()&&(0,Ht.join)((0,Vt.getHdbBasePath)(),Uc),t=(0,Vt.get)(U.DATABASES)||{};if(process.env.SCHEMAS_DATA_PATH&&(t.data={path:process.env.SCHEMAS_DATA_PATH}),e=process.env.STORAGE_PATH||(0,Vt.get)(U.STORAGE_PATH)||e&&((0,ns.existsSync)(e)?e:(0,Ht.join)((0,Vt.getHdbBasePath)(),xE)),!e)return;if((0,ns.existsSync)(e))for(let n of(0,ns.readdirSync)(e,{withFileTypes:!0})){let s=(0,Ht.basename)(n.name,".mdb");n.isFile()&&(0,Ht.extname)(n.name).toLowerCase()===".mdb"&&!t[s]?.path&&gh((0,Ht.join)(e,n.name),null,s)}if((0,ns.existsSync)((0,id.getBaseSchemaPath)())){for(let n of(0,ns.readdirSync)((0,id.getBaseSchemaPath)(),{withFileTypes:!0}))if(!n.isFile()){let s=(0,Ht.join)((0,id.getBaseSchemaPath)(),n.name),i=(0,Ht.join)((0,id.getTransactionAuditStoreBasePath)(),n.name);for(let a of(0,ns.readdirSync)(s,{withFileTypes:!0}))if(a.isFile()&&(0,Ht.extname)(a.name).toLowerCase()===".mdb"){let c=(0,Ht.join)(i,a.name);gh((0,Ht.join)(s,a.name),(0,Ht.basename)(a.name,".mdb"),n.name,c,!0)}}}if(t)for(let n in t){let s=t[n],i=s.path;if((0,ns.existsSync)(i))for(let c of(0,ns.readdirSync)(i,{withFileTypes:!0}))c.isFile()&&(0,Ht.extname)(c.name).toLowerCase()===".mdb"&&gh((0,Ht.join)(i,c.name),(0,Ht.basename)(c.name,".mdb"),n);let a=s.tables;if(a)for(let c in a){let l=a[c],u=(0,Ht.join)(l.path,(0,Ht.basename)(c+".mdb"));(0,ns.existsSync)(u)&&gh(u,c,n,null,!0)}}for(let n in ke){let s=od.get(n);if(s){let i=ke[n];n.includes("delete")&&Ir.trace(`defined tables ${Array.from(s.keys())}`);for(let a in i)s.has(a)||(Ir.trace(`delete table class ${a}`),delete i[a])}else if(delete ke[n],n==="data"){for(let i in un)delete un[i];delete un[Vg]}}let r=["hdb_temp","hdb_certificate","hdb_raw_analytics","hdb_session_will","hdb_job","hdb_license","hdb_info"];if((0,Vt.get)(U.ANALYTICS_REPLICATE)===!1?r.push("hdb_analytics"):(ke.system?.hdb_analytics?.enableAuditing(),ke.system?.hdb_analytics_hostname?.enableAuditing()),ke.system)for(let n of r)ke.system[n]&&(ke.system[n].replicate=!1);return od=null,ke}function ld(){$g=!1;for(let[,e]of Fo)e.needsDeletion=!0;nt();for(let[e,t]of Fo)if(t.needsDeletion&&!e.endsWith("system.mdb")){t.close(),Fo.delete(e);let r=ke[t.databaseName];for(let n in r)if(r[n].primaryStore.path===e){delete ke[t.databaseName],Th.forEach(i=>i(t.databaseName));break}}return ke}function gh(e,t,r=AN,n,s){let i=new RN.default(e,!1);try{let a=Fo.get(e);a?a.needsDeletion=!1:(a=(0,ad.open)(i),Fo.set(e,a));let c=new cd.default(!1),l=a.dbisDb||(a.dbisDb=a.openDB(kg.INTERNAL_DBIS_NAME,c)),u=a.auditStore;u||(n?(0,ns.existsSync)(n)&&(i.path=n,u=(0,ad.open)(i),u.isLegacy=!0):u=R_(a));let d=Ak(r),f=d[Vg],m=new Map;for(let{key:h,value:p}of l.getRange({start:!1})){let[_,g]=h.toString().split("/");g===""?g=p.name:g||(g=_,_=t,p.name||(p.name=g,p.indexed=!p.is_hash_attribute)),f?.add(_);let y=m.get(_);y||m.set(_,y={attributes:[]}),(g==null||p.is_hash_attribute)&&(y.primary=p),g!=null&&y.attributes.push(p),Object.defineProperty(p,"key",{value:h,configurable:!0})}for(let[h,p]of m){let{attributes:_,primary:g}=p;if(!g){for(let se of _)if(se.is_hash_attribute||se.isPrimaryKey){g=se;break}if(!g){Ir.warn(`Unable to find a primary key attribute on table ${h}, with attributes: ${JSON.stringify(_)}`);continue}}let y=d[h],T={},R=[],N,O,F=typeof g.audit=="boolean"?g.audit:(0,Vt.get)(U.LOGGING_AUDITLOG),Z=g.trackDeletes,G=g.expiration,Y=g.eviction,q=g.sealed,K=g.splitSegments,ce=g.replicate;if(y)T=y.indices,R=y.attributes,y.schemaVersion++;else{N=g.tableId,N?N>=(l.get(sd)||0)&&(l.putSync(sd,N+1),Ir.info(`Updating next table id (it was out of sync) to ${N+1} for ${h}`)):(g.tableId=N=l.get(sd),N||(N=1),Ir.debug("Table {tableName} missing an id, assigning {tableId}"),l.putSync(sd,N+1),l.putSync(g.key,g));let se=new cd.default(!g.is_hash_attribute,g.is_hash_attribute);if(se.compression=g.compression,se.compression){let pe=(0,Vt.get)(U.STORAGE_COMPRESSION_THRESHOLD)||yk;se.compression.threshold=pe}O=P_(a.openDB(g.key,se),a),a.databaseName=r,O.tableId=N}let le;for(let se of _){se.attribute=se.name;try{if(!se.is_hash_attribute&&(se.indexed||se.attribute&&!se.name)){if(!T[se.name]){let Ne=Ik(se.key,a,se);T[se.name]=Ne,T[se.name].indexNulls=se.indexNulls}let pe=R.find(Ne=>Ne.name===se.name);pe?R.splice(R.indexOf(pe),1,se):R.push(se),le=!0}}catch(pe){Ir.error("Error trying to update attribute",se,R,T,pe)}}for(let se of R)if(!_.find(Ne=>Ne.name===se.name)){if(se.is_hash_attribute){Ir.error("Unable to remove existing primary key attribute",se);continue}se.indexed&&(R.splice(R.indexOf(se),1),le=!0)}if(y)le&&(y.schemaVersion++,y.updatedAttributes());else{y=bk(d,h,xg({primaryStore:O,auditStore:u,audit:F,sealed:q,splitSegments:K,replicate:ce,expirationMS:G&&G*1e3,evictionMS:Y&&Y*1e3,trackDeletes:Z,tableName:h,tableId:N,primaryKey:g.name,databasePath:s?r+"/"+h:r,databaseName:r,indices:T,attributes:_,schemaDefined:g.schemaDefined,dbisDB:l})),y.schemaVersion=1;for(let se of Sh)se(y)}}return a}catch(a){throw a.message+=` opening database ${e}`,a}}function Ak(e){let t=ke[e];if(t||(e==="data"?t=ke[e]=un:e==="system"?Object.defineProperty(ke,"system",{value:t=Object.create(null),configurable:!0}):t=ke[e]=Object.create(null)),od&&!od.has(e)){let r=new Set;t[Vg]=r,od.set(e,r)}return t}function bk(e,t,r){return e[t]=r,r}function ju({database:e,table:t}){e||(e=AN),nt();let r=Ak(e),n=(0,Ht.join)((0,Vt.getHdbBasePath)(),Uc),s=(0,Vt.get)(U.DATABASES)||{};process.env.SCHEMAS_DATA_PATH&&(s.data={path:process.env.SCHEMAS_DATA_PATH});let i=t&&s[e]?.tables?.[t]?.path;n=i||s[e]?.path||process.env.STORAGE_PATH||(0,Vt.get)(U.STORAGE_PATH)||((0,ns.existsSync)(n)?n:(0,Ht.join)((0,Vt.getHdbBasePath)(),xE));let a=(0,Ht.join)(n,(i?t:e)+".mdb"),c=Fo.get(a);if(!c||c.status==="closed"){let l=new RN.default(a,!1);c=(0,ad.open)(l),Fo.set(a,c)}return c.auditStore||(c.auditStore=R_(c)),c}async function wI(e){if(!ke[e])throw new Error("Schema does not exist");let t=ke[e],r;for(let n in t)r=t[n].primaryStore.rootStore,Fo.delete(r.path),r.status==="open"&&(await r.close(),await Rh.remove(r.path));if(r||(r=ju({database:e,table:null}),r.status==="open"&&(await r.close(),await Rh.remove(r.path))),e==="data"){for(let n in un)delete un[n];delete un[Vg]}delete ke[e],Th.forEach(n=>n(e)),await UA(r)}function Ik(e,t,r){let n=r.is_hash_attribute||r.indexed.type&&TN[r.indexed.type]?.useObjectStore,s=new cd.default(!n,n),i=t.openDB(e,s);if(r.indexed.type){let a=TN[r.indexed.type];a?i.customIndex=new a(i,r.indexed):Ir.error(`The indexing type '${r.indexed.type}' is unknown`)}return i}function je(e){let{table:t,database:r,expiration:n,eviction:s,scanInterval:i,attributes:a,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,schemaDefined:m,origin:h}=e;r||(r=AN);let p=ju({database:r,table:t}),_=ke[r];Ir.trace(`Defining ${t} in ${r}`);let g=_?.[t];if(p.status==="closed")throw new Error(`Can not use a closed data store for ${t}`);let y,T,R;m==null&&(m=!0);let N=new cd.default(!1);for(let K of a)K.attribute&&!K.name?(K.name=K.attribute,K.indexed=!0):K.attribute=K.name,K.expiresAt&&(K.indexed=!0);let O,F;if(g){if(y=g.primaryKey,g.primaryStore.rootStore.status==="closed")throw new Error(`Can not use a closed data store from ${t} class`);u==null&&(u=g.splitSegments),g.attributes.splice(0,g.attributes.length,...a)}else{let K=p.auditStore;T=a.find(pe=>pe.isPrimaryKey)||{},y=T.name,T.is_hash_attribute=T.isPrimaryKey=!0,T.schemaDefined=m,T.compression=Kg(),f&&(T.trackDeletes=!0),c=T.audit=typeof c=="boolean"?c:(0,Vt.get)(U.LOGGING_AUDITLOG),n&&(T.expiration=n),s&&(T.eviction=s),u??=!1,T.splitSegments=u,typeof l=="boolean"&&(T.sealed=l),typeof d=="boolean"&&(T.replicate=d),h&&(T.origins?T.origins.includes(h)||T.origins.push(h):T.origins=[h]),Ir.trace(`${t} table loading, opening primary store`);let ce=new cd.default(!1,!0);ce.compression=T.compression;let le=t+"/";if(R=p.dbisDb=p.openDB(kg.INTERNAL_DBIS_NAME,N),q(),R.get(le))return F&&F(),ld(),je(e);let se=P_(p.openDB(le,ce),p);p.databaseName=r,se.tableId=R.get(sd),Ir.trace(`Assigning new table id ${se.tableId} for ${t}`),se.tableId||(se.tableId=1),R.put(sd,se.tableId+1),T.tableId=se.tableId,g=bk(_,t,xg({primaryStore:se,auditStore:K,audit:c,sealed:l,splitSegments:u,replicate:d,trackDeletes:f,expirationMS:n&&n*1e3,evictionMS:s&&s*1e3,primaryKey:y,tableName:t,tableId:se.tableId,databasePath:r,databaseName:r,indices:{},attributes:a,schemaDefined:m,dbisDB:R})),g.schemaVersion=1,O=!0,R.put(le,T)}let Z=g.indices;R=R||(p.dbisDb=p.openDB(kg.INTERNAL_DBIS_NAME,N)),g.dbisDB=R;let G=[];for(let{key:K,value:ce}of R.getRange({start:!0})){let[le,se]=K.toString().split("/");if(se===""&&(se=ce.name),se){if(le!==t)continue}else continue;let pe=a.find(Ue=>Ue.name===se),Ne=!pe?.indexed&&ce.indexed&&!ce.isPrimaryKey;if((!pe||Ne)&&(q(),O=!0,pe||R.remove(K),Ne)){let Ue=g.indices[le];Ue&&G.push(Ue)}}let Y=[];try{for(let K of a||[]){if((K.relationship||K.computed)&&(O=!0,K.relationship))continue;let ce=t+"/"+(K.name||"");Object.defineProperty(K,"key",{value:ce,configurable:!0});let le=R.get(ce);if(K.isPrimaryKey){if(le=le||R.get(ce=t+"/")||{},c!==void 0&&c!==g.audit||l!==void 0&&l!==g.sealed||d!==void 0&&d!==g.replicate||(+n||void 0)!==(+le.expiration||void 0)||(+s||void 0)!==(+le.eviction||void 0)||K.type!==le.type){let pe={...le};typeof c=="boolean"&&(c&&g.enableAuditing(c),pe.audit=c),n&&(pe.expiration=+n),s&&(pe.eviction=+s),l!==void 0&&(pe.sealed=l),d!==void 0&&(pe.replicate=d),K.type&&(pe.type=K.type),O=!0,q(),R.put(ce,pe)}continue}le?.attribute&&!le.name&&(le.indexed=!0);let se=!le||le.type!==K.type||JSON.stringify(le.indexed)!==JSON.stringify(K.indexed)||le.nullable!==K.nullable||le.version!==K.version||JSON.stringify(le.properties)!==JSON.stringify(K.properties)||JSON.stringify(le.elements)!==JSON.stringify(K.elements);if(K.indexed){let pe=Ik(ce,p,K);(se||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<yh.workerData?.restartNumber)&&(O=!0,q(),le=R.get(ce),(se||le.indexingPID&&le.indexingPID!==process.pid||le.restartNumber<yh.workerData?.restartNumber)&&(O=!0,K.indexNulls===void 0&&(K.indexNulls=!0),g.primaryStore.getStats().entryCount>0&&(K.lastIndexedKey=le?.lastIndexedKey??void 0,K.indexingPID=process.pid,pe.isIndexing=!0,Object.defineProperty(K,"dbi",{value:pe}),Y.push(K))),R.put(ce,K)),le?.indexNulls&&K.indexNulls===void 0&&(K.indexNulls=!0),pe.indexNulls=K.indexNulls,Z[K.name]=pe}else se&&(O=!0,q(),R.put(ce,K))}}finally{F&&F()}if(O&&(g.schemaVersion++,g.updatedAttributes()),Ir.trace(`${t} table loading, running index`),Y.length>0||G.length>0?g.indexingOperation=rie(g,Y,G):O&&Gg.signalSchemaChange(new qg.SchemaEventMsg(process.pid,"schema-change",g.databaseName,g.tableName)),g.origin=h,O)for(let K of Sh)K(g,h!=="cluster");return(n||s||i)&&g.setTTLExpiration({expiration:n,eviction:s,scanInterval:i}),Ir.trace(`${t} table loaded`),g;function q(){F||p.transactionSync(()=>({then(K){F=K}}))}o(q,"startTxn")}async function rie(e,t,r){try{Ir.info(`Indexing ${e.tableName} attributes`,t);let n=e.schemaVersion;await Gg.signalSchemaChange(new qg.SchemaEventMsg(process.pid,"schema-change",e.databaseName,e.tableName));let s;for(let u of r)s=u.drop();let i,a={},c=0,l=t.length;if(await new Promise(u=>setImmediate(u)),l>0){let u;for(let f of t)(0,ad.compareKeys)(f.lastIndexedKey,u)<0&&(u=f.lastIndexedKey),f.lastIndexedKey==null&&f.dbi.clearAsync();let d=0;for(let{key:f,value:m,version:h}of e.primaryStore.getRange({start:u,lazy:l<4,versions:!0,snapshot:!1}))if(m){if(d++,s=e.primaryStore.ifVersion(f,h,()=>{for(let p=0;p<l;p++){let _=t[p],g=_.name,y=_.dbi;try{let T=_.resolve,R=m&&(T?T(m):m[g]);if(y.customIndex){y.customIndex.index(f,R);continue}let N=(0,Sk.getIndexedValues)(R);if(N)for(let O=0,F=N.length;O<F;O++)y.put(N[O],f)}catch(T){a[g]||(a[g]=!0,Ir.error(`Error indexing attribute ${g}`,T))}}}),s.then(()=>d--,p=>{d--,Ir.error(p)}),yh.workerData&&yh.workerData.restartNumber!==Rk.restartNumber&&(i=!0),++c%100===0||i){for(let p of t)p.lastIndexedKey=f,e.dbisDB.put(p.key,p);if(i)return}d>eie?await s:d>tie&&await new Promise(p=>setImmediate(p))}for(let f of t)delete f.lastIndexedKey,delete f.indexingPID,f.dbi.isIndexing=!1,s=e.dbisDB.put(f.key,f)}await s,await Gg.signalSchemaChange(new qg.SchemaEventMsg(process.pid,"indexing-finished",e.databaseName,e.tableName)),Ir.info(`Finished indexing ${e.tableName} attributes`,t)}catch(n){Ir.error("Error in indexing",n)}}function nie({table:e,database:t}){let r=ju({database:t,table:e}),n=[],s=r.dbisDb;for(let i of s.getKeys({start:e+"/",end:e+"0"}))n.push(s.remove(i));return Promise.all(n)}function Nl(e){return Sh.push(e),{remove(){let t=Sh.indexOf(e);t>-1&&Sh.splice(t,1)}}}function Ah(e){return Th.push(e),{remove(){let t=Th.indexOf(e);t>-1&&Th.splice(t,1)}}}function Kg(){let e=(0,Vt.get)(U.STORAGE_COMPRESSION),t=(0,Vt.get)(U.STORAGE_COMPRESSION_DICTIONARY),r=(0,Vt.get)(U.STORAGE_COMPRESSION_THRESHOLD)||yk,n={startingOffset:32};return t&&(n.dictionary=Rh.readFileSync(t)),r&&(n.threshold=r),e&&n}var Vt,kg,ad,Ht,ns,id,cd,RN,Rh,yN,Sk,Gg,qg,yh,Tk,Rk,Ir,AN,Vg,yk,un,ke,sd,Sh,Th,$g,Fo,od,eie,tie,De=ue(()=>{Vt=w(oe()),kg=w(qt()),ad=require("lmdb"),Ht=require("path"),ns=require("fs"),id=w(At());U_();cd=w(Lm()),RN=w(Dm());k();Rh=w(require("fs-extra")),yN=w(ei()),Sk=w(In()),Gg=w(Do()),qg=w(ai()),yh=require("worker_threads"),Tk=w(Q()),Rk=w(rt());Mi();Jc();Wn();gk();Ir=(0,Tk.forComponent)("storage"),AN="data",Vg=Symbol("defined-tables"),yk=((0,Vt.get)(U.STORAGE_PAGESIZE)||4096)-60;(0,Vt.initSync)();un=Object.create(null),ke=Object.create(null);(0,yN._assignPackageExport)("databases",ke);(0,yN._assignPackageExport)("tables",un);sd=Symbol.for("next-table-id"),Sh=[],Th=[],Fo=new Map;o(Zse,"getTables");o(nt,"getDatabases");o(ld,"resetDatabases");o(gh,"readMetaDb");o(Ak,"ensureDB");o(bk,"setTable");o(ju,"database");o(wI,"dropDatabase");o(Ik,"openIndex");o(je,"table");eie=1e3,tie=10;o(rie,"runIndexing");o(nie,"dropTableMeta");o(Nl,"onUpdatedTable");o(Ah,"onRemovedDB");o(Kg,"getDefaultCompression")});var NN={};Oe(NN,{loadGQLSchema:()=>oie,start:()=>IN,startOnMainThread:()=>iie});function IN({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r,n,s,i){let{parse:a,Source:c,Kind:l,NamedTypeNode:u,StringValueNode:d}=await import("graphql"),f=a(new c(r.toString(),s)),m=new Map,h=[],p;for(let y of f.definitions)switch(y.kind){case l.OBJECT_TYPE_DEFINITION:let F=function(G){if(G.kind==="NonNullType"){let K=F(G.type);return K.nullable=!1,K}if(G.kind==="ListType")return{type:"array",elements:F(G.type)};let q={type:G.name?.value};return Object.defineProperty(q,"location",{value:G.loc.startToken}),q};o(F,"getProperty");let T=y.name.value,R=[],N={table:null,database:null,properties:R};m.set(T,N);for(let G of y.directives){if(G.name.value==="table"){for(let q of G.arguments)N[q.name.value]=q.value.value;N.schema&&(N.database=N.schema),N.table||(N.table=T),N.audit&&(N.audit=N.audit!=="false"),N.attributes=N.properties,h.push(N)}if(G.name.value==="sealed"&&(N.sealed=!0),G.name.value==="splitSegments"&&(N.splitSegments=!0),G.name.value==="replicate"&&(N.replicate=!0),G.name.value==="export"){N.export=!0;for(let q of G.arguments)typeof N.export!="object"&&(N.export={}),N.export[q.name.value]=q.value.value}}let O=!1,Z={};for(let G of y.fields){let Y=F(G.type);Y.name=G.name.value,R.push(Y),Z[Y.name]=void 0;for(let q of G.directives){let K=q.name.value;if(K==="primaryKey")O?console.warn("Can not define two attributes as a primary key at",q.loc):(Y.isPrimaryKey=!0,O=!0);else if(K==="indexed"){let ce={};for(let le of q.arguments||[])ce[le.name.value]=le.value.value;Y.indexed=ce}else if(K==="computed"){for(let ce of q.arguments||[])if(ce.name.value==="from"){let le=ce.value.value;Y.computed={from:g(le,ce,Z)},Y.version==null&&(Y.version=le)}else ce.name.value==="version"&&(Y.version=ce.value.value);Y.computed=Y.computed||!0}else if(K==="relationship"){let ce={};for(let le of q.arguments)ce[le.name.value]=le.value.value;Y.relationship=ce}else if(K==="createdTime")Y.assignCreatedTime=!0;else if(K==="updatedTime")Y.assignUpdatedTime=!0;else if(K==="expiresAt")Y.expiresAt=!0;else if(K==="allow"){let ce=Y.authorizedRoles=[];for(let le of q.arguments)le.name.value==="role"&&ce.push(le.value.value)}else server.knownGraphQLDirectives.includes(K)&&console.warn(`@${K} is an unknown directive, at`,q.loc)}}N.type=T,T==="Query"&&(p=N)}function _(y){let T=m.get(y.type);T?(Object.defineProperty(y,"properties",{value:T.properties}),Object.defineProperty(y,"definition",{value:T})):y.type==="array"?_(y.elements):sie.includes(y.type)||(0,wk.getWorkerIndex)()===0&&console.error(`The type ${y.type} is unknown at line ${y.location.line}, column ${y.location.column}, in ${s}`)}o(_,"connectPropertyType");for(let y of m.values())for(let T of y.properties)_(T);for(let y of h)y.tableClass=e(y),y.export&&(y.export.name===""?i.set((0,bN.dirname)(n),y.tableClass):i.set((0,bN.dirname)(n)+"/"+(y.export.name||y.type),y.tableClass,y.export));function g(y,T,R){return new Nk.Script(`function computed(attributes) { return function(record) { with(attributes) { with (record) { return ${y}; } } } } computed;`,{filename:s,lineOffset:T.loc.startToken.line-1,columnOffset:T.loc.startToken.column}).runInThisContext()(R)}o(g,"createComputedFrom")}}var bN,Nk,wk,sie,iie,oie,Ok=ue(()=>{bN=require("path"),Nk=require("node:vm");De();wk=w(rt()),sie=["ID","Int","Float","Long","String","Boolean","Date","Bytes","Any","BigInt","Blob"];server.knownGraphQLDirectives&&(server.knownGraphQLDirectives=["table","sealed","export","primaryKey","indexed","computed","relationship","createdTime","updatedTime","expiresAt","allow"]);o(IN,"start");iie=IN,oie=IN({ensureTable:je}).handleFile});var ON={};Oe(ON,{start:()=>pie});function aie(e){if(e.kind!==Fe.Kind.OPERATION_DEFINITION&&e.kind!==Fe.Kind.FRAGMENT_DEFINITION)throw new Hr(`Unexpected non-executable definition type ${e.kind}.`)}function Ck(e){if(typeof e!="object"||e===null)throw new Qi("Request body must be an object.");if(!("query"in e))throw new Qi("Request body must contain a `query` field.");if(typeof e.query!="string")throw new Qi("Request body `query` field must be a string.");if("variables"in e&&(typeof e.variables!="object"||e.variables===null))throw new Qi("Request body `variables` field must be an object.");if("operationName"in e&&typeof e.operationName!="string")throw new Qi("Request body `operationName` field must be a string.")}function wN(e){return parseInt(e.value,10)}function Lk(e){return parseFloat(e.value)}function Dk(e,t,r){let n=r.get(e.name.value);return Mk(n)?vk(n,t):{attribute:t,value:n}}function Mk(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function vk(e,t){return t=typeof t=="string"?[t]:t,Object.entries(e).flatMap(([r,n])=>(t=[...t,r],Mk(n)?vk(n,t):{attribute:t,value:n}))}function cie(e,t,r){switch(t=[...t,e.name.value],e.value.kind){case Fe.Kind.NULL:return{attribute:t,value:null};case Fe.Kind.INT:return{attribute:t,value:wN(e.value)};case Fe.Kind.FLOAT:return{attribute:t,value:Lk(e.value)};case Fe.Kind.BOOLEAN:case Fe.Kind.STRING:return{attribute:t,value:e.value.value};case Fe.Kind.VARIABLE:return Dk(e.value,t,r);case Fe.Kind.OBJECT:return Uk(e.value,t,r);case Fe.Kind.LIST:case Fe.Kind.ENUM:default:throw new Hr(`Value type, ${e.value.kind}, is not supported.`)}}function Uk(e,t,r){return e.fields.flatMap(n=>cie(n,t,r))}function lie(e,t){switch(e.value.kind){case Fe.Kind.NULL:return{attribute:e.name.value,value:null};case Fe.Kind.INT:return{attribute:e.name.value,value:wN(e.value)};case Fe.Kind.FLOAT:return{attribute:e.name.value,value:Lk(e.value)};case Fe.Kind.BOOLEAN:case Fe.Kind.STRING:return{attribute:e.name.value,value:e.value.value};case Fe.Kind.VARIABLE:return Dk(e.value,e.name.value,t);case Fe.Kind.OBJECT:return Uk(e.value,[e.name.value],t);case Fe.Kind.LIST:case Fe.Kind.ENUM:default:throw new Hr(`Argument type, ${e.value.kind}, is not supported.`)}}function uie(e,t){return e.flatMap(r=>lie(r,t))}function Yg(e,t){return e.selections.flatMap(r=>{switch(r.kind){case Fe.Kind.FIELD:return r;case Fe.Kind.FRAGMENT_SPREAD:{let n=r.name.value,s=t.get(n);if(s==null)throw new Hr(`Fragment \`${n}\` not found.`);return Yg(s.selectionSet,t)}case Fe.Kind.INLINE_FRAGMENT:return Yg(r.selectionSet,t)}})}function xk(e,t){return Yg(e,t).map(r=>r.selectionSet?.selections.length>0?{name:r.name.value,select:xk(r.selectionSet,t)}:r.name.value)}async function die(e,t,r,n){let s=Is.getMatch(e.name.value,"graphql");if(s===void 0)throw new Hr(`Resource \`${e.name.value}\` not found.`);let i=s.Resource,a={select:xk(e.selectionSet,r),conditions:uie(e.arguments,t)},c=[];n.authorize=!0;for await(let l of i.search(a,n))c.push(l);return[e.name.value,c]}function Bk(e){switch(e.kind){case Fe.Kind.NULL:return null;case Fe.Kind.INT:return wN(e);case Fe.Kind.FLOAT:return parseFloat(e.value);case Fe.Kind.STRING:case Fe.Kind.BOOLEAN:return e.value;case Fe.Kind.OBJECT:return e.fields.reduce((t,r)=>({[r.name.value]:Bk(r.value),...t}),{});case Fe.Kind.LIST:case Fe.Kind.ENUM:default:throw new Hr(`Value type, ${e.kind}, is not supported.`)}}function fie(e,t){let r=new Map;for(let n of e){let s=n.variable.name.value,i=t?.[s];if(i===void 0&&n.defaultValue!==void 0&&(i=Bk(n.defaultValue)),n.type.kind===Fe.Kind.NON_NULL_TYPE&&!(s in t)&&i===void 0)throw new Hr(`Variable $${s} is required, but not provided.`);r.set(n.variable.name.value,i??null)}return r}async function mie(e,t,r,n){if(e.operation===Fe.OperationTypeNode.SUBSCRIPTION)throw new Hr("Subscriptions are not supported.");if(e.operation===Fe.OperationTypeNode.MUTATION)throw new Hr("Mutations are not supported yet.");let s=fie(e.variableDefinitions,t),i=await Promise.all(Yg(e.selectionSet,r).map(c=>die(c,s,r,n))),a={data:{}};for(let[c,l]of i)a.data[c]=l;return a}async function Pk({query:e,variables:t={},operationName:r},n){let s=Fe.parse(e),i=new Map,a=new Map;for(let u of s.definitions)if(aie(u),u.kind===Fe.Kind.FRAGMENT_DEFINITION)a.set(u.name.value,u);else{if(u.name===void 0&&s.definitions.length>1)throw new Hr("Unnamed operations are only allowed when there is a single operation in the document.");let d=u.name?.value??"Unnamed Query";if(i.has(d))throw new Hr(`Duplicate operation definition: ${d}`);i.set(d,u)}let c;if(r==null)if(i.size===1)c=i.entries().next().value[1];else throw new Hr("Operation name is required when there are multiple operations in the document.");else if(c=i.get(r),c==null)throw new Hr(`Operation \`${r}\` not found.`);let l=await mie(c,t,a,n);return{status:200,headers:{"Content-Type":"application/graphql-response+json; charset=utf-8"},body:JSON.stringify(l)}}async function hie(e){switch(e.method){case"GET":{let t=new URLSearchParams(e.url.split("?")[1]),r={};for(let[n,s]of t)r[n]=n==="variables"||n==="extensions"?JSON.parse(s):s;return Ck(r),Pk(r,e)}case"POST":{let r=await Ao(e.headers.get("content-type"),!0)(e._nodeRequest);return Ck(r),Pk(r,e)}default:throw new Qi("Method Not Allowed",405,{Allow:"GET, POST"})}}function pie(e){e.server.http(async(t,r)=>{if(!t.url.startsWith("/graphql"))return r(t);try{return await hie(t)}catch(n){logger.error(n);let s=t.headers.get("accept")??"application/graphql-response+json";switch(s){case"application/json":{if(n instanceof Qi)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json",...n.headers}};if(n instanceof Fe.GraphQLError)return{status:200,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/json"}};if(n instanceof Hr)return{status:200,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/json"}};break}default:logger.info(`Unsupported accept header, ${s}, defaulting to application/graphql-response+json`);case"application/graphql-response+json":{if(n instanceof Qi)return{status:n.statusCode,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json",...n.headers}};if(n instanceof Fe.GraphQLError)return{status:400,body:JSON.stringify({errors:[n]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Hr)return{status:400,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};if(n instanceof Error)return{status:500,body:JSON.stringify({errors:[{message:n.message}]}),headers:{"Content-Type":"application/graphql-response+json"}};break}}throw n}},{port:e.port,securePort:e.securePort})}var Fe,Hr,Qi,Fk=ue(()=>{Fe=w(require("graphql"));bo();ku();o(aie,"assertExecutableDefinitionNode");o(Ck,"assertRequestParams");o(wN,"processIntValueNode");o(Lk,"processFloatValueNode");o(Dk,"processVariableNode");o(Mk,"isObject");o(vk,"transformObjectIntoQueryCondition");o(cie,"processObjectFieldNode");o(Uk,"processObjectValueNode");o(lie,"processArgumentNode");o(uie,"buildConditionsQuery");o(Yg,"fillInFragments");o(xk,"buildSelectQuery");o(die,"processFieldNode");o(Bk,"processConstValueNode");o(fie,"resolveVariables");o(mie,"executeOperation");o(Pk,"resolver");Hr=class extends Error{static{o(this,"GraphQLQueryingError")}},Qi=class extends Error{static{o(this,"HTTPError")}statusCode;headers;constructor(t,r=400,n={}){super(t),this.statusCode=r,this.headers=n}};o(hie,"graphqlQueryingHandler");o(pie,"start")});var Vk=M((NDe,$k)=>{var ud=require("validate.js"),kk=ct(),dd=(k(),v(W)),{handleHDBError:Eie,hdbErrors:_ie}=ge(),{HDB_ERROR_MSGS:tr,HTTP_STATUS_CODES:gie}=_ie,CN=o(()=>({role:{presence:!0,format:"[\\w\\-\\_]+"},id:{presence:!0,format:"[\\w\\-\\_]+"},permission:{presence:!0}}),"constraintsTemplate"),Sie={STRUCTURE_USER:"structure_user"},Hk=Object.values(dd.ROLE_TYPES_ENUM),Tie="attribute_permissions",Rie="attribute_name",{PERMS_CRUD_ENUM:fd}=dd,yie=[Tie,...Object.values(fd)],Gk=[fd.READ,fd.INSERT,fd.UPDATE],Aie=[Rie,...Gk];function bie(e){let t=CN();return t.role.presence=!0,t.id.presence=!1,t.permission.presence=!0,qk(e,t)}o(bie,"addRoleValidation");function Iie(e){let t=CN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!0,qk(e,t)}o(Iie,"alterRoleValidation");function Nie(e){let t=CN();return t.role.presence=!1,t.id.presence=!0,t.permission.presence=!1,kk.validateObject(e,t)}o(Nie,"dropRoleValidation");var wie=["operation","role","id","permission","hdb_user","access"];function qk(e,t){let r={main_permissions:[],schema_permissions:{}},n=Object.keys(e),s=[];for(let a=0,c=n.length;a<c;a++)wie.includes(n[a])||s.push(n[a]);s.length>0&&fr(tr.INVALID_ROLE_JSON_KEYS(s),r);let i=kk.validateObject(e,t);if(i&&i.message.split(",").forEach(a=>{fr(a,r)}),e.permission){let a=Oie(e);a&&fr(a,r),Hk.forEach(c=>{e.permission[c]&&!ud.isBoolean(e.permission[c])&&fr(tr.SU_CU_ROLE_BOOLEAN_ERROR(c),r)})}for(let a in e.permission)if(Hk.indexOf(a)<0){if(a===Sie.STRUCTURE_USER){let l=e.permission[a];if(typeof l=="boolean")continue;if(Array.isArray(l)){for(let u=0,d=l.length;u<d;u++){let f=l[u];global.hdb_schema[f]||fr(tr.SCHEMA_NOT_FOUND(f),r)}continue}fr(tr.STRUCTURE_USER_ROLE_TYPE_ERROR(a),r);continue}let c=e.permission[a];if(!a||!global.hdb_schema[a]){fr(tr.SCHEMA_NOT_FOUND(a),r);continue}if(c.tables)for(let l in c.tables){let u=c.tables[l];if(!l||!global.hdb_schema[a][l]){fr(tr.TABLE_NOT_FOUND(a,l),r);continue}if(Object.keys(u).forEach(d=>{yie.includes(d)||fr(tr.INVALID_PERM_KEY(d),r,a,l)}),Object.values(fd).forEach(d=>{ud.isDefined(u[d])?ud.isBoolean(u[d])||fr(tr.TABLE_PERM_NOT_BOOLEAN(d),r,a,l):fr(tr.TABLE_PERM_MISSING(d),r,a,l)}),u.attribute_permissions===void 0){fr(tr.ATTR_PERMS_ARRAY_MISSING,r,a,l);continue}else if(!(Array.isArray(u.attribute_permissions)||u.attribute_permissions===null)){fr(tr.ATTR_PERMS_NOT_ARRAY,r,a,l);continue}if(u.attribute_permissions){let d=global.hdb_schema[a][l].attributes.map(({attribute:m})=>m),f={read:!1,insert:!1,update:!1};for(let m in u.attribute_permissions){let h=u.attribute_permissions[m];if(Object.keys(h).forEach(_=>{!Aie.includes(_)&&_!==fd.DELETE&&fr(tr.INVALID_ATTR_PERM_KEY(_),r,a,l)}),!ud.isDefined(h.attribute_name)){fr(tr.ATTR_PERM_MISSING_NAME,r,a,l);continue}let p=h.attribute_name;if(!d.includes(p)){fr(tr.INVALID_ATTRIBUTE_IN_PERMS(p),r,a,l);continue}Gk.forEach(_=>{ud.isDefined(h[_])?ud.isBoolean(h[_])||fr(tr.ATTR_PERM_NOT_BOOLEAN(_,p),r,a,l):fr(tr.ATTR_PERM_MISSING(_,p),r,a,l)}),!f.read&&h.read===!0&&(f.read=!0),!f.insert&&h.insert===!0&&(f.insert=!0),!f.update&&h.update===!0&&(f.update=!0)}if(u.read===!1&&f.read===!0||u.insert===!1&&f.insert===!0||u.update===!1&&f.update===!0){let m=`${a}.${l}`;fr(tr.MISMATCHED_TABLE_ATTR_PERMS(m),r,a,l)}}}}return Cie(r)}o(qk,"customValidate");$k.exports={addRoleValidation:bie,alterRoleValidation:Iie,dropRoleValidation:Nie};function Oie(e){let{operation:t,permission:r}=e;if(t===dd.OPERATIONS_ENUM.ADD_ROLE||t===dd.OPERATIONS_ENUM.ALTER_ROLE){let n=r.super_user===!0,s=r.cluster_user===!0;if(Object.keys(r).length>1&&(n||s)){if(s&&n)return tr.SU_CU_ROLE_COMBINED_ERROR;{let a=r.super_user?dd.ROLE_TYPES_ENUM.SUPER_USER:dd.ROLE_TYPES_ENUM.CLUSTER_USER;return tr.SU_CU_ROLE_NO_PERMS_ALLOWED(a)}}}return null}o(Oie,"validateNoSUPerms");function Cie(e){let{main_permissions:t,schema_permissions:r}=e;if(t.length>0||Object.keys(r).length>0){let n={error:tr.ROLE_PERMS_ERROR,...e};return Eie(new Error,n,gie.BAD_REQUEST)}else return null}o(Cie,"generateRolePermResponse");function fr(e,t,r,n){if(!r)t.main_permissions.push(e);else{let s=n?r+"_"+n:r;t.schema_permissions[s]?t.schema_permissions[s].push(e):t.schema_permissions[s]=[e]}}o(fr,"addPermError")});var Ih=M((CDe,zk)=>{"use strict";var Kk=vn(),Yk=cn(),Pie=Sl(),LN=Vk(),DN=Do(),ODe=require("uuid").v4,Lie=require("util"),Wg=(k(),v(W)),Die=ie(),MN=Yk.searchByValue,Mie=Yk.searchByHash,vie=Lie.promisify(Pie.delete),Uie=ci(),xie=Wu(),{hdbErrors:Bie,handleHDBError:wl}=ge(),{HDB_ERROR_MSGS:Wk,HTTP_STATUS_CODES:bh}=Bie,{UserEventMsg:vN}=ai();zk.exports={addRole:Fie,alterRole:Hie,dropRole:kie,listRoles:Gie};function PN(e){try{e.hdb_auth_header&&delete e.hdb_auth_header,e.HDB_INTERNAL_PATH&&delete e.HDB_INTERNAL_PATH,e.operation&&delete e.operation,e.hdb_user&&delete e.hdb_user}catch{}return e}o(PN,"scrubRoleDetails");async function Fie(e){let t=LN.addRoleValidation(e);if(t)throw t;e=PN(e);let r={schema:"system",table:"hdb_role",search_attribute:"role",search_value:e.role,hash_attribute:"id",get_attributes:["*"]},n;try{n=Array.from(await MN(r)||[])}catch(i){throw wl(i)}if(n&&n.length>0)throw wl(new Error,Wk.ROLE_ALREADY_EXISTS(e.role),bh.CONFLICT,void 0,void 0,!0);e.id||(e.id=e.role);let s={operation:"insert",schema:"system",table:"hdb_role",hash_attribute:"id",records:[e]};return await Kk.insert(s),DN.signalUserChange(new vN(process.pid)),e=PN(e),e}o(Fie,"addRole");async function Hie(e){let t=LN.alterRoleValidation(e);if(t)throw t;e=PN(e);let r={operation:"update",schema:"system",table:"hdb_role",records:[e]},n;try{n=await Kk.update(r)}catch(s){throw wl(s)}if(n&&n?.message==="updated 0 of 1 records")throw wl(new Error,"Invalid role id",bh.BAD_REQUEST,void 0,void 0,!0);return await DN.signalUserChange(new vN(process.pid)),e}o(Hie,"alterRole");async function kie(e){let t=LN.dropRoleValidation(e);if(t)throw wl(new Error,t,bh.BAD_REQUEST,void 0,void 0,!0);let r=new xie(Wg.SYSTEM_SCHEMA_NAME,Wg.SYSTEM_TABLE_NAMES.ROLE_TABLE_NAME,[e.id],["role"]),n=Array.from(await Mie(r));if(n.length===0)throw wl(new Error,Wk.ROLE_NOT_FOUND,bh.NOT_FOUND,void 0,void 0,!0);let s=new Uie(Wg.SYSTEM_SCHEMA_NAME,Wg.SYSTEM_TABLE_NAMES.USER_TABLE_NAME,"role",e.id,void 0,["username","active"]),i=Array.from(await MN(s)),a=!1;if(Die.isEmptyOrZeroLength(i)===!1){for(let l=0;l<i.length;l++)if(i[l].active===!0){a=!0;break}}if(a===!0)throw wl(new Error,`Cannot drop role ${n[0].role} as it has active user(s) tied to this role`,bh.CONFLICT,void 0,void 0,!0);let c={table:"hdb_role",schema:"system",hash_values:[e.id]};return await vie(c),DN.signalUserChange(new vN(process.pid)),`${n[0].role} successfully deleted`}o(kie,"dropRole");async function Gie(){return MN({table:"hdb_role",schema:"system",hash_attribute:"id",search_attribute:"id",search_value:"*",get_attributes:["*"]})}o(Gie,"listRoles")});var UN={};Oe(UN,{start:()=>Jk,startOnMainThread:()=>Vie});function Jk({ensureTable:e}){return{handleFile:t,setupFile:t};async function t(r){let n=(0,jk.parseDocument)(r.toString(),{simpleKeys:!0}).toJSON();for(let s in n){let i=n[s];i.permission||(i={permission:i},i.permission.access&&(i.access=i.permission.access,delete i.permission.access));for(let a in i.permission){if(qie.includes(a))continue;let c=i.permission[a];c.tables||(i.permission[a]=c={tables:c});for(let l in c.tables){let u=c.tables[l];if(u.read=!!u.read,u.insert=!!u.insert,u.update=!!u.update,u.delete=!!u.delete,u.attributes){let d=[];for(let f in u.attributes){let m=u.attributes[f];m.attribute_name=f,d.push(m)}u.attribute_permissions=d,delete u.attributes}if(u.attribute_permissions){if(!Array.isArray(u.attribute_permissions))throw new Error("attribute_permissions must be an array if defined");for(let d of u.attribute_permissions)d.read=!!d.read,d.insert=!!d.insert,d.update=!!d.update}else u.attribute_permissions=null}}i.role=i.id=s,await $ie(i)}}}async function $ie(e){let t=nt().system.hdb_role;for await(let r of t.search([{attribute:"role",value:e.role}])){let{__createdtime__:n,__updatedtime__:s,...i}=r;return(0,Qk.isEqual)(i,e)?void 0:(e.id=r.id,(0,zg.alterRole)(e))}return(0,zg.addRole)(e)}var zg,jk,Qk,qie,Vie,Xk=ue(()=>{De();zg=w(Ih()),jk=require("yaml"),Qk=require("lodash"),qie=["super_user","cluster_user","structure_user"];o(Jk,"start");o($ie,"ensureRole");Vie=Jk});async function jg(e){let t=(0,tG.pathToFileURL)(e).toString();if(Kie)return Nh||(Nh=Yie(zie)),(await(await Nh).import(t)).namespace;try{return await import(t)}catch(r){try{(await import("internal/util")).default.decorateErrorStack(r)}catch{}throw r}}async function Yie(e){let{StaticModuleRecord:t}=await import("@endo/static-module-record");return require("ses"),lockdown({domainTaming:"unsafe",consoleTaming:"unsafe",errorTaming:"unsafe",errorTrapping:"none",stackFiltering:"verbose"}),Nh=new Compartment({console,Math,Date,fetch:Wie,...e()},{},{name:"h-dapp",resolveHook(r,n){return r==="harperdb"?"harperdb":(r=new URL(r,n).toString(),(0,eG.extname)(r)||(r+=".js"),r)},importHook:o(async r=>{if(r==="harperdb")return{imports:[],exports:["Resource","tables","databases"],execute(s){s.Resource=xr,s.tables=un,s.databases=ke}};let n=await(0,Zk.readFile)(new URL(r),{encoding:"utf-8"});return new t(n,r)},"importHook")}),Nh}function Wie(e,t){let r=typeof e=="string"||e.url;if(new URL(r).protocol!="https")throw new Error("Only https is allowed in fetch");return fetch(e,t)}function zie(){return{Resource:xr,tables:un}}var Zk,eG,tG,Kie,Nh,xN=ue(()=>{Ma();De();Zk=require("fs/promises"),eG=require("path"),tG=require("url"),Kie=!1;o(jg,"secureImport");o(Yie,"getCompartment");o(Wie,"secureOnlyFetch");o(zie,"getGlobalVars")});var BN={};Oe(BN,{handleApplication:()=>jie,suppressHandleApplicationWarning:()=>Qie});function nG(e){return typeof e=="function"&&("get"in e||"put"in e||"post"in e||"delete"in e)}async function jie(e){e.handleEntry(t=>{if(t.entryType!=="file"){e.logger.warn(`jsResource plugin cannot handle entry type ${t.entryType}. Modify the 'files' option in ${e.configFilePath} to only include files.`);return}if(t.eventType!=="add"){e.requestRestart();return}jg(t.absolutePath).then(r=>{let n=(0,rG.dirname)(t.urlPath).replace(/\\/g,"/").replace(/^\/$/,"");nG(r.default)&&(e.resources.set(n,r.default),e.logger.debug(`Registered root resource: ${n}`)),sG(e,r,n)}).catch(r=>{e.logger.error(`Failed to load resource module ${t.absolutePath}: ${r}`),e.requestRestart()})})}function sG(e,t,r){for(let n in t){let s=t[n],i=`${r}/${n}`;nG(s)?(e.resources.set(i,s),e.logger.debug(`Registered resource: ${i}`)):typeof s=="object"&&sG(e,s,i)}}var rG,Qie,iG=ue(()=>{xN();rG=require("path");o(nG,"isResource");o(jie,"handleApplication");o(sG,"recurseForResources");Qie=!0});var HN={};Oe(HN,{start:()=>Jie});function Jie({resources:e}){e.set("login",FN),e.loginPath=t=>"/login?redirect="+encodeURIComponent(t.url)}var FN,oG=ue(()=>{Ma();o(Jie,"start");FN=class extends xr{static{o(this,"Login")}static async get(t,r,n){}static async post(t,r,n){let{username:s,password:i,redirect:a}=r;return{data:await n.login(s,i)}}}});function dG(e){let t={openapi:Xie,info:{title:"HarperDB HTTP REST interface",version:uG.packageJson.version},paths:{},components:{schemas:{},securitySchemes:{basicAuth:{type:"http",scheme:"basic"},bearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}}},r=[{basicAuth:[],bearerAuth:[]}];for(let[,n]of e){if(!n.path||n.Resource.isError)continue;let{path:s}=n,i=s.split("/").slice(-1),{attributes:a,primaryKey:c,prototype:l}=n.Resource;if(c=c??"id",!c)continue;let u={},d=[];if(a)for(let{type:R,name:N,elements:O,relationship:F,definition:Z}of a){if(F)R==="array"?u[N]={type:"array",items:{$ref:Va+O.type}}:u[N]={$ref:Va+R};else{let G=Z??O?.definition;if(G){if(!t.components.schemas[G.type]){let Y={};G.properties.forEach(q=>{Y[q.name]=new $N(kN[q.type],q.type)}),t.components.schemas[G.type]=new lG(Y)}R==="array"?u[N]={type:"array",items:{$ref:Va+G.type}}:u[N]={$ref:Va+G.type}}else R==="array"?O.type==="Any"||O.type=="ID"?u[N]={type:"array",items:{format:O.type}}:u[N]={type:"array",items:new $N(kN[O.type],O.type)}:R==="Any"||R=="ID"?u[N]={format:R}:u[N]=new $N(kN[R],R)}d.push(new VN(N,"query",u[N]))}let f=Object.keys(u),m=new VN(c,"path",{format:"ID"});m.required=!0,m.description="primary key of record";let h=new VN("property","path",{enum:f});h.required=!0,t.components.schemas[i]=new lG(u);let p=l.post!==Resource.prototype.post||l.update,_=typeof l.put=="function",g=typeof l.get=="function",y=typeof l.delete=="function",T="/"+s+"/";p&&(t.paths[T]={},t.paths[T].post=new Zie(i,r,"create a new record auto-assigning a primary key")),g&&(t.paths[T]||(t.paths[T]={}),t.paths[T].get=new GN(d,r,{200:new qN({$ref:Va+i})},"search for records by the specified property name and value pairs")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new cG(d,r,"delete all the records that match the provided query",{204:new aG})),T="/"+s+"/{"+c+"}",g&&(t.paths[T]={},t.paths[T].get=new GN([m],r,{200:new qN({$ref:Va+i})},"retrieve a record by its primary key")),_&&(t.paths[T]||(t.paths[T]={}),t.paths[T].put=new eoe([m],r,i,"create or update the record with the URL path that maps to the record's primary key")),y&&(t.paths[T]||(t.paths[T]={}),t.paths[T].delete=new cG([m],r,"delete a record with the given primary key",{204:new aG})),g&&h.schema.enum.length>0&&(T="/"+s+"/{"+c+"}.{property}",t.paths[T]={},t.paths[T].get=new GN([m,h],r,{200:new qN({enum:f})},"used to retrieve the specified property of the specified record"))}return t}function Zie(e,t,r){this.description=r,this.requestBody={content:{"application/json":{schema:{$ref:Va+e}}}},this.security=t,this.responses={200:{description:KN,headers:{Location:{description:"primary key of new record",schema:{type:"string",format:"ID"}}},content:{"application/json":{schema:{type:"string",format:"ID"}}}}}}function GN(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.responses=r}function qN(e){this.description=KN,this.content={"application/json":{schema:e}}}function aG(){this.description="successfully processed request, no content returned to client"}function eoe(e,t,r,n){this.description=n,this.parameters=e,this.security=t,this.requestBody={content:{"application/json":{schema:{$ref:Va+r}}}},this.responses={200:{description:KN}}}function cG(e,t,r,n){this.description=r,this.parameters=e,this.security=t,this.responses=n}function lG(e){this.type="object",this.properties=e}function $N(e,t){this.type=e,this.format=t}function VN(e,t,r){this.name=e,this.in=t,this.schema=r}var uG,Xie,kN,Va,KN,fG=ue(()=>{uG=w(Rt()),Xie="3.0.3",kN={Int:"integer",Float:"number",Long:"integer",String:"string",Boolean:"boolean",Date:"string",Bytes:"string",BigInt:"integer",array:"array"},Va="#/components/schemas/",KN="successful operation";o(dG,"generateJsonApi");o(Zie,"Post");o(GN,"Get");o(qN,"Response200");o(aG,"Response204");o(eoe,"Put");o(cG,"Delete");o(lG,"ResourceSchema");o($N,"Type");o(VN,"Parameter")});var hG={};Oe(hG,{Request:()=>Ka,createReuseportFd:()=>Qg});var mG,Ka,YN,WN,Qg,wh=ue(()=>{mG=require("os"),Ka=class{static{o(this,"Request")}#e;constructor(t,r){this.method=t.method;let n=t.url;this._nodeRequest=t,this._nodeResponse=r,this.url=n,this.headers=new WN(t.headers)}get absoluteURL(){return this.protocol+"://"+this.host+this.url}get pathname(){let t=this.url.indexOf("?");return t>-1?this.url.slice(0,t):this.url}set pathname(t){let r=this.url.indexOf("?");r>-1?this.url=t+this.url.slice(r):this.url=t}get protocol(){return this._nodeRequest.socket.encrypted?"https":"http"}get ip(){return this._nodeRequest.socket.remoteAddress}get authorized(){return this._nodeRequest.socket.authorized}get peerCertificate(){return this._nodeRequest.socket.getPeerCertificate()}get mtlsConfig(){return this._nodeRequest.socket.server.mtlsConfig}get body(){return this.#e||(this.#e=new YN(this._nodeRequest))}get host(){return this._nodeRequest.authority||this._nodeRequest.headers.host}get httpVersion(){return this._nodeRequest.httpVersion}get isAborted(){return!1}sendEarlyHints(t,r={}){r.link=t,this._nodeResponse.writeEarlyHints(r)}},YN=class{static{o(this,"RequestBody")}#e;constructor(t){this.#e=t}on(t,r){return this.#e.on(t,r),this}pipe(t,r){return this.#e.pipe(t,r)}},WN=class{constructor(t){this.asObject=t}static{o(this,"Headers")}set(t,r){this.asObject[t.toLowerCase()]=r}get(t){return this.asObject[t.toLowerCase()]}has(t){return this.asObject.hasOwnProperty(t.toLowerCase())}[Symbol.iterator](){return Object.entries(this.asObject)[Symbol.iterator]()}keys(){return Object.keys(this.asObject)}values(){return Object.values(this.asObject)}delete(t){delete this.asObject[t.toLowerCase()]}forEach(t){for(let[r,n]of this)t(n,r,this)}};(0,mG.platform)()!="win32"&&(Qg=require("node-unix-socket").createReuseportFd)});var Xg={};Oe(Xg,{parseHeaderValue:()=>jN,start:()=>noe});async function roe(e,t){let r=e.headers.asObject,n=r.accept==="text/event-stream",s=n?"CONNECT":e.method;e.search&&M_(e);let i=new Cs;try{e.responseHeaders=i;let a=e.url.slice(1),c,l;if(a!==pG){let g=Jg.getMatch(a,n?"sse":"rest");if(!g)return t(e);e.handlerPath=g.path,c=new si(g.relativeURL),c.async=!0,l=g.Resource}if(l?.isCaching){let g=r["cache-control"];if(g){let y=jN(g);for(let T of y)switch(T.name){case"max-age":e.expiresAt=T.value*1e3+Date.now();break;case"only-if-cached":e.onlyIfCached=!0;break;case"no-cache":e.noCache=!0;break;case"no-store":e.noCacheStore=!0;break;case"stale-if-error":e.staleIfError=!0;break;case"must-revalidate":e.mustRevalidate=!0;break}}}let u=r["x-replicate-to"];if(u){let g=jN(u).map(y=>(y.next?.name==="confirm"&&y.next.value>=0&&(e.replicatedConfirmation=+y.next.value),y.name));e.replicateTo=g.length===1&&+g[0]>=0?+g[0]:g[0]==="*"?void 0:g}r["x-replicate-from"]==="none"&&(e.replicateFrom=!1);let f=await Bt(e,()=>{if(r["content-length"]||r["transfer-encoding"])try{e.data=Ao(r["content-type"],!0)(e.body,e.headers)}catch(g){throw new md.ClientError(g,400)}if(e.authorize=!0,a===pG&&s==="GET"){if(e?.user?.role?.permission?.super_user)return dG(Jg);throw new md.ServerError("Forbidden",403)}switch(c.checkPermission=e.user?.role?.permission??{},s){case"GET":case"HEAD":return l.get(c,e);case"POST":return l.post(c,e.data,e);case"PUT":return l.put(c,e.data,e);case"DELETE":return l.delete(c,e);case"PATCH":return l.patch(c,e.data,e);case"OPTIONS":i.setIfNone("Allow","GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS, TRACE, QUERY, COPY, MOVE");return;case"CONNECT":return l.connect(c,null,e);case"TRACE":return"HarperDB is the terminating server";case"QUERY":return l.query(c,e.data,e);case"COPY":return l.copy(c,r.destination,e);case"MOVE":return l.move(c,r.destination,e);case"BREW":throw new md.ClientError("HarperDB is short and stout and can't brew coffee",418);default:throw new md.ServerError(`Method ${s} is not recognized`,501)}}),m=200,h;if(f==null)m=s==="GET"||s==="HEAD"?404:204,zN.lastModified&&e.lastModified&&i.setIfNone("Last-Modified",new Date(e.lastModified).toUTCString());else if(f.status>0&&f.headers){let g=ek(f.headers,i);return f.headers!==g&&(f.headers=g),f.data!==void 0&&(f.body=hm(f.data,e,f)),f}else if(h=e.lastModified){toe[0]=h;let g=String.fromCharCode(34,(jr[0]&63)+62,(jr[0]>>6)+(jr[1]<<2&63)+62,(jr[1]>>4)+(jr[2]<<4&63)+62,(jr[2]>>2)+62,(jr[3]&63)+62,(jr[3]>>6)+(jr[4]<<2&63)+62,(jr[4]>>4)+(jr[5]<<4&63)+62,(jr[5]>>2)+62,(jr[6]&63)+62,(jr[6]>>6)+(jr[7]<<2&63)+62,34),y=r["if-none-match"];y&&g==y?(f?.onDone&&f.onDone(),m=304,f=void 0):i.setIfNone("ETag",g),zN.lastModified&&i.setIfNone("Last-Modified",new Date(h).toUTCString())}e.createdResource&&(m=201),e.newLocation&&i.setIfNone("Location",e.newLocation);let p={status:m,headers:i,body:void 0},_=e.loadedFromSource??f?.wasLoadedFromSource?.();return _!==void 0&&(p.wasCacheMiss=_,!_&&h&&i.setIfNone("Age",Math.round((Date.now()-(e.lastRefreshed||h))/1e3))),f!==void 0&&(p.body=hm(f,e,p),s==="HEAD"&&(p.body=void 0)),p}catch(a){a.statusCode?a.statusCode===500?fi.warn(a):fi.info(a):fi.error(a),a.statusCode===405&&(a.method&&(a.message+=` to handle HTTP method ${a.method.toUpperCase()||""}`),a.allow&&(a.allow.push("trace","head","options"),i.setIfNone("Allow",a.allow.map(l=>l.toUpperCase()).join(", "))));let c={status:a.statusCode||500,headers:i,body:void 0};return c.body=hm(a.contentType?a:gG(a),e,c),c}}function noe(e){zN=e,e.includeExpensiveRecordCountEstimates&&(Ka.prototype.includeExpensiveRecordCountEstimates=!0),!EG&&(EG=!0,Jg=e.resources,e.server.http(async(t,r)=>{if(!t.isWebSocket)return roe(t,r)},e),e.webSocket!==!1&&e.server.ws(async(t,r,n)=>{Oh++;let s=new Yn;_G||(_G=!0,fh(l=>{Oh>0&&l.push({metric:"ws-connections",connections:Oh,byThread:!0})}));let i;t.on("error",l=>{i=!0,fi.warn(l)});let a;t.on("message",o(function(u){a||(a=Ao(r.requestedContentType??r.headers.asObject["content-type"],!1));let d=a(u);st(u.length,"bytes-received",r.handlerPath,"message","ws"),s.push(d)},"message"));let c;t.on("close",()=>{Oh--,zr(!i,"connection","ws","disconnect"),s.emit("close"),c&&c.return()});try{await n;let l=r.url.slice(1),u=Jg.getMatch(l,"ws");if(zr(!!u,"connection","ws","connect"),u){r.handlerPath=u.path,st(p=>({count:p.count,total:Oh}),"connections",r.handlerPath,"connect","ws"),r.authorize=!0;let d=new si(u.relativeURL);d.checkPermission=r.user?.role?.permission??{};let f=u.Resource;c=(await Bt(r,()=>f.connect(d,s,r)))[Symbol.asyncIterator]();let h;for(;!(h=await c.next()).done;){let p=await wa(h.value,r);t.send(p),st(p.length,"bytes-sent",r.handlerPath,"message","ws"),t._socket.writableNeedDrain&&await new Promise(_=>t._socket.once("drain",_))}}else return t.close(1011,`No resource was found to handle ${r.pathname}`)}catch(l){l.statusCode?l.statusCode===500?fi.warn(l):fi.info(l):fi.error(l),t.close(soe[l.statusCode]||1011,gG(l))}t.close()},e))}function jN(e){return e.trim().split(",").map(t=>{let r,n=t.trim().split(";"),s;for(;s=n.pop();)if(s.includes("=")){let[i,a]=s.trim().split("=");i=i.trim(),a&&(a=a.trim()),r={name:i.toLowerCase(),value:a,next:r}}else r={name:s.toLowerCase(),next:r};return r})}var fi,md,gG,jr,toe,zN,pG,EG,Jg,_G,Oh,soe,SG=ue(()=>{bo();zi();fi=w(Q()),md=w(ge());v_();Au();kc();hh();fG();wh();x_();({errorToString:gG}=fi),jr=new Uint8Array(8),toe=new Float64Array(jr.buffer,0,1),zN={},pG="openapi";o(roe,"http");Oh=0;o(noe,"start");soe={401:3e3,403:3003};o(jN,"parseHeaderValue")});var QN=M((tMe,RG)=>{var{recordAction:Zg,recordActionBinary:TG}=(zi(),v(Lg)),ioe=require("fastify-plugin"),ooe=200;RG.exports=ioe(function(e,t,r){e.addHook("onResponse",async(n,s)=>{let i=s.elapsedTime}),e.addHook("onSend",async(n,s,i)=>{let a=s.elapsedTime,c=performance.now(),l=s.request.routeOptions,u,d,f;l.config?.isOperation?(u=n.body?.operation,d="operation"):(u=l.url,d="fastify-route",f=l.method),Zg(a,"duration",u,f,d),TG(s.raw.statusCode<400,"success",u,f,d),TG(1,"response_"+s.raw.statusCode,u,f,d);let m=ooe;i?.pipe?(i.on("data",g=>{m+=g.length}),i.on("end",()=>{Zg(performance.now()-c,"transfer",u,f,d),Zg(m,"bytes-sent",u,f,d)})):(m+=i?.length||0,Zg(m,"bytes-sent",u,f,d));let h=a.toFixed(3),p=s.getHeader("Server-Timing"),_=`db;dur=${h}`;s.header("Server-Timing",p?`${p}, ${_}`:_)}),r()},{name:"hdb-request-time"})});var AG=M((rMe,yG)=>{var aoe=ct(),coe={user:{presence:!0},schema:{presence:!0},table:{presence:!0},operation:{presence:!0}};yG.exports=function(e){return aoe.validateObject(e,coe)}});var eS=M((nMe,bG)=>{"use strict";var loe=(k(),v(W)).OPERATIONS_ENUM,JN=class{static{o(this,"UpdateObject")}constructor(t,r,n,s=void 0){this.operation=loe.UPDATE,this.schema=t,this.table=r,this.records=n,this.__origin=s}};bG.exports=JN});var Lh={};Oe(Lh,{createTokens:()=>ew,getJWTRSAKeys:()=>iS,refreshOperationToken:()=>tw,validateOperationToken:()=>rw,validateRefreshToken:()=>oS});async function iS(){if(tS)return tS;try{let e=Ch.default.join(Ph.default.getHdbBasePath(),zy),t=await rS.default.readFile(Ch.default.join(e,Wf.JWT_PASSPHRASE_NAME),"utf8"),r=await rS.default.readFile(Ch.default.join(e,Wf.JWT_PRIVATE_KEY_NAME),"utf8");return tS={publicKey:await rS.default.readFile(Ch.default.join(e,Wf.JWT_PUBLIC_KEY_NAME),"utf8"),privateKey:r,passphrase:t},tS}catch(e){throw sS.default.error(e),new mi.ClientError(pd.NO_ENCRYPTION_KEYS,hd.INTERNAL_SERVER_ERROR)}}async function ew(e){let t=(0,XN.validateBySchema)(e,Ji.default.object({username:Ji.default.string().optional(),password:Ji.default.string().optional(),role:Ji.default.string().optional(),expires_in:Ji.default.alternatives(Ji.default.string(),Ji.default.number()).optional()}));if(t)throw new mi.ClientError(t.message);let r;try{let f=e.bypass_auth!==!0;!e.username&&!e.password&&(e.username=e.hdb_user?.username,f=!1),r=await(0,ZN.findAndValidateUser)(e.username,e.password,f)}catch(f){throw sS.default.error(f),new mi.ClientError(pd.INVALID_CREDENTIALS,hd.UNAUTHORIZED)}if(!r)throw new mi.ClientError(pd.INVALID_CREDENTIALS,hd.UNAUTHORIZED);let n=!1,s=!1;r.role?.permission&&(n=r.role.permission.super_user===!0,s=r.role.permission.cluster_user===!0);let i={username:e.username,super_user:n,cluster_user:s};e.role&&(i.role=e.role);let a=await iS(),c=await Ed.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:e.expires_in??CG,algorithm:nS,subject:_d.OPERATION}),l=await Ed.default.sign(i,{key:a.privateKey,passphrase:a.passphrase},{expiresIn:uoe,algorithm:nS,subject:_d.REFRESH}),u=YI(l,Br.SHA256);if((await(0,IG.update)(new NG.default(Yf,gu.USER_TABLE_NAME,[{username:e.username,refresh_token:u}]))).skipped_hashes.length>0)throw new mi.ClientError(pd.REFRESH_TOKEN_SAVE_FAILED,hd.INTERNAL_SERVER_ERROR);return wG.default.signalUserChange(new OG.UserEventMsg(process.pid)),{operation_token:c,refresh_token:l}}async function tw(e){let t=(0,XN.validateBySchema)(e,Ji.default.object({refresh_token:Ji.default.string().required()}).required());if(t)throw new mi.ClientError(t.message);let{refresh_token:r}=e;await oS(r);let n=await iS(),s=await Ed.default.decode(r);return{operation_token:await Ed.default.sign({username:s.username,super_user:s.super_user,cluster_user:s.cluster_user},{key:n.privateKey,passphrase:n.passphrase},{expiresIn:CG,algorithm:nS,subject:_d.OPERATION})}}async function rw(e){return PG(e,_d.OPERATION)}async function oS(e){return PG(e,_d.REFRESH)}async function PG(e,t){try{let r=await iS(),n=await Ed.default.verify(e,r.publicKey,{algorithms:nS,subject:t});if(n.role)throw new Error("Invalid token");let s=await(0,ZN.findAndValidateUser)(n.username,void 0,!1);if(t===_d.REFRESH&&!WI(s.refresh_token,e))throw new Error("Invalid token");return s}catch(r){throw sS.default.warn(r),r?.name==="TokenExpiredError"?new mi.ClientError(pd.TOKEN_EXPIRED,hd.FORBIDDEN):new mi.ClientError(pd.INVALID_TOKEN,hd.UNAUTHORIZED)}}var Ed,rS,Ch,Ji,XN,mi,sS,ZN,IG,NG,wG,OG,Ph,hd,pd,CG,uoe,nS,_d,tS,gd=ue(()=>{Ed=w(require("jsonwebtoken")),rS=w(require("fs-extra")),Ch=w(require("node:path")),Ji=w(require("joi")),XN=w(ct());k();mi=w(ge()),sS=w(Q());Rg();ZN=w(ts()),IG=w(vn()),NG=w(eS()),wG=w(Do()),OG=w(ai()),Ph=w(oe()),{HTTP_STATUS_CODES:hd,AUTHENTICATION_ERROR_MSGS:pd}=mi.hdbErrors;Ph.default.initSync();CG=Ph.default.get(U.AUTHENTICATION_OPERATIONTOKENTIMEOUT)||"1d",uoe=Ph.default.get(U.AUTHENTICATION_REFRESHTOKENTIMEOUT)||"30d",nS="RS256",_d={OPERATION:"operation",REFRESH:"refresh"};o(iS,"getJWTRSAKeys");o(ew,"createTokens");o(tw,"refreshOperationToken");o(rw,"validateOperationToken");o(oS,"validateRefreshToken");o(PG,"validateToken")});var nw=M((cMe,MG)=>{"use strict";var doe=AG(),Sd=require("passport"),foe=require("passport-local").Strategy,moe=require("passport-http").BasicStrategy,hoe=require("util"),poe=ts(),DG=hoe.callbackify(poe.findAndValidateUser),aMe=nn(),Eoe=(k(),v(W)),LG=(gd(),v(Lh));Sd.use(new foe(function(e,t,r){DG(e,t,r)}));Sd.use(new moe(function(e,t,r){DG(e,t,r)}));Sd.serializeUser(function(e,t){t(null,e)});Sd.deserializeUser(function(e,t){t(null,e)});function _oe(e,t,r){if(e.raw?.user!==void 0)return r(null,e.raw.user);let n,s;if(e.headers?.authorization){let a=e.headers.authorization.split(" ");n=a[0],s=a[1]}function i(a,c){return a?r(a):c?r(null,c):r("Must login")}switch(o(i,"handleResponse"),n){case"Basic":Sd.authenticate("basic",{session:!1},(a,c)=>{i(a,c)})(e,t,r);break;case"Bearer":e.body?.operation&&e.body.operation===Eoe.OPERATIONS_ENUM.REFRESH_OPERATION_TOKEN?LG.validateRefreshToken(s).then(a=>{e.body.refresh_token=s,r(null,a)}).catch(a=>{r(a)}):LG.validateOperationToken(s).then(a=>{r(null,a)}).catch(a=>{r(a)});break;default:Sd.authenticate("local",{session:!1},function(a,c){i(a,c)})(e,t,r);break}}o(_oe,"authorize");function goe(e,t){let r=doe(e);if(r){t(r);return}let n={authorized:!0,messages:[]},s=e.user.role;if(!s?.permission)return t("Invalid role");let i=JSON.parse(s.permission);if(i.super_user)return t(null,n);if(!i[e.schema])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.schema} schema`),t(null,n);if(!i[e.schema].tables[e.table])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.table} table`),t(null,n);if(!i[e.schema].tables[e.table][e.operation])return n.authorized=!1,n.messages.push(`Not authorized to access ${e.operation} on ${e.table} table`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&!e.attributes)return n.authorized=!1,n.messages.push(`${e.schema}.${e.table} has attribute permissions. Missing attributes to validate`),t(null,n);if(i[e.schema].tables[e.table].attribute_permissions&&e.attributes){let a=i[e.schema].tables[e.table].attribute_permissions;for(let c in a)e.attributes.indexOf(a[c].attribute_name)>-1&&!a[c][e.operation]&&(n.authorized=!1,n.messages.push(`Not authorized to ${e.operation} ${a[c].attribute_name} `))}return t(null,n)}o(goe,"checkPermissions");MG.exports={authorize:_oe,checkPermissions:goe}});var aS=M((uMe,vG)=>{"use strict";var Soe=Zn();vG.exports={writeTransaction:Toe};function Toe(e,t,r){return Soe.writeTransaction(e,t,r)}o(Toe,"writeTransaction")});var FG=M((mMe,BG)=>{"use strict";var Roe=cn(),yoe=Os(),UG=Q(),Aoe=vn(),fMe=aS(),boe=require("clone"),iw=require("alasql"),Ioe=ug(),xG=require("util"),Noe=xG.promisify(yoe.getTableSchema),woe=xG.promisify(Roe.search),Ooe=(k(),v(W)),sw=ie();Ioe(iw);BG.exports={update:Poe};var Coe="There was a problem performing this update. Please check the logs and try again.";async function Poe({statement:e,hdb_user:t}){let r=await Noe(e.table.databaseid,e.table.tableid),n=Loe(e.columns);sw.backtickASTSchemaItems(e);let{table:s,where:i}=e,a=boe(s),c=sw.isEmpty(i)?"":` WHERE ${i.toString()}`,l=`SELECT ${r.hash_attribute} FROM ${s.toString()} ${c}`,u=iw.parse(l).statements[0],d=await woe(u),f=Doe(n,d);return Moe(a,f,t)}o(Poe,"update");function Loe(e){try{let t={};return e.forEach(r=>{"value"in r.expression?t[r.column.columnid]=r.expression.value??null:t[r.column.columnid]=iw.compile(`SELECT ${r.expression.toString()} AS [${Ooe.FUNC_VAL}] FROM ?`)}),t}catch(t){throw UG.error(t),new Error(Coe)}}o(Loe,"createUpdateRecord");function Doe(e,t){return sw.isEmptyOrZeroLength(t)?[]:t.map(r=>Object.assign(r,e))}o(Doe,"buildUpdateRecords");async function Moe(e,t,r){let n={operation:"update",schema:e.databaseid_orig,table:e.tableid_orig,records:t,hdb_user:r},s=await Aoe.update(n);try{delete s.new_attributes,delete s.txn_time}catch(i){UG.error(`Error delete new_attributes from update response: ${i}`)}return s}o(Moe,"updateRecords")});var kG=M((_Me,HG)=>{var voe=require("alasql"),Uoe=cn(),xoe=Q(),Boe=Zn(),aw=require("util"),ow=ie(),Foe=(k(),v(W)),Hoe=Os(),pMe=aS(),EMe=vn(),koe="record",Goe="successfully deleted",qoe=aw.callbackify(Yoe),$oe=aw.promisify(Uoe.search),Voe=aw.promisify(Hoe.getTableSchema);HG.exports={convertDelete:qoe};function Koe(e){return`${e.deleted_hashes.length} ${koe}${e.deleted_hashes.length===1?"":"s"} ${Goe}`}o(Koe,"generateReturnMessage");async function Yoe({statement:e,hdb_user:t}){let r=await Voe(e.table.databaseid,e.table.tableid);ow.backtickASTSchemaItems(e);let{table:n,where:s}=e,i=ow.isEmpty(s)?"":` WHERE ${s.toString()}`,a=`SELECT ${r.hash_attribute} FROM ${n.toString()} ${i}`,c=voe.parse(a).statements[0],l={operation:Foe.OPERATIONS_ENUM.DELETE,schema:n.databaseid_orig,table:n.tableid_orig,hdb_user:t};try{l.records=await $oe(c);let u=await Boe.deleteRecords(l);return ow.isEmptyOrZeroLength(u.message)&&(u.message=Koe(u)),delete u.txn_time,u}catch(u){throw xoe.error(u),u.hdb_code?u.message:u}}o(Yoe,"convertDelete")});var KG=M((SMe,VG)=>{"use strict";var Woe=Fa(),{hdbErrors:GG}=ge(),{getDatabases:qG}=(De(),v(mt));VG.exports={checkSchemaExists:$G,checkSchemaTableExists:zoe,schemaDescribe:Woe};async function $G(e){if(!qG()[e])return GG.HDB_ERROR_MSGS.SCHEMA_NOT_FOUND(e)}o($G,"checkSchemaExists");async function zoe(e,t){let r=await $G(e);if(r)return r;if(!qG()[e][t])return GG.HDB_ERROR_MSGS.TABLE_NOT_FOUND(e,t)}o(zoe,"checkSchemaTableExists")});var fw=M((bMe,nq)=>{"use strict";var{decode:joe}=require("msgpackr"),{isMainThread:RMe,parentPort:yMe,threadId:AMe}=require("worker_threads"),uS=mr(),Td=Nt(),uw=(k(),v(W)),dn=Q(),lw=oe(),Qoe=(k(),v(W)),{onMessageByType:Joe}=rt(),jG=Ki(),{recordAction:YG,recordActionBinary:Xoe}=(zi(),v(Lg)),{publishToStream:Zoe}=uS,{ConsumerEvents:WG}=require("nats"),eae=cn(),{promisify:tae}=require("util"),{decodeBlobsWithWrites:rae}=(Wn(),v(h_)),QG=tae(setTimeout),dS=1e4,fS,lS,nae,sae,JG,Dh=new Map,Rd=new Map;nq.exports={initialize:XG,ingestConsumer:dw,setSubscription:iae,setIgnoreOrigin:cae,getDatabaseSubscriptions:aae,updateConsumer:ZG};async function XG(){Joe(uw.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,async n=>{await ZG(n)}),JG=!0,dn.notify("Initializing clustering ingest service.");let{connection:e,jsm:t,js:r}=await uS.getNATSReferences();fS=e,lS=e.info.server_name,nae=t,sae=r}o(XG,"initialize");async function ZG(e){if(e.status==="start"){let{js:t,jsm:r}=await eq(e.node_domain_name);dw(e.stream_name,t,r,e.node_domain_name)}else if(e.status==="stop"){let t=Dh.get(e.stream_name+e.node_domain_name);t&&(dn.notify("Closing ingest consumer for node:",e.node_domain_name,"stream:",e.stream_name),await t.close?.(),Dh.set(e.stream_name+e.node_domain_name,"close")),Rd.get(e.node_domain_name)==="failed"&&Rd.set(e.node_domain_name,"close")}}o(ZG,"updateConsumer");var mS=new Map;function iae(e,t,r){let n=mS.get(e);n||mS.set(e,n=new Map),n.set(t,r),JG||XG().then(oae)}o(iae,"setSubscription");async function oae(){let e=await eae.searchByValue({database:"system",table:"hdb_nodes",search_attribute:"name",search_value:"*"});for await(let t of e){let r=t.name+Td.SERVER_SUFFIX.LEAF,n,s;for(let i of t.subscriptions||[])if(i.subscribe===!0){if(!n&&({js:n,jsm:s}=await eq(r),!n))break;let{schema:a,table:c}=i,l=jG.createNatsTableStreamName(a,c);dw(l,n,s,r)}}}o(oae,"accessConsumers");async function eq(e){let t,r,n=1;for(;!r;)try{t=await fS.jetstream({domain:e}),r=await fS.jetstreamManager({domain:e,checkAPI:!1})}catch(s){if(Rd.get(e)==="close")break;Rd.set(e,"failed"),n%10===1&&dn.warn("Nats ingest attempting to connect to:",e,"Nats error:",s.message);let i=n++*100<dS?n++*100:dS;await QG(i)}return{js:t,jsm:r}}o(eq,"connectToRemoteJS");function aae(){return mS}o(aae,"getDatabaseSubscriptions");var tq;function cae(e){tq=e}o(cae,"setIgnoreOrigin");var rq=100,zG=new Array(rq),cS=0;async function dw(e,t,r,n){let{connection:s}=await uS.getNATSReferences();fS=s,lS=s.info.server_name;let i,a=1;for(;!i;)try{i=await t.consumers.get(e,lS),dn.notify("Initializing ingest consumer for node:",n,"stream:",e)}catch(u){if(Rd.get(n)==="close")break;a%10===1&&dn.warn("Nats ingest error getting consumer:",n,"stream:",e,"Nats error:",u.message),u.code==="404"&&(dn.notify("Nats ingest creating consumer for node:",n,"stream:",e),i=await uS.createConsumer(r,e,lS,new Date(Date.now()).toISOString()));let d=a++*100<dS?a++*100:dS;await QG(d)}let c=!1,l;for(;!c;){if(Dh.get(e+n)==="close"||Rd.get(n)==="close"){Dh.delete(e+n),c=!0;continue}l=await i.consume({max_messages:lw.get(uw.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXCONSUMEMSGS)??100,bind:!0}),Dh.set(e+n,l);let u=!1;(async()=>{for await(let d of await l.status())if(d.type===WG.ConsumerDeleted&&(await l.close(),c=!0),d.type===WG.HeartbeatsMissed){let f=d.data;dn.trace(`${f} clustering ingest consumer heartbeats missed, node: ${n} stream: ${l.consumer.stream}`),f===100&&(dn.warn(`Restarting clustering ingest consumer due to missed heartbeat threshold being met, node: ${n} stream: ${l.consumer.stream}`),l.stop(),u=!0)}})();try{for await(let d of l)await zG[cS],zG[cS]=lae(d).catch(f=>{dn.error(f)}),++cS>=rq&&(cS=0)}catch(d){d.message==="consumer deleted"?(dn.notify("Nats consumer deleted, closing messages for node:",n,"stream:",l.consumer.stream),await l.close(),c=!0):dn.error("Error consuming clustering ingest, restarting consumer",d)}}}o(dw,"ingestConsumer");async function lae(e){let t;await rae(()=>{t=joe(e.data)}),YG(e.data.length,"bytes-received",e.subject,t.operation,"ingest"),dn.trace("Nats message processor message size:",e?.msg?._msg?.size,"bytes");let r=e.headers,n=!1,s=lw.get(uw.CONFIG_PARAMS.CLUSTERING_NODENAME);r.has(Td.MSG_HEADERS.TRANSACTED_NODES)&&r.values(Td.MSG_HEADERS.TRANSACTED_NODES).indexOf(s)>-1&&(n=!0);let i=r.get(Td.MSG_HEADERS.ORIGIN);if(n||(n=i===s&&!tq),Xoe(n,"echo",e.subject,t.operation,"ingest"),n){e.ack();return}r.append(Td.MSG_HEADERS.TRANSACTED_NODES,s);try{let{operation:a,schema:c,next:l,table:u,records:d,hash_values:f,__origin:m,expiresAt:h}=t;dn.trace("processing message:",a,c,u,(d?"records: "+d.map(O=>O?.id):"")+(f?"ids: "+f:""),"with sequence:",e.seq),dn.trace(`messageProcessor nats msg id: ${e.headers.get(Td.MSG_HEADERS.NATS_MSG_ID)}`);let p;d||(d=f);let _=new Promise(O=>p=O),{timestamp:g,user:y,node_name:T}=m||{},R=mS.get(c)?.get(u);if(!R)throw new Error(`Missing table for replication message: ${u}`);if(a==="define_schema")t.type=a,t.onCommit=p,R.send(t);else if(d.length===1&&!l)R.send({type:cw(a),value:d[0],id:f?.[0],expiresAt:h,timestamp:g,table:u,onCommit:p,user:y,nodeName:T});else{let O=d.map((F,Z)=>({type:cw(a),value:F,expiresAt:h,id:f?.[Z],table:u}));for(;l;)O.push({type:cw(l.operation),value:l.record,expiresAt:l.expiresAt,id:l.id,table:l.table}),l=l.next;R.send({type:"transaction",writes:O,table:u,timestamp:g,onCommit:p,user:y,nodeName:T})}lw.get(Qoe.CONFIG_PARAMS.CLUSTERING_REPUBLISHMESSAGES)!==!1&&Zoe(e.subject.split(".").slice(0,-1).join("."),jG.createNatsTableStreamName(c,u),e.headers,e.data),await _;let N=Date.now()-g;g&&YG(N,"replication-latency",e.subject,a,"ingest")}catch(a){dn.error(a)}e.ack()}o(lae,"messageProcessor");function cw(e){switch(e){case"insert":case"upsert":case"update":return"put"}return e}o(cw,"convertOperation")});var mr=M((LMe,Tq)=>{"use strict";var kr=oe();kr.initSync();var uae=require("fs-extra"),dae=require("semver"),Uh=require("path"),{monotonicFactory:fae}=require("ulidx"),iq=fae(),mae=require("util"),oq=require("child_process"),hae=mae.promisify(oq.exec),pae=oq.spawn,Qr=Nt(),Qe=(k(),v(W)),{packageJson:Eae,PACKAGE_ROOT:_ae}=Rt(),hS=ie(),hi=Q(),pS=Ki(),gae=aS(),Mh=yt(),{broadcast:Sae,onMessageByType:Tae,getWorkerIndex:Rae}=rt(),{isMainThread:aq}=require("worker_threads"),{Encoder:yae,decode:Ew}=require("msgpackr"),cq=new yae,{isEmpty:Ll}=hS,lq=ts(),NMe=48*36e11;aq&&Tae(Qe.ITC_EVENT_TYPES.RESTART,()=>{fn=void 0,Pl=void 0});var{connect:Aae,StorageType:bae,RetentionPolicy:Iae,AckPolicy:_w,DeliverPolicy:gw,DiscardPolicy:Nae,NatsConnection:wMe,JetStreamManager:OMe,JetStreamClient:CMe,StringCodec:PMe,JSONCodec:wae,createInbox:Sw,headers:Oae,ErrorCode:sq}=require("nats"),{recordAction:Cae}=(zi(),v(Lg)),{encodeBlobsAsBuffers:Pae}=(Wn(),v(h_)),uq=wae(),Lae="clustering",Dae=Eae.engines[Qr.NATS_SERVER_NAME],Mae=Uh.join(_ae,"dependencies"),pw=Uh.join(Mae,`${process.platform}-${process.arch}`,Qr.NATS_BINARY_NAME),mw,hw,vh,Ol,Cl;Tq.exports={runCommand:dq,checkNATSServerInstalled:vae,createConnection:Tw,getConnection:xh,getJetStreamManager:Bh,getJetStream:mq,getNATSReferences:Xi,getServerList:xae,createLocalStream:Rw,listStreams:hq,deleteLocalStream:Bae,getServerConfig:yd,listRemoteStreams:Fae,viewStream:Hae,viewStreamIterator:kae,publishToStream:Gae,request:Vae,reloadNATS:yw,reloadNATSHub:Kae,reloadNATSLeaf:Yae,extractServerName:$ae,requestErrorHandler:Wae,createLocalTableStream:gq,createTableStreams:Qae,purgeTableStream:Sq,purgeSchemaTableStreams:Jae,getStreamInfo:Xae,updateLocalStreams:ece,closeConnection:Uae,getJsmServerName:ES,addNatsMsgHeader:pq,clearClientCache:fq,updateRemoteConsumer:zae,createConsumer:Eq,updateConsumerIterator:jae};async function dq(e,t=void 0){let{stdout:r,stderr:n}=await hae(e,{cwd:t});if(n)throw new Error(n.replace(`
15
15
  `,""));return r.replace(`
16
16
  `,"")}o(dq,"runCommand");async function vae(){try{await uae.access(pw)}catch{return!1}let e=await dq(`${pw} --version`,void 0),t=e.substring(e.lastIndexOf("v")+1,e.length);return dae.eq(t,Dae)}o(vae,"checkNATSServerInstalled");async function Tw(e,t,r,n=!0,s="127.0.0.1"){if(!t&&!r){let a=await lq.getClusterUser();if(Ll(a))throw new Error("Unable to get nats connection. Cluster user is undefined.");t=a.username,r=a.decrypt_hash}hi.trace("create nats connection called");let i=await Aae({name:s,port:e,user:t,pass:r,maxReconnectAttempts:-1,waitOnFirstConnect:n,timeout:2e5,tls:{keyFile:kr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_PRIVATEKEY),certFile:kr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERTIFICATE),caFile:kr.get(Qe.CONFIG_PARAMS.CLUSTERING_TLS_CERT_AUTH),rejectUnauthorized:!1}});return i.protocol.transport.socket.unref(),hi.trace("create connection established a nats client connection with id",i?.info?.client_id),i.closed().then(a=>{a&&hi.error("Error with Nats client connection, connection closed",a),i===fn&&fq()}),i}o(Tw,"createConnection");function fq(){fn=void 0,Ol=void 0,Cl=void 0,Pl=void 0}o(fq,"clearClientCache");async function Uae(){fn&&(await fn.drain(),fn=void 0,Ol=void 0,Cl=void 0,Pl=void 0)}o(Uae,"closeConnection");var fn,Pl;async function xh(){return Pl||(Pl=Tw(kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),void 0,void 0),fn=await Pl),fn||Pl}o(xh,"getConnection");async function Bh(){if(Ol)return Ol;Ll(fn)&&await xh();let{domain:e}=yd(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Ll(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Ol=await fn.jetstreamManager({domain:e,timeout:6e4}),Ol}o(Bh,"getJetStreamManager");async function mq(){if(Cl)return Cl;Ll(fn)&&await xh();let{domain:e}=yd(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);if(Ll(e))throw new Error("Error getting JetStream domain. Unable to get JetStream manager.");return Cl=fn.jetstream({domain:e,timeout:6e4}),Cl}o(mq,"getJetStream");async function Xi(){let e=fn||await xh(),t=Ol||await Bh(),r=Cl||await mq();return{connection:e,jsm:t,js:r}}o(Xi,"getNATSReferences");async function xae(e){let t=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),{sys_name:r,decrypt_hash:n}=await lq.getClusterUser(),s=await Tw(t,r,n),i=Sw(),a=s.subscribe(i),c=[],l,u=(async()=>{for await(let d of a){let f=uq.decode(d.data);f.response_time=Date.now()-l,c.push(f)}})();return l=Date.now(),await s.publish("$SYS.REQ.SERVER.PING.VARZ",void 0,{reply:i}),await s.publish("$SYS.REQ.SERVER.PING",void 0,{reply:i}),await s.flush(),await hS.asyncSetTimeout(e),await a.drain(),await s.close(),await u,c}o(xae,"getServerList");async function Rw(e,t){let{jsm:r}=await Xi(),n=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);s=s===null?-1:s;let i=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);i=i===null?-1:i,await r.streams.add({name:e,storage:bae.File,retention:Iae.Limits,subjects:t,discard:Nae.Old,maxMsgs:s,maxBytes:i,maxAge:n})}o(Rw,"createLocalStream");async function hq(){let{jsm:e}=await Xi(),t=await e.streams.list().next(),r=[];return t.forEach(n=>{r.push(n)}),r}o(hq,"listStreams");async function Bae(e){let{jsm:t}=await Xi();await t.streams.delete(e)}o(Bae,"deleteLocalStream");async function Fae(e){let{connection:t}=await Xi(),r=[],n=Sw(),s=t.subscribe(n),i=(async()=>{for await(let a of s)r.push(uq.decode(a.data))})();return await t.publish(`$JS.${e}.API.STREAM.LIST`,void 0,{reply:n}),await t.flush(),await s.drain(),await i,r}o(Fae,"listRemoteStreams");async function Hae(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Xi(),i=iq(),a={durable_name:i,ack_policy:_w.Explicit};t&&(a.deliver_policy=gw.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];let u=[];for await(let d of l){let f=Ew(d.data),m={nats_timestamp:d.info.timestampNanos,nats_sequence:d.info.streamSequence,entry:f};if(d.headers&&(m.origin=d.headers.get(Qr.MSG_HEADERS.ORIGIN)),u.push(m),d.ack(),d.info.pending===0)break}return await c.delete(),u}o(Hae,"viewStream");async function*kae(e,t=void 0,r=void 0){let{jsm:n,js:s}=await Xi(),i=iq(),a={durable_name:i,ack_policy:_w.Explicit};t&&(a.deliver_policy=gw.StartTime,a.opt_start_time=new Date(t).toISOString()),await n.consumers.add(e,a);let c=await s.consumers.get(e,i),l=r?await c.fetch({max_messages:r,expires:2e3}):await c.consume();if(c._info.num_pending===0)return[];for await(let u of l){let d=Ew(u.data);d[0]||(d=[d]);for(let f of d){let m={nats_timestamp:u.info.timestampNanos,nats_sequence:u.info.streamSequence,entry:f};u.headers&&(m.origin=u.headers.get(Qr.MSG_HEADERS.ORIGIN)),yield m}if(u.ack(),u.info.pending===0)break}await c.delete()}o(kae,"viewStreamIterator");async function Gae(e,t,r,n){hi.trace(`publishToStream called with subject: ${e}, stream: ${t}, entries:`,n.operation),r=pq(n,r);let{js:s}=await Xi(),i=await ES(),a=`${e}.${i}`,c=await Pae(()=>n instanceof Uint8Array?n:cq.encode(n));try{hi.trace(`publishToStream publishing to subject: ${a}`),Cae(c.length,"bytes-sent",e,n.operation,"replication"),await s.publish(a,c,{headers:r})}catch(l){if(l.code&&l.code.toString()==="503")return _q(async()=>{try{await s.publish(a,c,{headers:r})}catch{if(l.code&&l.code.toString()==="503"){hi.trace(`publishToStream creating stream: ${t}`);let d=a.split(".");d[2]="*",await Rw(t,[a]),await s.publish(a,c,{headers:r})}else throw l}});throw l}}o(Gae,"publishToStream");function pq(e,t){t===void 0&&(t=Oae());let r=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME);return!t.has(Qr.MSG_HEADERS.ORIGIN)&&r&&t.append(Qr.MSG_HEADERS.ORIGIN,r),t}o(pq,"addNatsMsgHeader");function yd(e){e=e.toLowerCase();let t=Uh.join(kr.get(Qe.CONFIG_PARAMS.ROOTPATH),Lae);if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())return Ll(hw)&&(hw={port:Mh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),server_name:Mh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Qr.SERVER_SUFFIX.HUB,config_file:Qr.NATS_CONFIG_FILES.HUB_SERVER,pid_file_path:Uh.join(t,Qr.PID_FILES.HUB),hdbNatsPath:t}),hw;if(e===Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())return Ll(mw)&&(mw={port:Mh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),server_name:Mh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Qr.SERVER_SUFFIX.LEAF,config_file:Qr.NATS_CONFIG_FILES.LEAF_SERVER,domain:Mh.getConfigFromFile(Qe.CONFIG_PARAMS.CLUSTERING_NODENAME)+Qr.SERVER_SUFFIX.LEAF,pid_file_path:Uh.join(t,Qr.PID_FILES.LEAF),hdbNatsPath:t}),mw;hi.error(`Unable to get Nats server config. Unrecognized process: ${e}`)}o(yd,"getServerConfig");async function Eq(e,t,r,n){try{await e.consumers.add(t,{ack_policy:_w.Explicit,durable_name:r,deliver_policy:gw.StartTime,opt_start_time:n})}catch(s){if(s.message!=="consumer already exists")throw s}}o(Eq,"createConsumer");async function qae(e,t,r){await e.consumers.delete(t,r)}o(qae,"removeConsumer");function $ae(e){return e.split(".")[1]}o($ae,"extractServerName");async function Vae(e,t,r=6e4,n=Sw()){if(!hS.isObject(t))throw new Error("data param must be an object");let s=cq.encode(t),{connection:i}=await Xi(),a={timeout:r};n&&(a.reply=n,a.noMux=!0);let c=await i.request(e,s,a);return Ew(c.data)}o(Vae,"request");function yw(e){return new Promise(async(t,r)=>{let n=pae(pw,["--signal",`reload=${e}`],{cwd:__dirname}),s,i;n.on("error",a=>{r(a)}),n.stdout.on("data",a=>{i+=a.toString()}),n.stderr.on("data",a=>{s+=a.toString()}),n.stderr.on("close",a=>{s&&r(s),t(i)})})}o(yw,"reloadNATS");async function Kae(){let{pid_file_path:e}=yd(Qe.PROCESS_DESCRIPTORS.CLUSTERING_HUB);await yw(e)}o(Kae,"reloadNATSHub");async function Yae(){let{pid_file_path:e}=yd(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await yw(e)}o(Yae,"reloadNATSLeaf");function Wae(e,t,r){let n;switch(e.code){case sq.NoResponders:n=`Unable to ${t}, node '${r}' is not listening.`;break;case sq.Timeout:n=`Unable to ${t}, node '${r}' is listening but did not respond.`;break;default:n=e.message;break}return n}o(Wae,"requestErrorHandler");async function zae(e,t){let r=t+Qr.SERVER_SUFFIX.LEAF,{connection:n}=await Xi(),{jsm:s}=await rce(r),{schema:i,table:a}=e,c=pS.createNatsTableStreamName(i,a),l=e.start_time?e.start_time:new Date(Date.now()).toISOString();await _q(async()=>{if(e.subscribe===!0)await Eq(s,c,n.info.server_name,l);else try{await qae(s,c,n.info.server_name)}catch(u){hi.trace(u)}})}o(zae,"updateRemoteConsumer");async function jae(e,t,r,n){let s=pS.createNatsTableStreamName(e,t),i=r+Qr.SERVER_SUFFIX.LEAF,a={type:Qe.ITC_EVENT_TYPES.NATS_CONSUMER_UPDATE,status:n,stream_name:s,node_domain_name:i};if(!aq&&Rae()<kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXINGESTTHREADS)){let{updateConsumer:c}=fw();await c(a)}await Sae(a),n==="stop"&&await hS.asyncSetTimeout(1e3)}o(jae,"updateConsumerIterator");function _q(e){return gae.writeTransaction(Qe.SYSTEM_SCHEMA_NAME,Qe.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,e)}o(_q,"exclusiveLock");async function gq(e,t){let r=pS.createNatsTableStreamName(e,t),n=await ES(),s=Zae(e,t,n);await Rw(r,[s])}o(gq,"createLocalTableStream");async function Qae(e){for(let t=0,r=e.length;t<r;t++){let n=e[t].schema,s=e[t].table;await gq(n,s)}}o(Qae,"createTableStreams");async function Sq(e,t,r=void 0){if(kr.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))try{let n=pS.createNatsTableStreamName(e,t),{domain:s}=yd(Qe.PROCESS_DESCRIPTORS.CLUSTERING_LEAF);await(await(await xh()).jetstreamManager({domain:s,timeout:24e4})).streams.purge(n,r)}catch(n){if(n.message==="stream not found")hi.warn(n);else throw n}}o(Sq,"purgeTableStream");async function Jae(e,t){if(kr.get(Qe.CONFIG_PARAMS.CLUSTERING_ENABLED))for(let r=0,n=t.length;r<n;r++)await Sq(e,t[r])}o(Jae,"purgeSchemaTableStreams");async function Xae(e){return(await Bh()).streams.info(e)}o(Xae,"getStreamInfo");function Zae(e,t,r){return`${Qr.SUBJECT_PREFIXES.TXN}.${e}${t?"."+t:""}.${r}`}o(Zae,"createSubjectName");async function ES(){if(vh)return vh;if(vh=(await Bh())?.nc?.info?.server_name,vh===void 0)throw new Error("Unable to get jetstream manager server name");return vh}o(ES,"getJsmServerName");async function ece(){let e=await Bh(),t=await ES(),r=await hq();for(let n of r){let s=n.config,i=s.subjects[0];if(!i)continue;let a=tce(n),c=i.split(".");if(c[c.length-1]===t&&!a||s.name==="__HARPERDB_WORK_QUEUE__")continue;let u=i.split(".");u[u.length-1]=t;let d=u.join(".");hi.trace(`Updating stream subject name from: ${i} to: ${d}`),s.subjects[0]=d,await e.streams.update(s.name,s)}}o(ece,"updateLocalStreams");function tce(e){let{config:t}=e,r=!1,n=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXAGE);n=n===null?0:n*1e9;let s=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXBYTES);s=s===null?-1:s;let i=kr.get(Qe.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_STREAMS_MAXMSGS);return i=i===null?-1:i,n!==t.max_age&&(t.max_age=n,r=!0),s!==t.max_bytes&&(t.max_bytes=s,r=!0),i!==t.max_msgs&&(t.max_msgs=i,r=!0),r}o(tce,"updateStreamLimits");async function rce(e){let t,r;try{t=await fn.jetstream({domain:e}),r=await fn.jetstreamManager({domain:e,checkAPI:!1})}catch(n){throw hi.error("Unable to connect to:",e),n}return{js:t,jsm:r}}o(rce,"connectToRemoteJS")});function Aw(e){let t=e.get(_S),r=t?(0,Ad.unpack)(t):null;r||(r={remoteNameToId:{}});let n=Ze(),s=!1;r.nodeName=Ze();let i=r.remoteNameToId;if(i[n]!==0){let a=0,c;for(let l in i){let u=i[l];u===0?c=l:u>a&&(a=u)}if(c){a++,i[c]=a;let l=[Symbol.for("seq"),a];e.rootStore.dbisDb.transactionSync(()=>{e.rootStore.dbisDb.get(l)||e.rootStore.dbisDb.putSync(l,{seqId:Hh(e)??1,nodes:[]})})}i[n]=0,e.putSync(_S,(0,Ad.pack)(r))}return r}function Fh(e){return Aw(e).remoteNameToId}function yq(e,t){let r=Aw(t),n=r.remoteNameToId,s=new Map,i=!1;for(let a in e){let c=e[a],l=n[a];if(l==null){let u=0;for(let d in n){let f=n[d];f>u&&(u=f)}l=u+1,n[a]=l,i=!0}s.set(c,l)}return i&&t.putSync(_S,(0,Ad.pack)(r)),s}function gS(e,t){let r=Aw(t),n=r.remoteNameToId,s=n[e];if(s==null){let i=0;for(let a in n){let c=n[a];c>i&&(i=c)}s=i+1,n[e]=s,t.putSync(_S,(0,Ad.pack)(r))}return Rq.trace?.("The remote node name map",e,n,s),s}var Rq,Ad,_S,bw=ue(()=>{Rq=w(ri());ss();Ad=require("msgpackr"),_S=Symbol.for("remote-ids");o(Aw,"getIdMappingRecord");o(Fh,"exportIdMapping");o(yq,"remoteToLocalNodeId");o(gS,"getIdOfRemoteNode")});var Iw={};Oe(Iw,{commitsAwaitingReplication:()=>bd,getHDBNodeTable:()=>Kt,getReplicationSharedStatus:()=>Id,iterateRoutes:()=>Gh,shouldReplicateToNode:()=>kh,subscribeToNodeUpdates:()=>Nd});function Kt(){return Aq||(Aq=je({table:"hdb_nodes",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"subscriptions"},{attribute:"system_info"},{attribute:"url"},{attribute:"routes"},{attribute:"ca"},{attribute:"ca_info"},{attribute:"replicates"},{attribute:"revoked_certificates"},{attribute:"__createdtime__"},{attribute:"__updatedtime__"}]}))}function Id(e,t,r,n){return new Float64Array(e.getUserSharedBuffer(["replicated",t,r],new ArrayBuffer(48),n&&{callback:n}))}function Nd(e){Kt().subscribe({}).then(async t=>{for await(let r of t){let n=r?.value?.name;wq.debug?.("adding node",n,"on node",Ze()," on process",process.pid),server.nodes=server.nodes.filter(i=>i.name!==n),r.type==="put"&&n!==Ze()&&(r.value?server.nodes.push(r.value):console.error("Invalid node update event",r));let s=new Map;for await(let i of Kt().search({}))if(i.shard!=null){let a=s.get(i.shard);a||s.set(i.shard,a=[]),a.push(i)}server.shards=s,(r.type==="put"||r.type==="delete")&&e(r.value,r.id)}})}function kh(e,t){let r=Ya.default.get(U.REPLICATION_DATABASES);return(e.replicates===!0||e.replicates?.sends)&&databases[t]&&(r==="*"||r?.find?.(n=>(typeof n=="string"?n:n.name)===t&&(!n.sharded||e.shard===Ya.default.get(U.REPLICATION_SHARD))))&&Kt().primaryStore.get(Ze())?.replicates||e.subscriptions?.some(n=>(n.database||n.schema)===t&&n.subscribe)}function nce(){Nd(e=>{Wa({},(t,r)=>{let n=e.name,s=bq.get(n);if(s||bq.set(n,s=new Map),s.has(r))return;let i;for(let a in t)if(i=t[a].auditStore,i)break;if(i){let a=Id(i,r,n,()=>{let c=a[0],l=a.lastTime;for(let{txnTime:u,onConfirm:d}of bd.get(r)||[])u>l&&u<=c&&d();a.lastTime=c});a.lastTime=0,s.set(r,a)}})})}function*Gh(e){for(let t of e.routes||[]){let r=t.url,n;if(typeof t=="string"?t.includes("://")?r=t:n=t:n=t.hostname??t.host,n&&!r){let s=Ya.default.get(U.REPLICATION_SECUREPORT)??(!Ya.default.get(U.REPLICATION_PORT)&&Ya.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),i;(i=n.match(/:(\d+)$/)?.[1])?n=n.slice(0,-i[0].length-1):t.port?i=t.port:i=s||Ya.default.get(U.REPLICATION_PORT)||Ya.default.get(U.OPERATIONSAPI_NETWORK_PORT);let a=i?.lastIndexOf?.(":");a>0&&(i=+i.slice(a+1).replace(/[\[\]]/g,"")),r=(s?"wss://":"ws://")+n+":"+i}if(!r){Iq.isMainThread&&console.error("Invalid route, must specify a url or host (with port)");continue}yield{replicates:!t.subscriptions,url:r,subscription:t.subscriptions,routes:t.routes,startTime:t.startTime,revoked_certificates:t.revokedCertificates}}}var Iq,Nq,Ya,wq,Aq,bq,bd,Dl=ue(()=>{De();ss();cm();Iq=require("worker_threads"),Nq=w(ge()),Ya=w(oe());k();wq=w(ri());server.nodes=[];o(Kt,"getHDBNodeTable");o(Id,"getReplicationSharedStatus");o(Nd,"subscribeToNodeUpdates");o(kh,"shouldReplicateToNode");bq=new Map;Av((e,t,r)=>{if(r>server.nodes.length)throw new Nq.ClientError(`Cannot confirm replication to more nodes (${r}) than are in the network (${server.nodes.length})`);bd||(bd=new Map,nce());let n=bd.get(e);return n||(n=[],bd.set(e,n)),new Promise(s=>{let i=0;n.push({txnTime:t,onConfirm:o(()=>{++i===r&&s()},"onConfirm")})})});o(nce,"startSubscriptionToReplications");o(Gh,"iterateRoutes")});var Pq={};Oe(Pq,{connectedToNode:()=>Ml,disconnectedFromNode:()=>Od,ensureNode:()=>Ho,requestClusterStatus:()=>Cq,startOnMainThread:()=>ww});async function ww(e){let t=0,r=nt();for(let i of Object.getOwnPropertyNames(r)){let a=r[i];for(let c in a){let l=a[c];if(l.auditStore){SS.set(i,Hh(l.auditStore));break}}}eo.whenThreadsStarted.then(async()=>{let i=[];for await(let l of r.system.hdb_nodes?.search([])||[])i.push(l);let a=Ze();function c(){let l=Kt().primaryStore.get(a);if(l!==null){let u=e.url??za();if(l===void 0||l.url!==u||l.shard!==e.shard)return Ho(a,{name:a,url:u,shard:e.shard,replicates:!0})}}o(c,"ensureThisNode"),Kt().primaryStore.get(a)&&c();for(let l of Gh(e))try{let u=!l.subscriptions;if(u&&await c(),u&&l.replicates==null&&(l.replicates=!0),i.find(d=>d.url===l.url))continue;s(l)}catch(u){console.error(u)}Nd(s)});let n;function s(i,a=i?.name){let c=Ze()&&a===Ze()||za()&&i?.url===za();if(c){let f=!!i?.replicates;if(n!==void 0&&n!==f)for(let m of Kt().search([]))m.replicates&&m.name!==a&&s(m,m.name);n=f}if(ot.trace("Setting up node replication for",i),!i){for(let[f,m]of Zi){let h;for(let[p,{worker:_,nodes:g}]of m){let y=g[0];if(y&&y.name==a){h=!0;for(let[T,{worker:R}]of m)m.delete(T),ot.warn("Node was deleted, unsubscribing from node",a,T,f),R?.postMessage({type:"unsubscribe-from-node",node:a,database:T,url:f});break}}if(h){Zi.get(f).iterator.remove(),Zi.delete(f);return}}return}if(c)return;if(!i.url){ot.info(`Node ${i.name} is missing url`);return}let l=Zi.get(i.url);if(l&&l.iterator.remove(),!(i.replicates===!0||i.replicates?.sends)&&!i.subscriptions?.length&&!l)return;if(ot.info(`Added node ${i.name} at ${i.url} for process ${Ze()}`),i.replicates&&i.subscriptions&&(i={...i,subscriptions:null}),i.name){for(let[f,m]of wd)if(i.url===m.url){wd.delete(f);break}wd.set(i.name,i)}let u=nt();if(l||(l=new Map,Zi.set(i.url,l)),l.iterator=Wa(e,(f,m,h)=>{h?d(m,!0):d(m,!1)}),i.subscriptions)for(let f of i.subscriptions){let m=f.database||f.schema;u[m]||(ot.warn(`Database ${m} not found for node ${i.name}, making a subscription anyway`),d(m,!1))}function d(f,m){ot.trace("Setting up replication for database",f,"on node",i.name);let h=l.get(f),p,_=[{replicateByDefault:m,...i}];SS.has(f)&&qh.default.get(U.REPLICATION_FAILOVER)&&(_.push({replicateByDefault:m,name:Ze(),startTime:SS.get(f),endTime:Date.now(),replicates:!0}),SS.delete(f));let g=kh(i,f),y=eo.workers.filter(T=>T.name==="http");if(h?(p=h.worker,h.nodes=_):g&&(t=t%y.length,p=y[t++],l.set(f,{worker:p,nodes:_,url:i.url}),p?.on("exit",()=>{l.get(f)?.worker===p&&(l.delete(f),d(f,m))})),g)setTimeout(()=>{let T={type:"subscribe-to-node",database:f,nodes:_};p?p.postMessage(T):$h(T)},sce);else{ot.info("Node no longer should be used, unsubscribing from node",{replicates:i.replicates,databaseName:f,node:i,subscriptions:i.subscriptions,hasDatabase:!!u[f],thisReplicates:Kt().primaryStore.get(Ze())?.replicates}),Kt().primaryStore.get(Ze())?.replicates||(n=!1,ot.info("Disabling replication, this node name",Ze(),Kt().primaryStore.get(Ze()),f));let T={type:"unsubscribe-from-node",database:f,url:i.url,name:i.name};p?p.postMessage(T):RS(T)}}o(d,"onDatabase")}o(s,"onNodeUpdate"),Od=o(function(i){try{ot.info("Disconnected from node",i.name,i.url,"finished",!!i.finished);let a=Array.from(wd.keys()),c=a.sort(),l=c.indexOf(i.name||pi(i.url));if(l===-1){ot.warn("Disconnected node not found in node map",i.name,a);return}let u=Zi.get(i.url),d=u?.get(i.database);if(!d){ot.warn("Disconnected node not found in replication map",i.database,u);return}if(d.connected=!1,i.finished||!qh.default.get(U.REPLICATION_FAILOVER))return;let f=d.nodes[0];if(!(f.replicates===!0||f.replicates?.sends||f.subscriptions?.length))return;let m=f.shard,h=(l+1)%c.length;for(;l!==h;){let p=c[h],_=wd.get(p);u=Zi.get(_.url);let g=u?.get(i.database);if(!g||g.connected===!1||g.nodes[0].shard!==m){h=(h+1)%c.length;continue}let{worker:y,nodes:T}=g,R=!1;for(let N of d.nodes){if(T.some(O=>O.name===N.name)){ot.info(`Disconnected node is already failing over to ${p} for ${i.database}`);continue}N.endTime<Date.now()||(T.push(N),R=!0)}if(d.nodes=[d.nodes[0]],!R){ot.info(`Disconnected node ${i.name} has no nodes to fail over to ${p}`);return}ot.info(`Failing over ${i.database} from ${i.name} to ${p}`),y?y.postMessage({type:"subscribe-to-node",database:i.database,nodes:T}):$h({database:i.database,nodes:T});return}ot.warn("Unable to find any other node to fail over to",i.name,i.url)}catch(a){ot.error("Error failing over node",a)}},"disconnectedFromNode"),Ml=o(function(i){let a=Zi.get(i.url),c=a?.get(i.database);if(!c){ot.warn("Connected node not found in replication map, this may be because the node is being removed",i.database,a);return}c.connected=!0,c.latency=i.latency;let l=c.nodes[0];if(!l){ot.warn("Newly connected node has no node subscriptions",i.database,c);return}if(!l.name){ot.debug("Connected node is not named yet",i.database,c);return}if(!qh.default.get(U.REPLICATION_FAILOVER))return;c.nodes=[l];let u=!1;for(let d of Zi.values()){let f=d.get(i.database);if(!f||f==c)continue;let{worker:m,nodes:h,connected:p}=f;if(h)if(p===!1&&h[0].shard===l.shard)u=!0,c.nodes.push(h[0]);else{let _=h.filter(g=>g&&g.name!==l.name);_.length<h.length&&(f.nodes=_,m.postMessage({type:"subscribe-to-node",database:i.database,nodes:h}))}}u&&c.worker&&c.worker.postMessage({type:"subscribe-to-node",database:i.database,nodes:c.nodes})},"connectedToNode"),(0,eo.onMessageByType)("disconnected-from-node",Od),(0,eo.onMessageByType)("connected-to-node",Ml),(0,eo.onMessageByType)("request-cluster-status",Cq)}function Cq(e,t){let r=[];for(let[n,s]of wd)try{let i=Zi.get(s.url);ot.info("Getting cluster status for",n,s.url,"has dbs",i?.size);let a=[];if(i){for(let[l,{worker:u,connected:d,nodes:f,latency:m}]of i)a.push({database:l,connected:d,latency:m,threadId:u?.threadId,nodes:f.filter(h=>!(h.endTime<Date.now())).map(h=>h.name)});let c=(0,Nw.cloneDeep)(s);c.database_sockets=a,delete c.ca,delete c.node_name,delete c.__updatedtime__,delete c.__createdtime__,r.push(c)}}catch(i){ot.warn("Error getting cluster status for",s?.url,i)}return t?.postMessage({type:"cluster-status",connections:r}),{connections:r}}async function Ho(e,t){let r=Kt();e=e??pi(t.url),t.name=e;try{if(t.ca){let s=new Oq.X509Certificate(t.ca);t.ca_info={issuer:s.issuer.replace(/\n/g," "),subject:s.subject.replace(/\n/g," "),subjectAltName:s.subjectAltName,serialNumber:s.serialNumber,validFrom:s.validFrom,validTo:s.validTo}}}catch(s){ot.error("Error parsing replication CA info for hdb_nodes table",s.message)}let n=r.primaryStore.get(e);if(ot.debug(`Ensuring node ${e} at ${t.url}, existing record:`,n,"new record:",t),!n)await r.patch(t);else{t.replicates&&!qh.default.get(U.CLUSTERING_ENABLED)&&(t.subscriptions=null);for(let s in t)if(n[s]!==t[s]&&s==="subscriptions"&&t[s]&&n[s]){let i=[],a=(0,Nw.cloneDeep)(n[s]);for(let c of t[s]){let l=!1;for(let u of a)if((c.database??c.schema)===(u.database??u.schema)&&c.table===u.table){u.publish=c.publish,u.subscribe=c.subscribe,l=!0;break}l||i.push(c)}t.subscriptions=[...a,...i];break}if(Array.isArray(t.revoked_certificates)){let s=n.revoked_certificates||[];t.revoked_certificates=[...new Set([...s,...t.revoked_certificates])]}ot.info(`Updating node ${e} at ${t.url}`),await r.patch(t)}}var eo,TS,ot,Nw,qh,Oq,sce,Zi,Od,Ml,wd,SS,Vh=ue(()=>{De();eo=w(rt());ss();TS=require("worker_threads");Dl();ot=w(Q()),Nw=require("lodash"),qh=w(oe());k();Oq=require("crypto"),sce=200,Zi=new Map,wd=new Map,SS=new Map;o(ww,"startOnMainThread");o(Cq,"requestClusterStatus");TS.parentPort&&(Od=o(e=>{TS.parentPort.postMessage({type:"disconnected-from-node",...e})},"disconnectedFromNode"),Ml=o(e=>{TS.parentPort.postMessage({type:"connected-to-node",...e})},"connectedToNode"),(0,eo.onMessageByType)("subscribe-to-node",e=>{$h(e)}),(0,eo.onMessageByType)("unsubscribe-from-node",e=>{RS(e)}));o(Ho,"ensureNode")});var os=M(Yt=>{"use strict";var hr=require("path"),{watch:ice}=require("chokidar"),Un=require("fs-extra"),Cd=require("node-forge"),xq=require("net"),{generateKeyPair:Ow,X509Certificate:ko,createPrivateKey:Bq}=require("crypto"),oce=require("util");Ow=oce.promisify(Ow);var wt=Cd.pki,Ei=require("joi"),{v4:Fq}=require("uuid"),{validateBySchema:Dw}=ct(),{forComponent:ace}=Q(),is=oe(),Ds=(k(),v(W)),{CONFIG_PARAMS:Ul}=Ds,_i=tA(),{ClientError:Qa}=ge(),AS=require("node:tls"),{relative:Hq,join:cce}=require("node:path"),{CERT_PREFERENCE_APP:zMe,CERTIFICATE_VALUES:Lq}=_i,lce=xc(),Cw=yt(),{table:uce,getDatabases:dce,databases:yS}=(De(),v(mt)),{getJWTRSAKeys:Dq}=(gd(),v(Lh)),ht=ace("tls");Yt.generateKeys=Uw;Yt.updateConfigCert=Wq;Yt.createCsr=gce;Yt.signCertificate=Sce;Yt.setCertTable=Pd;Yt.loadCertificates=Vq;Yt.reviewSelfSignedCert=Bw;Yt.createTLSSelector=jq;Yt.listCertificates=Jq;Yt.addCertificate=Ice;Yt.removeCertificate=wce;Yt.createNatsCerts=yce;Yt.generateCertsKeys=Rce;Yt.getReplicationCert=Yh;Yt.getReplicationCertAuth=_ce;Yt.renewSelfSigned=Ace;Yt.hostnamesFromCert=Hw;Yt.getKey=Oce;Yt.getHostnamesFromCertificate=Cce;Yt.getPrimaryHostName=Fw;var{urlToNodeName:kq,getThisNodeUrl:fce,getThisNodeName:IS,clearThisNodeName:mce}=(ss(),v(Go)),{readFileSync:hce,statSync:Gq}=require("node:fs"),jMe=oe(),{getTicketKeys:pce,onMessageFromWorkers:Ece}=rt(),ja=Q(),{isMainThread:qq}=require("worker_threads"),{TLSSocket:$q,createSecureContext:QMe}=require("node:tls"),Mw=3650,Kh=["127.0.0.1","localhost","::1"],vw=[{name:"countryName",value:"USA"},{name:"stateOrProvinceName",value:"Colorado"},{name:"localityName",value:"Denver"},{name:"organizationName",value:"HarperDB, Inc."}];Ece(async e=>{e.type===Ds.ITC_EVENT_TYPES.RESTART&&(is.initSync(!0),await Bw())});var Jr;function Xa(){return Jr||(Jr=dce().system.hdb_certificate,Jr||(Jr=uce({table:"hdb_certificate",database:"system",attributes:[{name:"name",isPrimaryKey:!0},{attribute:"uses"},{attribute:"certificate"},{attribute:"is_authority"},{attribute:"private_key_name"},{attribute:"details"},{attribute:"is_self_signed"},{attribute:"__updatedtime__"}]}))),Jr}o(Xa,"getCertTable");async function Yh(){let e=jq("operations-api"),t={secureContexts:null,setSecureContext:o(s=>{},"setSecureContext")};await e.initialize(t);let r=t.secureContexts.get(IS());if(!r)return;let n=new ko(r.options.cert);return r.cert_parsed=n,r.issuer=n.issuer,r}o(Yh,"getReplicationCert");async function _ce(){Xa();let e=(await Yh()).options.cert,r=new ko(e).issuer.match(/CN=(.*)/)?.[1];return Jr.get(r)}o(_ce,"getReplicationCertAuth");var Mq,Ja=new Map;function Vq(){if(Mq)return;Mq=!0;let e=[{configKey:Ul.TLS},{configKey:Ul.OPERATIONSAPI_TLS}];Xa();let t=hr.dirname(Cw.getConfigFilePath()),r;for(let{configKey:n}of e){let s=Cw.getConfigFromFile(n);if(s){Array.isArray(s)||(s=[s]);for(let i of s){let a=i.privateKey,c=a&&Hq(cce(t,"keys"),a);c&&vq(a,l=>{Ja.set(c,l)},"private key");for(let l of[!1,!0]){let u=i[l?"certificateAuthority":"certificate"];if(u&&qq){let d;vq(u,f=>{if(Lq.cert===f)return;let m=i.hostname??i.hostnames??i.host??i.hosts;m&&!Array.isArray(m)&&(m=[m]);let h=zq(u),p=new ko(h),_;try{_=Fw(p)}catch(R){ht.error("error extracting host name from certificate",R);return}if(_==null){ht.error("No host name found on certificate");return}if(p.checkIssued(new ko(Lq.cert)))return;let g=Jr.primaryStore.get(_),y=Gq(u).mtimeMs,T=!g||g.is_self_signed?1:g.file_timestamp??g.__updatedtime__;if(g&&y<=T){y<T&&ht.info(`Certificate ${_} at ${u} is older (${new Date(y)}) than the certificate in the database (${T>1?new Date(T):"only self signed certificate available"})`);return}r=Jr.put({name:_,uses:["https",...n.includes("operations")?["operations"]:[]],ciphers:i.ciphers,certificate:h,private_key_name:c,is_authority:l,hostnames:m,fileTimestamp:y,details:{issuer:p.issuer.replace(/\n/g," "),subject:p.subject?.replace(/\n/g," "),subject_alt_name:p.subjectAltName,serial_number:p.serialNumber,valid_from:p.validFrom,valid_to:p.validTo}})},l?"certificate authority":"certificate")}}}}}return r}o(Vq,"loadCertificates");function vq(e,t,r){let n,s=o((i,a)=>{try{let c=a.mtimeMs;c&&c!==n&&(n&&qq&&ht.warn(`Reloading ${r}:`,i),n=c,t(zq(i)))}catch(c){ht.error(`Error loading ${r}:`,i,c)}},"loadFile");Un.existsSync(e)?s(e,Gq(e)):ht.error(`${r} file not found:`,e),ice(e,{persistent:!1}).on("change",s)}o(vq,"loadAndWatch");function Pw(){let e=fce();if(e==null){let t=Kh[0];return ht.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return kq(e)}o(Pw,"getHost");function bS(){let e=IS();if(e==null){let t=Kh[0];return ht.info("replication url is missing from harperdb-config.yaml, using default host"+t),t}return e}o(bS,"getCommonName");async function gce(){let e=await Yh(),t=wt.certificateFromPem(e.options.cert),r=wt.privateKeyFromPem(e.options.key);ht.info("Creating CSR with cert named:",e.name);let n=wt.createCertificationRequest();n.publicKey=t.publicKey;let s=[{name:"commonName",value:bS()},...vw];ht.info("Creating CSR with subject",s),n.setSubject(s);let i=[{name:"unstructuredName",value:"HarperDB, Inc."},{name:"extensionRequest",extensions:Kq()}];return ht.info("Creating CSR with attributes",i),n.setAttributes(i),n.sign(r),Cd.pki.certificationRequestToPem(n)}o(gce,"createCsr");function Kq(){let e=Kh.includes(bS())?Kh:[...Kh,bS()];return e.includes(Pw())||e.push(Pw()),[{name:"basicConstraints",cA:!1,critical:!0},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0,critical:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"nsCertType",client:!0,server:!0},{name:"subjectAltName",altNames:e.map(t=>xq.isIP(t)?{type:7,ip:t}:{type:2,value:t})}]}o(Kq,"certExtensions");async function Sce(e){let t={},r=hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME);if(e.csr){let n,s;Xa();for await(let d of Jr.search([]))if(d.is_authority&&!d.details.issuer.includes("HarperDB-Certificate-Authority")){if(Ja.has(d.private_key_name)){n=Ja.get(d.private_key_name),s=d;break}else if(d.private_key_name&&await Un.exists(hr.join(r,d.private_key_name))){n=Un.readFile(hr.join(r,d.private_key_name)),s=d;break}}if(!n){let d=await Lw();s=d.ca,n=d.private_key}n=wt.privateKeyFromPem(n),t.signingCA=s.certificate;let i=wt.certificateFromPem(s.certificate);ht.info("Signing CSR with cert named",s.name);let a=wt.certificationRequestFromPem(e.csr);try{a.verify()}catch(d){return ht.error(d),new Error("Error verifying CSR: "+d.message)}let c=Cd.pki.createCertificate();c.serialNumber="0"+Math.random().toString().slice(2,9),c.validity.notBefore=new Date;let l=new Date;c.validity.notAfter=l,c.validity.notAfter.setDate(l.getDate()+Mw),ht.info("sign cert setting validity:",c.validity),ht.info("sign cert setting subject from CSR:",a.subject.attributes),c.setSubject(a.subject.attributes),ht.info("sign cert setting issuer:",i.subject.attributes),c.setIssuer(i.subject.attributes);let u=a.getAttribute({name:"extensionRequest"}).extensions;ht.info("sign cert adding extensions from CSR:",u),c.setExtensions(u),c.publicKey=a.publicKey,c.sign(n,Cd.md.sha256.create()),t.certificate=wt.certificateToPem(c)}else ht.info("Sign cert did not receive a CSR from:",e.url,"only the CA will be returned");return t}o(Sce,"signCertificate");async function Tce(e,t){await Pd({name:IS(),uses:["https","wss"],certificate:e,private_key_name:"privateKey.pem",is_authority:!1,is_self_signed:!0}),await Pd({name:t.subject.getField("CN").value,uses:["https","wss"],certificate:wt.certificateToPem(t),private_key_name:"privateKey.pem",is_authority:!0,is_self_signed:!0})}o(Tce,"createCertificateTable");async function Pd(e){let t=new ko(e.certificate);e.details={issuer:t.issuer.replace(/\n/g," "),subject:t.subject?.replace(/\n/g," "),subject_alt_name:t.subjectAltName,serial_number:t.serialNumber,valid_from:t.validFrom,valid_to:t.validTo},Xa(),await Jr.patch(e)}o(Pd,"setCertTable");async function Uw(){let e=await Ow("rsa",{modulusLength:4096,publicKeyEncoding:{type:"spki",format:"pem"},privateKeyEncoding:{type:"pkcs8",format:"pem"}});return{publicKey:wt.publicKeyFromPem(e.publicKey),privateKey:wt.privateKeyFromPem(e.privateKey)}}o(Uw,"generateKeys");async function xw(e,t,r){let n=wt.createCertificate();if(!t){let a=await Yh();t=wt.certificateFromPem(a.options.cert).publicKey}n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+Mw);let i=[{name:"commonName",value:bS()},...vw];return n.setSubject(i),n.setIssuer(r.subject.attributes),n.setExtensions(Kq()),n.sign(e,Cd.md.sha256.create()),wt.certificateToPem(n)}o(xw,"generateCertificates");async function Lw(){let e=await Jq(),t;for(let r of e){if(!r.is_authority)continue;let n=await Qq(r.private_key_name);if(r.private_key_name&&n&&new ko(r.certificate).checkPrivateKey(Bq(n))){ht.trace(`CA named: ${r.name} found with matching private key`),t={ca:r,private_key:n};break}}if(t)return t;ht.trace("No CA found with matching private key")}o(Lw,"getCertAuthority");async function Yq(e,t,r=!0){let n=wt.createCertificate();n.publicKey=t,n.serialNumber="0"+Math.random().toString().slice(2,9),n.validity.notBefore=new Date;let s=new Date;n.validity.notAfter=s,n.validity.notAfter.setDate(s.getDate()+Mw);let i=[{name:"commonName",value:`HarperDB-Certificate-Authority-${is.get(Ul.REPLICATION_HOSTNAME)??kq(is.get(Ul.REPLICATION_URL))??Fq().split("-")[0]}`},...vw];n.setSubject(i),n.setIssuer(i),n.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,critical:!0}]),n.sign(e,Cd.md.sha256.create());let a=hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME),c=hr.join(a,_i.PRIVATEKEY_PEM_NAME);return r&&await Un.writeFile(c,wt.privateKeyToPem(e)),n}o(Yq,"generateCertAuthority");async function Rce(){let{privateKey:e,publicKey:t}=await Uw(),r=await Yq(e,t),n=await xw(e,t,r);await Tce(n,r),Wq()}o(Rce,"generateCertsKeys");async function yce(){let e=await xw(wt.privateKeyFromPem(_i.CERTIFICATE_VALUES.key),void 0,wt.certificateFromPem(_i.CERTIFICATE_VALUES.cert)),t=hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME),r=hr.join(t,_i.NATS_CERTIFICATE_PEM_NAME);await Un.exists(r)||await Un.writeFile(r,e);let n=hr.join(t,_i.NATS_CA_PEM_NAME);await Un.exists(n)||await Un.writeFile(n,_i.CERTIFICATE_VALUES.cert)}o(yce,"createNatsCerts");async function Ace(){Xa();for await(let e of Jr.search([{attribute:"is_self_signed",value:!0}]))await Jr.delete(e.name);await Bw()}o(Ace,"renewSelfSigned");async function Bw(){mce(),await Vq(),Xa();let e=await Lw();if(!e){ht.notify("A matching Certificate Authority and key was not found. A new CA will be created in advance, so it's available if needed.");let r=o(u=>{try{return{key:wt.privateKeyFromPem(Un.readFileSync(u)),keyPath:u}}catch(d){return ht.warn(`Failed to parse private key from ${u}:`,d.message),{key:null,keyPath:u}}},"tryToParseKey"),n=is.get(Ul.TLS),s,i;if(Array.isArray(n)){for(let u of n)if(u.privateKey){let d=r(u.privateKey);if(s=d.key,i=d.keyPath,d.key)break}}else{let u=is.get(Ul.TLS_PRIVATEKEY),d=r(u);s=d.key,i=d.keyPath}let a=hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME),c=Hq(a,i);s||(ht.warn("Unable to parse the TLS key",i,"A new key will be generated and used to create Certificate Authority"),{privateKey:s}=await Uw(),Un.existsSync(hr.join(a,_i.PRIVATEKEY_PEM_NAME))&&(c=`privateKey${Fq().split("-")[0]}.pem`),await Un.writeFile(hr.join(a,c),wt.privateKeyToPem(s)));let l=await Yq(s,wt.setRsaPublicKey(s.n,s.e),!1);await Pd({name:l.subject.getField("CN").value,uses:["https"],certificate:wt.certificateToPem(l),private_key_name:c,is_authority:!0,is_self_signed:!0})}if(!await Yh()){let r=IS();ht.notify(`A suitable replication certificate was not found, creating new self singed cert named: ${r}`),e=e??await Lw();let n=wt.certificateFromPem(e.ca.certificate),s=n.publicKey,i=await xw(wt.privateKeyFromPem(e.private_key),s,n);await Pd({name:r,uses:["https","operations","wss"],certificate:i,is_authority:!1,private_key_name:e.ca.private_key_name,is_self_signed:!0})}}o(Bw,"reviewSelfSignedCert");function Wq(){let e=lce(Object.keys(Ds.CONFIG_PARAM_MAP),!0),t=hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME),r=hr.join(t,_i.PRIVATEKEY_PEM_NAME),n=hr.join(t,_i.NATS_CERTIFICATE_PEM_NAME),s=hr.join(t,_i.NATS_CA_PEM_NAME),i=Ds.CONFIG_PARAMS,a={[i.TLS_PRIVATEKEY]:e[i.TLS_PRIVATEKEY.toLowerCase()]?e[i.TLS_PRIVATEKEY.toLowerCase()]:r};e[i.TLS_CERTIFICATE.toLowerCase()]&&(a[i.TLS_CERTIFICATE]=e[i.TLS_CERTIFICATE.toLowerCase()]),e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.TLS_CERTIFICATEAUTHORITY]=e[i.TLS_CERTIFICATEAUTHORITY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATE]=e[i.OPERATIONSAPI_TLS_CERTIFICATE.toLowerCase()]),e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_PRIVATEKEY]=e[i.OPERATIONSAPI_TLS_PRIVATEKEY.toLowerCase()]),e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]&&(a[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY]=e[i.OPERATIONSAPI_TLS_CERTIFICATEAUTHORITY.toLowerCase()]),(e[i.CLUSTERING_ENABLED.toLowerCase()]||e.clustering)&&(a[i.CLUSTERING_TLS_CERTIFICATE]=e[i.CLUSTERING_TLS_CERTIFICATE.toLowerCase()]??n,a[i.CLUSTERING_TLS_CERT_AUTH]=e[i.CLUSTERING_TLS_CERT_AUTH.toLowerCase()]??s,a[i.CLUSTERING_TLS_PRIVATEKEY]=e[i.CLUSTERING_TLS_PRIVATEKEY.toLowerCase()]??r),Cw.updateConfigValue(void 0,void 0,a,!1,!0)}o(Wq,"updateConfigCert");function zq(e){return e.startsWith("-----BEGIN")?e:hce(e,"utf8")}o(zq,"readPEM");var Uq=AS.createSecureContext;AS.createSecureContext=function(e){if(!e.cert||!e.key)return Uq(e);let t={...e};delete t.key,delete t.cert;let r=Uq(t);return r.context.setCert(e.cert),r.context.setKey(e.key,void 0),r};var bce=$q.prototype._init;$q.prototype._init=function(e,t){bce.call(this,e,t);let r=this;this._handle.oncertcb=function(n){let s=n.servername;r._SNICallback(s,(i,a)=>{this.sni_context=a?.context||a,this.certCbDone()})}};var vl=new Map;function jq(e,t){let r=new Map,n,s=!1;return i.initialize=a=>i.ready?i.ready:(a&&(a.secureContexts=r,a.secureContextsListeners=[]),i.ready=new Promise((c,l)=>{async function u(){try{r.clear(),vl.clear();let d=0;if(yS===void 0){c();return}for await(let f of yS.system.hdb_certificate.search([])){let m=f.certificate,h=new ko(m);f.is_authority&&(h.asString=m,vl.set(h.subject,m))}for await(let f of yS.system.hdb_certificate.search([]))try{if(f.is_authority)continue;let m=e==="operations-api",h=f.is_self_signed?1:2;m&&f.uses?.includes?.("operations")&&(h+=1);let p=await Qq(f.private_key_name),_=f.certificate,g=new ko(_);if(vl.has(g.issuer)&&(_+=`
17
- `+vl.get(g.issuer)),!p||!_)throw new Error("Missing private key or certificate for secure server");let y={ciphers:f.ciphers,ticketKeys:pce(),availableCAs:vl,ca:t&&Array.from(vl.values()),cert:_,key:p,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(y.sessionIdContext=a.sessionIdContext);let T=AS.createSecureContext(y);T.name=f.name,T.options=y,T.quality=h,T.certificateAuthorities=Array.from(vl),T.certStart=_.toString().slice(0,100);let R=f.hostnames??Hw(g);Array.isArray(R)||(R=[R]);let N;for(let O of R)if(O){O[0]==="*"&&(s=!0,O=O.slice(1)),O===Pw()&&(h+=2),xq.isIP(O)&&(N=!0);let F=r.get(O)?.quality??0;h>F&&r.set(O,T)}else ja.error("No hostname found for certificate at",AS.certificate);ja.trace("Adding TLS",T.name,"for",a.ports||"client","cert named",f.name,"hostnames",R,"quality",h,"best quality",d),h>d&&(i.defaultContext=n=T,d=h,a&&(a.defaultContext=T))}catch(m){ja.error("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),yS?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){ja.info("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return ja.debug("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?ja.debug("No certificate found to match",a,"using the default certificate"):ja.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):ja.info("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(jq,"createTLSSelector");async function Qq(e){let t=Ja.get(e);return!t&&e?await Un.readFile(hr.join(is.get(Ul.ROOTPATH),Ds.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(Qq,"getPrivateKeyByName");async function Jq(){Xa();let e=[];for await(let t of Jr.search([]))e.push(t);return e}o(Jq,"listCertificates");async function Ice(e){let t=Dw(e,Ei.object({name:Ei.string().required(),certificate:Ei.string().required(),is_authority:Ei.boolean().required(),private_key:Ei.string(),hosts:Ei.array(),uses:Ei.array()}));if(t)throw new Qa(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new ko(n),c=!1,l=!1,u;for(let[h,p]of Ja)!s&&!c&&a.checkPrivateKey(Bq(p))&&(c=!0,u=h),s&&s===p&&(l=!0,u=h);if(!i&&!s&&!c)throw new Qa("A suitable private key was not found for this certificate");let d;if(!r){try{d=Fw(a)}catch(h){ht.error(h)}if(d==null)throw new Qa("Error extracting certificate host name, please provide a name parameter")}let f=Nce(r??d);s&&!c&&!l&&(await Un.writeFile(hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME,f+".pem"),s),Ja.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await Pd(m),"Successfully added certificate: "+f}o(Ice,"addCertificate");function Nce(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(Nce,"sanitizeName");async function wce(e){let t=Dw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Qa(t.message);let{name:r}=e;Xa();let n=await Jr.get(r);if(!n)throw new Qa(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Jr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(ht.info("Removing private key named",s),await Un.remove(hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME,s)))}return await Jr.delete(r),"Successfully removed "+r}o(wce,"removeCertificate");function Fw(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||Hw(e)[0]}o(Fw,"getPrimaryHostName");function Hw(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=certObj.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}o(Hw,"hostnamesFromCert");async function Oce(e){if(e.bypass_auth!==!0)throw new Qa("Unauthorized","401");let t=Dw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Qa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await Dq()).privateKey;if(r===".jwtPublic")return(await Dq()).publicKey;if(Ja.get(r))return Ja.get(e.name);throw new Qa("Key not found")}o(Oce,"getKey");function Cce(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(Cce,"getHostnamesFromCertificate")});var S$={};Oe(S$,{CONFIRMATION_STATUS_POSITION:()=>_$,LATENCY_POSITION:()=>US,NodeReplicationConnection:()=>Md,OPERATION_REQUEST:()=>$w,RECEIVED_TIME_POSITION:()=>MS,RECEIVED_VERSION_POSITION:()=>DS,RECEIVING_STATUS_POSITION:()=>vS,RECEIVING_STATUS_RECEIVING:()=>g$,RECEIVING_STATUS_WAITING:()=>Vw,SENDING_TIME_POSITION:()=>Wh,createWebSocket:()=>xS,databaseSubscriptions:()=>ec,replicateOverWS:()=>zh,tableUpdateListeners:()=>Yw});async function xS(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Ze(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!Gw){let l=(0,f$.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),Gw=u.secureContexts}if(i=Gw.get(s),i&&ae.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,h$.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(LS?.caCount!==qo.size&&(LS=m$.createSecureContext({...i.options,ca:[...qo,...i.options.availableCAs.values()]}),LS.caCount=qo.size),c.secureContext=LS),new u$.WebSocket(e,"harperdb-replication-v1",c)}function zh(e,t,r){let n=t.port||t.securePort,s=xl.pid%1e3+"-"+d$.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ae.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||ec,f,m,h=!1,p=t.subscription;p?.then&&p.then(E=>{p=E,p.auditStore&&(f=p.auditStore)});let _=t.tables||u&&nt()[u],g;if(!r){ae.error?.(s,"No authorization provided"),Ss(1008,"Unauthorized");return}let y=new Map,T=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let R,N,O,F,Z,G,Y,q=6e4,K,ce=0,le=0,se=0,pe=l$.default.get(U.REPLICATION_BLOBTIMEOUT)??12e4,Ne=new Map,Ue=[],xe=0,Rr;if(t.url){let E=o(()=>{Z&&le===e._socket?.bytesRead&&se===e._socket?.bytesWritten?e.terminate():(Z=performance.now(),e.ping(),le=e._socket?.bytesRead,se=e._socket?.bytesWritten)},"sendPing");O=setInterval(E,a$).unref(),E()}else Jt();e._socket?.setMaxListeners(200);function Jt(){clearTimeout(F),le=e._socket?.bytesRead,se=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&se===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},a$*2).unref()}o(Jt,"resetPingTimer");function Mt(){if(!(!g||!u))return m||(m=Id(f,u,g)),m}o(Mt,"getSharedStatus"),u&&Sa(u);let Xt,Uf,Pc=[],Gt=[],xf,Bf=[],OE=[],CE=[],Fy=150,Ff=25,Pe=0,PE=0,Hf=!1,_o,Lr,yr,kf;e.on("message",E=>{ce=performance.now();try{let S=E.dataView=new Wc(E.buffer,E.byteOffset,E.byteLength);if(E[0]>127){let P=(0,et.decode)(E),[L,D,H]=P;switch(L){case Zq:{if(D){if(g){if(g!==D){ae.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${D}, disconnecting`),e.send((0,et.encode)([Ld])),Ss(1008,"Node name mismatch");return}}else if(g=D,t.connection?.tentativeNode){let B=t.connection.tentativeNode;B.name=g,t.connection.tentativeNode=null,Ho(g,B)}if(t.connection&&(t.connection.nodeName=g),ae.debug?.(s,"received node name:",g,"db:",u??P[2]),!u)try{Sa(u=P[2]),u==="system"&&(Xt=Wa(t,(B,de)=>{pu(de)&&Ta(de)}),e.on("close",()=>{Xt?.remove()}))}catch(B){ae.warn?.(s,"Error setting database",B),e.send((0,et.encode)([Ld])),Ss(1008,B.message);return}Dr()}break}case i$:{ae.debug?.(s,"Received table definitions for",D.map(B=>B.table));for(let B of D){let de=P[2];B.database=de;let me;pu(de)&&(de==="system"?ke[de]?.[B.table]||(me=V(B,ke[de]?.[B.table])):me=V(B,ke[de]?.[B.table]),f||(f=me?.auditStore),_||(_=nt()?.[de]))}break}case Ld:Ss();break;case $w:try{let B=r?.replicates||r?.subscribers||r?.name;ae.debug?.("Received operation request",D,"from",g),server.operation(D,{user:r},!B).then(de=>{Array.isArray(de)&&(de={results:de}),de.requestId=D.requestId,e.send((0,et.encode)([wS,de]))},de=>{e.send((0,et.encode)([wS,{requestId:D.requestId,error:(0,Dd.errorToString)(de)}]))})}catch(B){e.send((0,et.encode)([wS,{requestId:D.requestId,error:(0,Dd.errorToString)(B)}]))}break;case wS:let{resolve:C,reject:x}=y.get(D.requestId);D.error?x(new Error(D.error)):C(D),y.delete(D.requestId);break;case kw:let z=P[3];if(!_){u?ae.error?.(s,"No database found for",u):ae.error?.(s,"Database name never received"),Ss();return}let ne=_[z];ne=V({table:z,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ne),Pc[H]={name:z,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(B){return ne.primaryStore.getEntry(B)},rootStore:ne.primaryStore.rootStore};break;case e$:kf=f?yq(D,f):new Map,xf=P[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${xf}`);break;case t$:let re=H;CE[re]=D;break;case s$:Mt()[_$]=D,ae.trace?.(s,"received and broadcasting committed update",D),Mt().buffer.notify();break;case n$:R=D,p.send({type:"end_txn",localTime:R,remoteNodeIds:T}),Mt(),replication_shared_status[DS]=last_sequence_id_received,replication_shared_status[MS]=Date.now(),replication_shared_status[vS]=Vw;break;case OS:{let B=P[1],{fileId:de,size:me,finished:Se,error:ee}=B,j=Ne.get(de);ae.debug?.("Received blob",de,"has stream",!!j,"connectedToBlob",!!j?.connectedToBlob,"length",P[2].length,"finished",Se),j||(j=new qw.PassThrough,j.expectedSize=me,Ne.set(de,j)),j.lastChunk=Date.now();let he=P[2];st(he.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Se?(ee?(j.on("error",()=>{}),j.destroy(new Error("Blob error: "+ee+" for record "+(j.recordId??"unknown")+" from "+g))):j.end(he),j.connectedToBlob&&Ne.delete(de)):j.write(he)}catch(Te){ae.error?.(`Error receiving blob for ${j.recordId} from ${g} and streaming to storage`,Te),Ne.delete(de)}break}case r$:{let B=D,de;try{let me=P[3],Se=Gt[H]||(Gt[H]=_[P[4]]);if(!Se)return ae.warn?.("Unknown table id trying to handle record request",H);let ee=Se.primaryStore.getBinaryFast(Symbol.for("structures")),j=ee?.length??0;if(j>0&&j!==PE){PE=j;let Te=(0,et.decode)(ee);e.send((0,et.encode)([kw,{typedStructs:Te.typed,structures:Te.named},H,Se.tableName]))}let he=Se.primaryStore.getBinaryFast(me);if(he){let Te=Se.primaryStore.decoder.decode(he,{valueAsBuffer:!0}),fe=lt||{};fe.version=(0,p$.getLastVersion)(),lt&&lt[Pu]&Vr&&(Te=Buffer.from(Te),gm(()=>Se.primaryStore.decoder.decode(he),We=>ga(We,me),Se.primaryStore.rootStore)),de=(0,et.encode)([NS,B,{value:Te,expiresAt:fe.expiresAt,version:fe.version,residencyId:fe.residencyId,nodeId:fe.nodeId,user:fe.user}])}else de=(0,et.encode)([NS,B])}catch(me){de=(0,et.encode)([NS,B,{error:me.message}])}e.send(de);break}case NS:{let{resolve:B,reject:de,tableId:me,key:Se}=y.get(P[1]),ee=P[2];if(ee?.error)de(new Error(ee.error));else if(ee){let j;m_(()=>{let he=Pc[me].decoder.decode(ee.value);ee.value=he,ee.key=Se,B(ee)||j&&setTimeout(()=>j.forEach(u_),6e4).unref()},f?.rootStore,he=>{let Te=Lc(he,Se);return j||(j=[]),j.push(Te),Te})}else B();y.delete(P[1]);break}case Xq:{yr=D;let B,de,me=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=d.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",yr),!p){let Ee;p=new Promise(ft=>{ae.debug?.("Waiting for subscription to database "+u),Ee=ft}),p.ready=Ee,ec.set(u,p)}if(r.name)de=Kt().subscribe(r.name),de.then(async Ee=>{B=Ee;for await(let ft of B){let tt=ft.value;if(!(tt?.replicates===!0||tt?.replicates?.receives||tt?.subscriptions?.some(cr=>(cr.database||cr.schema)===u&&cr.publish!==!1))){me=!0,e.send((0,et.encode)([Ld])),Ss(1008,`Unauthorized database subscription to ${u}`);return}}},Ee=>{ae.error?.(s,"Error subscribing to HDB nodes",Ee)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([Ld])),Ss(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(ae.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),yr.length===0)return;let Se=yr[0],ee=o(Ee=>{if(Ee&&(Se.replicateByDefault?!Se.tables.includes(Ee.tableName):Se.tables.includes(Ee.tableName)))return{table:Ee}},"tableToTableEntry"),j={txnTime:0},he,Te,fe=1/0,We,Et=o((Ee,ft)=>{if(Ee.type==="end_txn"){j.txnTime&&(a[i]!==66&&ae.error?.("Invalid encoding of message"),Eu(9),Eu(b_),Mc(We=ft),ut()),i=c,j.txnTime=0;return}let tt=Ee.nodeId,cr=Ee.tableId,vt=Te[cr];if(!vt&&(vt=Te[cr]=ee(p.tableById[cr]),!vt))return ae.debug?.("Not subscribed to table",cr);let Ts=vt.table,Ut=Ts.primaryStore,Js=Ut.encoder;(Ee.extendedType&C_||!Js.typedStructs)&&(Js._mergeStructures(Js.getStructures()),Js.typedStructs&&(Js.lastTypedStructuresLength=Js.typedStructs.length));let _u=he[tt];if(!(_u&&_u.startTime<ft&&(!_u.endTime||_u.endTime>ft)))return PS&&ae.trace?.(s,"skipping replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he),tM();PS&&ae.trace?.(s,"sending replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he);let Hy=Ee.version,vc=Ee.residencyId,ky=hu(vc,Ts),DE;if(ky&&!ky.includes(g)){let Xs=hu(Ee.previousResidencyId,Ts);if(Xs&&!Xs.includes(g)&&(Ee.type==="put"||Ee.type==="patch")||Ts.getResidencyById)return tM();let qf=Ee.recordId;ae.trace?.(s,"sending invalidation",qf,g,"from",tt);let $f=0;vc&&($f|=zc),Ee.previousResidencyId&&($f|=jc);let $y,ME=null;for(let rM in Ts.indices){if(!ME){if($y=Ee.getValue(Ut,!0),!$y)break;ME={}}ME[rM]=$y[rM]}DE=Qc(Ee.version,cr,qf,null,tt,Ee.user,Ee.type==="put"||Ee.type==="patch"?"invalidate":Ee.type,Js.encode(ME),$f,vc,Ee.previousResidencyId,Ee.expiresAt)}function tM(){return ae.trace?.(s,"skipping audit record",Ee.recordId),G||(G=setTimeout(()=>{G=null,(We||0)+o$/2<fe&&(PS&&ae.trace?.(s,"sending skipped sequence update",fe),e.send((0,et.encode)([n$,fe])))},o$).unref()),new Promise(setImmediate)}o(tM,"skipAuditRecord");let Gy=Js.typedStructs,qy=Js.structures;if((Gy?.length!=vt.typed_length||qy?.length!=vt.structure_length)&&(vt.typed_length=Gy?.length,vt.structure_length=qy.length,ae.debug?.(s,"send table struct",vt.typed_length,vt.structure_length),vt.sentName||(vt.sentName=!0),e.send((0,et.encode)([kw,{typedStructs:Gy,structures:qy,attributes:Ts.attributes,schemaDefined:Ts.schemaDefined},cr,vt.table.tableName]))),vc&&!OE[vc]&&(e.send((0,et.encode)([t$,ky,vc])),OE[vc]=!0),j.txnTime!==Hy&&(j.txnTime&&(PS&&ae.trace?.(s,"new txn time, sending queued txn",j.txnTime),a[i]!==66&&ae.error?.("Invalid encoding of message"),ut()),j.txnTime=Hy,i=c,Mc(Hy)),DE)Eu(DE.length),Dc(DE);else{let Xs=Ee.encoded;Ee.extendedType&Vr&&gm(()=>Ee.getValue(Ut),$f=>ga($f,Ee.recordId),Ut.rootStore);let qf=Xs[0]===66?8:0;Eu(Xs.length-qf),Dc(Xs,qf),ae.trace?.("wrote record",Ee.recordId,"length:",Xs.length)}return e._socket.writableNeedDrain?new Promise(Xs=>{ae.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Xs)}):xe>Ff?new Promise(Xs=>{Rr=Xs}):new Promise(setImmediate)},"sendAuditRecord"),ut=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),st(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new Kw.EventEmitter,Lr.once("close",()=>{me=!0,B?.end()});for(let{startTime:Ee}of yr)Ee<fe&&(fe=Ee);(de||Promise.resolve()).then(async()=>{p=await p,f=p.auditStore,Te=p.tableById.map(ee),he=[];for(let{name:ft,startTime:tt,endTime:cr}of yr){let vt=gS(ft,f);ae.debug?.("subscription to",ft,"using local id",vt,"starting",tt),he[vt]={startTime:tt,endTime:cr}}Ta(u),Xt||(Xt=Nl(ft=>{ft.databaseName===u&&Ta(u)}),Uf=Ah(ft=>{ft===u&&(e.send((0,et.encode)([Ld])),Ss())}),e.on("close",()=>{Xt?.remove(),Uf?.remove()})),e.send((0,et.encode)([e$,Fh(p.auditStore),yr.map(({name:ft})=>ft)]));let Ee=!0;do{isFinite(fe)||(ae.warn?.("Invalid sequence id "+fe),Ss(1008,"Invalid sequence id"+fe));let ft;if(Ee&&!me&&(Ee=!1,fe===0)){ae.info?.("Replicating all tables to",g);let tt=fe,cr=BS(f);for(let vt in _){if(!ee(vt))continue;let Ts=_[vt];for(let Ut of Ts.primaryStore.getRange({snapshot:!1,versions:!0})){if(me)return;if(Ut.localTime>=fe){ae.trace?.(s,"Copying record from",u,vt,Ut.key,Ut.localTime),tt=Math.max(Ut.localTime,tt),Mt()[Wh]=1;let Js=Qc(Ut.version,Ts.tableId,Ut.key,null,cr,null,"put",gm(()=>Ts.primaryStore.encoder.encode(Ut.value),_u=>ga(_u,Ut.key)),Ut.metadataFlags&-256,Ut.residencyId,null,Ut.expiresAt);await Et({recordId:Ut.key,tableId:Ts.tableId,type:"put",getValue(){return Ut.value},encoded:Js,version:Ut.version,residencyId:Ut.residencyId,nodeId:cr,extendedType:Ut.metadataFlags},Ut.localTime)}}}c-i>8&&Et({type:"end_txn"},fe),Mt()[Wh]=0,fe=tt}for(let{key:tt,value:cr}of f.getRange({start:fe||1,exclusiveStart:!0,snapshot:!1})){if(me)return;let vt=bt(cr);ae.debug?.("sending audit record",new Date(tt)),Mt()[Wh]=tt,fe=tt,await Et(vt,tt),Lr.startTime=tt}c-i>8&&Et({type:"end_txn"},fe),Mt()[Wh]=0,await GU(f)}while(!me)}).catch(Ee=>{ae.error?.(s,"Error handling subscription to node",Ee),Ss(1008,"Error handling subscription to node")});break}}return}S.position=8;let A=!0,b,I;do{Mt();let P=S.readInt();if(P===9&&S.getUint8(S.position)==b_){S.position++,R=I=S.readFloat64(),m[DS]=R,m[MS]=Date.now(),m[vS]=Vw,ae.trace?.("received remote sequence update",R,u);break}let L=S.position,D=bt(E,L,L+P),H=Pc[D.tableId];H||ae.error?.(`No table found with an id of ${D.tableId}`);let C;D.residencyId&&(C=CE[D.residencyId],ae.trace?.(s,"received residency list",C,D.type,D.recordId));try{let x=D.recordId;m_(()=>{b={table:H.name,id:D.recordId,type:D.type,nodeId:kf.get(D.nodeId),residencyList:C,timestamp:D.version,value:D.getValue(H),user:D.user,beginTxn:A,expiresAt:D.expiresAt}},f?.rootStore,z=>Lc(z,x))}catch(x){throw x.message+="typed structures for current decoder"+JSON.stringify(H.decoder.typedStructs),x}A=!1,ae.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),m[DS]=D.version,m[MS]=Date.now(),m[vS]=g$,p.send(b),S.position=L+P}while(S.position<E.byteLength);Pe++,st(E.byteLength,"bytes-received",`${g}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pe>Fy&&!Hf&&(Hf=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),p.send({type:"end_txn",localTime:R,remoteNodeIds:T,async onCommit(){if(b){let P=Date.now()-b.timestamp;st(P,"replication-latency",g+"."+u+"."+b.table,b.type,"ingest")}Pe--,Hf&&(Hf=!1,e.resume(),ae.debug?.(`Replication resuming ${g}`)),Ue.length>0&&await Promise.all(Ue),ae.trace?.("All blobs finished"),!N&&I&&(ae.trace?.(s,"queuing confirmation of a commit at",I),setTimeout(()=>{e.send((0,et.encode)([s$,N])),ae.trace?.(s,"sent confirmation of a commit at",N),N=null},Lce)),N=I,ae.debug?.("last sequence committed",new Date(I),u)}})}catch(S){ae.error?.(s,"Error handling incoming replication message",S)}}),e.on("ping",Jt),e.on("pong",()=>{if(t.connection){let E=performance.now()-Z;t.connection.latency=E,Mt()&&(m[US]=E),t.isSubscriptionConnection&&Ml({name:g,database:u,url:t.url,latency:E})}Z=null}),e.on("close",(E,S)=>{clearInterval(O),clearTimeout(F),clearInterval(Y),Lr&&Lr.emit("close"),_o&&_o.end();for(let[A,{reject:b}]of y)b(new Error(`Connection closed ${S?.toString()} ${E}`));ae.debug?.(s,"closed",E,S?.toString())});function Ss(E,S){try{e.isFinished=!0,ae.debug?.(s,"closing",g,u,E,S),e.close(E,S),t.connection?.emit("finished")}catch(A){ae.error?.(s,"Error closing connection",A)}}o(Ss,"close");let _a=new Set;async function ga(E,S){let A=d_(E);if(_a.has(A)){ae.debug?.("Blob already being sent",A);return}_a.add(A);try{let b;xe++;for await(let I of E.stream())b&&(ae.debug?.("Sending blob chunk",A,"length",b.length),e.send((0,et.encode)([OS,{fileId:A,size:E.size},b]))),b=I,e._socket.writableNeedDrain&&(ae.debug?.("draining",A),await new Promise(P=>e._socket.once("drain",P)),ae.debug?.("drained",A)),st(I.length,"bytes-sent",`${g}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",A,"length",b.length),e.send((0,et.encode)([OS,{fileId:A,size:E.size,finished:!0},b]))}catch(b){ae.warn?.("Error sending blob",b,"blob id",A,"for record",S),e.send((0,et.encode)([OS,{fileId:A,finished:!0,error:(0,Dd.errorToString)(b)},Buffer.alloc(0)]))}finally{_a.delete(A),xe--,xe<Ff&&Rr?.()}}o(ga,"sendBlobs");function Lc(E,S){let A=d_(E),b=Ne.get(A);ae.debug?.("Received transaction with blob",A,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&Ne.delete(A):(b=new qw.PassThrough,Ne.set(A,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=S,E.size===void 0&&b.expectedSize&&(E.size=b.expectedSize);let I=b.blob??createBlob(b,E);b.blob=I;let P=No(()=>_m(I).saving,p.auditStore?.rootStore);return P&&(P.blobId=A,Ue.push(P),P.finally(()=>{ae.debug?.(`Finished receiving blob stream ${A}`),Ue.splice(Ue.indexOf(P),1)})),I}o(Lc,"receiveBlobs");function Dr(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Dr)),!f&&p&&(f=p.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let E=new Map;f||(f=p?.auditStore);try{for(let b of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let I of b.value.nodes||[])I.lastTxnTime>(E.get(I.id)??0)&&E.set(I.id,I.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let S=t.connection?.nodeSubscriptions?.[0];T=[];let A=t.connection?.nodeSubscriptions.map((b,I)=>{let P=[],{replicateByDefault:L}=b;if(b.subscriptions){for(let x of b.subscriptions)if(x.subscribe&&(x.schema||x.database)===u){let z=x.table;_?.[z]?.replicate!==!1&&P.push(z)}L=!1}else for(let x in _)(L?_[x].replicate===!1:_[x].replicate)&&P.push(x);let D=f&&gS(b.name,f),H=p?.dbisDB?.get([Symbol.for("seq"),D])??1,C=Math.max(H?.seqId??1,(typeof b.startTime=="string"?new Date(b.startTime).getTime():b.startTime)??1);if(ae.debug?.("Starting time recorded in db",b.name,D,u,H?.seqId,"start time:",C,new Date(C)),S!==b){let x=f&&gS(S.name,f),z=p?.dbisDB?.get([Symbol.for("seq"),x])??1;for(let ne of z?.nodes||[])ne.name===b.name&&(C=ne.seqId,ae.debug?.("Using sequence id from proxy node",S.name,C))}if(D===void 0?ae.warn("Starting subscription request from node",b,"but no node id found"):T.push(D),E.get(D)>C&&(C=E.get(D),ae.debug?.("Updating start time from more recent txn recorded",S.name,C)),C===1&&CS)try{new URL(CS).hostname===b.name?(ae.warn?.(`Requesting full copy of database ${u} from ${CS}`),C=0):C=Date.now()-6e4}catch(x){ae.error?.("Error parsing leader URL",CS,x)}return ae.trace?.(s,"defining subscription request",b.name,u,new Date(C)),{name:b.name,replicateByDefault:L,tables:P,startTime:C,endTime:b.endTime}});if(A)if(ae.debug?.(s,"sending subscription request",A,p?.dbisDB?.path),clearTimeout(K),A.length>0)e.send((0,et.encode)([Xq,A]));else{let b=o(()=>{let I=performance.now();K=setTimeout(()=>{ce<=I?Ss(1008,"Connection has no subscriptions and is no longer used"):b()},q).unref()},"scheduleClose");b()}}o(Dr,"sendSubscriptionRequestUpdate");function hu(E,S){if(!E)return;let A=Bf[E];return A||(A=S.getResidencyRecord(E),Bf[E]=A),A}o(hu,"getResidence");function pu(E){return!(Za&&Za!="*"&&!Za[E]&&!Za.includes?.(E)&&!Za.some?.(S=>S.name===E))}o(pu,"checkDatabaseAccess");function Sa(E){if(p=p||d.get(E),!pu(E))throw new Error(`Access to database "${E}" is not permitted`);p||ae.warn?.(`No database named "${E}" was declared and registered`),f=p?.auditStore,_||(_=nt()?.[E]);let S=Ze();if(S===g)throw S?new Error("Should not connect to self",S):new Error("Node name not defined");return LE(S,E),!0}o(Sa,"setDatabase");function LE(E,S){let A=nt()?.[S],b=[];for(let I in A){let P=A[I];b.push({table:I,schemaDefined:P.schemaDefined,attributes:P.attributes.map(L=>({name:L.name,type:L.type,isPrimaryKey:L.isPrimaryKey}))})}ae.trace?.("Sending database info for node",E,"database name",S),e.send((0,et.encode)([Zq,E,S,b]))}o(LE,"sendNodeDBName");function Ta(E){let S=nt()?.[E],A=[];for(let b in S){if(yr&&!yr.some(P=>P.replicateByDefault?!P.tables.includes(b):P.tables.includes(b)))continue;let I=S[b];A.push({table:b,schemaDefined:I.schemaDefined,attributes:I.attributes.map(P=>({name:P.name,type:P.type,isPrimaryKey:P.isPrimaryKey}))})}e.send((0,et.encode)([i$,A,E]))}o(Ta,"sendDBSchema"),Y=setInterval(()=>{for(let[E,S]of Ne)S.lastChunk+pe<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${E} for record ${S.recordId??"unknown"} from ${g}`),Ne.delete(E),S.end())},pe).unref();let Ra=1,Gf=[];return{end(){_o&&_o.end(),Lr&&Lr.emit("close")},getRecord(E){let S=Ra++;return new Promise((A,b)=>{let I=[r$,S,E.table.tableId,E.id];Gf[E.table.tableId]||(I.push(E.table.tableName),Gf[E.table.tableId]=!0),e.send((0,et.encode)(I)),ce=performance.now(),y.set(S,{tableId:E.table.tableId,key:E.id,resolve(P){let{table:L,entry:D}=E;if(A(P),P)return L._recordRelocate(D,P)},reject:b})})},sendOperation(E){let S=Ra++;return E.requestId=S,e.send((0,et.encode)([$w,E])),new Promise((A,b)=>{y.set(S,{resolve:A,reject:b})})}};function Eu(E){ya(5),E<128?a[c++]=E:E<16384?(l.setUint16(c,E|32768),c+=2):E<1056964608?(l.setUint32(c,E|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,E),c+=5)}function Dc(E,S=0,A=E.length){let b=A-S;ya(b),E.copy(a,c,S,A),c+=b}function Mc(E){ya(8),l.setFloat64(c,E),c+=8}function ya(E){if(E+16>a.length-c){let S=Buffer.allocUnsafeSlow(c+E-i+65536>>10<<11);a.copy(S,0,i,c),c=c-i,i=0,a=S,l=new DataView(a.buffer,0,a.length)}}function V(E,S){let A=E.database??"data";if(A!=="data"&&!ke[A]){ae.warn?.("Database not found",E.database);return}S||(S={});let b=S.schemaDefined,I=!1,P=E.schemaDefined,L=S.attributes||[];for(let D=0;D<E.attributes?.length;D++){let H=E.attributes[D],C=L.find(x=>x.name===H.name);(!C||C.type!==H.type)&&(b?ae.error?.(`Schema for '${u}.${E.table}' is defined locally, but attribute '${H.name}: ${H.type}' from '${g}' does not match local attribute ${C?"'"+C.name+": "+C.type+"'":"which does not exist"}`):(I=!0,P||(H.indexed=!0),C?L[L.indexOf(C)]=H:L.push(H)))}return I?(ae.debug?.("(Re)creating",E),je({table:E.table,database:E.database,schemaDefined:E.schemaDefined,attributes:L,...S})):S}}var l$,et,u$,d$,Dd,Kw,f$,m$,xl,h$,qw,p$,E$,ae,Xq,Zq,e$,Ld,t$,kw,r$,NS,$w,wS,n$,s$,i$,OS,_$,DS,MS,Wh,US,vS,Vw,g$,Pce,CS,Yw,ec,PS,o$,Lce,a$,Gw,LS,c$,Md,Ww=ue(()=>{De();Mi();bw();lb();ss();l$=w(oe());k();Jc();et=require("msgpackr"),u$=require("ws"),d$=require("worker_threads"),Dd=w(Q());Vh();Kw=require("events"),f$=w(os()),m$=w(require("node:tls"));Dl();xl=w(require("node:process")),h$=require("node:net");zi();Wn();qw=require("node:stream"),p$=require("lmdb"),E$=w(require("minimist")),ae=(0,Dd.forComponent)("replication").conditional,Xq=129,Zq=140,e$=141,Ld=142,t$=130,kw=132,r$=133,NS=134,$w=136,wS=137,n$=143,s$=144,i$=145,OS=146,_$=0,DS=1,MS=2,Wh=3,US=4,vS=5,Vw=0,g$=1,Pce=(0,E$.default)(xl.argv),CS=Pce.HDB_LEADER_URL??xl.env.HDB_LEADER_URL,Yw=new Map,ec=new Map,PS=!0,o$=300,Lce=2,a$=3e4;o(xS,"createWebSocket");c$=500,Md=class extends Kw.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=c$;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??pi(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await xS(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${xl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ae[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=c$,this.nodeSubscriptions&&Ml({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=zh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ae.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ae.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ae.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&Od({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();ae.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(zh,"replicateOverWS")});var Go={};Oe(Go,{clearThisNodeName:()=>kce,disableReplication:()=>Uce,enabledDatabases:()=>Za,forEachReplicatedDatabase:()=>Wa,getThisNodeId:()=>BS,getThisNodeName:()=>Ze,getThisNodeUrl:()=>za,hostnameToUrl:()=>qS,lastTimeInAuditStore:()=>Hh,monitorNodeCAs:()=>O$,replicateOperation:()=>qce,replicationCertificateAuthorities:()=>qo,sendOperationToNode:()=>jh,servers:()=>Mce,setReplicator:()=>P$,start:()=>vce,startOnMainThread:()=>ww,subscribeToNode:()=>$h,unsubscribeFromNode:()=>RS,urlToNodeName:()=>pi});function vce(e){if(!e.port&&!e.securePort&&(e.port=Ms.default.get(U.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ms.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),!Ze())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Gh(e))t.set(pi(s.url),s);xce(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Le.ws(async(s,i,a,c)=>{if(Ot.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);await a,s._socket.unref(),zh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&Ot.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Le.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){Ot.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&Ot.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=Kt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,N$.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){Ot.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else Ot.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:Ot.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(qo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=GS.createSecureContext(u)}catch(l){Ot.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ms.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1&&i()}O$(()=>{for(let s of n)s()})}function O$(e){let t=0;Nd(r=>{r?.ca&&(qo.add(r.ca),qo.size!==t&&(t=qo.size,e?.()))})}function Uce(e=!0){w$=e}function xce(e){w$||(nt(),Za=e.databases,Wa(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ec;for(let[s,i]of HS){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];P$(r,s,e),Yw.get(s)?.forEach(i=>i(s))}}))}function P$(e,t,r){if(!t)return console.error(`Attempt to replicate non-existent table ${t.name} from database ${e}`);if(t.replicate===!1||t.sources?.some(s=>s.isReplicator))return;let n;t.sourcedFrom(class C$ extends xr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||ec,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(Ot.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Yn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let p of c){if(u.has(p)||p===Le.hostname)continue;let _=Fce(p,C$.subscription,e);if(_?.isConnected){let g=Id(t.auditStore,e,p)[US];(!d||g<m)&&(d=_,f=p,m=g)}}if(!d)throw l||new b$.ServerError(`No connection to any other nodes are available: ${c}`,502);let h={requestId:Dce++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(h)}catch(p){if(d.isConnected)throw p;Ot.warn("Error in load from node",kS,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Bce(e,t,r,n,s){let i=HS.get(e);i||HS.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new Md(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function Fce(e,t,r){let n=T$.get(e);n||(n=new Map,T$.set(e,n));let s=n.get(r);if(s)return s;let i=Kt().primaryStore.get(e);return i?.url&&(s=new Md(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function jh(e,t,r){r||(r={}),r.serverName=e.name;let n=await xS(e.url,r),s=zh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{Ot.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{Ot.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function $h(e){try{I$.isMainThread&&Ot.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=ec.get(e.database);if(!t){let n;t=new Promise(s=>{Ot.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ec.set(e.database,t)}let r=Bce(e.nodes[0].url,t,e.database,e.nodes[0].name,e.nodes[0].authorization);e.nodes[0].name===void 0?r.tentativeNode=e.nodes[0]:r.nodeName=e.nodes[0].name,r.subscribe(e.nodes.filter(n=>kh(n,e.database)),e.replicateByDefault)}catch(t){Ot.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function RS({name:e,url:t,database:r}){Ot.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Kt().primaryStore.getRange({})));let n=HS.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Hce(){if(zw!==void 0)return zw;let e=Ms.default.get(U.OPERATIONSAPI_TLS_CERTIFICATE)||Ms.default.get(U.TLS_CERTIFICATE);if(e)return zw=new y$.X509Certificate((0,A$.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function Ze(){return kS||(kS=Ms.default.get("replication_hostname")??pi(Ms.default.get("replication_url"))??Hce()??R$("operationsapi_network_secureport")??R$("operationsapi_network_port")??"127.0.0.1")}function kce(){kS=void 0}function R$(e){let t=Ms.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function FS(e){let t=Ms.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function BS(e){return Fh(e)?.[Ze()]}function za(){let e=Ms.default.get("replication_url");return e||qS(Ze())}function qS(e){let t=FS("replication_port");if(t)return`ws://${e}:${t}`;if(t=FS("replication_secureport"),t)return`wss://${e}:${t}`;if(t=FS("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=FS("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function pi(e){if(e)return new URL(e).hostname}function Wa(e,t){for(let n of Object.getOwnPropertyNames(ke))r(n);return Ah(n=>{r(n)}),Nl((n,s)=>{r(n.databaseName)});function r(n){let s=ke[n];Ot.trace("Checking replication status of ",n,e?.databases),e?.databases===void 0||e.databases==="*"||e.databases.includes(n)||e.databases.some?.(i=>i.name===n)||!s?t(s,n,!0):Gce(n)&&t(s,n,!1)}o(r,"forDatabase")}function Gce(e){let t=ke[e];for(let r in t)if(t[r].replicate)return!0}function Hh(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function qce(e){let t={message:""};if(e.replicated){e.replicated=!1,Ot.trace?.("Replicating operation",e.operation,"to nodes",Le.nodes.map(n=>n.name));let r=await Promise.allSettled(Le.nodes.map(n=>jh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Le.nodes[s]?.name,i})}return t}var Ms,Ot,y$,A$,GS,b$,I$,N$,w$,Dce,Mce,qo,Za,HS,T$,zw,kS,ss=ue(()=>{De();Ma();Au();Ww();Mr();Ms=w(oe()),Ot=w(Q()),y$=require("crypto"),A$=require("fs");Vh();Dl();k();bw();GS=w(require("node:tls")),b$=w(ge()),I$=require("worker_threads"),N$=w(os()),Dce=1,Mce=[],qo=Ms.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1?new Set(GS.rootCertificates):new Set;o(vce,"start");o(O$,"monitorNodeCAs");o(Uce,"disableReplication");o(xce,"assignReplicationSource");o(P$,"setReplicator");HS=new Map;o(Bce,"getSubscriptionConnection");T$=new Map;o(Fce,"getRetrievalConnectionByName");o(jh,"sendOperationToNode");o($h,"subscribeToNode");o(RS,"unsubscribeFromNode");o(Hce,"getCommonNameFromCert");o(Ze,"getThisNodeName");o(kce,"clearThisNodeName");Object.defineProperty(Le,"hostname",{get(){return Ze()}});o(R$,"getHostFromListeningPort");o(FS,"getPortFromListeningPort");o(BS,"getThisNodeId");Le.replication={getThisNodeId:BS,exportIdMapping:Fh};o(za,"getThisNodeUrl");o(qS,"hostnameToUrl");o(pi,"urlToNodeName");o(Wa,"forEachReplicatedDatabase");o(Gce,"hasExplicitlyReplicatedTable");o(Hh,"lastTimeInAuditStore");o(qce,"replicateOperation")});var Jh=M((yve,U$)=>{"use strict";var vd=KG(),{validateBySchema:Qh}=ct(),{commonValidators:Ud,schemaRegex:jw}=Gi(),pr=require("joi"),$ce=Q(),Vce=require("uuid").v4,KS=Do(),xd=(k(),v(W)),Kce=require("util"),tc=Zn(),{handleHDBError:$o,hdbErrors:Yce,ClientError:Bl}=ge(),{HDB_ERROR_MSGS:$S,HTTP_STATUS_CODES:Vo}=Yce,{SchemaEventMsg:YS}=ai(),L$=mr(),{getDatabases:Wce}=(De(),v(mt)),{transformReq:Bd}=ie(),{replicateOperation:D$}=(ss(),v(Go)),{cleanupOrphans:zce}=(Wn(),v(h_)),VS=pr.string().min(1).max(Ud.schema_length.maximum).pattern(jw).messages({"string.pattern.base":"{:#label} "+Ud.schema_format.message}),jce=pr.string().min(1).max(Ud.schema_length.maximum).pattern(jw).messages({"string.pattern.base":"{:#label} "+Ud.schema_format.message}).required(),Qce=pr.string().min(1).max(Ud.schema_length.maximum).pattern(jw).messages({"string.pattern.base":"{:#label} "+Ud.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();U$.exports={createSchema:Jce,createSchemaStructure:M$,createTable:Xce,createTableStructure:v$,createAttribute:nle,dropSchema:Zce,dropTable:ele,dropAttribute:tle,getBackup:sle,cleanupOrphanBlobs:ile};async function Jce(e){let t=await M$(e);return KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema)),t}o(Jce,"createSchema");async function M$(e){let t=Qh(e,pr.object({database:VS,schema:VS}));if(t)throw new Bl(t.message);if(Bd(e),!await vd.checkSchemaExists(e.schema))throw $o(new Error,$S.SCHEMA_EXISTS_ERR(e.schema),Vo.BAD_REQUEST,xd.LOG_LEVELS.ERROR,$S.SCHEMA_EXISTS_ERR(e.schema),!0);return await tc.createSchema(e),`database '${e.schema}' successfully created`}o(M$,"createSchemaStructure");async function Xce(e){return Bd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await v$(e)}o(Xce,"createTable");async function v$(e){let t=Qh(e,pr.object({database:VS,schema:VS,table:jce,residence:pr.array().items(pr.string().min(1)).optional(),hash_attribute:Qce}));if(t)throw new Bl(t.message);if(!await vd.checkSchemaTableExists(e.schema,e.table))throw $o(new Error,$S.TABLE_EXISTS_ERR(e.schema,e.table),Vo.BAD_REQUEST,xd.LOG_LEVELS.ERROR,$S.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Vce(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await tc.createTable(n,e);else throw $o(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Vo.BAD_REQUEST);else await tc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(v$,"createTableStructure");async function Zce(e){let t=Qh(e,pr.object({database:pr.string(),schema:pr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Bl(t.message);Bd(e);let r=await vd.checkSchemaExists(e.schema);if(r)throw $o(new Error,r,Vo.NOT_FOUND,xd.LOG_LEVELS.ERROR,r,!0);let n=await vd.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await tc.dropSchema(e),KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema)),await L$.purgeSchemaTableStreams(e.schema,s);let i=await D$(e);return i.message=`successfully deleted '${e.schema}'`,i}o(Zce,"dropSchema");async function ele(e){let t=Qh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required()}));if(t)throw new Bl(t.message);Bd(e);let r=await vd.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,xd.LOG_LEVELS.ERROR,r,!0);await tc.dropTable(e),await L$.purgeTableStream(e.schema,e.table);let n=await D$(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(ele,"dropTable");async function tle(e){let t=Qh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required(),attribute:pr.string().required()}));if(t)throw new Bl(t.message);Bd(e);let r=await vd.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,xd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw $o(new Error,"You cannot drop a hash attribute",Vo.BAD_REQUEST,void 0,void 0,!0);if(xd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw $o(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Vo.BAD_REQUEST,void 0,void 0,!0);try{return await tc.dropAttribute(e),rle(e),KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw $ce.error(`Got an error deleting attribute ${Kce.inspect(e)}.`),n}}o(tle,"dropAttribute");function rle(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(rle,"dropAttributeFromGlobal");async function nle(e){Bd(e);let t=Wce()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw $o(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Vo.BAD_REQUEST,void 0,void 0,!0);return await tc.createAttribute(e),KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(nle,"createAttribute");function sle(e){return tc.getBackup(e)}o(sle,"getBackup");function ile(e){if(!e.database)throw new Bl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Bl(`Unknown database '${e.database}'`);return zce(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(ile,"cleanupOrphanBlobs")});var B$=M((bve,x$)=>{"use strict";var{OPERATIONS_ENUM:ole}=(k(),v(W)),Qw=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=ole.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};x$.exports=Qw});var Jw=M((wve,q$)=>{"use strict";var ale=Zn(),Nve=B$(),WS=ie(),zS=(k(),v(W)),cle=oe(),{handleHDBError:F$,hdbErrors:lle}=ge(),{HDB_ERROR_MSGS:H$,HTTP_STATUS_CODES:k$}=lle,ule=Object.values(zS.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),G$="To use this operation audit log must be enabled in harperdb-config.yaml";q$.exports=dle;async function dle(e){if(WS.isEmpty(e.schema))throw new Error(H$.SCHEMA_REQUIRED_ERR);if(WS.isEmpty(e.table))throw new Error(H$.TABLE_REQUIRED_ERR);if(!cle.get(zS.CONFIG_PARAMS.LOGGING_AUDITLOG))throw F$(new Error,G$,k$.BAD_REQUEST,zS.LOG_LEVELS.ERROR,G$,!0);let t=WS.checkSchemaTableExist(e.schema,e.table);if(t)throw F$(new Error,t,k$.NOT_FOUND,zS.LOG_LEVELS.ERROR,t,!0);if(!WS.isEmpty(e.search_type)&&ule.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await ale.readAuditLog(e)}o(dle,"readAuditLog")});var V$=M((Cve,$$)=>{"use strict";var{OPERATIONS_ENUM:fle}=(k(),v(W)),Xw=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=fle.GET_BACKUP,this.schema=t,this.table=r}};$$.exports=Xw});var W$=M((Mve,Y$)=>{"use strict";var mle=Zn(),Lve=V$(),Zw=ie(),hle=(k(),v(W)),Dve=oe(),{handleHDBError:ple,hdbErrors:Ele}=ge(),{HDB_ERROR_MSGS:K$,HTTP_STATUS_CODES:_le}=Ele;Y$.exports=gle;async function gle(e){if(Zw.isEmpty(e.schema))throw new Error(K$.SCHEMA_REQUIRED_ERR);if(Zw.isEmpty(e.table))throw new Error(K$.TABLE_REQUIRED_ERR);let t=Zw.checkSchemaTableExist(e.schema,e.table);if(t)throw ple(new Error,t,_le.NOT_FOUND,hle.LOG_LEVELS.ERROR,t,!0);return await mle.getBackup(readAuditLogObject)}o(gle,"getBackup")});var J$=M((Uve,Q$)=>{"use strict";var Sle=oe(),rc=require("joi"),Tle=ct(),z$=require("moment"),Rle=require("fs-extra"),eO=require("path"),yle=require("lodash"),Xh=(k(),v(W)),{LOG_LEVELS:Fl}=(k(),v(W)),Ale="YYYY-MM-DD hh:mm:ss",ble=eO.resolve(__dirname,"../logs");Q$.exports=function(e){return Tle.validateBySchema(e,Ile)};var Ile=rc.object({from:rc.custom(j$),until:rc.custom(j$),level:rc.valid(Fl.NOTIFY,Fl.FATAL,Fl.ERROR,Fl.WARN,Fl.INFO,Fl.DEBUG,Fl.TRACE),order:rc.valid("asc","desc"),limit:rc.number().min(1),start:rc.number().min(0),log_name:rc.custom(Nle)});function j$(e,t){if(z$(e,z$.ISO_8601).format(Ale)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(j$,"validateDatetime");function Nle(e,t){if(yle.invert(Xh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Sle.get(Xh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Xh.LOG_NAMES.HDB:e,i=s===Xh.LOG_NAMES.INSTALL?eO.join(ble,Xh.LOG_NAMES.INSTALL):eO.join(n,s);return Rle.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Nle,"validateReadLogPath")});var rO=M((Bve,Z$)=>{"use strict";var jS=(k(),v(W)),wle=Q(),Ole=oe(),Cle=J$(),tO=require("path"),X$=require("fs-extra"),{once:Ple}=require("events"),{handleHDBError:Lle,hdbErrors:Dle}=ge(),{PACKAGE_ROOT:Mle}=Rt(),{replicateOperation:vle}=(ss(),v(Go)),Ule=tO.join(Mle,"logs"),xle=1e3,Ble=200;Z$.exports=Fle;async function Fle(e){let t=Cle(e);if(t)throw Lle(t,t.message,Dle.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=vle(e),n=Ole.get(jS.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?jS.LOG_NAMES.HDB:e.log_name,i=s===jS.LOG_NAMES.INSTALL?tO.join(Ule,jS.LOG_NAMES.INSTALL):tO.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?xle:e.limit,h=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,_=p+m,g=0;h==="desc"&&!u&&!f&&(g=Math.max(X$.statSync(i).size-(_+5)*Ble,0));let y=X$.createReadStream(i,{start:g});y.on("error",G=>{wle.error(G)});let T=0,R=[],N="",O;y.on("data",G=>{let Y=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=N+G;let q=0,K;for(;(K=Y.exec(G))&&!y.destroyed;){O&&(O.message=G.slice(q,K.index),F(O));let[ce,le,se]=K,pe=se.split("] ["),Ne=pe[0],Ue=pe[1];pe.splice(0,2),O={timestamp:le,thread:Ne,level:Ue,tags:pe,message:""},q=K.index+ce.length}N=G.slice(q)}),y.on("end",G=>{y.destroyed||O&&(O.message=N.trim(),F(O))}),y.resume();function F(G){let Y,q,K;switch(!0){case(a&&l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),G.level===c&&Y>=q&&Y<=K&&T<p?T++:G.level===c&&Y>=q&&Y<=K&&(to(G,h,R),T++,T===_&&y.destroy());break;case(a&&l):Y=new Date(G.timestamp),q=new Date(u),G.level===c&&Y>=q&&T<p?T++:G.level===c&&Y>=q&&(to(G,h,R),T++,T===_&&y.destroy());break;case(a&&d):Y=new Date(G.timestamp),K=new Date(f),G.level===c&&Y<=K&&T<p?T++:G.level===c&&Y<=K&&(to(G,h,R),T++,T===_&&y.destroy());break;case(l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),Y>=q&&Y<=K&&T<p?T++:Y>=q&&Y<=K&&(to(G,h,R),T++,T===_&&y.destroy());break;case a:G.level===c&&T<p?T++:G.level===c&&(to(G,h,R),T++,T===_&&y.destroy());break;case l:Y=new Date(G.timestamp),q=new Date(u),Y>=q&&T<p?T++:Y>=q&&T>=p&&(to(G,h,R),T++,T===_&&y.destroy());break;case d:Y=new Date(G.timestamp),K=new Date(f),Y<=K&&T<p?T++:Y<=K&&T>=p&&(to(G,h,R),T++,T===_&&y.destroy());break;default:T<p?T++:(to(G,h,R),T++,T===_&&y.destroy())}}o(F,"onLogMessage"),await Ple(y,"close");let Z=await r;if(Z.replicated){for(let G of R)G.node=server.hostname;for(let G of Z.replicated){let Y=G.node;if(G.status==="failed")to({timestamp:new Date().toISOString(),level:"error",node:Y,message:`Error retrieving logs: ${G.reason}`},h,R);else for(let q of G.results)q.node=Y,to(q,h,R)}}return R}o(Fle,"readLog");function to(e,t,r){t==="desc"?Hle(e,r):t==="asc"?kle(e,r):r.push(e)}o(to,"pushLineToResult");function Hle(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(Hle,"insertDescending");function kle(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o(kle,"insertAscending")});var QS=M(($ve,nV)=>{"use strict";var nO=require("joi"),{string:Fd,boolean:eV,date:Gle}=nO.types(),qle=ct(),{validateSchemaExists:Hve,validateTableExists:kve,validateSchemaName:Gve}=Gi(),$le=(k(),v(W)),Vle=Nt(),tV=oe();tV.initSync();var qve=Fd.invalid(tV.get($le.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Vle.NATS_TERM_CONSTRAINTS_RX).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >","any.invalid":"'node_name' cannot be this nodes name"}).empty(null),rV={operation:Fd.valid("add_node","update_node","set_node_replication"),node_name:Fd.optional(),subscriptions:nO.array().items({table:Fd.optional(),schema:Fd.optional(),database:Fd.optional(),subscribe:eV.required(),publish:eV.required().custom(Yle),start_time:Gle.iso()})};function Kle(e){return qle.validateBySchema(e,nO.object(rV))}o(Kle,"addUpdateNodeValidator");function Yle(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(Yle,"checkForFalsy");nV.exports={addUpdateNodeValidator:Kle,validationSchema:rV}});var Hd=M((Kve,sV)=>{"use strict";var sO=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},iO=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};sV.exports={Node:sO,NodeSubscription:iO}});var oV=M((Wve,iV)=>{"use strict";var Wle=(k(),v(W)).OPERATIONS_ENUM,oO=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Wle.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};iV.exports=oO});var Zh=M((jve,aV)=>{"use strict";var aO=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},cO=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};aV.exports={RemotePayloadObject:aO,RemotePayloadSubscription:cO}});var lV=M((Jve,cV)=>{"use strict";var lO=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};cV.exports=lO});var dV=M((nUe,uV)=>{"use strict";var zle=lV(),Zve=qt(),eUe=gt(),jle=Q(),{getSchemaPath:tUe,getTransactionAuditStorePath:rUe}=At(),{getDatabases:Qle}=(De(),v(mt));uV.exports=Jle;async function Jle(e){let t=new zle;try{let r=Qle()[e.schema]?.[e.name],n=r.primaryStore.getStats(),s=r.auditStore?.getStats();t.schema=e.schema,t.table=e.name,t.record_count=n.entryCount,t.transaction_log_record_count=s.entryCount}catch(r){jle.warn(`unable to stat table dbi due to ${r}`)}return t}o(Jle,"lmdbGetTableSize")});var mV=M((iUe,fV)=>{"use strict";var uO=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};fV.exports=uO});var Gd=M((dUe,_V)=>{"use strict";var Xle=require("fs-extra"),Zle=require("path"),mn=require("systeminformation"),nc=Q(),hV=mr(),aUe=Nt(),kd=(k(),v(W)),eue=dV(),tue=Fa(),{getThreadInfo:pV}=rt(),ep=oe();ep.initSync();var rue=mV(),{openEnvironment:cUe}=gt(),{getSchemaPath:lUe}=At(),{database:uUe,databases:dO}=(De(),v(mt)),JS;_V.exports={getHDBProcessInfo:pO,getNetworkInfo:_O,getDiskInfo:EO,getMemoryInfo:hO,getCPUInfo:mO,getTimeInfo:fO,getSystemInformation:gO,systemInformation:nue,getTableSize:SO,getMetrics:TO};function fO(){return mn.time()}o(fO,"getTimeInfo");async function mO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await mn.cpu();d.cpu_speed=await mn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:h,rawCurrentloadNice:p,rawCurrentloadSystem:_,rawCurrentloadUser:g,cpus:y,...T}=await mn.currentLoad();return T.cpus=[],y.forEach(R=>{let{rawLoad:N,rawLoadIdle:O,rawLoadIrq:F,rawLoadNice:Z,rawLoadSystem:G,rawLoadUser:Y,...q}=R;T.cpus.push(q)}),d.current_load=T,d}catch(e){return nc.error(`error in getCPUInfo: ${e}`),{}}}o(mO,"getCPUInfo");async function hO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await mn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return nc.error(`error in getMemoryInfo: ${e}`),{}}}o(hO,"getMemoryInfo");async function pO(){let e={core:[],clustering:[]};try{let t=await mn.processes(),r;try{r=Number.parseInt(await Xle.readFile(Zle.join(ep.get(kd.CONFIG_PARAMS.ROOTPATH),kd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===kd.NODE_ERROR_CODES.ENOENT)nc.warn("Unable to locate 'hdb.pid' file, try stopping and starting HarperDB. This could be because HarperDB is not running.");else throw n}t.list.forEach(n=>{n.pid===r?e.core.push(n):n.name==="nats-server"&&e.clustering.push(n)});for(let n of e.core)for(let s of t.list)s.pid===n.parentPid&&(s.name==="PM2"||s.command==="PM2")&&(n.parent="PM2");return e}catch(t){return nc.error(`error in getHDBProcessInfo: ${t}`),e}}o(pO,"getHDBProcessInfo");async function EO(){let e={};try{if(!ep.get(kd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await mn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await mn.fsStats();return e.read_write=u,e.size=await mn.fsSize(),e}catch(t){return nc.error(`error in getDiskInfo: ${t}`),e}}o(EO,"getDiskInfo");async function _O(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return ep.get(kd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await mn.networkInterfaceDefault(),e.latency=await mn.inetChecksite("google.com"),(await mn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await mn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return nc.error(`error in getNetworkInfo: ${t}`),e}}o(_O,"getNetworkInfo");async function gO(){if(JS!==void 0)return JS;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await mn.osInfo();e=c;let l=await mn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,JS=e,JS}catch(t){return nc.error(`error in getSystemInformation: ${t}`),e}}o(gO,"getSystemInformation");async function SO(){let e=[],t=await tue.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await eue(n));return e}o(SO,"getTableSize");async function TO(){let e={};for(let t in dO){let r=e[t]={},n=r.tables={};for(let s in dO[t])try{let i=dO[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){nc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(TO,"getMetrics");async function EV(){if(ep.get(kd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await hV.getNATSReferences(),t=await hV.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(EV,"getNatsStreamInfo");async function nue(e){let t=new rue;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await gO(),t.time=fO(),t.cpu=await mO(),t.memory=await hO(),t.disk=await EO(),t.network=await _O(),t.harperdb_processes=await pO(),t.table_size=await SO(),t.metrics=await TO(),t.threads=await pV(),t.replication=await EV(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await gO();break;case"time":t.time=fO();break;case"cpu":t.cpu=await mO();break;case"memory":t.memory=await hO();break;case"disk":t.disk=await EO();break;case"network":t.network=await _O();break;case"harperdb_processes":t.harperdb_processes=await pO();break;case"table_size":t.table_size=await SO();break;case"database_metrics":case"metrics":t.metrics=await TO();break;case"threads":t.threads=await pV();break;case"replication":t.replication=await EV();break;default:break}return t}o(nue,"systemInformation")});var ro=M((EUe,RV)=>{"use strict";var sue=vn(),RO=ie(),iue=require("util"),Hl=(k(),v(W)),gV=oe();gV.initSync();var oue=nw(),SV=cn(),{Node:mUe,NodeSubscription:hUe}=Hd(),aue=Wu(),cue=oV(),{RemotePayloadObject:lue,RemotePayloadSubscription:uue}=Zh(),{handleHDBError:due,hdbErrors:fue}=ge(),{HTTP_STATUS_CODES:mue,HDB_ERROR_MSGS:hue}=fue,pue=ci(),Eue=Gd(),{packageJson:_ue}=Rt(),{getDatabases:gue}=(De(),v(mt)),pUe=iue.promisify(oue.authorize),Sue=SV.searchByHash,Tue=SV.searchByValue;RV.exports={isEmpty:Rue,getNodeRecord:yue,upsertNodeRecord:Aue,buildNodePayloads:bue,checkClusteringEnabled:Iue,getAllNodeRecords:Nue,getSystemInfo:wue,reverseSubscription:TV};function Rue(e){return e==null}o(Rue,"isEmpty");async function yue(e){let t=new aue(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Sue(t)}o(yue,"getNodeRecord");async function Aue(e){let t=new cue(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return sue.upsert(t)}o(Aue,"upsertNodeRecord");function TV(e){if(RO.isEmpty(e.subscribe)||RO.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(TV,"reverseSubscription");function bue(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=RO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=TV(c),h=gue()[l]?.[u],p=new uue(l,u,d,m,f,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(p)}return new lue(r,t,s,n)}o(bue,"buildNodePayloads");function Iue(){if(!gV.get(Hl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw due(new Error,hue.CLUSTERING_NOT_ENABLED,mue.BAD_REQUEST,void 0,void 0,!0)}o(Iue,"checkClusteringEnabled");async function Nue(){let e=new pue(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Tue(e))}o(Nue,"getAllNodeRecords");async function wue(){let e=await Eue.getSystemInformation();return{hdb_version:_ue.version,node_version:e.node_version,platform:e.platform}}o(wue,"getSystemInfo")});var yO=M((gUe,CV)=>{"use strict";var XS=mr(),yV=ie(),AV=Nt(),bV=(k(),v(W)),ZS=Q(),IV=Jh(),Oue=Ym(),{RemotePayloadObject:Cue}=Zh(),{handleHDBError:NV,hdbErrors:Pue}=ge(),{HTTP_STATUS_CODES:wV}=Pue,{NodeSubscription:OV}=Hd();CV.exports=Lue;async function Lue(e,t){let r;try{r=await XS.request(`${t}.${AV.REQUEST_SUFFIX}`,new Cue(bV.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),ZS.trace("Response from remote describe all request:",r)}catch(a){ZS.error(`addNode received error from describe all request to remote node: ${a}`);let c=XS.requestErrorHandler(a,"add_node",t);throw NV(new Error,c,wV.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===AV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw NV(new Error,a,wV.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===bV.SYSTEM_SCHEMA_NAME){await XS.createLocalTableStream(l,c);let p=new OV(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p);continue}let u=yV.doesSchemaExist(l),d=n[l]!==void 0,f=c?yV.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(ZS.trace(`addNode creating schema: ${l}`),await IV.createSchema({operation:"create_schema",schema:l})),!f&&m){ZS.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new Oue(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await IV.createTable(p)}await XS.createLocalTableStream(l,c);let h=new OV(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h)}return{added:i,skipped:s}}o(Lue,"reviewSubscriptions")});var qd={};Oe(qd,{addNodeBack:()=>AO,removeNodeBack:()=>bO,setNode:()=>Uue});async function Uue(e){e.node_name&&!e.hostname&&(e.hostname=e.node_name),e.verify_tls!==void 0&&(e.rejectUnauthorized=e.verify_tls);let{url:t,hostname:r}=e;t?r||(r=e.hostname=pi(t)):t=qS(r);let n=(0,LV.validateBySchema)(e,vue);if(n)throw(0,Ko.handleHDBError)(n,n.message,Mue.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Ko.ClientError("url or hostname is required for remove_node operation");let h=r,p=Kt(),_=await p.get(h);if(!_)throw new Ko.ClientError(h+" does not exist");try{await jh({url:_.url},{operation:$.REMOVE_NODE_BACK,name:_?.subscriptions?.length>0?Ze():h},void 0)}catch(g){as.warn(`Error removing node from target node ${h}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await p.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new Ko.ClientError("url required for this operation");let s=za();if(s==null)throw new Ko.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,vs.getReplicationCert)();let h=await(0,vs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,vs.createCsr)(),as.info("Sending CSR to target node:",t)):h&&(c=h.certificate,as.info("Sending CA named",h.name,"to target node",t))}let l={operation:$.ADD_NODE_BACK,hostname:(0,ic.get)(U.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,ic.get)(U.REPLICATION_SHARD)!==void 0&&(l.shard=(0,ic.get)(U.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(PV):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=PV(e);l.subscribe=h.subscribe,l.publish=h.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await jh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,as.warn("Error adding node:",t,"to cluster:",h),d=h}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(as.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,vs.setCertTable)({name:Due.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,vs.setCertTable)({name:Ze(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,ic.get)(U.REPLICATION_SHARD)!==void 0&&(h.shard=(0,ic.get)(U.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Ho(Ze(),h)}await Ho(u?u.nodeName:f.name??pi(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function AO(e){as.trace("addNodeBack received request:",e);let t=await(0,vs.signCertificate)(e),r;e.csr?(r=t.signingCA,as.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,as.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,vs.getReplicationCertAuth)();if(n.replicates){let i={url:za(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,ic.get)(U.REPLICATION_SHARD)!==void 0&&(i.shard=(0,ic.get)(U.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Ho(Ze(),i)}return await Ho(e.hostname,n),t.nodeName=Ze(),t.usingCA=s?.certificate,as.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function bO(e){as.trace("removeNodeBack received request:",e),await Kt().delete(e.name)}function PV(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var vs,LV,sc,ic,as,Ko,Due,Mue,vue,$d=ue(()=>{vs=w(os()),LV=w(ct()),sc=w(require("joi")),ic=w(oe());k();Vh();Dl();ss();as=w(Q()),Ko=w(ge()),{pki:Due}=require("node-forge"),{HTTP_STATUS_CODES:Mue}=Ko.hdbErrors,vue=sc.default.object({hostname:sc.default.string(),verify_tls:sc.default.boolean(),replicates:sc.default.boolean(),subscriptions:sc.default.array(),revoked_certificates:sc.default.array(),shard:sc.default.number()});o(Uue,"setNode");o(AO,"addNodeBack");o(bO,"removeNodeBack");o(PV,"reverseSubscription")});var np=M((wUe,MV)=>{"use strict";var{handleHDBError:eT,hdbErrors:xue}=ge(),{HTTP_STATUS_CODES:tT}=xue,{addUpdateNodeValidator:Bue}=QS(),rT=Q(),nT=(k(),v(W)),DV=Nt(),Fue=ie(),tp=mr(),rp=ro(),IO=oe(),Hue=yO(),{Node:kue,NodeSubscription:Gue}=Hd(),{broadcast:que}=rt(),{setNode:$ue}=($d(),v(qd)),IUe=oe(),NUe=(k(),v(W)),Vue="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Kue="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Yue=IO.get(nT.CONFIG_PARAMS.CLUSTERING_NODENAME);MV.exports=Wue;async function Wue(e,t=!1){if(rT.trace("addNode called with:",e),IO.get(nT.CONFIG_PARAMS.REPLICATION_URL)||IO.get(nT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return $ue(e);rp.checkClusteringEnabled();let r=Bue(e);if(r)throw eT(r,r.message,tT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await rp.getNodeRecord(n);if(!Fue.isEmptyOrZeroLength(f))throw eT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,tT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Hue(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Vue,a;let c=rp.buildNodePayloads(s,Yue,nT.OPERATIONS_ENUM.ADD_NODE,await rp.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let h=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Gue(h.schema,h.table,h.publish,h.subscribe))}rT.trace("addNode sending remote payload:",c);let u;try{u=await tp.request(`${n}.${DV.REQUEST_SUFFIX}`,c)}catch(f){rT.error(`addNode received error from request: ${f}`);for(let h=0,p=s.length;h<p;h++){let _=s[h];_.publish=!1,_.subscribe=!1,await tp.updateRemoteConsumer(_,n)}let m=tp.requestErrorHandler(f,"add_node",n);throw eT(new Error,m,tT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===DV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw eT(new Error,f,tT.INTERNAL_SERVER_ERROR,"error",f)}rT.trace(u);for(let f=0,m=s.length;f<m;f++){let h=s[f];await tp.updateRemoteConsumer(h,n),h.subscribe===!0&&await tp.updateConsumerIterator(h.schema,h.table,n,"start")}let d=new kue(n,l,u.system_info);return await rp.upsertNodeRecord(d),que({type:"nats_update"}),i.length>0?a.message=Kue:a.message=`Successfully added '${n}' to manifest`,a}o(Wue,"addNode")});var CO=M((PUe,UV)=>{"use strict";var{handleHDBError:NO,hdbErrors:zue}=ge(),{HTTP_STATUS_CODES:wO}=zue,{addUpdateNodeValidator:jue}=QS(),sp=Q(),sT=(k(),v(W)),vV=Nt(),CUe=ie(),ip=mr(),op=ro(),OO=oe(),{cloneDeep:Que}=require("lodash"),Jue=yO(),{Node:Xue,NodeSubscription:Zue}=Hd(),{broadcast:ede}=rt(),{setNode:tde}=($d(),v(qd)),rde="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",nde="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",sde=OO.get(sT.CONFIG_PARAMS.CLUSTERING_NODENAME);UV.exports=ide;async function ide(e){if(sp.trace("updateNode called with:",e),OO.get(sT.CONFIG_PARAMS.REPLICATION_URL)??OO.get(sT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return tde(e);op.checkClusteringEnabled();let t=jue(e);if(t)throw NO(t,t.message,wO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await op.getNodeRecord(r);s.length>0&&(n=Que(s));let{added:i,skipped:a}=await Jue(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=rde,c;let l=op.buildNodePayloads(i,sde,sT.OPERATIONS_ENUM.UPDATE_NODE,await op.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];sp.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}sp.trace("updateNode sending remote payload:",l);let u;try{u=await ip.request(`${r}.${vV.REQUEST_SUFFIX}`,l)}catch(d){sp.error(`updateNode received error from request: ${d}`);let f=ip.requestErrorHandler(d,"update_node",r);throw NO(new Error,f,wO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===vV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw NO(new Error,d,wO.INTERNAL_SERVER_ERROR,"error",d)}sp.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await ip.updateRemoteConsumer(m,r),m.subscribe===!0?await ip.updateConsumerIterator(m.schema,m.table,r,"start"):await ip.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new Xue(r,[],u.system_info)]),await ode(n[0],i,u.system_info),a.length>0?c.message=nde:c.message=`Successfully updated '${r}'`,c}o(ide,"updateNode");async function ode(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new Zue(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await op.upsertNodeRecord(n),ede({type:"nats_update"})}o(ode,"updateNodeTable")});var kV=M((DUe,HV)=>{"use strict";var FV=require("joi"),{string:xV}=FV.types(),ade=ct(),BV=(k(),v(W)),cde=oe(),lde=Nt();HV.exports=ude;function ude(e){let t=xV.invalid(cde.get(BV.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(lde.NATS_TERM_CONSTRAINTS_RX).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >","any.invalid":"'node_name' cannot be this nodes name"}).empty(null),r=FV.object({operation:xV.valid(BV.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return ade.validateBySchema(e,r)}o(ude,"removeNodeValidator")});var cp=M((vUe,KV)=>{"use strict";var{handleHDBError:GV,hdbErrors:dde}=ge(),{HTTP_STATUS_CODES:qV}=dde,fde=kV(),ap=Q(),$V=ro(),mde=ie(),Vd=(k(),v(W)),VV=Nt(),PO=mr(),LO=oe(),{RemotePayloadObject:hde}=Zh(),{NodeSubscription:pde}=Hd(),Ede=Km(),_de=Sl(),{broadcast:gde}=rt(),{setNode:Sde}=($d(),v(qd)),Tde=LO.get(Vd.CONFIG_PARAMS.CLUSTERING_NODENAME);KV.exports=Rde;async function Rde(e){if(ap.trace("removeNode called with:",e),LO.get(Vd.CONFIG_PARAMS.REPLICATION_URL)??LO.get(Vd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Sde(e);$V.checkClusteringEnabled();let t=fde(e);if(t)throw GV(t,t.message,qV.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await $V.getNodeRecord(r);if(mde.isEmptyOrZeroLength(n))throw GV(new Error,`Node '${r}' was not found.`,qV.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new hde(Vd.OPERATIONS_ENUM.REMOVE_NODE,Tde,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await PO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await PO.updateRemoteConsumer(new pde(d.schema,d.table,!1,!1),r)}catch(f){ap.error(f)}}try{i=await PO.request(`${r}.${VV.REQUEST_SUFFIX}`,s),ap.trace("Remove node reply from remote node:",r,i)}catch(l){ap.error("removeNode received error from request:",l),a=!0}let c=new Ede(Vd.SYSTEM_SCHEMA_NAME,Vd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await _de.deleteRecord(c),gde({type:"nats_update"}),i?.status===VV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(ap.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(Rde,"removeNode")});var zV=M((xUe,WV)=>{"use strict";var YV=require("joi"),{string:yde,array:Ade}=YV.types(),bde=ct(),Ide=QS();WV.exports=Nde;function Nde(e){let t=YV.object({operation:yde.valid("configure_cluster").required(),connections:Ade.items(Ide.validationSchema).required()});return bde.validateBySchema(e,t)}o(Nde,"configureClusterValidator")});var DO=M((FUe,ZV)=>{"use strict";var jV=(k(),v(W)),iT=Q(),wde=ie(),Ode=oe(),Cde=cp(),Pde=np(),Lde=ro(),Dde=zV(),{handleHDBError:QV,hdbErrors:Mde}=ge(),{HTTP_STATUS_CODES:JV}=Mde,vde="Configure cluster complete.",Ude="Failed to configure the cluster. Check the logs for more details.",xde="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";ZV.exports=Bde;async function Bde(e){iT.trace("configure cluster called with:",e);let t=Dde(e);if(t)throw QV(t,t.message,JV.BAD_REQUEST,void 0,void 0,!0);let r=await Lde.getAllNodeRecords(),n=[];if(Ode.get(jV.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await XV(Cde,{operation:jV.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}iT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await XV(Pde,f,f.node_name);s.push(m)}iT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(iT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(wde.isEmptyOrZeroLength(a))return{message:vde,connections:c};if(l)return{message:xde,failed_nodes:a,connections:c};throw QV(new Error,Ude,JV.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(Bde,"configureCluster");async function XV(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(XV,"functionWrapper")});var n1=M((kUe,r1)=>{"use strict";var lp=require("joi"),Fde=ct(),{validateSchemaExists:e1,validateTableExists:Hde,validateSchemaName:t1}=Gi(),kde=lp.object({operation:lp.string().valid("purge_stream"),schema:lp.string().custom(e1).custom(t1).optional(),database:lp.string().custom(e1).custom(t1).optional(),table:lp.string().custom(Hde).required()});function Gde(e){return Fde.validateBySchema(e,kde)}o(Gde,"purgeStreamValidator");r1.exports=Gde});var MO=M((qUe,s1)=>{"use strict";var{handleHDBError:qde,hdbErrors:$de}=ge(),{HTTP_STATUS_CODES:Vde}=$de,Kde=n1(),Yde=mr(),Wde=ro();s1.exports=zde;async function zde(e){e.schema=e.schema??e.database;let t=Kde(e);if(t)throw qde(t,t.message,Vde.BAD_REQUEST,void 0,void 0,!0);Wde.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Yde.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(zde,"purgeStream")});var cT=M((VUe,d1)=>{"use strict";var UO=ro(),jde=mr(),aT=oe(),Kd=(k(),v(W)),kl=Nt(),Qde=ie(),vO=Q(),{RemotePayloadObject:Jde}=Zh(),{ErrorCode:i1}=require("nats"),{parentPort:o1}=require("worker_threads"),{onMessageByType:Xde}=rt(),{getThisNodeName:Zde}=(ss(),v(Go)),{requestClusterStatus:efe}=(Vh(),v(Pq)),{getReplicationSharedStatus:tfe,getHDBNodeTable:rfe}=(Dl(),v(Iw)),{CONFIRMATION_STATUS_POSITION:nfe,RECEIVED_VERSION_POSITION:sfe,RECEIVED_TIME_POSITION:ife,SENDING_TIME_POSITION:ofe,RECEIVING_STATUS_POSITION:afe,RECEIVING_STATUS_RECEIVING:cfe}=(Ww(),v(S$)),a1=aT.get(Kd.CONFIG_PARAMS.CLUSTERING_ENABLED),c1=aT.get(Kd.CONFIG_PARAMS.CLUSTERING_NODENAME);d1.exports={clusterStatus:lfe,buildNodeStatus:u1};var l1;Xde("cluster-status",async e=>{l1(e)});async function lfe(){if(aT.get(Kd.CONFIG_PARAMS.REPLICATION_URL)||aT.get(Kd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(o1){o1.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{l1=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=tfe(u,l,a);c.lastCommitConfirmed=oT(d[nfe]),c.lastReceivedRemoteTime=oT(d[sfe]),c.lastReceivedLocalTime=oT(d[ife]),c.sendingMessage=oT(d[ofe]),c.lastReceivedStatus=d[afe]===cfe?"Receiving":"Waiting"}}}else n=efe();n.node_name=Zde();let s=rfe().primaryStore.get(n.node_name);return s?.shard&&(n.shard=s.shard),s?.url&&(n.url=s.url),n.is_enabled=!0,n}let e={node_name:c1,is_enabled:a1,connections:[]};if(!a1)return e;let t=await UO.getAllNodeRecords();if(Qde.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(u1(t[n],e.connections));return await Promise.allSettled(r),e}o(lfe,"clusterStatus");function oT(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(oT,"asDate");async function u1(e,t){let r=e.name,n=new Jde(Kd.OPERATIONS_ENUM.CLUSTER_STATUS,c1,void 0,await UO.getSystemInfo()),s,i,a=kl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await jde.request(kl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===kl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=kl.CLUSTER_STATUS_STATUSES.CLOSED,vO.error(`Error getting node status from ${r} `,s))}catch(l){vO.warn(`Error getting node status from ${r}`,l),l.code===i1.NoResponders?a=kl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===i1.Timeout?a=kl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=kl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new ufe(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Kd.PRE_4_0_0_VERSION&&await UO.upsertNodeRecord(l)}catch(l){vO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(u1,"buildNodeStatus");function ufe(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(ufe,"NodeStatusObject")});var BO=M((YUe,f1)=>{"use strict";var{handleHDBError:dfe,hdbErrors:ffe}=ge(),{HTTP_STATUS_CODES:mfe}=ffe,hfe=mr(),pfe=ro(),xO=ie(),lT=require("joi"),Efe=ct(),_fe=2e3,gfe=lT.object({timeout:lT.number().min(1),connected_nodes:lT.boolean(),routes:lT.boolean()});f1.exports=Sfe;async function Sfe(e){pfe.checkClusteringEnabled();let t=Efe.validateBySchema(e,gfe);if(t)throw dfe(t,t.message,mfe.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||xO.autoCastBoolean(n),a=s===void 0||xO.autoCastBoolean(s),c={nodes:[]},l=await hfe.getServerList(r??_fe),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,h=l[d].data;if(m.name.endsWith("-hub")){let p={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(p.connected_nodes=[],u[m.name]&&u[m.name].forEach(_=>{p.connected_nodes.includes(_.name.slice(0,-4))||p.connected_nodes.push(_.name.slice(0,-4))})),a&&(p.routes=h.cluster?.urls?h.cluster?.urls.map(_=>({host:_.split(":")[0],port:xO.autoCast(_.split(":")[1])})):[]),c.nodes.push(p)}}return c}o(Sfe,"clusterNetwork")});var E1=M((zUe,p1)=>{"use strict";var FO=require("joi"),m1=ct(),{routeConstraints:h1}=nA();p1.exports={setRoutesValidator:Tfe,deleteRoutesValidator:Rfe};function Tfe(e){let t=FO.object({server:FO.valid("hub","leaf"),routes:h1.required()});return m1.validateBySchema(e,t)}o(Tfe,"setRoutesValidator");function Rfe(e){let t=FO.object({routes:h1.required()});return m1.validateBySchema(e,t)}o(Rfe,"deleteRoutesValidator")});var uT=M((QUe,A1)=>{"use strict";var Yo=yt(),HO=ie(),Us=(k(),v(W)),Yd=oe(),_1=E1(),{handleHDBError:g1,hdbErrors:yfe}=ge(),{HTTP_STATUS_CODES:S1}=yfe,T1="cluster routes successfully set",R1="cluster routes successfully deleted";A1.exports={setRoutes:bfe,getRoutes:Ife,deleteRoutes:Nfe};function Afe(e){let t=Yo.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=HO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:T1,set:i,skipped:s}}o(Afe,"setRoutesNats");function bfe(e){let t=_1.setRoutesValidator(e);if(t)throw g1(t,t.message,S1.BAD_REQUEST,void 0,void 0,!0);if(Yd.get(Us.CONFIG_PARAMS.CLUSTERING_ENABLED))return Afe(e);let r=[],n=[],s=Yd.get(Us.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{y1(s,i)?n.push(i):(s.push(i),r.push(i))}),Yo.updateConfigValue(Us.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:T1,set:r,skipped:n}}o(bfe,"setRoutes");function y1(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(y1,"existsInArray");function Ife(){if(Yd.get(Us.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Yo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Yd.get(Us.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Ife,"getRoutes");function Nfe(e){let t=_1.deleteRoutesValidator(e);if(t)throw g1(t,t.message,S1.BAD_REQUEST,void 0,void 0,!0);if(Yd.get(Us.CONFIG_PARAMS.CLUSTERING_ENABLED))return wfe(e);let r=[],n=[],s=Yd.get(Us.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{y1(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),Yo.updateConfigValue(Us.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:R1,deleted:r,skipped:n}}o(Nfe,"deleteRoutes");function wfe(e){let t=Yo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,h=r.length;m<h;m++){let p=r[m];if(d.host===p.host&&d.port===p.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let h=0,p=n.length;h<p;h++){let _=n[h];if(d.host===_.host&&d.port===_.port){n.splice(h,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=HO.isEmptyOrZeroLength(r)?null:r,Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=HO.isEmptyOrZeroLength(n)?null:n,Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:R1,deleted:s,skipped:i}}o(wfe,"deleteRoutesNats")});var I1=M((XUe,b1)=>{"use strict";var up=require("alasql"),Gl=require("recursive-iterator"),gi=Q(),Ofe=ie(),dp=(k(),v(W)),kO=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,Pfe(this.ast,this.affected_attributes,this.table_lookup,this.schema_lookup,this.table_to_schema_lookup)}getAttributesBySchemaTableName(t,r){if(!t||!r||!this.affected_attributes)return[];if(this.affected_attributes.has(t))return!this.affected_attributes.get(t).has(r)&&(r=this.table_lookup.get(r),!r)?[]:this.affected_attributes.get(t).get(r)}getAllTables(){let t=[];if(!this.affected_attributes)return t;for(let r of this.affected_attributes.keys())t.push(Array.from(this.affected_attributes.get(r).keys()));return t}getTablesBySchemaName(t){return!t||!this.affected_attributes?[]:Array.from(this.affected_attributes.get(t).keys())}getSchemas(){return this.affected_attributes?Array.from(this.affected_attributes.keys()):[]}getAst(){return this.ast}updateAttributeWildcardsForRolePerms(t){let r=this.ast.columns.filter(s=>dp.SEARCH_WILDCARDS.includes(s.columnid));if(r.length===0)return this.ast;let n=this.ast.from[0].databaseid;return this.ast.columns=this.ast.columns.filter(s=>!dp.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][dp.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=Cfe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!dp.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new up.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function Cfe(e){return e.filter(t=>t[dp.PERMS_CRUD_ENUM.READ])}o(Cfe,"filterReadRestrictedAttrs");function Pfe(e,t,r,n,s){Lfe(e,t,r,n,s)}o(Pfe,"interpretAST");function fp(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(fp,"addSchemaTableToMap");function Lfe(e,t,r,n,s){if(!e){gi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof up.yy.Insert?Ufe(e,t,r):e instanceof up.yy.Select?Dfe(e,t,r,n,s):e instanceof up.yy.Update?Mfe(e,t,r):e instanceof up.yy.Delete?vfe(e,t,r):gi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(Lfe,"getRecordAttributesAST");function Dfe(e,t,r,n,s){if(!e){gi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Ofe.isEmptyOrZeroLength(i)){gi.error("No schema specified");return}e.from.forEach(c=>{fp(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),fp(c.table,t,r,n,s)});let a=new Gl(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{gi.info(`table specified as ${l} not found.`);return}t.get(u).get(l).indexOf(c.columnid)<0&&t.get(u).get(l).push(c.columnid)}if(e.where){let c=new Gl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new Gl(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new Gl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{gi.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(Dfe,"getSelectAttributes");function Mfe(e,t,r){if(!e){gi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new Gl(e.columns),s=e.table.databaseid;fp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&GO(e.table.tableid,s,i.columnid,t,r)}o(Mfe,"getUpdateAttributes");function vfe(e,t,r){if(!e){gi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new Gl(e.where),s=e.table.databaseid;fp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&GO(e.table.tableid,s,i.columnid,t,r)}o(vfe,"getDeleteAttributes");function Ufe(e,t,r){if(!e){gi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new Gl(e.columns),s=e.into.databaseid;fp(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&GO(e.into.tableid,s,i.columnid,t,r)}o(Ufe,"getInsertAttributes");function GO(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(GO,"pushAttribute");b1.exports=kO});var w1=M((e0e,N1)=>{"use strict";var dT=(k(),v(W)),fT=class{static{o(this,"BaseLicense")}constructor(t=0,r=dT.RAM_ALLOCATION_ENUM.DEFAULT,n=dT.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},qO=class extends fT{static{o(this,"ExtendedLicense")}constructor(t=0,r=dT.RAM_ALLOCATION_ENUM.DEFAULT,n=dT.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};N1.exports={BaseLicense:fT,ExtendedLicense:qO}});var jd=M((r0e,M1)=>{"use strict";var zd=require("fs-extra"),mT=(Rg(),v(Tg)),C1=require("crypto"),xfe=require("moment"),Bfe=require("uuid").v4,hn=Q(),VO=require("path"),Ffe=ie(),ql=(k(),v(W)),{totalmem:O1}=require("os"),Hfe=w1().ExtendedLicense,Wd="invalid license key format",kfe="061183",Gfe="mofi25",qfe="aes-256-cbc",$fe=16,Vfe=32,P1=oe(),{resolvePath:L1}=yt();P1.initSync();var $O;M1.exports={validateLicense:D1,generateFingerPrint:Yfe,licenseSearch:WO,getLicense:jfe,checkMemoryLimit:Qfe};function KO(){return VO.join(P1.getHdbBasePath(),ql.LICENSE_KEY_DIR_NAME,ql.LICENSE_FILE_NAME)}o(KO,"getLicenseDirPath");function Kfe(){let e=KO();return L1(VO.join(e,ql.LICENSE_FILE_NAME))}o(Kfe,"getLicenseFilePath");function YO(){let e=KO();return L1(VO.join(e,ql.REG_KEY_FILE_NAME))}o(YO,"getFingerPrintFilePath");async function Yfe(){let e=YO();try{return await zd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Wfe();throw hn.error(`Error writing fingerprint file to ${e}`),hn.error(t),new Error("There was an error generating the fingerprint")}}o(Yfe,"generateFingerPrint");async function Wfe(){let e=Bfe(),t=mT.hash(e,mT.HASH_FUNCTION.MD5),r=YO();try{await zd.mkdirp(KO()),await zd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw hn.error(`Error writing fingerprint file to ${r}`),hn.error(n),new Error("There was an error generating the fingerprint")}return t}o(Wfe,"writeFingerprint");function D1(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:ql.RAM_ALLOCATION_ENUM.DEFAULT,version:ql.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return hn.error("empty license key passed to validate."),r;let n=YO(),s=!1;try{s=zd.statSync(n)}catch(i){hn.error(i)}if(s){let i;try{i=zd.readFileSync(n,"utf8")}catch{hn.error("error validating this machine in the license"),r.valid_machine=!1;return}let a=e.split(Gfe),c=a[1];c=Buffer.concat([Buffer.from(c)],$fe);let l=Buffer.concat([Buffer.from(i)],Vfe),u=C1.createDecipheriv(qfe,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(a[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let h=zfe(a[0],i);if(h)d=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Wd),hn.error(Wd),new Error(Wd)}let f;if(isNaN(d))try{f=JSON.parse(d),r.version=f.version,r.exp_date=f.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),f.ram_allocation&&(r.ram_allocation=f.ram_allocation)}catch{throw console.error(Wd),hn.error(Wd),new Error(Wd)}else r.exp_date=d;r.exp_date<xfe().valueOf()&&(r.valid_date=!1),mT.validate(a[1],`${kfe}${i}${t}`,mT.HASH_FUNCTION.MD5)||(r.valid_license=!1)}else r.valid_license=!1,r.valid_machine=!1;return r.valid_license&&r.valid_machine&&r.valid_date||hn.error("Invalid licence"),r}o(D1,"validateLicense");function zfe(e,t){try{let r=C1.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{hn.warn("Check old license failed")}}o(zfe,"checkOldLicense");function WO(){let e=new Hfe,t=[];try{t=zd.readFileSync(Kfe(),"utf-8").split(`\r
17
+ `+vl.get(g.issuer)),!p||!_)throw new Error("Missing private key or certificate for secure server");let y={ciphers:f.ciphers,ticketKeys:pce(),availableCAs:vl,ca:t&&Array.from(vl.values()),cert:_,key:p,key_file:f.private_key_name,is_self_signed:f.is_self_signed};a&&(y.sessionIdContext=a.sessionIdContext);let T=AS.createSecureContext(y);T.name=f.name,T.options=y,T.quality=h,T.certificateAuthorities=Array.from(vl),T.certStart=_.toString().slice(0,100);let R=f.hostnames??Hw(g);Array.isArray(R)||(R=[R]);let N;for(let O of R)if(O){O[0]==="*"&&(s=!0,O=O.slice(1)),O===Pw()&&(h+=2),xq.isIP(O)&&(N=!0);let F=r.get(O)?.quality??0;h>F&&r.set(O,T)}else ja.error("No hostname found for certificate at",AS.certificate);ja.trace("Adding TLS",T.name,"for",a.ports||"client","cert named",f.name,"hostnames",R,"quality",h,"best quality",d),h>d&&(i.defaultContext=n=T,d=h,a&&(a.defaultContext=T))}catch(m){ja.error("Error applying TLS for",f.name,m)}a?.secureContextsListeners.forEach(f=>f()),c(n)}catch(d){l(d)}}o(u,"updateTLS"),yS?.system.hdb_certificate.subscribe({listener:o(()=>setTimeout(()=>u(),1500).unref(),"listener"),omitCurrent:!0}),u()})),i;function i(a,c){ja.info("TLS requested for",a||"(no SNI)");let l=a;for(;;){let d=r.get(l);if(d)return ja.debug("Found certificate for",a,d.certStart),d.updatedContext&&(d=d.updatedContext),c(null,d);if(s&&l){let f=l.indexOf(".",1);f<0?l="":l=l.slice(f)}else break}a?ja.debug("No certificate found to match",a,"using the default certificate"):ja.debug("No SNI, using the default certificate",n?.name);let u=n;u?u.updatedContext&&(u=u.updatedContext):ja.info("No default certificate found"),c(null,u)}o(i,"SNICallback")}o(jq,"createTLSSelector");async function Qq(e){let t=Ja.get(e);return!t&&e?await Un.readFile(hr.join(is.get(Ul.ROOTPATH),Ds.LICENSE_KEY_DIR_NAME,e),"utf8"):t}o(Qq,"getPrivateKeyByName");async function Jq(){Xa();let e=[];for await(let t of Jr.search([]))e.push(t);return e}o(Jq,"listCertificates");async function Ice(e){let t=Dw(e,Ei.object({name:Ei.string().required(),certificate:Ei.string().required(),is_authority:Ei.boolean().required(),private_key:Ei.string(),hosts:Ei.array(),uses:Ei.array()}));if(t)throw new Qa(t.message);let{name:r,certificate:n,private_key:s,is_authority:i}=e,a=new ko(n),c=!1,l=!1,u;for(let[h,p]of Ja)!s&&!c&&a.checkPrivateKey(Bq(p))&&(c=!0,u=h),s&&s===p&&(l=!0,u=h);if(!i&&!s&&!c)throw new Qa("A suitable private key was not found for this certificate");let d;if(!r){try{d=Fw(a)}catch(h){ht.error(h)}if(d==null)throw new Qa("Error extracting certificate host name, please provide a name parameter")}let f=Nce(r??d);s&&!c&&!l&&(await Un.writeFile(hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME,f+".pem"),s),Ja.set(f,s));let m={name:r??d,certificate:n,is_authority:i,hosts:e.hosts,uses:e.uses};return(!i||i&&u||i&&s)&&(m.private_key_name=u??f+".pem"),e.ciphers&&(m.ciphers=e.ciphers),await Pd(m),"Successfully added certificate: "+f}o(Ice,"addCertificate");function Nce(e){return e.replace(/[^a-z0-9\.]/gi,"-")}o(Nce,"sanitizeName");async function wce(e){let t=Dw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Qa(t.message);let{name:r}=e;Xa();let n=await Jr.get(r);if(!n)throw new Qa(r+" not found");let{private_key_name:s}=n;if(s){let i=Array.from(await Jr.search([{attribute:"private_key_name",value:s}]));i.length===1&&i[0].name===r&&(ht.info("Removing private key named",s),await Un.remove(hr.join(is.getHdbBasePath(),Ds.LICENSE_KEY_DIR_NAME,s)))}return await Jr.delete(r),"Successfully removed "+r}o(wce,"removeCertificate");function Fw(e){let t=e.subject?.match(/CN=(.*)/)?.[1];return t||Hw(e)[0]}o(Fw,"getPrimaryHostName");function Hw(e){if(e.subjectAltName)return e.subjectAltName.split(",").map(r=>{let n=r.indexOf(":");if(r=r.slice(n+1),r=r.trim(),r[0]==='"')try{r=JSON.parse(r)}catch{}return r.indexOf("=")>-1?r.match(/CN=([^,]*)/)?.[1]:r}).filter(r=>r);let t=certObj.subject?.match(/CN=(.*)/)?.[1];return t?[t]:[]}o(Hw,"hostnamesFromCert");async function Oce(e){if(e.bypass_auth!==!0)throw new Qa("Unauthorized","401");let t=Dw(e,Ei.object({name:Ei.string().required()}));if(t)throw new Qa(t.message);let{name:r}=e;if(r===".jwtPrivate")return(await Dq()).privateKey;if(r===".jwtPublic")return(await Dq()).publicKey;if(Ja.get(r))return Ja.get(e.name);throw new Qa("Key not found")}o(Oce,"getKey");function Cce(e){return[e.subject?.CN,...e.subjectaltname.split(",").filter(t=>t.trim().startsWith("DNS:")).map(t=>t.trim().substring(4))]}o(Cce,"getHostnamesFromCertificate")});var S$={};Oe(S$,{CONFIRMATION_STATUS_POSITION:()=>_$,LATENCY_POSITION:()=>US,NodeReplicationConnection:()=>Md,OPERATION_REQUEST:()=>$w,RECEIVED_TIME_POSITION:()=>MS,RECEIVED_VERSION_POSITION:()=>DS,RECEIVING_STATUS_POSITION:()=>vS,RECEIVING_STATUS_RECEIVING:()=>g$,RECEIVING_STATUS_WAITING:()=>Vw,SENDING_TIME_POSITION:()=>Wh,createWebSocket:()=>xS,databaseSubscriptions:()=>ec,replicateOverWS:()=>zh,tableUpdateListeners:()=>Yw});async function xS(e,t){let{authorization:r,rejectUnauthorized:n}=t||{},s=Ze(),i;if(e==null)throw new TypeError(`Invalid URL: Expected a string URL for node "${s}" but received ${e}`);if(e.includes("wss://")){if(!Gw){let l=(0,f$.createTLSSelector)("operations-api"),u={secureContexts:null};await l.initialize(u),Gw=u.secureContexts}if(i=Gw.get(s),i&&ae.debug?.("Creating web socket for URL",e,"with certificate named:",i.name),!i&&n!==!1)throw new Error("Unable to find a valid certificate to use for replication to connect to "+e)}let a={};r&&(a.Authorization=r);let c={headers:a,localAddress:s?.startsWith("127.0")?s:void 0,servername:(0,h$.isIP)(t?.serverName)?void 0:t?.serverName,noDelay:!0,highWaterMark:128*1024,rejectUnauthorized:n!==!1,secureContext:void 0};return i&&(LS?.caCount!==qo.size&&(LS=m$.createSecureContext({...i.options,ca:[...qo,...i.options.availableCAs.values()]}),LS.caCount=qo.size),c.secureContext=LS),new u$.WebSocket(e,"harperdb-replication-v1",c)}function zh(e,t,r){let n=t.port||t.securePort,s=xl.pid%1e3+"-"+d$.threadId+(n?"s:"+n:"c:"+t.url?.slice(-4))+" "+Math.random().toString().slice(2,3);ae.debug?.(s,"Initializing replication connection",r);let i=0,a=Buffer.allocUnsafeSlow(1024),c=0,l=new DataView(a.buffer,0,1024),u=t.database,d=t.databaseSubscriptions||ec,f,m,h=!1,p=t.subscription;p?.then&&p.then(E=>{p=E,p.auditStore&&(f=p.auditStore)});let _=t.tables||u&&nt()[u],g;if(!r){ae.error?.(s,"No authorization provided"),Ss(1008,"Unauthorized");return}let y=new Map,T=[];g=r.name,g&&t.connection&&(t.connection.nodeName=g);let R,N,O,F,Z,G,Y,q=6e4,K,ce=0,le=0,se=0,pe=l$.default.get(U.REPLICATION_BLOBTIMEOUT)??12e4,Ne=new Map,Ue=[],xe=0,Rr;if(t.url){let E=o(()=>{Z&&le===e._socket?.bytesRead&&se===e._socket?.bytesWritten?e.terminate():(Z=performance.now(),e.ping(),le=e._socket?.bytesRead,se=e._socket?.bytesWritten)},"sendPing");O=setInterval(E,a$).unref(),E()}else Jt();e._socket?.setMaxListeners(200);function Jt(){clearTimeout(F),le=e._socket?.bytesRead,se=e._socket?.bytesWritten,F=setTimeout(()=>{le===e._socket?.bytesRead&&se===e._socket?.bytesWritten&&(ae.warn?.(`Timeout waiting for ping from ${g}, terminating connection and reconnecting`),e.terminate())},a$*2).unref()}o(Jt,"resetPingTimer");function Mt(){if(!(!g||!u))return m||(m=Id(f,u,g)),m}o(Mt,"getSharedStatus"),u&&Sa(u);let Xt,Uf,Pc=[],Gt=[],xf,Bf=[],OE=[],CE=[],Fy=150,Ff=25,Pe=0,PE=0,Hf=!1,_o,Lr,yr,kf;e.on("message",E=>{ce=performance.now();try{let S=E.dataView=new Wc(E.buffer,E.byteOffset,E.byteLength);if(E[0]>127){let P=(0,et.decode)(E),[L,D,H]=P;switch(L){case Zq:{if(D){if(g){if(g!==D){ae.error?.(s,`Node name mismatch, expecting to connect to ${g}, but peer reported name as ${D}, disconnecting`),e.send((0,et.encode)([Ld])),Ss(1008,"Node name mismatch");return}}else if(g=D,t.connection?.tentativeNode){let B=t.connection.tentativeNode;B.name=g,t.connection.tentativeNode=null,Ho(g,B)}if(t.connection&&(t.connection.nodeName=g),ae.debug?.(s,"received node name:",g,"db:",u??P[2]),!u)try{Sa(u=P[2]),u==="system"&&(Xt=Wa(t,(B,de)=>{pu(de)&&Ta(de)}),e.on("close",()=>{Xt?.remove()}))}catch(B){ae.warn?.(s,"Error setting database",B),e.send((0,et.encode)([Ld])),Ss(1008,B.message);return}Dr()}break}case i$:{ae.debug?.(s,"Received table definitions for",D.map(B=>B.table));for(let B of D){let de=P[2];B.database=de;let me;pu(de)&&(de==="system"?ke[de]?.[B.table]||(me=V(B,ke[de]?.[B.table])):me=V(B,ke[de]?.[B.table]),f||(f=me?.auditStore),_||(_=nt()?.[de]))}break}case Ld:Ss();break;case $w:try{let B=r?.replicates||r?.subscribers||r?.name;ae.debug?.("Received operation request",D,"from",g),server.operation(D,{user:r},!B).then(de=>{Array.isArray(de)&&(de={results:de}),de.requestId=D.requestId,e.send((0,et.encode)([wS,de]))},de=>{e.send((0,et.encode)([wS,{requestId:D.requestId,error:(0,Dd.errorToString)(de)}]))})}catch(B){e.send((0,et.encode)([wS,{requestId:D.requestId,error:(0,Dd.errorToString)(B)}]))}break;case wS:let{resolve:C,reject:x}=y.get(D.requestId);D.error?x(new Error(D.error)):C(D),y.delete(D.requestId);break;case kw:let z=P[3];if(!_){u?ae.error?.(s,"No database found for",u):ae.error?.(s,"Database name never received"),Ss();return}let ne=_[z];ne=V({table:z,database:u,attributes:D.attributes,schemaDefined:D.schemaDefined},ne),Pc[H]={name:z,decoder:new et.Packr({useBigIntExtension:!0,randomAccessStructure:!0,freezeData:!0,typedStructs:D.typedStructs,structures:D.structures}),getEntry(B){return ne.primaryStore.getEntry(B)},rootStore:ne.primaryStore.rootStore};break;case e$:kf=f?yq(D,f):new Map,xf=P[2],ae.debug?.(s,`Acknowledged subscription request, receiving messages for nodes: ${xf}`);break;case t$:let re=H;CE[re]=D;break;case s$:Mt()[_$]=D,ae.trace?.(s,"received and broadcasting committed update",D),Mt().buffer.notify();break;case n$:R=D,p.send({type:"end_txn",localTime:R,remoteNodeIds:T}),Mt(),m[DS]=last_sequence_id_received,m[MS]=Date.now(),m[vS]=Vw;break;case OS:{let B=P[1],{fileId:de,size:me,finished:Se,error:ee}=B,j=Ne.get(de);ae.debug?.("Received blob",de,"has stream",!!j,"connectedToBlob",!!j?.connectedToBlob,"length",P[2].length,"finished",Se),j||(j=new qw.PassThrough,j.expectedSize=me,Ne.set(de,j)),j.lastChunk=Date.now();let he=P[2];st(he.byteLength,"bytes-received",`${g}.${u}`,"replication","blob");try{Se?(ee?(j.on("error",()=>{}),j.destroy(new Error("Blob error: "+ee+" for record "+(j.recordId??"unknown")+" from "+g))):j.end(he),j.connectedToBlob&&Ne.delete(de)):j.write(he)}catch(Te){ae.error?.(`Error receiving blob for ${j.recordId} from ${g} and streaming to storage`,Te),Ne.delete(de)}break}case r$:{let B=D,de;try{let me=P[3],Se=Gt[H]||(Gt[H]=_[P[4]]);if(!Se)return ae.warn?.("Unknown table id trying to handle record request",H);let ee=Se.primaryStore.getBinaryFast(Symbol.for("structures")),j=ee?.length??0;if(j>0&&j!==PE){PE=j;let Te=(0,et.decode)(ee);e.send((0,et.encode)([kw,{typedStructs:Te.typed,structures:Te.named},H,Se.tableName]))}let he=Se.primaryStore.getBinaryFast(me);if(he){let Te=Se.primaryStore.decoder.decode(he,{valueAsBuffer:!0}),fe=lt||{};fe.version=(0,p$.getLastVersion)(),lt&&lt[Pu]&Vr&&(Te=Buffer.from(Te),gm(()=>Se.primaryStore.decoder.decode(he),We=>ga(We,me),Se.primaryStore.rootStore)),de=(0,et.encode)([NS,B,{value:Te,expiresAt:fe.expiresAt,version:fe.version,residencyId:fe.residencyId,nodeId:fe.nodeId,user:fe.user}])}else de=(0,et.encode)([NS,B])}catch(me){de=(0,et.encode)([NS,B,{error:me.message}])}e.send(de);break}case NS:{let{resolve:B,reject:de,tableId:me,key:Se}=y.get(P[1]),ee=P[2];if(ee?.error)de(new Error(ee.error));else if(ee){let j;m_(()=>{let he=Pc[me].decoder.decode(ee.value);ee.value=he,ee.key=Se,B(ee)||j&&setTimeout(()=>j.forEach(u_),6e4).unref()},f?.rootStore,he=>{let Te=Lc(he,Se);return j||(j=[]),j.push(Te),Te})}else B();y.delete(P[1]);break}case Xq:{yr=D;let B,de,me=!1;if(p){if(u!==p.databaseName&&!p.then){ae.error?.("Subscription request for wrong database",u,p.databaseName);return}}else p=d.get(u);if(ae.debug?.(s,"received subscription request for",u,"at",yr),!p){let Ee;p=new Promise(ft=>{ae.debug?.("Waiting for subscription to database "+u),Ee=ft}),p.ready=Ee,ec.set(u,p)}if(r.name)de=Kt().subscribe(r.name),de.then(async Ee=>{B=Ee;for await(let ft of B){let tt=ft.value;if(!(tt?.replicates===!0||tt?.replicates?.receives||tt?.subscriptions?.some(cr=>(cr.database||cr.schema)===u&&cr.publish!==!1))){me=!0,e.send((0,et.encode)([Ld])),Ss(1008,`Unauthorized database subscription to ${u}`);return}}},Ee=>{ae.error?.(s,"Error subscribing to HDB nodes",Ee)});else if(!(r?.role?.permission?.super_user||r.replicates)){e.send((0,et.encode)([Ld])),Ss(1008,`Unauthorized database subscription to ${u}`);return}if(Lr&&(ae.debug?.(s,"stopping previous subscription",u),Lr.emit("close")),yr.length===0)return;let Se=yr[0],ee=o(Ee=>{if(Ee&&(Se.replicateByDefault?!Se.tables.includes(Ee.tableName):Se.tables.includes(Ee.tableName)))return{table:Ee}},"tableToTableEntry"),j={txnTime:0},he,Te,fe=1/0,We,Et=o((Ee,ft)=>{if(Ee.type==="end_txn"){j.txnTime&&(a[i]!==66&&ae.error?.("Invalid encoding of message"),Eu(9),Eu(b_),Mc(We=ft),ut()),i=c,j.txnTime=0;return}let tt=Ee.nodeId,cr=Ee.tableId,vt=Te[cr];if(!vt&&(vt=Te[cr]=ee(p.tableById[cr]),!vt))return ae.debug?.("Not subscribed to table",cr);let Ts=vt.table,Ut=Ts.primaryStore,Js=Ut.encoder;(Ee.extendedType&C_||!Js.typedStructs)&&(Js._mergeStructures(Js.getStructures()),Js.typedStructs&&(Js.lastTypedStructuresLength=Js.typedStructs.length));let _u=he[tt];if(!(_u&&_u.startTime<ft&&(!_u.endTime||_u.endTime>ft)))return PS&&ae.trace?.(s,"skipping replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he),tM();PS&&ae.trace?.(s,"sending replication update",Ee.recordId,"to:",g,"from:",tt,"subscribed:",he);let Hy=Ee.version,vc=Ee.residencyId,ky=hu(vc,Ts),DE;if(ky&&!ky.includes(g)){let Xs=hu(Ee.previousResidencyId,Ts);if(Xs&&!Xs.includes(g)&&(Ee.type==="put"||Ee.type==="patch")||Ts.getResidencyById)return tM();let qf=Ee.recordId;ae.trace?.(s,"sending invalidation",qf,g,"from",tt);let $f=0;vc&&($f|=zc),Ee.previousResidencyId&&($f|=jc);let $y,ME=null;for(let rM in Ts.indices){if(!ME){if($y=Ee.getValue(Ut,!0),!$y)break;ME={}}ME[rM]=$y[rM]}DE=Qc(Ee.version,cr,qf,null,tt,Ee.user,Ee.type==="put"||Ee.type==="patch"?"invalidate":Ee.type,Js.encode(ME),$f,vc,Ee.previousResidencyId,Ee.expiresAt)}function tM(){return ae.trace?.(s,"skipping audit record",Ee.recordId),G||(G=setTimeout(()=>{G=null,(We||0)+o$/2<fe&&(PS&&ae.trace?.(s,"sending skipped sequence update",fe),e.send((0,et.encode)([n$,fe])))},o$).unref()),new Promise(setImmediate)}o(tM,"skipAuditRecord");let Gy=Js.typedStructs,qy=Js.structures;if((Gy?.length!=vt.typed_length||qy?.length!=vt.structure_length)&&(vt.typed_length=Gy?.length,vt.structure_length=qy.length,ae.debug?.(s,"send table struct",vt.typed_length,vt.structure_length),vt.sentName||(vt.sentName=!0),e.send((0,et.encode)([kw,{typedStructs:Gy,structures:qy,attributes:Ts.attributes,schemaDefined:Ts.schemaDefined},cr,vt.table.tableName]))),vc&&!OE[vc]&&(e.send((0,et.encode)([t$,ky,vc])),OE[vc]=!0),j.txnTime!==Hy&&(j.txnTime&&(PS&&ae.trace?.(s,"new txn time, sending queued txn",j.txnTime),a[i]!==66&&ae.error?.("Invalid encoding of message"),ut()),j.txnTime=Hy,i=c,Mc(Hy)),DE)Eu(DE.length),Dc(DE);else{let Xs=Ee.encoded;Ee.extendedType&Vr&&gm(()=>Ee.getValue(Ut),$f=>ga($f,Ee.recordId),Ut.rootStore);let qf=Xs[0]===66?8:0;Eu(Xs.length-qf),Dc(Xs,qf),ae.trace?.("wrote record",Ee.recordId,"length:",Xs.length)}return e._socket.writableNeedDrain?new Promise(Xs=>{ae.debug?.(`Waiting for remote node ${g} to allow more commits ${e._socket.writableNeedDrain?"due to network backlog":"due to requested flow directive"}`),e._socket.once("drain",Xs)}):xe>Ff?new Promise(Xs=>{Rr=Xs}):new Promise(setImmediate)},"sendAuditRecord"),ut=o(()=>{c-i>8?(e.send(a.subarray(i,c)),ae.debug?.(s,"Sent message, size:",c-i),st(c-i,"bytes-sent",`${g}.${u}`,"replication","egress")):ae.debug?.(s,"skipping empty transaction")},"sendQueuedData");Lr=new Kw.EventEmitter,Lr.once("close",()=>{me=!0,B?.end()});for(let{startTime:Ee}of yr)Ee<fe&&(fe=Ee);(de||Promise.resolve()).then(async()=>{p=await p,f=p.auditStore,Te=p.tableById.map(ee),he=[];for(let{name:ft,startTime:tt,endTime:cr}of yr){let vt=gS(ft,f);ae.debug?.("subscription to",ft,"using local id",vt,"starting",tt),he[vt]={startTime:tt,endTime:cr}}Ta(u),Xt||(Xt=Nl(ft=>{ft.databaseName===u&&Ta(u)}),Uf=Ah(ft=>{ft===u&&(e.send((0,et.encode)([Ld])),Ss())}),e.on("close",()=>{Xt?.remove(),Uf?.remove()})),e.send((0,et.encode)([e$,Fh(p.auditStore),yr.map(({name:ft})=>ft)]));let Ee=!0;do{isFinite(fe)||(ae.warn?.("Invalid sequence id "+fe),Ss(1008,"Invalid sequence id"+fe));let ft;if(Ee&&!me&&(Ee=!1,fe===0)){ae.info?.("Replicating all tables to",g);let tt=fe,cr=BS(f);for(let vt in _){if(!ee(vt))continue;let Ts=_[vt];for(let Ut of Ts.primaryStore.getRange({snapshot:!1,versions:!0})){if(me)return;if(Ut.localTime>=fe){ae.trace?.(s,"Copying record from",u,vt,Ut.key,Ut.localTime),tt=Math.max(Ut.localTime,tt),Mt()[Wh]=1;let Js=Qc(Ut.version,Ts.tableId,Ut.key,null,cr,null,"put",gm(()=>Ts.primaryStore.encoder.encode(Ut.value),_u=>ga(_u,Ut.key)),Ut.metadataFlags&-256,Ut.residencyId,null,Ut.expiresAt);await Et({recordId:Ut.key,tableId:Ts.tableId,type:"put",getValue(){return Ut.value},encoded:Js,version:Ut.version,residencyId:Ut.residencyId,nodeId:cr,extendedType:Ut.metadataFlags},Ut.localTime)}}}c-i>8&&Et({type:"end_txn"},fe),Mt()[Wh]=0,fe=tt}for(let{key:tt,value:cr}of f.getRange({start:fe||1,exclusiveStart:!0,snapshot:!1})){if(me)return;let vt=bt(cr);ae.debug?.("sending audit record",new Date(tt)),Mt()[Wh]=tt,fe=tt,await Et(vt,tt),Lr.startTime=tt}c-i>8&&Et({type:"end_txn"},fe),Mt()[Wh]=0,await GU(f)}while(!me)}).catch(Ee=>{ae.error?.(s,"Error handling subscription to node",Ee),Ss(1008,"Error handling subscription to node")});break}}return}S.position=8;let A=!0,b,I;do{Mt();let P=S.readInt();if(P===9&&S.getUint8(S.position)==b_){S.position++,R=I=S.readFloat64(),m[DS]=R,m[MS]=Date.now(),m[vS]=Vw,ae.trace?.("received remote sequence update",R,u);break}let L=S.position,D=bt(E,L,L+P),H=Pc[D.tableId];H||ae.error?.(`No table found with an id of ${D.tableId}`);let C;D.residencyId&&(C=CE[D.residencyId],ae.trace?.(s,"received residency list",C,D.type,D.recordId));try{let x=D.recordId;m_(()=>{b={table:H.name,id:D.recordId,type:D.type,nodeId:kf.get(D.nodeId),residencyList:C,timestamp:D.version,value:D.getValue(H),user:D.user,beginTxn:A,expiresAt:D.expiresAt}},f?.rootStore,z=>Lc(z,x))}catch(x){throw x.message+="typed structures for current decoder"+JSON.stringify(H.decoder.typedStructs),x}A=!1,ae.trace?.(s,"received replication message",D.type,"id",b.id,"version",new Date(D.version),"nodeId",b.nodeId),m[DS]=D.version,m[MS]=Date.now(),m[vS]=g$,p.send(b),S.position=L+P}while(S.position<E.byteLength);Pe++,st(E.byteLength,"bytes-received",`${g}.${u}.${b?.table||"unknown_table"}`,"replication","ingest"),Pe>Fy&&!Hf&&(Hf=!0,e.pause(),ae.debug?.(`Commit backlog causing replication back-pressure, requesting that ${g} pause replication`)),p.send({type:"end_txn",localTime:R,remoteNodeIds:T,async onCommit(){if(b){let P=Date.now()-b.timestamp;st(P,"replication-latency",g+"."+u+"."+b.table,b.type,"ingest")}Pe--,Hf&&(Hf=!1,e.resume(),ae.debug?.(`Replication resuming ${g}`)),Ue.length>0&&await Promise.all(Ue),ae.trace?.("All blobs finished"),!N&&I&&(ae.trace?.(s,"queuing confirmation of a commit at",I),setTimeout(()=>{e.send((0,et.encode)([s$,N])),ae.trace?.(s,"sent confirmation of a commit at",N),N=null},Lce)),N=I,ae.debug?.("last sequence committed",new Date(I),u)}})}catch(S){ae.error?.(s,"Error handling incoming replication message",S)}}),e.on("ping",Jt),e.on("pong",()=>{if(t.connection){let E=performance.now()-Z;t.connection.latency=E,Mt()&&(m[US]=E),t.isSubscriptionConnection&&Ml({name:g,database:u,url:t.url,latency:E})}Z=null}),e.on("close",(E,S)=>{clearInterval(O),clearTimeout(F),clearInterval(Y),Lr&&Lr.emit("close"),_o&&_o.end();for(let[A,{reject:b}]of y)b(new Error(`Connection closed ${S?.toString()} ${E}`));ae.debug?.(s,"closed",E,S?.toString())});function Ss(E,S){try{e.isFinished=!0,ae.debug?.(s,"closing",g,u,E,S),e.close(E,S),t.connection?.emit("finished")}catch(A){ae.error?.(s,"Error closing connection",A)}}o(Ss,"close");let _a=new Set;async function ga(E,S){let A=d_(E);if(_a.has(A)){ae.debug?.("Blob already being sent",A);return}_a.add(A);try{let b;xe++;for await(let I of E.stream())b&&(ae.debug?.("Sending blob chunk",A,"length",b.length),e.send((0,et.encode)([OS,{fileId:A,size:E.size},b]))),b=I,e._socket.writableNeedDrain&&(ae.debug?.("draining",A),await new Promise(P=>e._socket.once("drain",P)),ae.debug?.("drained",A)),st(I.length,"bytes-sent",`${g}.${u}`,"replication","blob");ae.debug?.("Sending final blob chunk",A,"length",b.length),e.send((0,et.encode)([OS,{fileId:A,size:E.size,finished:!0},b]))}catch(b){ae.warn?.("Error sending blob",b,"blob id",A,"for record",S),e.send((0,et.encode)([OS,{fileId:A,finished:!0,error:(0,Dd.errorToString)(b)},Buffer.alloc(0)]))}finally{_a.delete(A),xe--,xe<Ff&&Rr?.()}}o(ga,"sendBlobs");function Lc(E,S){let A=d_(E),b=Ne.get(A);ae.debug?.("Received transaction with blob",A,"has stream",!!b,"ended",!!b?.writableEnded),b?b.writableEnded&&Ne.delete(A):(b=new qw.PassThrough,Ne.set(A,b)),b.connectedToBlob=!0,b.lastChunk=Date.now(),b.recordId=S,E.size===void 0&&b.expectedSize&&(E.size=b.expectedSize);let I=b.blob??createBlob(b,E);b.blob=I;let P=No(()=>_m(I).saving,p.auditStore?.rootStore);return P&&(P.blobId=A,Ue.push(P),P.finally(()=>{ae.debug?.(`Finished receiving blob stream ${A}`),Ue.splice(Ue.indexOf(P),1)})),I}o(Lc,"receiveBlobs");function Dr(){if(h||(h=!0,t.connection?.on("subscriptions-updated",Dr)),!f&&p&&(f=p.auditStore),t.connection?.isFinished)throw new Error("Can not make a subscription request on a connection that is already closed");let E=new Map;f||(f=p?.auditStore);try{for(let b of p?.dbisDB?.getRange({start:Symbol.for("seq"),end:[Symbol.for("seq"),Buffer.from([255])]})||[])for(let I of b.value.nodes||[])I.lastTxnTime>(E.get(I.id)??0)&&E.set(I.id,I.lastTxnTime)}catch(b){if(!b.message.includes("Can not re"))throw b}let S=t.connection?.nodeSubscriptions?.[0];T=[];let A=t.connection?.nodeSubscriptions.map((b,I)=>{let P=[],{replicateByDefault:L}=b;if(b.subscriptions){for(let x of b.subscriptions)if(x.subscribe&&(x.schema||x.database)===u){let z=x.table;_?.[z]?.replicate!==!1&&P.push(z)}L=!1}else for(let x in _)(L?_[x].replicate===!1:_[x].replicate)&&P.push(x);let D=f&&gS(b.name,f),H=p?.dbisDB?.get([Symbol.for("seq"),D])??1,C=Math.max(H?.seqId??1,(typeof b.startTime=="string"?new Date(b.startTime).getTime():b.startTime)??1);if(ae.debug?.("Starting time recorded in db",b.name,D,u,H?.seqId,"start time:",C,new Date(C)),S!==b){let x=f&&gS(S.name,f),z=p?.dbisDB?.get([Symbol.for("seq"),x])??1;for(let ne of z?.nodes||[])ne.name===b.name&&(C=ne.seqId,ae.debug?.("Using sequence id from proxy node",S.name,C))}if(D===void 0?ae.warn("Starting subscription request from node",b,"but no node id found"):T.push(D),E.get(D)>C&&(C=E.get(D),ae.debug?.("Updating start time from more recent txn recorded",S.name,C)),C===1&&CS)try{new URL(CS).hostname===b.name?(ae.warn?.(`Requesting full copy of database ${u} from ${CS}`),C=0):C=Date.now()-6e4}catch(x){ae.error?.("Error parsing leader URL",CS,x)}return ae.trace?.(s,"defining subscription request",b.name,u,new Date(C)),{name:b.name,replicateByDefault:L,tables:P,startTime:C,endTime:b.endTime}});if(A)if(ae.debug?.(s,"sending subscription request",A,p?.dbisDB?.path),clearTimeout(K),A.length>0)e.send((0,et.encode)([Xq,A]));else{let b=o(()=>{let I=performance.now();K=setTimeout(()=>{ce<=I?Ss(1008,"Connection has no subscriptions and is no longer used"):b()},q).unref()},"scheduleClose");b()}}o(Dr,"sendSubscriptionRequestUpdate");function hu(E,S){if(!E)return;let A=Bf[E];return A||(A=S.getResidencyRecord(E),Bf[E]=A),A}o(hu,"getResidence");function pu(E){return!(Za&&Za!="*"&&!Za[E]&&!Za.includes?.(E)&&!Za.some?.(S=>S.name===E))}o(pu,"checkDatabaseAccess");function Sa(E){if(p=p||d.get(E),!pu(E))throw new Error(`Access to database "${E}" is not permitted`);p||ae.warn?.(`No database named "${E}" was declared and registered`),f=p?.auditStore,_||(_=nt()?.[E]);let S=Ze();if(S===g)throw S?new Error("Should not connect to self",S):new Error("Node name not defined");return LE(S,E),!0}o(Sa,"setDatabase");function LE(E,S){let A=nt()?.[S],b=[];for(let I in A){let P=A[I];b.push({table:I,schemaDefined:P.schemaDefined,attributes:P.attributes.map(L=>({name:L.name,type:L.type,isPrimaryKey:L.isPrimaryKey}))})}ae.trace?.("Sending database info for node",E,"database name",S),e.send((0,et.encode)([Zq,E,S,b]))}o(LE,"sendNodeDBName");function Ta(E){let S=nt()?.[E],A=[];for(let b in S){if(yr&&!yr.some(P=>P.replicateByDefault?!P.tables.includes(b):P.tables.includes(b)))continue;let I=S[b];A.push({table:b,schemaDefined:I.schemaDefined,attributes:I.attributes.map(P=>({name:P.name,type:P.type,isPrimaryKey:P.isPrimaryKey}))})}e.send((0,et.encode)([i$,A,E]))}o(Ta,"sendDBSchema"),Y=setInterval(()=>{for(let[E,S]of Ne)S.lastChunk+pe<Date.now()&&(ae.warn?.(`Timeout waiting for blob stream to finish ${E} for record ${S.recordId??"unknown"} from ${g}`),Ne.delete(E),S.end())},pe).unref();let Ra=1,Gf=[];return{end(){_o&&_o.end(),Lr&&Lr.emit("close")},getRecord(E){let S=Ra++;return new Promise((A,b)=>{let I=[r$,S,E.table.tableId,E.id];Gf[E.table.tableId]||(I.push(E.table.tableName),Gf[E.table.tableId]=!0),e.send((0,et.encode)(I)),ce=performance.now(),y.set(S,{tableId:E.table.tableId,key:E.id,resolve(P){let{table:L,entry:D}=E;if(A(P),P)return L._recordRelocate(D,P)},reject:b})})},sendOperation(E){let S=Ra++;return E.requestId=S,e.send((0,et.encode)([$w,E])),new Promise((A,b)=>{y.set(S,{resolve:A,reject:b})})}};function Eu(E){ya(5),E<128?a[c++]=E:E<16384?(l.setUint16(c,E|32768),c+=2):E<1056964608?(l.setUint32(c,E|3221225472),c+=4):(a[c]=255,l.setUint32(c+1,E),c+=5)}function Dc(E,S=0,A=E.length){let b=A-S;ya(b),E.copy(a,c,S,A),c+=b}function Mc(E){ya(8),l.setFloat64(c,E),c+=8}function ya(E){if(E+16>a.length-c){let S=Buffer.allocUnsafeSlow(c+E-i+65536>>10<<11);a.copy(S,0,i,c),c=c-i,i=0,a=S,l=new DataView(a.buffer,0,a.length)}}function V(E,S){let A=E.database??"data";if(A!=="data"&&!ke[A]){ae.warn?.("Database not found",E.database);return}S||(S={});let b=S.schemaDefined,I=!1,P=E.schemaDefined,L=S.attributes||[];for(let D=0;D<E.attributes?.length;D++){let H=E.attributes[D],C=L.find(x=>x.name===H.name);(!C||C.type!==H.type)&&(b?ae.error?.(`Schema for '${u}.${E.table}' is defined locally, but attribute '${H.name}: ${H.type}' from '${g}' does not match local attribute ${C?"'"+C.name+": "+C.type+"'":"which does not exist"}`):(I=!0,P||(H.indexed=!0),C?L[L.indexOf(C)]=H:L.push(H)))}return I?(ae.debug?.("(Re)creating",E),je({table:E.table,database:E.database,schemaDefined:E.schemaDefined,attributes:L,...S})):S}}var l$,et,u$,d$,Dd,Kw,f$,m$,xl,h$,qw,p$,E$,ae,Xq,Zq,e$,Ld,t$,kw,r$,NS,$w,wS,n$,s$,i$,OS,_$,DS,MS,Wh,US,vS,Vw,g$,Pce,CS,Yw,ec,PS,o$,Lce,a$,Gw,LS,c$,Md,Ww=ue(()=>{De();Mi();bw();lb();ss();l$=w(oe());k();Jc();et=require("msgpackr"),u$=require("ws"),d$=require("worker_threads"),Dd=w(Q());Vh();Kw=require("events"),f$=w(os()),m$=w(require("node:tls"));Dl();xl=w(require("node:process")),h$=require("node:net");zi();Wn();qw=require("node:stream"),p$=require("lmdb"),E$=w(require("minimist")),ae=(0,Dd.forComponent)("replication").conditional,Xq=129,Zq=140,e$=141,Ld=142,t$=130,kw=132,r$=133,NS=134,$w=136,wS=137,n$=143,s$=144,i$=145,OS=146,_$=0,DS=1,MS=2,Wh=3,US=4,vS=5,Vw=0,g$=1,Pce=(0,E$.default)(xl.argv),CS=Pce.HDB_LEADER_URL??xl.env.HDB_LEADER_URL,Yw=new Map,ec=new Map,PS=!0,o$=300,Lce=2,a$=3e4;o(xS,"createWebSocket");c$=500,Md=class extends Kw.EventEmitter{static{o(this,"NodeReplicationConnection")}socket;startTime;retryTime=c$;retries=0;isConnected=!0;isFinished=!1;nodeSubscriptions;latency=0;replicateTablesByDefault;session;sessionResolve;sessionReject;url;subscription;databaseName;nodeName;authorization;constructor(t,r,n,s,i){super(),this.url=t,this.subscription=r,this.databaseName=n,this.authorization=i,this.nodeName=this.nodeName??pi(t)}async connect(){this.session||this.resetSession();let t=[];this.socket=await xS(this.url,{serverName:this.nodeName,authorization:this.authorization});let r;ae.debug?.(`Connecting to ${this.url}, db: ${this.databaseName}, process ${xl.pid}`),this.socket.on("open",()=>{this.socket._socket.unref(),ae[this.isConnected?"info":"warn"]?.(`Connected to ${this.url}, db: ${this.databaseName}`),this.retries=0,this.retryTime=c$,this.nodeSubscriptions&&Ml({name:this.nodeName,database:this.databaseName,url:this.url}),this.isConnected=!0,r=zh(this.socket,{database:this.databaseName,subscription:this.subscription,url:this.url,connection:this,isSubscriptionConnection:this.nodeSubscriptions!==void 0},{replicates:!0}),this.sessionResolve(r)}),this.socket.on("error",n=>{n.code==="SELF_SIGNED_CERT_IN_CHAIN"?(ae.warn?.(`Can not connect to ${this.url}, this server does not have a certificate authority for the certificate provided by ${this.url}`),n.isHandled=!0):n.code!=="ECONNREFUSED"&&(n.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"?ae.error?.(`Can not connect to ${this.url}, the certificate provided by ${this.url} is not trusted, this node needs to be added to the cluster, or a certificate authority needs to be added`):ae.error?.(`Error in connection to ${this.url} due to ${n.message}`)),this.sessionReject(n)}),this.socket.on("close",(n,s)=>{if(this.isConnected&&(this.nodeSubscriptions&&Od({name:this.nodeName,database:this.databaseName,url:this.url,finished:this.socket.isFinished}),this.isConnected=!1),this.removeAllListeners("subscriptions-updated"),this.socket.isFinished){this.isFinished=!0,r?.end(),this.emit("finished");return}if(++this.retries%20===1){let i=s?.toString();ae.warn?.(`${r?"Disconnected from":"Failed to connect to"} ${this.url} (db: "${this.databaseName}"), due to ${i?'"'+i+'" ':""}(code: ${n})`)}r=null,this.resetSession(),setTimeout(()=>{this.connect()},this.retryTime).unref(),this.retryTime+=this.retryTime>>8})}resetSession(){this.session=new Promise((t,r)=>{this.sessionResolve=t,this.sessionReject=r})}subscribe(t,r){this.nodeSubscriptions=t,this.replicateTablesByDefault=r,this.emit("subscriptions-updated",t)}unsubscribe(){this.socket.isFinished=!0,this.socket.close(1008,"No longer subscribed")}getRecord(t){return this.session.then(r=>r.getRecord(t))}};o(zh,"replicateOverWS")});var Go={};Oe(Go,{clearThisNodeName:()=>kce,disableReplication:()=>Uce,enabledDatabases:()=>Za,forEachReplicatedDatabase:()=>Wa,getThisNodeId:()=>BS,getThisNodeName:()=>Ze,getThisNodeUrl:()=>za,hostnameToUrl:()=>qS,lastTimeInAuditStore:()=>Hh,monitorNodeCAs:()=>O$,replicateOperation:()=>qce,replicationCertificateAuthorities:()=>qo,sendOperationToNode:()=>jh,servers:()=>Mce,setReplicator:()=>P$,start:()=>vce,startOnMainThread:()=>ww,subscribeToNode:()=>$h,unsubscribeFromNode:()=>RS,urlToNodeName:()=>pi});function vce(e){if(!e.port&&!e.securePort&&(e.port=Ms.default.get(U.OPERATIONSAPI_NETWORK_PORT),e.securePort=Ms.default.get(U.OPERATIONSAPI_NETWORK_SECUREPORT)),!Ze())throw new Error("Can not load replication without a url (see replication.url in the config)");let t=new Map;for(let s of Gh(e))t.set(pi(s.url),s);xce(e),e={mtls:!0,isOperationsServer:!0,maxPayload:10*1024*1024*1024,...e};let r=Le.ws(async(s,i,a,c)=>{if(Ot.debug("Incoming WS connection received "+i.url),i.headers.get("sec-websocket-protocol")!=="harperdb-replication-v1")return c(s,i,a);await a,s._socket.unref(),zh(s,e,i?.user),s.on("error",l=>{l.code!=="ECONNREFUSED"&&Ot.error("Error in connection to "+this.url,l.message)})},e);e.runFirst=!0,Le.http((s,i)=>{if(s.isWebSocket&&s.headers.get("Sec-WebSocket-Protocol")==="harperdb-replication-v1"){Ot.debug("Incoming replication WS connection received, authorized: "+s.authorized),!s.authorized&&s._nodeRequest.socket.authorizationError&&Ot.error(`Incoming client connection from ${s.ip} did not have valid certificate, you may need turn on enableRootCAs in the config if you are using a publicly signed certificate, or add the CA to the server's trusted CAs`,s._nodeRequest.socket.authorizationError);let a=Kt().primaryStore;if(s.authorized&&s.peerCertificate.subjectaltname){let c=(0,N$.getHostnamesFromCertificate)(s.peerCertificate),l;for(let u of c)if(l=u&&(a.get(u)||t.get(u)),l)break;if(l)if(l?.revoked_certificates?.includes(s.peerCertificate.serialNumber)){Ot.warn("Revoked certificate used in attempt to connect to node",l.name,"certificate serial number",s.peerCertificate.serialNumber);return}else s.user=l;else Ot.warn(`No node found for certificate common name/SANs: ${c}, available nodes are ${Array.from(a.getRange({}).filter(({value:u})=>u).map(({key:u})=>u)).join(", ")} and routes ${Array.from(t.keys()).join(", ")}, connection will require credentials.`)}else{let c=a.get(s.ip)||t.get(s.ip);c?s.user=c:Ot.warn(`No node found for IP address ${s.ip}, available nodes are ${Array.from(new Set([...a.getKeys(),...t.keys()])).join(", ")}, connection will require credentials.`)}}return i(s)},e);let n=[];for(let s of r)if(s.secureContexts){let i=o(()=>{let a=new Set(s.secureContexts.values());s.defaultContext&&a.add(s.defaultContext);for(let c of a)try{let l=Array.from(qo);c.options.availableCAs&&l.push(...c.options.availableCAs.values());let u={...c.options,ca:l};c.updatedContext=GS.createSecureContext(u)}catch(l){Ot.error("Error creating replication TLS config",l)}},"updateContexts");s.secureContextsListeners.push(i),n.push(i),Ms.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1&&i()}O$(()=>{for(let s of n)s()})}function O$(e){let t=0;Nd(r=>{r?.ca&&(qo.add(r.ca),qo.size!==t&&(t=qo.size,e?.()))})}function Uce(e=!0){w$=e}function xce(e){w$||(nt(),Za=e.databases,Wa(e,(t,r)=>{if(!t){let n=e.databaseSubscriptions||ec;for(let[s,i]of HS){let a=i.get(r);a&&(a.subscribe([],!1),i.delete(r))}n.delete(r);return}for(let n in t){let s=t[n];P$(r,s,e),Yw.get(s)?.forEach(i=>i(s))}}))}function P$(e,t,r){if(!t)return console.error(`Attempt to replicate non-existent table ${t.name} from database ${e}`);if(t.replicate===!1||t.sources?.some(s=>s.isReplicator))return;let n;t.sourcedFrom(class C$ extends xr{static{o(this,"Replicator")}static connection;static subscription;static async subscribe(){let i=r.databaseSubscriptions||ec,a=i.get(e),c=a?.tableById||[];c[t.tableId]=t;let l=a?.ready;if(Ot.trace("Setting up replicator subscription to database",e),!a?.auditStore)return this.subscription=a=new Yn,i.set(e,a),a.tableById=c,a.auditStore=t.auditStore,a.dbisDB=t.dbisDB,a.databaseName=e,l&&l(a),a;this.subscription=a}static subscribeOnThisThread(i,a){return!0}static async load(i){if(i){let a=i.residencyId,c=i.residency||t.dbisDB.get([Symbol.for("residency_by_id"),a]);if(c){let l,u=new Set;do{let d,f="",m=1/0;for(let p of c){if(u.has(p)||p===Le.hostname)continue;let _=Fce(p,C$.subscription,e);if(_?.isConnected){let g=Id(t.auditStore,e,p)[US];(!d||g<m)&&(d=_,f=p,m=g)}}if(!d)throw l||new b$.ServerError(`No connection to any other nodes are available: ${c}`,502);let h={requestId:Dce++,table:t,entry:i,id:i.key};u.add(f);try{return await d.getRecord(h)}catch(p){if(d.isConnected)throw p;Ot.warn("Error in load from node",kS,p),l||(l=p)}}while(!0)}}}static isReplicator=!0},{intermediateSource:!0})}function Bce(e,t,r,n,s){let i=HS.get(e);i||HS.set(e,i=new Map);let a=i.get(r);if(a)return a;if(t)return i.set(r,a=new Md(e,t,r,n,s)),a.connect(),a.once("finished",()=>i.delete(r)),a}function Fce(e,t,r){let n=T$.get(e);n||(n=new Map,T$.set(e,n));let s=n.get(r);if(s)return s;let i=Kt().primaryStore.get(e);return i?.url&&(s=new Md(i.url,t,r,e,i.authorization),n.set(r,s),s.connect(),s.once("finished",()=>n.delete(r))),s}async function jh(e,t,r){r||(r={}),r.serverName=e.name;let n=await xS(e.url,r),s=zh(n,{},{});return new Promise((i,a)=>{n.on("open",()=>{Ot.debug("Sending operation connection to "+e.url+" opened",t),i(s.sendOperation(t))}),n.on("error",c=>{a(c)}),n.on("close",c=>{Ot.info("Sending operation connection to "+e.url+" closed",c)})}).finally(()=>{n.close()})}function $h(e){try{I$.isMainThread&&Ot.trace("Subscribing on main thread (should not happen in multi-threaded instance)",e.nodes[0].url,e.database);let t=ec.get(e.database);if(!t){let n;t=new Promise(s=>{Ot.info("Waiting for subscription to database "+e.database),n=s}),t.ready=n,ec.set(e.database,t)}let r=Bce(e.nodes[0].url,t,e.database,e.nodes[0].name,e.nodes[0].authorization);e.nodes[0].name===void 0?r.tentativeNode=e.nodes[0]:r.nodeName=e.nodes[0].name,r.subscribe(e.nodes.filter(n=>kh(n,e.database)),e.replicateByDefault)}catch(t){Ot.error("Error in subscription to node",e.nodes[0]?.url,t)}}async function RS({name:e,url:t,database:r}){Ot.trace("Unsubscribing from node",e,t,r,"nodes",Array.from(Kt().primaryStore.getRange({})));let n=HS.get(t);if(n){let s=n.get(r);s&&(s.unsubscribe(),n.delete(r))}}function Hce(){if(zw!==void 0)return zw;let e=Ms.default.get(U.OPERATIONSAPI_TLS_CERTIFICATE)||Ms.default.get(U.TLS_CERTIFICATE);if(e)return zw=new y$.X509Certificate((0,A$.readFileSync)(e)).subject?.match(/CN=(.*)/)?.[1]??null}function Ze(){return kS||(kS=Ms.default.get("replication_hostname")??pi(Ms.default.get("replication_url"))??Hce()??R$("operationsapi_network_secureport")??R$("operationsapi_network_port")??"127.0.0.1")}function kce(){kS=void 0}function R$(e){let t=Ms.default.get(e),r=t?.lastIndexOf?.(":");if(r>0)return t.slice(0,r)}function FS(e){let t=Ms.default.get(e),r=t?.lastIndexOf?.(":");return r>0?+t.slice(r+1).replace(/[\[\]]/g,""):+t}function BS(e){return Fh(e)?.[Ze()]}function za(){let e=Ms.default.get("replication_url");return e||qS(Ze())}function qS(e){let t=FS("replication_port");if(t)return`ws://${e}:${t}`;if(t=FS("replication_secureport"),t)return`wss://${e}:${t}`;if(t=FS("operationsapi_network_port"),t)return`ws://${e}:${t}`;if(t=FS("operationsapi_network_secureport"),t)return`wss://${e}:${t}`}function pi(e){if(e)return new URL(e).hostname}function Wa(e,t){for(let n of Object.getOwnPropertyNames(ke))r(n);return Ah(n=>{r(n)}),Nl((n,s)=>{r(n.databaseName)});function r(n){let s=ke[n];Ot.trace("Checking replication status of ",n,e?.databases),e?.databases===void 0||e.databases==="*"||e.databases.includes(n)||e.databases.some?.(i=>i.name===n)||!s?t(s,n,!0):Gce(n)&&t(s,n,!1)}o(r,"forDatabase")}function Gce(e){let t=ke[e];for(let r in t)if(t[r].replicate)return!0}function Hh(e){for(let t of e.getKeys({limit:1,reverse:!0}))return t}async function qce(e){let t={message:""};if(e.replicated){e.replicated=!1,Ot.trace?.("Replicating operation",e.operation,"to nodes",Le.nodes.map(n=>n.name));let r=await Promise.allSettled(Le.nodes.map(n=>jh(n,e)));t.replicated=r.map((n,s)=>{let i=n.status==="rejected"?{status:"failed",reason:n.reason.toString()}:n.value;return i.node=Le.nodes[s]?.name,i})}return t}var Ms,Ot,y$,A$,GS,b$,I$,N$,w$,Dce,Mce,qo,Za,HS,T$,zw,kS,ss=ue(()=>{De();Ma();Au();Ww();Mr();Ms=w(oe()),Ot=w(Q()),y$=require("crypto"),A$=require("fs");Vh();Dl();k();bw();GS=w(require("node:tls")),b$=w(ge()),I$=require("worker_threads"),N$=w(os()),Dce=1,Mce=[],qo=Ms.default.get(U.REPLICATION_ENABLEROOTCAS)!==!1?new Set(GS.rootCertificates):new Set;o(vce,"start");o(O$,"monitorNodeCAs");o(Uce,"disableReplication");o(xce,"assignReplicationSource");o(P$,"setReplicator");HS=new Map;o(Bce,"getSubscriptionConnection");T$=new Map;o(Fce,"getRetrievalConnectionByName");o(jh,"sendOperationToNode");o($h,"subscribeToNode");o(RS,"unsubscribeFromNode");o(Hce,"getCommonNameFromCert");o(Ze,"getThisNodeName");o(kce,"clearThisNodeName");Object.defineProperty(Le,"hostname",{get(){return Ze()}});o(R$,"getHostFromListeningPort");o(FS,"getPortFromListeningPort");o(BS,"getThisNodeId");Le.replication={getThisNodeId:BS,exportIdMapping:Fh};o(za,"getThisNodeUrl");o(qS,"hostnameToUrl");o(pi,"urlToNodeName");o(Wa,"forEachReplicatedDatabase");o(Gce,"hasExplicitlyReplicatedTable");o(Hh,"lastTimeInAuditStore");o(qce,"replicateOperation")});var Jh=M((yve,U$)=>{"use strict";var vd=KG(),{validateBySchema:Qh}=ct(),{commonValidators:Ud,schemaRegex:jw}=Gi(),pr=require("joi"),$ce=Q(),Vce=require("uuid").v4,KS=Do(),xd=(k(),v(W)),Kce=require("util"),tc=Zn(),{handleHDBError:$o,hdbErrors:Yce,ClientError:Bl}=ge(),{HDB_ERROR_MSGS:$S,HTTP_STATUS_CODES:Vo}=Yce,{SchemaEventMsg:YS}=ai(),L$=mr(),{getDatabases:Wce}=(De(),v(mt)),{transformReq:Bd}=ie(),{replicateOperation:D$}=(ss(),v(Go)),{cleanupOrphans:zce}=(Wn(),v(h_)),VS=pr.string().min(1).max(Ud.schema_length.maximum).pattern(jw).messages({"string.pattern.base":"{:#label} "+Ud.schema_format.message}),jce=pr.string().min(1).max(Ud.schema_length.maximum).pattern(jw).messages({"string.pattern.base":"{:#label} "+Ud.schema_format.message}).required(),Qce=pr.string().min(1).max(Ud.schema_length.maximum).pattern(jw).messages({"string.pattern.base":"{:#label} "+Ud.schema_format.message,"any.required":"'primary_key' is required","string.base":"'primary_key' must be a string"}).required();U$.exports={createSchema:Jce,createSchemaStructure:M$,createTable:Xce,createTableStructure:v$,createAttribute:nle,dropSchema:Zce,dropTable:ele,dropAttribute:tle,getBackup:sle,cleanupOrphanBlobs:ile};async function Jce(e){let t=await M$(e);return KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema)),t}o(Jce,"createSchema");async function M$(e){let t=Qh(e,pr.object({database:VS,schema:VS}));if(t)throw new Bl(t.message);if(Bd(e),!await vd.checkSchemaExists(e.schema))throw $o(new Error,$S.SCHEMA_EXISTS_ERR(e.schema),Vo.BAD_REQUEST,xd.LOG_LEVELS.ERROR,$S.SCHEMA_EXISTS_ERR(e.schema),!0);return await tc.createSchema(e),`database '${e.schema}' successfully created`}o(M$,"createSchemaStructure");async function Xce(e){return Bd(e),e.hash_attribute=e.primary_key??e.hash_attribute,await v$(e)}o(Xce,"createTable");async function v$(e){let t=Qh(e,pr.object({database:VS,schema:VS,table:jce,residence:pr.array().items(pr.string().min(1)).optional(),hash_attribute:Qce}));if(t)throw new Bl(t.message);if(!await vd.checkSchemaTableExists(e.schema,e.table))throw $o(new Error,$S.TABLE_EXISTS_ERR(e.schema,e.table),Vo.BAD_REQUEST,xd.LOG_LEVELS.ERROR,$S.TABLE_EXISTS_ERR(e.schema,e.table),!0);let n={name:e.table,schema:e.schema,id:Vce(),hash_attribute:e.hash_attribute};try{if(e.residence)if(global.clustering_on)n.residence=e.residence,await tc.createTable(n,e);else throw $o(new Error,"Clustering does not appear to be enabled. Cannot insert table with property 'residence'.",Vo.BAD_REQUEST);else await tc.createTable(n,e);return`table '${e.schema}.${e.table}' successfully created.`}catch(s){throw s}}o(v$,"createTableStructure");async function Zce(e){let t=Qh(e,pr.object({database:pr.string(),schema:pr.string()}).or("database","schema").messages({"object.missing":"'database' is required"}));if(t)throw new Bl(t.message);Bd(e);let r=await vd.checkSchemaExists(e.schema);if(r)throw $o(new Error,r,Vo.NOT_FOUND,xd.LOG_LEVELS.ERROR,r,!0);let n=await vd.schemaDescribe.describeSchema({schema:e.schema}),s=Object.keys(global.hdb_schema[e.schema]);await tc.dropSchema(e),KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema)),await L$.purgeSchemaTableStreams(e.schema,s);let i=await D$(e);return i.message=`successfully deleted '${e.schema}'`,i}o(Zce,"dropSchema");async function ele(e){let t=Qh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required()}));if(t)throw new Bl(t.message);Bd(e);let r=await vd.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,xd.LOG_LEVELS.ERROR,r,!0);await tc.dropTable(e),await L$.purgeTableStream(e.schema,e.table);let n=await D$(e);return n.message=`successfully deleted table '${e.schema}.${e.table}'`,n}o(ele,"dropTable");async function tle(e){let t=Qh(e,pr.object({database:pr.string(),schema:pr.string(),table:pr.string().required(),attribute:pr.string().required()}));if(t)throw new Bl(t.message);Bd(e);let r=await vd.checkSchemaTableExists(e.schema,e.table);if(r)throw $o(new Error,r,Vo.NOT_FOUND,xd.LOG_LEVELS.ERROR,r,!0);if(e.attribute===global.hdb_schema[e.schema][e.table].hash_attribute)throw $o(new Error,"You cannot drop a hash attribute",Vo.BAD_REQUEST,void 0,void 0,!0);if(xd.TIME_STAMP_NAMES.indexOf(e.attribute)>=0)throw $o(new Error,`cannot drop internal timestamp attribute: ${e.attribute}`,Vo.BAD_REQUEST,void 0,void 0,!0);try{return await tc.dropAttribute(e),rle(e),KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema,e.table,e.attribute)),`successfully deleted attribute '${e.attribute}'`}catch(n){throw $ce.error(`Got an error deleting attribute ${Kce.inspect(e)}.`),n}}o(tle,"dropAttribute");function rle(e){let t=Object.values(global.hdb_schema[e.schema][e.table].attributes);for(let r=0;r<t.length;r++)t[r].attribute===e.attribute&&global.hdb_schema[e.schema][e.table].attributes.splice(r,1)}o(rle,"dropAttributeFromGlobal");async function nle(e){Bd(e);let t=Wce()[e.schema][e.table].attributes;for(let{name:r}of t)if(r===e.attribute)throw $o(new Error,`attribute '${e.attribute}' already exists in ${e.schema}.${e.table}`,Vo.BAD_REQUEST,void 0,void 0,!0);return await tc.createAttribute(e),KS.signalSchemaChange(new YS(process.pid,e.operation,e.schema,e.table,e.attribute)),`attribute '${e.schema}.${e.table}.${e.attribute}' successfully created.`}o(nle,"createAttribute");function sle(e){return tc.getBackup(e)}o(sle,"getBackup");function ile(e){if(!e.database)throw new Bl('Must provide "database" name for search for orphaned blobs');if(!databases[e.database])throw new Bl(`Unknown database '${e.database}'`);return zce(databases[e.database],e.database),{message:"Orphaned blobs cleanup started, check logs for progress"}}o(ile,"cleanupOrphanBlobs")});var B$=M((bve,x$)=>{"use strict";var{OPERATIONS_ENUM:ole}=(k(),v(W)),Qw=class{static{o(this,"ReadAuditLogObject")}constructor(t,r,n=void 0,s=void 0){this.operation=ole.READ_AUDIT_LOG,this.schema=t,this.table=r,this.search_type=n,this.search_values=s}};x$.exports=Qw});var Jw=M((wve,q$)=>{"use strict";var ale=Zn(),Nve=B$(),WS=ie(),zS=(k(),v(W)),cle=oe(),{handleHDBError:F$,hdbErrors:lle}=ge(),{HDB_ERROR_MSGS:H$,HTTP_STATUS_CODES:k$}=lle,ule=Object.values(zS.READ_AUDIT_LOG_SEARCH_TYPES_ENUM),G$="To use this operation audit log must be enabled in harperdb-config.yaml";q$.exports=dle;async function dle(e){if(WS.isEmpty(e.schema))throw new Error(H$.SCHEMA_REQUIRED_ERR);if(WS.isEmpty(e.table))throw new Error(H$.TABLE_REQUIRED_ERR);if(!cle.get(zS.CONFIG_PARAMS.LOGGING_AUDITLOG))throw F$(new Error,G$,k$.BAD_REQUEST,zS.LOG_LEVELS.ERROR,G$,!0);let t=WS.checkSchemaTableExist(e.schema,e.table);if(t)throw F$(new Error,t,k$.NOT_FOUND,zS.LOG_LEVELS.ERROR,t,!0);if(!WS.isEmpty(e.search_type)&&ule.indexOf(e.search_type)<0)throw new Error(`Invalid searchType '${read_audit_log_object.search_type}'`);return await ale.readAuditLog(e)}o(dle,"readAuditLog")});var V$=M((Cve,$$)=>{"use strict";var{OPERATIONS_ENUM:fle}=(k(),v(W)),Xw=class{static{o(this,"GetBackupObject")}constructor(t,r,n=void 0,s=void 0){this.operation=fle.GET_BACKUP,this.schema=t,this.table=r}};$$.exports=Xw});var W$=M((Mve,Y$)=>{"use strict";var mle=Zn(),Lve=V$(),Zw=ie(),hle=(k(),v(W)),Dve=oe(),{handleHDBError:ple,hdbErrors:Ele}=ge(),{HDB_ERROR_MSGS:K$,HTTP_STATUS_CODES:_le}=Ele;Y$.exports=gle;async function gle(e){if(Zw.isEmpty(e.schema))throw new Error(K$.SCHEMA_REQUIRED_ERR);if(Zw.isEmpty(e.table))throw new Error(K$.TABLE_REQUIRED_ERR);let t=Zw.checkSchemaTableExist(e.schema,e.table);if(t)throw ple(new Error,t,_le.NOT_FOUND,hle.LOG_LEVELS.ERROR,t,!0);return await mle.getBackup(readAuditLogObject)}o(gle,"getBackup")});var J$=M((Uve,Q$)=>{"use strict";var Sle=oe(),rc=require("joi"),Tle=ct(),z$=require("moment"),Rle=require("fs-extra"),eO=require("path"),yle=require("lodash"),Xh=(k(),v(W)),{LOG_LEVELS:Fl}=(k(),v(W)),Ale="YYYY-MM-DD hh:mm:ss",ble=eO.resolve(__dirname,"../logs");Q$.exports=function(e){return Tle.validateBySchema(e,Ile)};var Ile=rc.object({from:rc.custom(j$),until:rc.custom(j$),level:rc.valid(Fl.NOTIFY,Fl.FATAL,Fl.ERROR,Fl.WARN,Fl.INFO,Fl.DEBUG,Fl.TRACE),order:rc.valid("asc","desc"),limit:rc.number().min(1),start:rc.number().min(0),log_name:rc.custom(Nle)});function j$(e,t){if(z$(e,z$.ISO_8601).format(Ale)==="Invalid date")return t.message(`'${t.state.path[0]}' date '${e}' is invalid.`)}o(j$,"validateDatetime");function Nle(e,t){if(yle.invert(Xh.LOG_NAMES)[e]===void 0)return t.message(`'log_name' '${e}' is invalid.`);let n=Sle.get(Xh.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e===void 0?Xh.LOG_NAMES.HDB:e,i=s===Xh.LOG_NAMES.INSTALL?eO.join(ble,Xh.LOG_NAMES.INSTALL):eO.join(n,s);return Rle.existsSync(i)?null:t.message(`'log_name' '${e}' does not exist.`)}o(Nle,"validateReadLogPath")});var rO=M((Bve,Z$)=>{"use strict";var jS=(k(),v(W)),wle=Q(),Ole=oe(),Cle=J$(),tO=require("path"),X$=require("fs-extra"),{once:Ple}=require("events"),{handleHDBError:Lle,hdbErrors:Dle}=ge(),{PACKAGE_ROOT:Mle}=Rt(),{replicateOperation:vle}=(ss(),v(Go)),Ule=tO.join(Mle,"logs"),xle=1e3,Ble=200;Z$.exports=Fle;async function Fle(e){let t=Cle(e);if(t)throw Lle(t,t.message,Dle.HTTP_STATUS_CODES.BAD_REQUEST,void 0,void 0,!0);let r=vle(e),n=Ole.get(jS.HDB_SETTINGS_NAMES.LOG_PATH_KEY),s=e.log_name===void 0?jS.LOG_NAMES.HDB:e.log_name,i=s===jS.LOG_NAMES.INSTALL?tO.join(Ule,jS.LOG_NAMES.INSTALL):tO.join(n,s),a=e.level!==void 0,c=a?e.level:void 0,l=e.from!==void 0,u=l?new Date(e.from):void 0,d=e.until!==void 0,f=d?new Date(e.until):void 0,m=e.limit===void 0?xle:e.limit,h=e.order===void 0?void 0:e.order,p=e.start===void 0?0:e.start,_=p+m,g=0;h==="desc"&&!u&&!f&&(g=Math.max(X$.statSync(i).size-(_+5)*Ble,0));let y=X$.createReadStream(i,{start:g});y.on("error",G=>{wle.error(G)});let T=0,R=[],N="",O;y.on("data",G=>{let Y=/(?:^|\n)(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:[\d\.]+Z) \[(.+?)]: /g;G=N+G;let q=0,K;for(;(K=Y.exec(G))&&!y.destroyed;){O&&(O.message=G.slice(q,K.index),F(O));let[ce,le,se]=K,pe=se.split("] ["),Ne=pe[0],Ue=pe[1];pe.splice(0,2),O={timestamp:le,thread:Ne,level:Ue,tags:pe,message:""},q=K.index+ce.length}N=G.slice(q)}),y.on("end",G=>{y.destroyed||O&&(O.message=N.trim(),F(O))}),y.resume();function F(G){let Y,q,K;switch(!0){case(a&&l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),G.level===c&&Y>=q&&Y<=K&&T<p?T++:G.level===c&&Y>=q&&Y<=K&&(to(G,h,R),T++,T===_&&y.destroy());break;case(a&&l):Y=new Date(G.timestamp),q=new Date(u),G.level===c&&Y>=q&&T<p?T++:G.level===c&&Y>=q&&(to(G,h,R),T++,T===_&&y.destroy());break;case(a&&d):Y=new Date(G.timestamp),K=new Date(f),G.level===c&&Y<=K&&T<p?T++:G.level===c&&Y<=K&&(to(G,h,R),T++,T===_&&y.destroy());break;case(l&&d):Y=new Date(G.timestamp),q=new Date(u),K=new Date(f),Y>=q&&Y<=K&&T<p?T++:Y>=q&&Y<=K&&(to(G,h,R),T++,T===_&&y.destroy());break;case a:G.level===c&&T<p?T++:G.level===c&&(to(G,h,R),T++,T===_&&y.destroy());break;case l:Y=new Date(G.timestamp),q=new Date(u),Y>=q&&T<p?T++:Y>=q&&T>=p&&(to(G,h,R),T++,T===_&&y.destroy());break;case d:Y=new Date(G.timestamp),K=new Date(f),Y<=K&&T<p?T++:Y<=K&&T>=p&&(to(G,h,R),T++,T===_&&y.destroy());break;default:T<p?T++:(to(G,h,R),T++,T===_&&y.destroy())}}o(F,"onLogMessage"),await Ple(y,"close");let Z=await r;if(Z.replicated){for(let G of R)G.node=server.hostname;for(let G of Z.replicated){let Y=G.node;if(G.status==="failed")to({timestamp:new Date().toISOString(),level:"error",node:Y,message:`Error retrieving logs: ${G.reason}`},h,R);else for(let q of G.results)q.node=Y,to(q,h,R)}}return R}o(Fle,"readLog");function to(e,t,r){t==="desc"?Hle(e,r):t==="asc"?kle(e,r):r.push(e)}o(to,"pushLineToResult");function Hle(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)>r?n=i+1:s=i}t.splice(n,0,e)}o(Hle,"insertDescending");function kle(e,t){let r=new Date(e.timestamp),n=0,s=t.length;for(;n<s;){let i=n+s>>>1;new Date(t[i].timestamp)<r?n=i+1:s=i}t.splice(n,0,e)}o(kle,"insertAscending")});var QS=M(($ve,nV)=>{"use strict";var nO=require("joi"),{string:Fd,boolean:eV,date:Gle}=nO.types(),qle=ct(),{validateSchemaExists:Hve,validateTableExists:kve,validateSchemaName:Gve}=Gi(),$le=(k(),v(W)),Vle=Nt(),tV=oe();tV.initSync();var qve=Fd.invalid(tV.get($le.CONFIG_PARAMS.CLUSTERING_NODENAME)??"node_name").pattern(Vle.NATS_TERM_CONSTRAINTS_RX).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >","any.invalid":"'node_name' cannot be this nodes name"}).empty(null),rV={operation:Fd.valid("add_node","update_node","set_node_replication"),node_name:Fd.optional(),subscriptions:nO.array().items({table:Fd.optional(),schema:Fd.optional(),database:Fd.optional(),subscribe:eV.required(),publish:eV.required().custom(Yle),start_time:Gle.iso()})};function Kle(e){return qle.validateBySchema(e,nO.object(rV))}o(Kle,"addUpdateNodeValidator");function Yle(e,t){if(t.state.ancestors[2].operation==="add_node"&&e===!1&&t.state.ancestors[0].subscribe===!1)return t.message(`'subscriptions[${t.state.path[1]}]' subscribe and/or publish must be set to true when adding a node`)}o(Yle,"checkForFalsy");nV.exports={addUpdateNodeValidator:Kle,validationSchema:rV}});var Hd=M((Kve,sV)=>{"use strict";var sO=class{static{o(this,"Node")}constructor(t,r,n){this.name=t,this.subscriptions=r,this.system_info=n}},iO=class{static{o(this,"NodeSubscription")}constructor(t,r,n,s){this.schema=t,this.table=r,this.publish=n,this.subscribe=s}};sV.exports={Node:sO,NodeSubscription:iO}});var oV=M((Wve,iV)=>{"use strict";var Wle=(k(),v(W)).OPERATIONS_ENUM,oO=class{static{o(this,"UpsertObject")}constructor(t,r,n,s=void 0){this.operation=Wle.UPSERT,this.schema=t,this.table=r,this.records=n,this.__origin=s}};iV.exports=oO});var Zh=M((jve,aV)=>{"use strict";var aO=class{static{o(this,"RemotePayloadObject")}constructor(t,r,n,s){this.operation=t,this.node_name=r,this.subscriptions=n,this.system_info=s}},cO=class{static{o(this,"RemotePayloadSubscription")}constructor(t,r,n,s,i,a,c){this.schema=t,this.table=r,this.hash_attribute=n,this.publish=s,this.subscribe=i,this.start_time=a,c!==void 0&&(this.attributes=c)}};aV.exports={RemotePayloadObject:aO,RemotePayloadSubscription:cO}});var lV=M((Jve,cV)=>{"use strict";var lO=class{static{o(this,"TableSizeObject")}constructor(t,r,n=0,s=0,i=0,a=0){this.schema=t,this.table=r,this.table_size=n,this.record_count=s,this.transaction_log_size=i,this.transaction_log_record_count=a}};cV.exports=lO});var dV=M((nUe,uV)=>{"use strict";var zle=lV(),Zve=qt(),eUe=gt(),jle=Q(),{getSchemaPath:tUe,getTransactionAuditStorePath:rUe}=At(),{getDatabases:Qle}=(De(),v(mt));uV.exports=Jle;async function Jle(e){let t=new zle;try{let r=Qle()[e.schema]?.[e.name],n=r.primaryStore.getStats(),s=r.auditStore?.getStats();t.schema=e.schema,t.table=e.name,t.record_count=n.entryCount,t.transaction_log_record_count=s.entryCount}catch(r){jle.warn(`unable to stat table dbi due to ${r}`)}return t}o(Jle,"lmdbGetTableSize")});var mV=M((iUe,fV)=>{"use strict";var uO=class{static{o(this,"SystemInformationObject")}constructor(t,r,n,s,i,a,c){this.system=t,this.time=r,this.cpu=n,this.memory=s,this.disk=i,this.network=a,this.harperdb_processes=c}};fV.exports=uO});var Gd=M((dUe,_V)=>{"use strict";var Xle=require("fs-extra"),Zle=require("path"),mn=require("systeminformation"),nc=Q(),hV=mr(),aUe=Nt(),kd=(k(),v(W)),eue=dV(),tue=Fa(),{getThreadInfo:pV}=rt(),ep=oe();ep.initSync();var rue=mV(),{openEnvironment:cUe}=gt(),{getSchemaPath:lUe}=At(),{database:uUe,databases:dO}=(De(),v(mt)),JS;_V.exports={getHDBProcessInfo:pO,getNetworkInfo:_O,getDiskInfo:EO,getMemoryInfo:hO,getCPUInfo:mO,getTimeInfo:fO,getSystemInformation:gO,systemInformation:nue,getTableSize:SO,getMetrics:TO};function fO(){return mn.time()}o(fO,"getTimeInfo");async function mO(){try{let{family:e,model:t,stepping:r,revision:n,voltage:s,speedmin:i,speedmax:a,governor:c,socket:l,cache:u,...d}=await mn.cpu();d.cpu_speed=await mn.cpuCurrentSpeed();let{rawCurrentload:f,rawCurrentloadIdle:m,rawCurrentloadIrq:h,rawCurrentloadNice:p,rawCurrentloadSystem:_,rawCurrentloadUser:g,cpus:y,...T}=await mn.currentLoad();return T.cpus=[],y.forEach(R=>{let{rawLoad:N,rawLoadIdle:O,rawLoadIrq:F,rawLoadNice:Z,rawLoadSystem:G,rawLoadUser:Y,...q}=R;T.cpus.push(q)}),d.current_load=T,d}catch(e){return nc.error(`error in getCPUInfo: ${e}`),{}}}o(mO,"getCPUInfo");async function hO(){try{let{buffers:e,cached:t,slab:r,buffcache:n,...s}=await mn.mem();return Object.assign(s,process.memoryUsage())}catch(e){return nc.error(`error in getMemoryInfo: ${e}`),{}}}o(hO,"getMemoryInfo");async function pO(){let e={core:[],clustering:[]};try{let t=await mn.processes(),r;try{r=Number.parseInt(await Xle.readFile(Zle.join(ep.get(kd.CONFIG_PARAMS.ROOTPATH),kd.HDB_PID_FILE),"utf8"))}catch(n){if(n.code===kd.NODE_ERROR_CODES.ENOENT)nc.warn("Unable to locate 'hdb.pid' file, try stopping and starting HarperDB. This could be because HarperDB is not running.");else throw n}t.list.forEach(n=>{n.pid===r?e.core.push(n):n.name==="nats-server"&&e.clustering.push(n)});for(let n of e.core)for(let s of t.list)s.pid===n.parentPid&&(s.name==="PM2"||s.command==="PM2")&&(n.parent="PM2");return e}catch(t){return nc.error(`error in getHDBProcessInfo: ${t}`),e}}o(pO,"getHDBProcessInfo");async function EO(){let e={};try{if(!ep.get(kd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_DISK))return e;let{rIO_sec:t,wIO_sec:r,tIO_sec:n,ms:s,...i}=await mn.disksIO();e.io=i;let{rxSec:a,txSec:c,wxSec:l,...u}=await mn.fsStats();return e.read_write=u,e.size=await mn.fsSize(),e}catch(t){return nc.error(`error in getDiskInfo: ${t}`),e}}o(EO,"getDiskInfo");async function _O(){let e={default_interface:null,latency:{},interfaces:[],stats:[],connections:[]};try{return ep.get(kd.CONFIG_PARAMS.OPERATIONSAPI_SYSINFO_NETWORK)&&(e.default_interface=await mn.networkInterfaceDefault(),e.latency=await mn.inetChecksite("google.com"),(await mn.networkInterfaces()).forEach(n=>{let{internal:s,virtual:i,mtu:a,dhcp:c,dnsSuffix:l,ieee8021xAuth:u,ieee8021xState:d,carrierChanges:f,...m}=n;e.interfaces.push(m)}),(await mn.networkStats()).forEach(n=>{let{rxSec:s,txSec:i,ms:a,...c}=n;e.stats.push(c)})),e}catch(t){return nc.error(`error in getNetworkInfo: ${t}`),e}}o(_O,"getNetworkInfo");async function gO(){if(JS!==void 0)return JS;let e={};try{let{codepage:t,logofile:r,serial:n,build:s,servicepack:i,uefi:a,...c}=await mn.osInfo();e=c;let l=await mn.versions("node, npm");return e.node_version=l.node,e.npm_version=l.npm,JS=e,JS}catch(t){return nc.error(`error in getSystemInformation: ${t}`),e}}o(gO,"getSystemInformation");async function SO(){let e=[],t=await tue.describeAll();for(let r of Object.values(t))for(let n of Object.values(r))e.push(await eue(n));return e}o(SO,"getTableSize");async function TO(){let e={};for(let t in dO){let r=e[t]={},n=r.tables={};for(let s in dO[t])try{let i=dO[t][s];if(!r.readers&&(Object.assign(r,i.primaryStore.rootStore.getStats()),delete r.root,r.readers=i.primaryStore.rootStore.readerList().split(/\n\s+/).slice(1).map(l=>{let[u,d,f]=l.trim().split(" ");return{pid:u,thread:d,txnid:f}}),i.auditStore)){let{treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}=i.auditStore.getStats();r.audit={treeDepth:l,treeBranchPageCount:u,treeLeafPageCount:d,entryCount:f,overflowPages:m}}let a=i.primaryStore.getStats(),c={};for(let l of["treeDepth","treeBranchPageCount","treeLeafPageCount","entryCount","overflowPages"])c[l]=a[l];n[s]=c}catch(i){nc.notify(`Error getting stats for table ${s}: ${i}`)}}return e}o(TO,"getMetrics");async function EV(){if(ep.get(kd.CONFIG_PARAMS.CLUSTERING_ENABLED)){let{jsm:e}=await hV.getNATSReferences(),t=await hV.listStreams(),r=[];for(let n of t){let s=[],i=await e.consumers.list(n.config.name);for await(let c of i)s.push({name:c.name,created:c.created,num_ack_pending:c.num_ack_pending,num_redelivered:c.num_redelivered,num_waiting:c.num_waiting,num_pending:c.num_pending});let a={stream_name:n.config.name,database:n.config.subjects[0].split(".")[1],table:n.config.subjects[0].split(".")[2],state:n.state,consumers:s};r.push(a)}return r}}o(EV,"getNatsStreamInfo");async function nue(e){let t=new rue;if(!Array.isArray(e.attributes)||e.attributes.length===0)return t.system=await gO(),t.time=fO(),t.cpu=await mO(),t.memory=await hO(),t.disk=await EO(),t.network=await _O(),t.harperdb_processes=await pO(),t.table_size=await SO(),t.metrics=await TO(),t.threads=await pV(),t.replication=await EV(),t;for(let r=0;r<e.attributes.length;r++)switch(e.attributes[r]){case"system":t.system=await gO();break;case"time":t.time=fO();break;case"cpu":t.cpu=await mO();break;case"memory":t.memory=await hO();break;case"disk":t.disk=await EO();break;case"network":t.network=await _O();break;case"harperdb_processes":t.harperdb_processes=await pO();break;case"table_size":t.table_size=await SO();break;case"database_metrics":case"metrics":t.metrics=await TO();break;case"threads":t.threads=await pV();break;case"replication":t.replication=await EV();break;default:break}return t}o(nue,"systemInformation")});var ro=M((EUe,RV)=>{"use strict";var sue=vn(),RO=ie(),iue=require("util"),Hl=(k(),v(W)),gV=oe();gV.initSync();var oue=nw(),SV=cn(),{Node:mUe,NodeSubscription:hUe}=Hd(),aue=Wu(),cue=oV(),{RemotePayloadObject:lue,RemotePayloadSubscription:uue}=Zh(),{handleHDBError:due,hdbErrors:fue}=ge(),{HTTP_STATUS_CODES:mue,HDB_ERROR_MSGS:hue}=fue,pue=ci(),Eue=Gd(),{packageJson:_ue}=Rt(),{getDatabases:gue}=(De(),v(mt)),pUe=iue.promisify(oue.authorize),Sue=SV.searchByHash,Tue=SV.searchByValue;RV.exports={isEmpty:Rue,getNodeRecord:yue,upsertNodeRecord:Aue,buildNodePayloads:bue,checkClusteringEnabled:Iue,getAllNodeRecords:Nue,getSystemInfo:wue,reverseSubscription:TV};function Rue(e){return e==null}o(Rue,"isEmpty");async function yue(e){let t=new aue(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e],["*"]);return Sue(t)}o(yue,"getNodeRecord");async function Aue(e){let t=new cue(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[e]);return sue.upsert(t)}o(Aue,"upsertNodeRecord");function TV(e){if(RO.isEmpty(e.subscribe)||RO.isEmpty(e.publish))throw new Error("Received invalid subscription object");let{schema:t,table:r,hash_attribute:n}=e,s={schema:t,table:r,hash_attribute:n};return e.subscribe===!0&&e.publish===!1?(s.subscribe=!1,s.publish=!0):e.subscribe===!1&&e.publish===!0?(s.subscribe=!0,s.publish=!1):(s.subscribe=e.subscribe,s.publish=e.publish),s}o(TV,"reverseSubscription");function bue(e,t,r,n){let s=[];for(let i=0,a=e.length;i<a;i++){let c=e[i],{schema:l,table:u}=c,d=RO.getTableHashAttribute(l,u),{subscribe:f,publish:m}=TV(c),h=gue()[l]?.[u],p=new uue(l,u,d,m,f,c.start_time,h.schemaDefined?h.attributes:void 0);s.push(p)}return new lue(r,t,s,n)}o(bue,"buildNodePayloads");function Iue(){if(!gV.get(Hl.CONFIG_PARAMS.CLUSTERING_ENABLED))throw due(new Error,hue.CLUSTERING_NOT_ENABLED,mue.BAD_REQUEST,void 0,void 0,!0)}o(Iue,"checkClusteringEnabled");async function Nue(){let e=new pue(Hl.SYSTEM_SCHEMA_NAME,Hl.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,"name","*",void 0,["*"]);return Array.from(await Tue(e))}o(Nue,"getAllNodeRecords");async function wue(){let e=await Eue.getSystemInformation();return{hdb_version:_ue.version,node_version:e.node_version,platform:e.platform}}o(wue,"getSystemInfo")});var yO=M((gUe,CV)=>{"use strict";var XS=mr(),yV=ie(),AV=Nt(),bV=(k(),v(W)),ZS=Q(),IV=Jh(),Oue=Ym(),{RemotePayloadObject:Cue}=Zh(),{handleHDBError:NV,hdbErrors:Pue}=ge(),{HTTP_STATUS_CODES:wV}=Pue,{NodeSubscription:OV}=Hd();CV.exports=Lue;async function Lue(e,t){let r;try{r=await XS.request(`${t}.${AV.REQUEST_SUFFIX}`,new Cue(bV.OPERATIONS_ENUM.DESCRIBE_ALL,t,void 0,void 0)),ZS.trace("Response from remote describe all request:",r)}catch(a){ZS.error(`addNode received error from describe all request to remote node: ${a}`);let c=XS.requestErrorHandler(a,"add_node",t);throw NV(new Error,c,wV.INTERNAL_SERVER_ERROR,"error",c)}if(r.status===AV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let a=`Error returned from remote node ${t}: ${r.message}`;throw NV(new Error,a,wV.INTERNAL_SERVER_ERROR,"error",a)}let n=r.message,s=[],i=[];for(let a of e){let{table:c}=a,l=a.database??a.schema??"data";if(l===bV.SYSTEM_SCHEMA_NAME){await XS.createLocalTableStream(l,c);let p=new OV(l,c,a.publish,a.subscribe);p.start_time=a.start_time,i.push(p);continue}let u=yV.doesSchemaExist(l),d=n[l]!==void 0,f=c?yV.doesTableExist(l,c):!0,m=c?n?.[l]?.[c]!==void 0:!0;if(!u&&!d||!f&&!m){s.push(a);continue}if(!u&&d&&(ZS.trace(`addNode creating schema: ${l}`),await IV.createSchema({operation:"create_schema",schema:l})),!f&&m){ZS.trace(`addNode creating table: ${c} in schema: ${l} with attributes ${JSON.stringify(n[l][c].attributes)}`);let p=new Oue(l,c,n[l][c].hash_attribute);n[l][c].attributes&&(p.attributes=n[l][c].attributes),await IV.createTable(p)}await XS.createLocalTableStream(l,c);let h=new OV(l,c,a.publish,a.subscribe);h.start_time=a.start_time,i.push(h)}return{added:i,skipped:s}}o(Lue,"reviewSubscriptions")});var qd={};Oe(qd,{addNodeBack:()=>AO,removeNodeBack:()=>bO,setNode:()=>Uue});async function Uue(e){e.node_name&&!e.hostname&&(e.hostname=e.node_name),e.verify_tls!==void 0&&(e.rejectUnauthorized=e.verify_tls);let{url:t,hostname:r}=e;t?r||(r=e.hostname=pi(t)):t=qS(r);let n=(0,LV.validateBySchema)(e,vue);if(n)throw(0,Ko.handleHDBError)(n,n.message,Mue.BAD_REQUEST,void 0,void 0,!0);if(e.operation==="remove_node"){if(!t&&!r)throw new Ko.ClientError("url or hostname is required for remove_node operation");let h=r,p=Kt(),_=await p.get(h);if(!_)throw new Ko.ClientError(h+" does not exist");try{await jh({url:_.url},{operation:$.REMOVE_NODE_BACK,name:_?.subscriptions?.length>0?Ze():h},void 0)}catch(g){as.warn(`Error removing node from target node ${h}, if it is offline and we be online in the future, you may need to clean up this node manually, or retry:`,g)}return await p.delete(h),`Successfully removed '${h}' from cluster`}if(!t)throw new Ko.ClientError("url required for this operation");let s=za();if(s==null)throw new Ko.ClientError("replication url is missing from harperdb-config.yaml");let i,a,c;if(t?.startsWith("wss:")){i=await(0,vs.getReplicationCert)();let h=await(0,vs.getReplicationCertAuth)();if(!i)throw new Error("Unable to find a certificate to use for replication");i.options.is_self_signed?(a=await(0,vs.createCsr)(),as.info("Sending CSR to target node:",t)):h&&(c=h.certificate,as.info("Sending CA named",h.name,"to target node",t))}let l={operation:$.ADD_NODE_BACK,hostname:(0,ic.get)(U.REPLICATION_HOSTNAME),target_hostname:r,url:s,csr:a,cert_auth:c,authorization:e.retain_authorization?e.authorization:null};if((0,ic.get)(U.REPLICATION_SHARD)!==void 0&&(l.shard=(0,ic.get)(U.REPLICATION_SHARD)),e.subscriptions?l.subscriptions=e.subscriptions.map(PV):l.subscriptions=null,e.hasOwnProperty("subscribe")||e.hasOwnProperty("publish")){let h=PV(e);l.subscribe=h.subscribe,l.publish=h.publish}e?.authorization?.username&&e?.authorization?.password&&(e.authorization="Basic "+Buffer.from(e.authorization.username+":"+e.authorization.password).toString("base64"));let u,d;try{u=await jh({url:t},l,e)}catch(h){h.message=`Error returned from ${t}: `+h.message,as.warn("Error adding node:",t,"to cluster:",h),d=h}if(a&&(!u?.certificate||!u?.certificate?.includes?.("BEGIN CERTIFICATE")))throw d?(d.message+=" and connection was required to sign certificate",d):new Error(`Unexpected certificate signature response from node ${t} response: ${JSON.stringify(u)}`);a&&(as.info("CSR response received from node:",t,"saving certificate and CA in hdb_certificate"),await(0,vs.setCertTable)({name:Due.certificateFromPem(u.signingCA).issuer.getField("CN").value,certificate:u.signingCA,is_authority:!0}),u.certificate&&await(0,vs.setCertTable)({name:Ze(),uses:["https","operations","wss"],certificate:u.certificate,private_key_name:i?.options?.key_file,is_authority:!1,is_self_signed:!1}),c=u.signingCA);let f={url:t,ca:u?.usingCA};if(e.hostname&&(f.name=e.hostname),e.subscriptions?f.subscriptions=e.subscriptions:f.replicates=!0,e.start_time&&(f.start_time=typeof e.start_time=="string"?new Date(e.start_time).getTime():e.start_time),e.retain_authorization&&(f.authorization=e.authorization),e.revoked_certificates&&(f.revoked_certificates=e.revoked_certificates),u?.shard!==void 0?f.shard=u.shard:e.shard!==void 0&&(f.shard=e.shard),f.replicates){let h={url:s,ca:c,replicates:!0,subscriptions:null};(0,ic.get)(U.REPLICATION_SHARD)!==void 0&&(h.shard=(0,ic.get)(U.REPLICATION_SHARD)),e.retain_authorization&&(h.authorization=e.authorization),e.start_time&&(h.start_time=e.start_time),await Ho(Ze(),h)}await Ho(u?u.nodeName:f.name??pi(t),f);let m;return e.operation==="update_node"?m=`Successfully updated '${t}'`:m=`Successfully added '${t}' to cluster`,d&&(m+=" but there was an error updating target node: "+d.message),m}async function AO(e){as.trace("addNodeBack received request:",e);let t=await(0,vs.signCertificate)(e),r;e.csr?(r=t.signingCA,as.info("addNodeBack received CSR from node:",e.url,"this node will use and respond with CA that was used to issue CSR")):(r=e?.cert_auth,as.info("addNodeBack received CA from node:",e.url));let n={url:e.url,ca:r};e.subscriptions?n.subscriptions=e.subscriptions:(n.replicates=!0,n.subscriptions=null),e.start_time&&(n.start_time=e.start_time),e.authorization&&(n.authorization=e.authorization),e.shard!==void 0&&(n.shard=e.shard);let s=await(0,vs.getReplicationCertAuth)();if(n.replicates){let i={url:za(),ca:s?.certificate,replicates:!0,subscriptions:null};(0,ic.get)(U.REPLICATION_SHARD)!==void 0&&(i.shard=(0,ic.get)(U.REPLICATION_SHARD),t.shard=i.shard),e.start_time&&(i.start_time=e.start_time),e.authorization&&(i.authorization=e.authorization),await Ho(Ze(),i)}return await Ho(e.hostname,n),t.nodeName=Ze(),t.usingCA=s?.certificate,as.info("addNodeBack responding to:",e.url,"with CA named:",s?.name),t}async function bO(e){as.trace("removeNodeBack received request:",e),await Kt().delete(e.name)}function PV(e){let{subscribe:t,publish:r}=e;return{...e,subscribe:r,publish:t}}var vs,LV,sc,ic,as,Ko,Due,Mue,vue,$d=ue(()=>{vs=w(os()),LV=w(ct()),sc=w(require("joi")),ic=w(oe());k();Vh();Dl();ss();as=w(Q()),Ko=w(ge()),{pki:Due}=require("node-forge"),{HTTP_STATUS_CODES:Mue}=Ko.hdbErrors,vue=sc.default.object({hostname:sc.default.string(),verify_tls:sc.default.boolean(),replicates:sc.default.boolean(),subscriptions:sc.default.array(),revoked_certificates:sc.default.array(),shard:sc.default.number()});o(Uue,"setNode");o(AO,"addNodeBack");o(bO,"removeNodeBack");o(PV,"reverseSubscription")});var np=M((wUe,MV)=>{"use strict";var{handleHDBError:eT,hdbErrors:xue}=ge(),{HTTP_STATUS_CODES:tT}=xue,{addUpdateNodeValidator:Bue}=QS(),rT=Q(),nT=(k(),v(W)),DV=Nt(),Fue=ie(),tp=mr(),rp=ro(),IO=oe(),Hue=yO(),{Node:kue,NodeSubscription:Gue}=Hd(),{broadcast:que}=rt(),{setNode:$ue}=($d(),v(qd)),IUe=oe(),NUe=(k(),v(W)),Vue="Unable to create subscriptions due to schema and/or tables not existing on the local or remote node",Kue="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",Yue=IO.get(nT.CONFIG_PARAMS.CLUSTERING_NODENAME);MV.exports=Wue;async function Wue(e,t=!1){if(rT.trace("addNode called with:",e),IO.get(nT.CONFIG_PARAMS.REPLICATION_URL)||IO.get(nT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return $ue(e);rp.checkClusteringEnabled();let r=Bue(e);if(r)throw eT(r,r.message,tT.BAD_REQUEST,void 0,void 0,!0);let n=e.node_name;if(!t){let f=await rp.getNodeRecord(n);if(!Fue.isEmptyOrZeroLength(f))throw eT(new Error,`Node '${n}' has already been added, perform update_node to proceed.`,tT.BAD_REQUEST,void 0,void 0,!0)}let{added:s,skipped:i}=await Hue(e.subscriptions,n),a={message:void 0,added:s,skipped:i};if(s.length===0)return a.message=Vue,a;let c=rp.buildNodePayloads(s,Yue,nT.OPERATIONS_ENUM.ADD_NODE,await rp.getSystemInfo()),l=[];for(let f=0,m=s.length;f<m;f++){let h=s[f];s[f].start_time===void 0&&delete s[f].start_time,l.push(new Gue(h.schema,h.table,h.publish,h.subscribe))}rT.trace("addNode sending remote payload:",c);let u;try{u=await tp.request(`${n}.${DV.REQUEST_SUFFIX}`,c)}catch(f){rT.error(`addNode received error from request: ${f}`);for(let h=0,p=s.length;h<p;h++){let _=s[h];_.publish=!1,_.subscribe=!1,await tp.updateRemoteConsumer(_,n)}let m=tp.requestErrorHandler(f,"add_node",n);throw eT(new Error,m,tT.INTERNAL_SERVER_ERROR,"error",m)}if(u.status===DV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let f=`Error returned from remote node ${n}: ${u.message}`;throw eT(new Error,f,tT.INTERNAL_SERVER_ERROR,"error",f)}rT.trace(u);for(let f=0,m=s.length;f<m;f++){let h=s[f];await tp.updateRemoteConsumer(h,n),h.subscribe===!0&&await tp.updateConsumerIterator(h.schema,h.table,n,"start")}let d=new kue(n,l,u.system_info);return await rp.upsertNodeRecord(d),que({type:"nats_update"}),i.length>0?a.message=Kue:a.message=`Successfully added '${n}' to manifest`,a}o(Wue,"addNode")});var CO=M((PUe,UV)=>{"use strict";var{handleHDBError:NO,hdbErrors:zue}=ge(),{HTTP_STATUS_CODES:wO}=zue,{addUpdateNodeValidator:jue}=QS(),sp=Q(),sT=(k(),v(W)),vV=Nt(),CUe=ie(),ip=mr(),op=ro(),OO=oe(),{cloneDeep:Que}=require("lodash"),Jue=yO(),{Node:Xue,NodeSubscription:Zue}=Hd(),{broadcast:ede}=rt(),{setNode:tde}=($d(),v(qd)),rde="Unable to update subscriptions due to schema and/or tables not existing on the local or remote node",nde="Some subscriptions were unsuccessful due to schema and/or tables not existing on the local or remote node",sde=OO.get(sT.CONFIG_PARAMS.CLUSTERING_NODENAME);UV.exports=ide;async function ide(e){if(sp.trace("updateNode called with:",e),OO.get(sT.CONFIG_PARAMS.REPLICATION_URL)??OO.get(sT.CONFIG_PARAMS.REPLICATION_HOSTNAME))return tde(e);op.checkClusteringEnabled();let t=jue(e);if(t)throw NO(t,t.message,wO.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n,s=await op.getNodeRecord(r);s.length>0&&(n=Que(s));let{added:i,skipped:a}=await Jue(e.subscriptions,r),c={message:void 0,updated:i,skipped:a};if(i.length===0)return c.message=rde,c;let l=op.buildNodePayloads(i,sde,sT.OPERATIONS_ENUM.UPDATE_NODE,await op.getSystemInfo());for(let d=0,f=i.length;d<f;d++){let m=i[d];sp.trace(`updateNode updating work stream for node: ${r} subscription:`,m),i[d].start_time===void 0&&delete i[d].start_time}sp.trace("updateNode sending remote payload:",l);let u;try{u=await ip.request(`${r}.${vV.REQUEST_SUFFIX}`,l)}catch(d){sp.error(`updateNode received error from request: ${d}`);let f=ip.requestErrorHandler(d,"update_node",r);throw NO(new Error,f,wO.INTERNAL_SERVER_ERROR,"error",f)}if(u.status===vV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR){let d=`Error returned from remote node ${r}: ${u.message}`;throw NO(new Error,d,wO.INTERNAL_SERVER_ERROR,"error",d)}sp.trace(u);for(let d=0,f=i.length;d<f;d++){let m=i[d];await ip.updateRemoteConsumer(m,r),m.subscribe===!0?await ip.updateConsumerIterator(m.schema,m.table,r,"start"):await ip.updateConsumerIterator(m.schema,m.table,r,"stop")}return n||(n=[new Xue(r,[],u.system_info)]),await ode(n[0],i,u.system_info),a.length>0?c.message=nde:c.message=`Successfully updated '${r}'`,c}o(ide,"updateNode");async function ode(e,t,r){let n=e;for(let s=0,i=t.length;s<i;s++){let a=t[s],c=!1;for(let l=0,u=e.subscriptions.length;l<u;l++){let d=n.subscriptions[l];if(d.schema===a.schema&&d.table===a.table){d.publish=a.publish,d.subscribe=a.subscribe,c=!0;break}}c||n.subscriptions.push(new Zue(a.schema,a.table,a.publish,a.subscribe))}n.system_info=r,await op.upsertNodeRecord(n),ede({type:"nats_update"})}o(ode,"updateNodeTable")});var kV=M((DUe,HV)=>{"use strict";var FV=require("joi"),{string:xV}=FV.types(),ade=ct(),BV=(k(),v(W)),cde=oe(),lde=Nt();HV.exports=ude;function ude(e){let t=xV.invalid(cde.get(BV.CONFIG_PARAMS.CLUSTERING_NODENAME)).pattern(lde.NATS_TERM_CONSTRAINTS_RX).messages({"string.pattern.base":"{:#label} invalid, must not contain ., * or >","any.invalid":"'node_name' cannot be this nodes name"}).empty(null),r=FV.object({operation:xV.valid(BV.OPERATIONS_ENUM.REMOVE_NODE).required(),node_name:t});return ade.validateBySchema(e,r)}o(ude,"removeNodeValidator")});var cp=M((vUe,KV)=>{"use strict";var{handleHDBError:GV,hdbErrors:dde}=ge(),{HTTP_STATUS_CODES:qV}=dde,fde=kV(),ap=Q(),$V=ro(),mde=ie(),Vd=(k(),v(W)),VV=Nt(),PO=mr(),LO=oe(),{RemotePayloadObject:hde}=Zh(),{NodeSubscription:pde}=Hd(),Ede=Km(),_de=Sl(),{broadcast:gde}=rt(),{setNode:Sde}=($d(),v(qd)),Tde=LO.get(Vd.CONFIG_PARAMS.CLUSTERING_NODENAME);KV.exports=Rde;async function Rde(e){if(ap.trace("removeNode called with:",e),LO.get(Vd.CONFIG_PARAMS.REPLICATION_URL)??LO.get(Vd.CONFIG_PARAMS.REPLICATION_HOSTNAME))return Sde(e);$V.checkClusteringEnabled();let t=fde(e);if(t)throw GV(t,t.message,qV.BAD_REQUEST,void 0,void 0,!0);let r=e.node_name,n=await $V.getNodeRecord(r);if(mde.isEmptyOrZeroLength(n))throw GV(new Error,`Node '${r}' was not found.`,qV.BAD_REQUEST,void 0,void 0,!0);n=n[0];let s=new hde(Vd.OPERATIONS_ENUM.REMOVE_NODE,Tde,[]),i,a=!1;for(let l=0,u=n.subscriptions.length;l<u;l++){let d=n.subscriptions[l];d.subscribe===!0&&await PO.updateConsumerIterator(d.schema,d.table,r,"stop");try{await PO.updateRemoteConsumer(new pde(d.schema,d.table,!1,!1),r)}catch(f){ap.error(f)}}try{i=await PO.request(`${r}.${VV.REQUEST_SUFFIX}`,s),ap.trace("Remove node reply from remote node:",r,i)}catch(l){ap.error("removeNode received error from request:",l),a=!0}let c=new Ede(Vd.SYSTEM_SCHEMA_NAME,Vd.SYSTEM_TABLE_NAMES.NODE_TABLE_NAME,[r]);return await _de.deleteRecord(c),gde({type:"nats_update"}),i?.status===VV.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR||a?(ap.error("Error returned from remote node:",r,i?.message),`Successfully removed '${r}' from local manifest, however there was an error reaching remote node. Check the logs for more details.`):`Successfully removed '${r}' from manifest`}o(Rde,"removeNode")});var zV=M((xUe,WV)=>{"use strict";var YV=require("joi"),{string:yde,array:Ade}=YV.types(),bde=ct(),Ide=QS();WV.exports=Nde;function Nde(e){let t=YV.object({operation:yde.valid("configure_cluster").required(),connections:Ade.items(Ide.validationSchema).required()});return bde.validateBySchema(e,t)}o(Nde,"configureClusterValidator")});var DO=M((FUe,ZV)=>{"use strict";var jV=(k(),v(W)),iT=Q(),wde=ie(),Ode=oe(),Cde=cp(),Pde=np(),Lde=ro(),Dde=zV(),{handleHDBError:QV,hdbErrors:Mde}=ge(),{HTTP_STATUS_CODES:JV}=Mde,vde="Configure cluster complete.",Ude="Failed to configure the cluster. Check the logs for more details.",xde="Configure cluster was partially successful. Errors occurred when attempting to configure the following nodes. Check the logs for more details.";ZV.exports=Bde;async function Bde(e){iT.trace("configure cluster called with:",e);let t=Dde(e);if(t)throw QV(t,t.message,JV.BAD_REQUEST,void 0,void 0,!0);let r=await Lde.getAllNodeRecords(),n=[];if(Ode.get(jV.CONFIG_PARAMS.CLUSTERING_ENABLED)){for(let d=0,f=r.length;d<f;d++){let m=await XV(Cde,{operation:jV.OPERATIONS_ENUM.REMOVE_NODE,node_name:r[d].name},r[d].name);n.push(m)}iT.trace("All results from configure_cluster remove node:",n)}let s=[],i=e.connections.length;for(let d=0;d<i;d++){let f=e.connections[d],m=await XV(Pde,f,f.node_name);s.push(m)}iT.trace("All results from configure_cluster add node:",s);let a=[],c=[],l=!1,u=n.concat(s);for(let d=0,f=u.length;d<f;d++){let m=u[d];m.status==="rejected"&&(iT.error(m.node_name,m?.error?.message,m?.error?.stack),a.includes(m.node_name)||a.push(m.node_name)),(m?.result?.message?.includes?.("Successfully")||m?.result?.includes?.("Successfully"))&&(l=!0),!(typeof m.result=="string"&&m.result.includes("Successfully removed")||m.status==="rejected")&&c.push({node_name:m?.node_name,response:m?.result})}if(wde.isEmptyOrZeroLength(a))return{message:vde,connections:c};if(l)return{message:xde,failed_nodes:a,connections:c};throw QV(new Error,Ude,JV.INTERNAL_SERVER_ERROR,void 0,void 0,!0)}o(Bde,"configureCluster");async function XV(e,t,r){try{return{node_name:r,result:await e(t)}}catch(n){return{node_name:r,error:n,status:"rejected"}}}o(XV,"functionWrapper")});var n1=M((kUe,r1)=>{"use strict";var lp=require("joi"),Fde=ct(),{validateSchemaExists:e1,validateTableExists:Hde,validateSchemaName:t1}=Gi(),kde=lp.object({operation:lp.string().valid("purge_stream"),schema:lp.string().custom(e1).custom(t1).optional(),database:lp.string().custom(e1).custom(t1).optional(),table:lp.string().custom(Hde).required()});function Gde(e){return Fde.validateBySchema(e,kde)}o(Gde,"purgeStreamValidator");r1.exports=Gde});var MO=M((qUe,s1)=>{"use strict";var{handleHDBError:qde,hdbErrors:$de}=ge(),{HTTP_STATUS_CODES:Vde}=$de,Kde=n1(),Yde=mr(),Wde=ro();s1.exports=zde;async function zde(e){e.schema=e.schema??e.database;let t=Kde(e);if(t)throw qde(t,t.message,Vde.BAD_REQUEST,void 0,void 0,!0);Wde.checkClusteringEnabled();let{schema:r,table:n,options:s}=e;return await Yde.purgeTableStream(r,n,s),`Successfully purged table '${r}.${n}'`}o(zde,"purgeStream")});var cT=M((VUe,d1)=>{"use strict";var UO=ro(),jde=mr(),aT=oe(),Kd=(k(),v(W)),kl=Nt(),Qde=ie(),vO=Q(),{RemotePayloadObject:Jde}=Zh(),{ErrorCode:i1}=require("nats"),{parentPort:o1}=require("worker_threads"),{onMessageByType:Xde}=rt(),{getThisNodeName:Zde}=(ss(),v(Go)),{requestClusterStatus:efe}=(Vh(),v(Pq)),{getReplicationSharedStatus:tfe,getHDBNodeTable:rfe}=(Dl(),v(Iw)),{CONFIRMATION_STATUS_POSITION:nfe,RECEIVED_VERSION_POSITION:sfe,RECEIVED_TIME_POSITION:ife,SENDING_TIME_POSITION:ofe,RECEIVING_STATUS_POSITION:afe,RECEIVING_STATUS_RECEIVING:cfe}=(Ww(),v(S$)),a1=aT.get(Kd.CONFIG_PARAMS.CLUSTERING_ENABLED),c1=aT.get(Kd.CONFIG_PARAMS.CLUSTERING_NODENAME);d1.exports={clusterStatus:lfe,buildNodeStatus:u1};var l1;Xde("cluster-status",async e=>{l1(e)});async function lfe(){if(aT.get(Kd.CONFIG_PARAMS.REPLICATION_URL)||aT.get(Kd.CONFIG_PARAMS.REPLICATION_HOSTNAME)){let n;if(o1){o1.postMessage({type:"request-cluster-status"}),n=await new Promise(i=>{l1=i});for(let i of n.connections){let a=i.name;for(let c of i.database_sockets){let l=c.database,u;for(let f of Object.values(databases[l]||{}))if(u=f.auditStore,u)break;if(!u)continue;let d=tfe(u,l,a);c.lastCommitConfirmed=oT(d[nfe]),c.lastReceivedRemoteTime=oT(d[sfe]),c.lastReceivedLocalTime=oT(d[ife]),c.sendingMessage=oT(d[ofe]),c.lastReceivedStatus=d[afe]===cfe?"Receiving":"Waiting"}}}else n=efe();n.node_name=Zde();let s=rfe().primaryStore.get(n.node_name);return s?.shard&&(n.shard=s.shard),s?.url&&(n.url=s.url),n.is_enabled=!0,n}let e={node_name:c1,is_enabled:a1,connections:[]};if(!a1)return e;let t=await UO.getAllNodeRecords();if(Qde.isEmptyOrZeroLength(t))return e;let r=[];for(let n=0,s=t.length;n<s;n++)r.push(u1(t[n],e.connections));return await Promise.allSettled(r),e}o(lfe,"clusterStatus");function oT(e){return e?e===1?"Copying":new Date(e).toUTCString():void 0}o(oT,"asDate");async function u1(e,t){let r=e.name,n=new Jde(Kd.OPERATIONS_ENUM.CLUSTER_STATUS,c1,void 0,await UO.getSystemInfo()),s,i,a=kl.CLUSTER_STATUS_STATUSES.OPEN;try{let l=Date.now();s=await jde.request(kl.REQUEST_SUBJECT(r),n),i=Date.now()-l,s.status===kl.UPDATE_REMOTE_RESPONSE_STATUSES.ERROR&&(a=kl.CLUSTER_STATUS_STATUSES.CLOSED,vO.error(`Error getting node status from ${r} `,s))}catch(l){vO.warn(`Error getting node status from ${r}`,l),l.code===i1.NoResponders?a=kl.CLUSTER_STATUS_STATUSES.NO_RESPONDERS:l.code===i1.Timeout?a=kl.CLUSTER_STATUS_STATUSES.TIMEOUT:a=kl.CLUSTER_STATUS_STATUSES.CLOSED}let c=new ufe(r,a,s?.message?.ports?.clustering,s?.message?.ports?.operations_api,i,s?.message?.uptime,e.subscriptions,s?.message?.system_info);try{let l={name:r,system_info:s?.message?.system_info};e.system_info?.hdb_version!==Kd.PRE_4_0_0_VERSION&&await UO.upsertNodeRecord(l)}catch(l){vO.error("Cluster status encountered an error updating system info for node:",r,l)}t.push(c)}o(u1,"buildNodeStatus");function ufe(e,t,r,n,s,i,a,c){this.node_name=e,this.status=t,this.ports={clustering:r,operations_api:n},this.latency_ms=s,this.uptime=i,this.subscriptions=a,this.system_info=c}o(ufe,"NodeStatusObject")});var BO=M((YUe,f1)=>{"use strict";var{handleHDBError:dfe,hdbErrors:ffe}=ge(),{HTTP_STATUS_CODES:mfe}=ffe,hfe=mr(),pfe=ro(),xO=ie(),lT=require("joi"),Efe=ct(),_fe=2e3,gfe=lT.object({timeout:lT.number().min(1),connected_nodes:lT.boolean(),routes:lT.boolean()});f1.exports=Sfe;async function Sfe(e){pfe.checkClusteringEnabled();let t=Efe.validateBySchema(e,gfe);if(t)throw dfe(t,t.message,mfe.BAD_REQUEST,void 0,void 0,!0);let{timeout:r,connected_nodes:n,routes:s}=e,i=n===void 0||xO.autoCastBoolean(n),a=s===void 0||xO.autoCastBoolean(s),c={nodes:[]},l=await hfe.getServerList(r??_fe),u={};if(i)for(let d=0,f=l.length;d<f;d++){let m=l[d].statsz;m&&(u[l[d].server.name]=m.routes)}for(let d=0,f=l.length;d<f;d++){if(l[d].statsz)continue;let m=l[d].server,h=l[d].data;if(m.name.endsWith("-hub")){let p={name:m.name.slice(0,-4),response_time:l[d].response_time};i&&(p.connected_nodes=[],u[m.name]&&u[m.name].forEach(_=>{p.connected_nodes.includes(_.name.slice(0,-4))||p.connected_nodes.push(_.name.slice(0,-4))})),a&&(p.routes=h.cluster?.urls?h.cluster?.urls.map(_=>({host:_.split(":")[0],port:xO.autoCast(_.split(":")[1])})):[]),c.nodes.push(p)}}return c}o(Sfe,"clusterNetwork")});var E1=M((zUe,p1)=>{"use strict";var FO=require("joi"),m1=ct(),{routeConstraints:h1}=nA();p1.exports={setRoutesValidator:Tfe,deleteRoutesValidator:Rfe};function Tfe(e){let t=FO.object({server:FO.valid("hub","leaf"),routes:h1.required()});return m1.validateBySchema(e,t)}o(Tfe,"setRoutesValidator");function Rfe(e){let t=FO.object({routes:h1.required()});return m1.validateBySchema(e,t)}o(Rfe,"deleteRoutesValidator")});var uT=M((QUe,A1)=>{"use strict";var Yo=yt(),HO=ie(),Us=(k(),v(W)),Yd=oe(),_1=E1(),{handleHDBError:g1,hdbErrors:yfe}=ge(),{HTTP_STATUS_CODES:S1}=yfe,T1="cluster routes successfully set",R1="cluster routes successfully deleted";A1.exports={setRoutes:bfe,getRoutes:Ife,deleteRoutes:Nfe};function Afe(e){let t=Yo.getClusteringRoutes(),r=e.server==="hub"?t.hub_routes:t.leaf_routes,n=e.server==="hub"?t.leaf_routes:t.hub_routes,s=[],i=[];for(let a=0,c=e.routes.length;a<c;a++){let l=e.routes[a];l.port=HO.autoCast(l.port);let u=r.some(f=>f.host===l.host&&f.port===l.port),d=n.some(f=>f.host===l.host&&f.port===l.port);u||d?s.push(l):(r.push(l),i.push(l))}return e.server==="hub"?Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r):Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,r),{message:T1,set:i,skipped:s}}o(Afe,"setRoutesNats");function bfe(e){let t=_1.setRoutesValidator(e);if(t)throw g1(t,t.message,S1.BAD_REQUEST,void 0,void 0,!0);if(Yd.get(Us.CONFIG_PARAMS.CLUSTERING_ENABLED))return Afe(e);let r=[],n=[],s=Yd.get(Us.CONFIG_PARAMS.REPLICATION_ROUTES)??[];return e.routes.forEach(i=>{y1(s,i)?n.push(i):(s.push(i),r.push(i))}),Yo.updateConfigValue(Us.CONFIG_PARAMS.REPLICATION_ROUTES,s),{message:T1,set:r,skipped:n}}o(bfe,"setRoutes");function y1(e,t){return typeof t=="string"?e.includes(t):typeof t=="object"&&t!==null?e.some(r=>(r.host===t.host||r.hostname===t.hostname)&&r.port===t.port):!1}o(y1,"existsInArray");function Ife(){if(Yd.get(Us.CONFIG_PARAMS.CLUSTERING_ENABLED)){let e=Yo.getClusteringRoutes();return{hub:e.hub_routes,leaf:e.leaf_routes}}else return Yd.get(Us.CONFIG_PARAMS.REPLICATION_ROUTES)??[]}o(Ife,"getRoutes");function Nfe(e){let t=_1.deleteRoutesValidator(e);if(t)throw g1(t,t.message,S1.BAD_REQUEST,void 0,void 0,!0);if(Yd.get(Us.CONFIG_PARAMS.CLUSTERING_ENABLED))return wfe(e);let r=[],n=[],s=Yd.get(Us.CONFIG_PARAMS.REPLICATION_ROUTES)??[],i=[];return s.forEach(a=>{y1(e.routes,a)?r.push(a):(i.push(a),n.push(a))}),Yo.updateConfigValue(Us.CONFIG_PARAMS.REPLICATION_ROUTES,i),{message:R1,deleted:r,skipped:n}}o(Nfe,"deleteRoutes");function wfe(e){let t=Yo.getClusteringRoutes(),r=t.hub_routes,n=t.leaf_routes,s=[],i=[],a=!1,c=!1;for(let l=0,u=e.routes.length;l<u;l++){let d=e.routes[l],f=!1;for(let m=0,h=r.length;m<h;m++){let p=r[m];if(d.host===p.host&&d.port===p.port){r.splice(m,1),f=!0,a=!0,s.push(d);break}}if(!f){let m=!0;for(let h=0,p=n.length;h<p;h++){let _=n[h];if(d.host===_.host&&d.port===_.port){n.splice(h,1),c=!0,m=!1,s.push(d);break}}m&&i.push(d)}}return a&&(r=HO.isEmptyOrZeroLength(r)?null:r,Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_ROUTES,r)),c&&(n=HO.isEmptyOrZeroLength(n)?null:n,Yo.updateConfigValue(Us.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_ROUTES,n)),{message:R1,deleted:s,skipped:i}}o(wfe,"deleteRoutesNats")});var I1=M((XUe,b1)=>{"use strict";var up=require("alasql"),Gl=require("recursive-iterator"),gi=Q(),Ofe=ie(),dp=(k(),v(W)),kO=class{static{o(this,"sqlStatementBucket")}constructor(t){this.ast=t,this.affected_attributes=new Map,this.table_lookup=new Map,this.schema_lookup=new Map,this.table_to_schema_lookup=new Map,Pfe(this.ast,this.affected_attributes,this.table_lookup,this.schema_lookup,this.table_to_schema_lookup)}getAttributesBySchemaTableName(t,r){if(!t||!r||!this.affected_attributes)return[];if(this.affected_attributes.has(t))return!this.affected_attributes.get(t).has(r)&&(r=this.table_lookup.get(r),!r)?[]:this.affected_attributes.get(t).get(r)}getAllTables(){let t=[];if(!this.affected_attributes)return t;for(let r of this.affected_attributes.keys())t.push(Array.from(this.affected_attributes.get(r).keys()));return t}getTablesBySchemaName(t){return!t||!this.affected_attributes?[]:Array.from(this.affected_attributes.get(t).keys())}getSchemas(){return this.affected_attributes?Array.from(this.affected_attributes.keys()):[]}getAst(){return this.ast}updateAttributeWildcardsForRolePerms(t){let r=this.ast.columns.filter(s=>dp.SEARCH_WILDCARDS.includes(s.columnid));if(r.length===0)return this.ast;let n=this.ast.from[0].databaseid;return this.ast.columns=this.ast.columns.filter(s=>!dp.SEARCH_WILDCARDS.includes(s.columnid)),r.forEach(s=>{let i=this.table_to_schema_lookup.has(s.tableid)?this.table_to_schema_lookup.get(s.tableid):n,a=this.table_lookup.has(s.tableid)?this.table_lookup.get(s.tableid):this.ast.from[0].tableid;if(t[i]&&t[i].tables[a]&&t[i].tables[a][dp.PERMS_CRUD_ENUM.READ]){let c;t[i].tables[a].attribute_permissions.length>0?c=Cfe(t[i].tables[a].attribute_permissions):c=global.hdb_schema[i][a].attributes.map(u=>({attribute_name:u.attribute}));let l=this.affected_attributes.get(i).get(a).filter(u=>!dp.SEARCH_WILDCARDS.includes(u));c.forEach(({attribute_name:u})=>{let d=new up.yy.Column({columnid:u});s.tableid&&(d.tableid=s.tableid),this.ast.columns.push(d),l.includes(u)||l.push(u)}),this.affected_attributes.get(i).set(a,l)}}),this.ast}};function Cfe(e){return e.filter(t=>t[dp.PERMS_CRUD_ENUM.READ])}o(Cfe,"filterReadRestrictedAttrs");function Pfe(e,t,r,n,s){Lfe(e,t,r,n,s)}o(Pfe,"interpretAST");function fp(e,t,r,n,s){if(!(!e||!e.databaseid)&&(t.has(e.databaseid)||t.set(e.databaseid,new Map),t.get(e.databaseid).has(e.tableid)||t.get(e.databaseid).set(e.tableid,[]),e.as&&(r.has(e.as)||r.set(e.as,e.tableid),n&&!n.has(e.as)&&n.set(e.as,e.databaseid)),s)){let i=e.databaseid,a=e.tableid;e.as&&(a=e.as),s.set(a,i)}}o(fp,"addSchemaTableToMap");function Lfe(e,t,r,n,s){if(!e){gi.info("getRecordAttributesAST: invalid SQL syntax tree");return}e instanceof up.yy.Insert?Ufe(e,t,r):e instanceof up.yy.Select?Dfe(e,t,r,n,s):e instanceof up.yy.Update?Mfe(e,t,r):e instanceof up.yy.Delete?vfe(e,t,r):gi.error("AST in getRecordAttributesAST() is not a valid SQL type.")}o(Lfe,"getRecordAttributesAST");function Dfe(e,t,r,n,s){if(!e){gi.info("getSelectAttributes: invalid SQL syntax tree");return}if(!e.from||e.from[0]===void 0)return;let i=e.from[0].databaseid;if(Ofe.isEmptyOrZeroLength(i)){gi.error("No schema specified");return}e.from.forEach(c=>{fp(c,t,r,n,s)}),e.joins&&e.joins.forEach(c=>{c.as&&(c.table.as=c.as),fp(c.table,t,r,n,s)});let a=new Gl(e.columns);for(let{node:c}of a)if(c&&c.columnid){let l=c.tableid,u=n.has(l)?n.get(l):i;if(l||(l=e.from[0].tableid),!t.get(u).has(l))if(r.has(l))l=r.get(l);else{gi.info(`table specified as ${l} not found.`);return}t.get(u).get(l).indexOf(c.columnid)<0&&t.get(u).get(l).push(c.columnid)}if(e.where){let c=new Gl(e.where),l=e.from[0].tableid;for(let{node:u}of c)if(u&&u.columnid){let d=u.tableid?u.tableid:l;if(!t.get(i).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(i).get(d).indexOf(u.columnid)<0&&t.get(i).get(d).push(u.columnid)}}if(e.joins&&e.joins.forEach(c=>{let l=new Gl(c.on);for(let{node:u}of l)if(u&&u.columnid){let d=u.tableid,f=s.get(d);if(!t.get(f).has(d))if(r.has(d))d=r.get(d);else{gi.info(`table specified as ${d} not found.`);continue}t.get(f).get(d).indexOf(u.columnid)<0&&t.get(f).get(d).push(u.columnid)}}),e.order){let c=new Gl(e.order);for(let{node:l}of c)if(l&&l.columnid){let u=l.tableid,d=n.has(u)?n.get(u):i;if(u||(u=e.from[0].tableid),!t.get(d).has(u))if(r.has(u))u=r.get(u);else{gi.info(`table specified as ${u} not found.`);return}t.get(d).get(u).indexOf(l.columnid)<0&&t.get(d).get(u).push(l.columnid)}}}o(Dfe,"getSelectAttributes");function Mfe(e,t,r){if(!e){gi.info("getUpdateAttributes: invalid SQL syntax tree");return}let n=new Gl(e.columns),s=e.table.databaseid;fp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&GO(e.table.tableid,s,i.columnid,t,r)}o(Mfe,"getUpdateAttributes");function vfe(e,t,r){if(!e){gi.info("getDeleteAttributes: invalid SQL syntax tree");return}let n=new Gl(e.where),s=e.table.databaseid;fp(e.table,t,r);for(let{node:i}of n)i&&i.columnid&&GO(e.table.tableid,s,i.columnid,t,r)}o(vfe,"getDeleteAttributes");function Ufe(e,t,r){if(!e){gi.info("getInsertAttributes: invalid SQL syntax tree");return}let n=new Gl(e.columns),s=e.into.databaseid;fp(e.into,t,r);for(let{node:i}of n)i&&i.columnid&&GO(e.into.tableid,s,i.columnid,t,r)}o(Ufe,"getInsertAttributes");function GO(e,t,r,n,s){if(!n.get(t))return;let i=e;n.get(t).has(i)||(i=s.get(i)),n.get(t).get(i).push(r)}o(GO,"pushAttribute");b1.exports=kO});var w1=M((e0e,N1)=>{"use strict";var dT=(k(),v(W)),fT=class{static{o(this,"BaseLicense")}constructor(t=0,r=dT.RAM_ALLOCATION_ENUM.DEFAULT,n=dT.LICENSE_VALUES.VERSION_DEFAULT,s){this.exp_date=t,this.ram_allocation=r,this.version=n,this.fingerprint=s}},qO=class extends fT{static{o(this,"ExtendedLicense")}constructor(t=0,r=dT.RAM_ALLOCATION_ENUM.DEFAULT,n=dT.LICENSE_VALUES.VERSION_DEFAULT,s,i=!1){super(t,r,n,s),this.enterprise=i}};N1.exports={BaseLicense:fT,ExtendedLicense:qO}});var jd=M((r0e,M1)=>{"use strict";var zd=require("fs-extra"),mT=(Rg(),v(Tg)),C1=require("crypto"),xfe=require("moment"),Bfe=require("uuid").v4,hn=Q(),VO=require("path"),Ffe=ie(),ql=(k(),v(W)),{totalmem:O1}=require("os"),Hfe=w1().ExtendedLicense,Wd="invalid license key format",kfe="061183",Gfe="mofi25",qfe="aes-256-cbc",$fe=16,Vfe=32,P1=oe(),{resolvePath:L1}=yt();P1.initSync();var $O;M1.exports={validateLicense:D1,generateFingerPrint:Yfe,licenseSearch:WO,getLicense:jfe,checkMemoryLimit:Qfe};function KO(){return VO.join(P1.getHdbBasePath(),ql.LICENSE_KEY_DIR_NAME,ql.LICENSE_FILE_NAME)}o(KO,"getLicenseDirPath");function Kfe(){let e=KO();return L1(VO.join(e,ql.LICENSE_FILE_NAME))}o(Kfe,"getLicenseFilePath");function YO(){let e=KO();return L1(VO.join(e,ql.REG_KEY_FILE_NAME))}o(YO,"getFingerPrintFilePath");async function Yfe(){let e=YO();try{return await zd.readFile(e,"utf8")}catch(t){if(t.code==="ENOENT")return await Wfe();throw hn.error(`Error writing fingerprint file to ${e}`),hn.error(t),new Error("There was an error generating the fingerprint")}}o(Yfe,"generateFingerPrint");async function Wfe(){let e=Bfe(),t=mT.hash(e,mT.HASH_FUNCTION.MD5),r=YO();try{await zd.mkdirp(KO()),await zd.writeFile(r,t)}catch(n){if(n.code==="EEXIST")return t;throw hn.error(`Error writing fingerprint file to ${r}`),hn.error(n),new Error("There was an error generating the fingerprint")}return t}o(Wfe,"writeFingerprint");function D1(e,t){let r={valid_license:!1,valid_date:!1,valid_machine:!1,exp_date:null,ram_allocation:ql.RAM_ALLOCATION_ENUM.DEFAULT,version:ql.LICENSE_VALUES.VERSION_DEFAULT};if(!e)return hn.error("empty license key passed to validate."),r;let n=YO(),s=!1;try{s=zd.statSync(n)}catch(i){hn.error(i)}if(s){let i;try{i=zd.readFileSync(n,"utf8")}catch{hn.error("error validating this machine in the license"),r.valid_machine=!1;return}let a=e.split(Gfe),c=a[1];c=Buffer.concat([Buffer.from(c)],$fe);let l=Buffer.concat([Buffer.from(i)],Vfe),u=C1.createDecipheriv(qfe,l,c);r.valid_date=!0,r.valid_license=!0,r.valid_machine=!0;let d=null;try{d=u.update(a[0],"hex","utf8"),d.trim(),d+=u.final("utf8")}catch{let h=zfe(a[0],i);if(h)d=h;else throw r.valid_license=!1,r.valid_machine=!1,console.error(Wd),hn.error(Wd),new Error(Wd)}let f;if(isNaN(d))try{f=JSON.parse(d),r.version=f.version,r.exp_date=f.exp_date,isNaN(r.exp_date)&&(r.exp_date=new Date(r.exp_date).getTime()),f.ram_allocation&&(r.ram_allocation=f.ram_allocation)}catch{throw console.error(Wd),hn.error(Wd),new Error(Wd)}else r.exp_date=d;r.exp_date<xfe().valueOf()&&(r.valid_date=!1),mT.validate(a[1],`${kfe}${i}${t}`,mT.HASH_FUNCTION.MD5)||(r.valid_license=!1)}else r.valid_license=!1,r.valid_machine=!1;return r.valid_license&&r.valid_machine&&r.valid_date||hn.error("Invalid licence"),r}o(D1,"validateLicense");function zfe(e,t){try{let r=C1.createDecipher("aes192",t),n=r.update(e,"hex","utf8");return n.trim(),n+=r.final("utf8"),n}catch{hn.warn("Check old license failed")}}o(zfe,"checkOldLicense");function WO(){let e=new Hfe,t=[];try{t=zd.readFileSync(Kfe(),"utf-8").split(`\r
18
18
  `)}catch(r){r.code==="ENOENT"?hn.debug("no license file found"):hn.error(`could not search for licenses due to: '${r.message}`)}for(let r=0;r<t.length;++r){let n=t[r];try{if(Ffe.isEmptyOrZeroLength(n))continue;let s=JSON.parse(n),i=D1(s.license_key,s.company);i.valid_machine===!0&&i.valid_date===!0&&i.valid_machine===!0&&(e.exp_date=i.exp_date>e.exp_date?i.exp_date:e.exp_date,e.ram_allocation=i.ram_allocation,e.enterprise=!0)}catch(s){hn.error("There was an error parsing the license string."),hn.error(s),e.ram_allocation=ql.RAM_ALLOCATION_ENUM.DEFAULT,e.enterprise=!1}}return $O=e,e}o(WO,"licenseSearch");async function jfe(){return $O||await WO(),$O}o(jfe,"getLicense");function Qfe(){let e=WO().ram_allocation,t=process.constrainedMemory?.()||O1();if(t=Math.round(Math.min(t,O1())/2**20),t>e)return`This server has more memory (${t}MB) than HarperDB is licensed for (${e}MB), this should only be used for educational and development purposes.`}o(Qfe,"checkMemoryLimit")});var QO=M((s0e,B1)=>{var hT=jd(),v1=require("chalk"),cs=Q(),U1=require("prompt"),{promisify:Jfe}=require("util"),zO=(k(),v(W)),Xfe=require("fs-extra"),Zfe=require("path"),eme=ie(),{packageJson:tme}=Rt(),x1=oe();x1.initSync();var rme=require("moment"),nme=Jfe(U1.get),sme=Zfe.join(x1.getHdbBasePath(),zO.LICENSE_KEY_DIR_NAME,zO.LICENSE_FILE_NAME,zO.LICENSE_FILE_NAME);B1.exports={getFingerprint:ome,setLicense:ime,parseLicense:jO,register:ame,getRegistrationInfo:lme};async function ime(e){if(e&&e.key&&e.company){try{cs.info(`parsing license key: ${e.key} and `);let t=e.company.toString();await jO(e.key.trim(),t.trim())}catch(t){let r="There was an error parsing the license key.";throw cs.error(r),cs.error(t),new Error(r)}return"Wrote license key file. Registration successful."}throw new Error("Invalid key or company specified for license file.")}o(ime,"setLicense");async function ome(){let e={};try{e=await hT.generateFingerPrint()}catch(t){let r="Error generating fingerprint.";throw cs.error(r),cs.error(t),new Error(r)}return e}o(ome,"getFingerprint");async function jO(e,t){if(!e||!t)throw new Error("Invalid entries for License Key and Customer Company");cs.info("Validating license input...");let r=hT.validateLicense(e,t);if(cs.info("checking for valid license..."),!r.valid_license)throw new Error("Invalid license found.");if(cs.info("checking valid license date..."),!r.valid_date)throw new Error("This License has expired.");if(cs.info(`checking for valid machine license ${r.valid_machine}`),!r.valid_machine)throw new Error("This license is in use on another machine.");try{cs.info("writing license to disk"),await Xfe.writeFile(sme,JSON.stringify({license_key:e,company:t}))}catch(n){throw cs.error("Failed to write License"),n}return"Registration successful."}o(jO,"parseLicense");async function ame(){let e=await cme();return jO(e.HDB_LICENSE,e.CUSTOMER_COMPANY)}o(ame,"register");async function cme(){let e=await hT.generateFingerPrint(),t={properties:{CUSTOMER_COMPANY:{description:v1.magenta("[COMPANY] Please enter your company name"),required:!0},HDB_LICENSE:{description:v1.magenta(`[HDB_LICENSE] Your fingerprint is ${e} Please enter your license key`),required:!0}}};try{U1.start()}catch(n){cs.error(n)}let r;try{r=await nme(t)}catch(n){throw console.error("There was a problem prompting for registration input. Exiting."),n}return r}o(cme,"promptForRegistration");async function lme(){let e={registered:!1,version:null,ram_allocation:null,license_expiration_date:null},t;try{t=await hT.getLicense()}catch(r){throw cs.error(`There was an error when searching licenses due to: ${r.message}`),r}if(eme.isEmptyOrZeroLength(t))throw new Error("There were no licenses found.");if(e.registered=t.enterprise,e.version=tme.version,e.ram_allocation=t.ram_allocation,isNaN(t.exp_date))e.license_expiration_date=t.enterprise?t.exp_date:null;else{let r=rme.utc(t.exp_date).format("YYYY-MM-DD");e.license_expiration_date=t.enterprise?r:null}return e}o(lme,"getRegistrationInfo")});var H1=M((o0e,F1)=>{"use strict";var ume=Nt(),JO=class{static{o(this,"HubConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f,m,h,p){this.port=t,a===null&&(a=void 0),this.server_name=r+ume.SERVER_SUFFIX.HUB,this.pid_file=n,this.max_payload=67108864,this.reconnect_error_reports=100,this.jetstream={enabled:!1},this.tls={cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l},this.leafnodes={port:u,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c}},this.cluster={name:d,port:f,routes:m,tls:{cert_file:s,key_file:i,ca_file:a,insecure:c,verify:l}},this.accounts={SYS:{users:h},HDB:{users:p}},this.system_account="SYS"}};F1.exports=JO});var q1=M((c0e,G1)=>{"use strict";var k1=Nt(),XO=class{static{o(this,"LeafConfigObject")}constructor(t,r,n,s,i,a,c,l,u,d,f){this.port=t,f===null&&(f=void 0),this.server_name=r+k1.SERVER_SUFFIX.LEAF,this.pid_file=n,this.max_payload=67108864,this.jetstream={enabled:!0,store_dir:s,domain:r+k1.SERVER_SUFFIX.LEAF},this.tls={cert_file:u,key_file:d,ca_file:f,insecure:!0},this.leafnodes={remotes:[{tls:{ca_file:f,insecure:!0},urls:i,account:"SYS"},{tls:{ca_file:f,insecure:!0},urls:a,account:"HDB"}]},this.accounts={SYS:{users:c},HDB:{users:l,jetstream:"enabled"}},this.system_account="SYS"}};G1.exports=XO});var V1=M((u0e,$1)=>{"use strict";var ZO=class{static{o(this,"HdbUserObject")}constructor(t,r){this.user=t,this.password=r}};$1.exports=ZO});var Y1=M((f0e,K1)=>{"use strict";var dme=Nt(),eC=class{static{o(this,"SysUserObject")}constructor(t,r){this.user=t+dme.SERVER_SUFFIX.ADMIN,this.password=r}};K1.exports=eC});var gT=M((h0e,j1)=>{"use strict";var $l=require("path"),Vl=require("fs-extra"),fme=H1(),mme=q1(),hme=V1(),pme=Y1(),tC=ts(),Jd=ie(),xn=yt(),ET=(k(),v(W)),mp=Nt(),{CONFIG_PARAMS:rr}=ET,Xd=Q(),hp=oe(),W1=Ki(),rC=mr(),Eme=os(),Qd="clustering",_me=1e4,z1=50;j1.exports={generateNatsConfig:Sme,removeNatsConfig:Tme,getHubConfigPath:gme};function gme(){let e=hp.get(rr.ROOTPATH);return $l.join(e,Qd,mp.NATS_CONFIG_FILES.HUB_SERVER)}o(gme,"getHubConfigPath");async function Sme(e=!1,t=void 0){console.error("Warning: NATS replication is deprecated and will be removed in version 5.0 of Harper");let r=hp.get(rr.ROOTPATH);Vl.ensureDirSync($l.join(r,"clustering","leaf")),hp.initSync();let n=xn.getConfigFromFile(rr.CLUSTERING_TLS_CERT_AUTH),s=xn.getConfigFromFile(rr.CLUSTERING_TLS_PRIVATEKEY),i=xn.getConfigFromFile(rr.CLUSTERING_TLS_CERTIFICATE);!await Vl.exists(i)&&!await Vl.exists(!n)&&await Eme.createNatsCerts();let a=$l.join(r,Qd,mp.PID_FILES.HUB),c=$l.join(r,Qd,mp.PID_FILES.LEAF),l=xn.getConfigFromFile(rr.CLUSTERING_LEAFSERVER_STREAMS_PATH),u=$l.join(r,Qd,mp.NATS_CONFIG_FILES.HUB_SERVER),d=$l.join(r,Qd,mp.NATS_CONFIG_FILES.LEAF_SERVER),f=xn.getConfigFromFile(rr.CLUSTERING_TLS_INSECURE),m=xn.getConfigFromFile(rr.CLUSTERING_TLS_VERIFY),h=xn.getConfigFromFile(rr.CLUSTERING_NODENAME),p=xn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT);await rC.checkNATSServerInstalled()||_T("nats-server dependency is either missing or the wrong version. Run 'npm install' to fix");let _=await tC.listUsers(),g=xn.getConfigFromFile(rr.CLUSTERING_USER),y=await tC.getClusterUser();(Jd.isEmpty(y)||y.active!==!0)&&_T(`Invalid cluster user '${cluster_username}'. A valid user with the role 'cluster_user' must be defined under clustering.user in harperdb-config.yaml`),e||(await pT(rr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),await pT(rr.CLUSTERING_HUBSERVER_LEAFNODES_NETWORK_PORT),await pT(rr.CLUSTERING_HUBSERVER_NETWORK_PORT),await pT(rr.CLUSTERING_LEAFSERVER_NETWORK_PORT));let T=[],R=[];for(let[q,K]of _.entries())K.role?.role===ET.ROLE_TYPES_ENUM.CLUSTER_USER&&K.active&&(T.push(new pme(K.username,W1.decrypt(K.hash))),R.push(new hme(K.username,W1.decrypt(K.hash))));let N=[],{hub_routes:O}=xn.getClusteringRoutes();if(!Jd.isEmptyOrZeroLength(O))for(let q of O)N.push(`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@${q.host}:${q.port}`);let F=new fme(xn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_NETWORK_PORT),h,a,i,s,n,f,m,p,xn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_CLUSTER_NAME),xn.getConfigFromFile(rr.CLUSTERING_HUBSERVER_CLUSTER_NETWORK_PORT),N,T,R);n==null&&(delete F.tls.ca_file,delete F.leafnodes.tls.ca_file),t=Jd.isEmpty(t)?void 0:t.toLowerCase(),(t===void 0||t===ET.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase())&&(await Vl.writeJson(u,F),Xd.trace(`Hub server config written to ${u}`));let Z=`tls://${y.sys_name_encoded}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,G=`tls://${y.uri_encoded_name}:${y.uri_encoded_d_hash}@0.0.0.0:${p}`,Y=new mme(xn.getConfigFromFile(rr.CLUSTERING_LEAFSERVER_NETWORK_PORT),h,c,l,[Z],[G],T,R,i,s,n,f);n==null&&delete Y.tls.ca_file,(t===void 0||t===ET.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())&&(await Vl.writeJson(d,Y),Xd.trace(`Leaf server config written to ${d}`))}o(Sme,"generateNatsConfig");async function pT(e){let t=hp.get(e);return Jd.isEmpty(t)&&_T(`port undefined for '${e}'`),await Jd.isPortTaken(t)&&_T(`'${e}' port '${t}' is is in use by another process, check to see if HarperDB is already running or another process is using this port.`),!0}o(pT,"isPortAvailable");function _T(e){let t=`Error generating clustering config: ${e}`;Xd.error(t),console.error(t),process.exit(1)}o(_T,"generateNatsConfigError");async function Tme(e){let{port:t,config_file:r}=rC.getServerConfig(e),{username:n,decrypt_hash:s}=await tC.getClusterUser(),i=0,a=2e3;for(;i<z1;){try{let d=await rC.createConnection(t,n,s,!1);if(d.protocol.connected===!0){d.close();break}}catch(d){Xd.trace(`removeNatsConfig waiting for ${e}. Caught and swallowed error ${d}`)}if(i++,i>=z1)throw new Error(`Operations API timed out attempting to connect to ${e}. This is commonly caused by incorrect clustering config. Check hdb.log for further details.`);let u=a*(i*2);u>3e4&&Xd.notify("Operations API waiting for Nats server connection. This could be caused by large Nats streams or incorrect clustering config."),await Jd.asyncSetTimeout(u)}let c="0".repeat(_me),l=$l.join(hp.get(rr.ROOTPATH),Qd,r);await Vl.writeFile(l,c),await Vl.remove(l),Xd.notify(e,"started.")}o(Tme,"removeNatsConfig")});var tK=M((E0e,eK)=>{"use strict";var ls=oe(),Rme=jd(),Ke=(k(),v(W)),pp=Nt(),Wo=require("path"),{PACKAGE_ROOT:TT}=Rt(),Q1=oe(),ST=ie(),Zd="/dev/null",yme=Wo.join(TT,"launchServiceScripts"),J1=Wo.join(TT,"utility/scripts"),Ame=Wo.join(J1,Ke.HDB_RESTART_SCRIPT),X1=Wo.resolve(TT,"dependencies",`${process.platform}-${process.arch}`,pp.NATS_BINARY_NAME);function Z1(){let t=Rme.licenseSearch().ram_allocation||Ke.RAM_ALLOCATION_ENUM.DEFAULT,r=Ke.MEM_SETTING_KEY+t,n={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.HDB,IS_SCRIPTED_SERVICE:!0};return ST.noBootFile()&&(n[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=ST.getEnvCliRootPath()),{name:Ke.PROCESS_DESCRIPTORS.HDB,script:Ke.LAUNCH_SERVICE_SCRIPTS.MAIN,exec_mode:"fork",env:n,node_args:r,cwd:TT}}o(Z1,"generateMainServerConfig");var bme=9930;function Ime(){ls.initSync(!0);let e=ls.get(Ke.CONFIG_PARAMS.ROOTPATH),t=Wo.join(e,"clustering",pp.NATS_CONFIG_FILES.HUB_SERVER),r=Wo.join(ls.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=Q1.get(Ke.CONFIG_PARAMS.CLUSTERING_HUBSERVER_NETWORK_PORT),s=pp.LOG_LEVEL_FLAGS[ls.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB+(n!==bme?"-"+n:""),script:X1,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_HUB},merge_logs:!0,out_file:r,error_file:r,instances:1};return ls.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Zd,i.error_file=Zd),i}o(Ime,"generateNatsHubServerConfig");var Nme=9940;function wme(){ls.initSync(!0);let e=ls.get(Ke.CONFIG_PARAMS.ROOTPATH),t=Wo.join(e,"clustering",pp.NATS_CONFIG_FILES.LEAF_SERVER),r=Wo.join(ls.get(Ke.HDB_SETTINGS_NAMES.LOG_PATH_KEY),Ke.LOG_NAMES.HDB),n=Q1.get(Ke.CONFIG_PARAMS.CLUSTERING_LEAFSERVER_NETWORK_PORT),s=pp.LOG_LEVEL_FLAGS[ls.get(Ke.CONFIG_PARAMS.CLUSTERING_LOGLEVEL)]??void 0,i={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF+(n!==Nme?"-"+n:""),script:X1,args:s?`${s} -c ${t}`:`-c ${t}`,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_LEAF},merge_logs:!0,out_file:r,error_file:r,instances:1};return ls.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(i.out_file=Zd,i.error_file=Zd),i}o(wme,"generateNatsLeafServerConfig");function Ome(){ls.initSync();let e=Wo.join(ls.get(Ke.CONFIG_PARAMS.LOGGING_ROOT),Ke.LOG_NAMES.HDB),t={name:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0,script:Ke.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,exec_mode:"fork",env:{[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0},merge_logs:!0,out_file:e,error_file:e,instances:1,cwd:yme,autorestart:!1};return ls.get(Ke.HDB_SETTINGS_NAMES.LOG_TO_FILE)||(t.out_file=Zd,t.error_file=Zd),t}o(Ome,"generateClusteringUpgradeV4ServiceConfig");function Cme(){let e={[Ke.PROCESS_NAME_ENV_PROP]:Ke.PROCESS_DESCRIPTORS.RESTART_HDB};return ST.noBootFile()&&(e[Ke.CONFIG_PARAMS.ROOTPATH.toUpperCase()]=ST.getEnvCliRootPath()),{...{name:Ke.PROCESS_DESCRIPTORS.RESTART_HDB,exec_mode:"fork",env:e,instances:1,autorestart:!1,cwd:J1},script:Ame}}o(Cme,"generateRestart");function Pme(){return{apps:[Z1()]}}o(Pme,"generateAllServiceConfigs");eK.exports={generateAllServiceConfigs:Pme,generateMainServerConfig:Z1,generateRestart:Cme,generateNatsHubServerConfig:Ime,generateNatsLeafServerConfig:wme,generateClusteringUpgradeV4ServiceConfig:Ome}});var ef=M((S0e,pK)=>{"use strict";var at=(k(),v(W)),Lme=ie(),jo=gT(),RT=mr(),zo=Nt(),oc=tK(),yT=oe(),Kl=Q(),Dme=ro(),{startWorker:rK,onMessageFromWorkers:Mme}=rt(),vme=Gd(),g0e=require("util"),Ume=require("child_process"),xme=require("fs"),{execFile:Bme}=Ume,Je;pK.exports={enterPM2Mode:Fme,start:ac,stop:nC,reload:sK,restart:iK,list:sC,describe:cK,connect:Qo,kill:$me,startAllServices:Vme,startService:iC,getUniqueServicesList:lK,restartAllServices:Kme,isServiceRegistered:uK,reloadStopStart:dK,restartHdb:aK,deleteProcess:Gme,startClusteringProcesses:mK,startClusteringThreads:hK,isHdbRestartRunning:qme,isClusteringRunning:Wme,stopClustering:Yme,reloadClustering:zme,expectedRestartOfChildren:oK};var Ep=!1;Mme(e=>{e.type==="restart"&&yT.initSync(!0)});function Fme(){Ep=!0}o(Fme,"enterPM2Mode");function Qo(){return Je||(Je=require("pm2")),new Promise((e,t)=>{Je.connect((r,n)=>{r&&t(r),e(n)})})}o(Qo,"connect");var pn,Hme=10,nK;function ac(e,t=!1){if(Ep)return kme(e);let r=Bme(e.script,e.args.split(" "),e);r.name=e.name,r.config=e,r.on("exit",async i=>{let a=pn.indexOf(r);a>-1&&pn.splice(a,1),!nK&&i!==0&&(e.restarts=(e.restarts||0)+1,e.restarts<Hme&&(xme.existsSync(jo.getHubConfigPath())?ac(e):(await jo.generateNatsConfig(!0),ac(e),await new Promise(c=>setTimeout(c,3e3)),await jo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await jo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF))))});let n={serviceName:e.name.replace(/ /g,"-")};function s(i){let a=yT.get(at.CONFIG_PARAMS.CLUSTERING_LOGLEVEL),c=/\[\d+][^\[]+\[(\w+)]/g,l,u=0,d;for(;l=c.exec(i);){if(l.index&&zo.LOG_LEVEL_HIERARCHY[a]>=zo.LOG_LEVEL_HIERARCHY[d||"info"]){let h=d===zo.LOG_LEVELS.ERR||d===zo.LOG_LEVELS.WRN?Kl.OUTPUTS.STDERR:Kl.OUTPUTS.STDOUT;Kl.logCustomLevel(d||"info",h,n,i.slice(u,l.index).trim())}let[f,m]=l;u=l.index+f.length,d=zo.LOG_LEVELS[m]}if(zo.LOG_LEVEL_HIERARCHY[a]>=zo.LOG_LEVEL_HIERARCHY[d||"info"]){let f=d===zo.LOG_LEVELS.ERR||d===zo.LOG_LEVELS.WRN?Kl.OUTPUTS.STDERR:Kl.OUTPUTS.STDOUT;Kl.logCustomLevel(d||"info",f,n,i.slice(u).trim())}}if(o(s,"extractMessages"),r.stdout.on("data",s),r.stderr.on("data",s),r.unref(),!pn&&(pn=[],!t)){let i=o(()=>{nK=!0,pn&&(pn.map(a=>a.kill()),process.exit(0))},"killChildren");process.on("exit",i),process.on("SIGINT",i),process.on("SIGQUIT",i),process.on("SIGTERM",i)}pn.push(r)}o(ac,"start");function kme(e){return new Promise(async(t,r)=>{try{await Qo()}catch(n){r(n)}Je.start(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(kme,"startWithPM2");function nC(e){if(!Ep){for(let t of pn||[])t.name===e&&(pn.splice(pn.indexOf(t),1),t.kill());return}return new Promise(async(t,r)=>{try{await Qo()}catch(n){r(n)}Je.stop(e,async(n,s)=>{n&&(Je.disconnect(),r(n)),Je.delete(e,(i,a)=>{i&&(Je.disconnect(),r(n)),Je.disconnect(),t(a)})})})}o(nC,"stop");function sK(e){return new Promise(async(t,r)=>{try{await Qo()}catch(n){r(n)}Je.reload(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(sK,"reload");function iK(e){if(!Ep){oK();for(let t of pn||[])t.name===e&&t.kill()}return new Promise(async(t,r)=>{try{await Qo()}catch(n){r(n)}Je.restart(e,(n,s)=>{Je.disconnect(),t(s)})})}o(iK,"restart");function oK(){for(let e of pn||[])e.config&&(e.config.restarts=0)}o(oK,"expectedRestartOfChildren");function Gme(e){return new Promise(async(t,r)=>{try{await Qo()}catch(n){r(n)}Je.delete(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(Gme,"deleteProcess");async function aK(){await ac(oc.generateRestart())}o(aK,"restartHdb");async function qme(){let e=await sC();for(let t in e)if(e[t].name===at.PROCESS_DESCRIPTORS.RESTART_HDB)return!0;return!1}o(qme,"isHdbRestartRunning");function sC(){return new Promise(async(e,t)=>{try{await Qo()}catch(r){t(r)}Je.list((r,n)=>{r&&(Je.disconnect(),t(r)),Je.disconnect(),e(n)})})}o(sC,"list");function cK(e){return new Promise(async(t,r)=>{try{await Qo()}catch(n){r(n)}Je.describe(e,(n,s)=>{n&&(Je.disconnect(),r(n)),Je.disconnect(),t(s)})})}o(cK,"describe");function $me(){if(!Ep){for(let e of pn||[])e.kill();pn=[];return}return new Promise(async(e,t)=>{try{await Qo()}catch(r){t(r)}Je.killDaemon((r,n)=>{r&&(Je.disconnect(),t(r)),Je.disconnect(),e(n)})})}o($me,"kill");async function Vme(){try{await mK(),await hK(),await ac(oc.generateAllServiceConfigs())}catch(e){throw Je?.disconnect(),e}}o(Vme,"startAllServices");async function iC(e,t=!1){try{let r;switch(e=e.toLowerCase(),e){case at.PROCESS_DESCRIPTORS.HDB.toLowerCase():r=oc.generateMainServerConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_INGEST_SERVICE.toLowerCase():r=oc.generateNatsIngestServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE.toLowerCase():r=oc.generateNatsReplyServiceConfig();break;case at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase():r=oc.generateNatsHubServerConfig(),await ac(r,t),await jo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase():r=oc.generateNatsLeafServerConfig(),await ac(r,t),await jo.removeNatsConfig(e);return;case at.PROCESS_DESCRIPTORS.CLUSTERING_UPGRADE_4_0_0.toLowerCase():r=oc.generateClusteringUpgradeV4ServiceConfig();break;default:throw new Error(`Start service called with unknown service config: ${e}`)}await ac(r)}catch(r){throw Je?.disconnect(),r}}o(iC,"startService");async function lK(){try{let e=await sC(),t={};for(let r=0,n=e.length;r<n;r++){let s=e[r];t[s.name]===void 0&&(t[s.name]={name:s.name,exec_mode:s.pm2_env.exec_mode})}return t}catch(e){throw Je?.disconnect(),e}}o(lK,"getUniqueServicesList");async function Kme(e=[]){try{let t=!1,r=await lK();for(let n=0,s=Object.values(r).length;n<s;n++){let a=Object.values(r)[n].name;e.includes(a)||(a===at.PROCESS_DESCRIPTORS.HDB?t=!0:await iK(a))}t&&await dK(at.PROCESS_DESCRIPTORS.HDB)}catch(t){throw Je?.disconnect(),t}}o(Kme,"restartAllServices");async function uK(e){if(pn?.find(r=>r.name===e))return!0;let t=await vme.getHDBProcessInfo();return t.core.length&&t.core[0]?.parent==="PM2"}o(uK,"isServiceRegistered");async function dK(e){let t=yT.get(at.CONFIG_PARAMS.THREADS_COUNT)??yT.get(at.CONFIG_PARAMS.THREADS),r=await cK(e),n=Lme.isEmptyOrZeroLength(r)?0:r.length;t!==n?(await nC(e),await iC(e)):e===at.PROCESS_DESCRIPTORS.HDB?await aK():await sK(e)}o(dK,"reloadStopStart");var fK;async function mK(e=!1){for(let t in at.CLUSTERING_PROCESSES){let r=at.CLUSTERING_PROCESSES[t];await iC(r,e)}}o(mK,"startClusteringProcesses");async function hK(){fK=rK(at.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE,{name:at.PROCESS_DESCRIPTORS.CLUSTERING_REPLY_SERVICE});try{await RT.deleteLocalStream("__HARPERDB_WORK_QUEUE__")}catch{}await RT.updateLocalStreams();let e=await Dme.getAllNodeRecords();for(let t=0,r=e.length;t<r;t++)if(e[t].system_info?.hdb_version===at.PRE_4_0_0_VERSION){Kl.info("Starting clustering upgrade 4.0.0 process"),rK(at.LAUNCH_SERVICE_SCRIPTS.NODES_UPGRADE_4_0_0,{name:"Upgrade-4-0-0"});break}}o(hK,"startClusteringThreads");async function Yme(){for(let e in at.CLUSTERING_PROCESSES)if(e!==at.CLUSTERING_PROCESSES.CLUSTERING_INGEST_PROC_DESCRIPTOR)if(e===at.CLUSTERING_PROCESSES.CLUSTERING_REPLY_SERVICE_DESCRIPTOR)await fK.terminate();else{let t=at.CLUSTERING_PROCESSES[e];await nC(t)}}o(Yme,"stopClustering");async function Wme(){for(let e in at.CLUSTERING_PROCESSES){let t=at.CLUSTERING_PROCESSES[e];if(await uK(t)===!1)return!1}return!0}o(Wme,"isClusteringRunning");async function zme(){await jo.generateNatsConfig(!0),await RT.reloadNATSHub(),await RT.reloadNATSLeaf(),await jo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_HUB.toLowerCase()),await jo.removeNatsConfig(at.PROCESS_DESCRIPTORS.CLUSTERING_LEAF.toLowerCase())}o(zme,"reloadClustering")});var cC={};Oe(cC,{compactOnStart:()=>jme,copyDb:()=>RK});async function jme(){cc.notify("Running compact on start"),console.log("Running compact on start");let e=(0,oC.get)(U.ROOTPATH),t=new Map,r=nt();(0,aC.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);try{for(let n in r){if(n==="system"||n.endsWith("-copy"))continue;let s;for(let l in r[n]){s=r[n][l].primaryStore.path;break}if(!s){console.log("Couldn't find any tables in database",n);continue}let i=(0,AT.join)(e,"backup",n+".mdb"),a=(0,AT.join)(e,Uc,n+"-copy.mdb"),c=0;try{c=await EK(n),console.log("Database",n,"before compact has a total record count of",c)}catch(l){cc.error("Error getting record count for database",n,l),console.error("Error getting record count for database",n,l)}t.set(n,{dbPath:s,copyDest:a,backupDest:i,recordCount:c}),await RK(n,a),console.log("Backing up",n,"to",i);try{await(0,Yl.move)(s,i,{overwrite:!0})}catch(l){console.log("Error moving database",s,"to",i,l)}console.log("Moving copy compacted",n,"to",s),await(0,Yl.move)(a,s,{overwrite:!0}),await(0,Yl.remove)((0,AT.join)(e,Uc,`${n}-copy.mdb-lock`))}try{ld()}catch(n){cc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n)}try{ld()}catch(n){cc.error("Error resetting databases after backup",n),console.error("Error resetting databases after backup",n),process.exit(0)}}catch(n){cc.error("Error compacting database, rolling back operation",n),console.error("Error compacting database, rolling back operation",n),(0,aC.updateConfigValue)(U.STORAGE_COMPACTONSTART,!1);for(let[s,{dbPath:i,backupDest:a}]of t){console.error("Moving backup database",a,"back to",i);try{await(0,Yl.move)(a,i,{overwrite:!0})}catch(c){console.error(c)}}throw ld(),n}for(let[n,{backupDest:s,recordCount:i}]of t){let a=await EK(n);if(console.log("Database",n,"after compact has a total record count of",a),i!==a){let c=`There is a discrepancy between pre and post compact record count for database ${n}.
19
19
  Total record count before compaction: ${i}, total after: ${a}.
20
20
  Database backup has not been removed and can be found here: ${s}`;cc.error(c),console.error(c)}(0,oC.get)(U.STORAGE_COMPACTONSTARTKEEPBACKUP)!==!0&&(console.log("Removing backup",s),await(0,Yl.remove)(s))}}async function EK(e){let t=await(0,TK.describeSchema)({database:e}),r=0;for(let n in t)r+=t[n].record_count;return r}function tf(){}async function RK(e,t){console.log(`Copying database ${e} to ${t}`);let r=nt()[e];if(!r)throw new Error(`Source database not found: ${e}`);let n;for(let f in r){let m=r[f];m.primaryStore.put=tf,m.primaryStore.remove=tf;for(let h in m.indices){let p=m.indices[h];p.put=tf,p.remove=tf}m.auditStore&&(m.auditStore.put=tf,m.auditStore.remove=tf),n=m.primaryStore.rootStore}if(!n)throw new Error(`Source database does not have any tables: ${e}`);let s=n.dbisDb,i=n.auditStore,a=(0,_K.open)(new gK.default(t)),c=a.openDB(bT.INTERNAL_DBIS_NAME),l,u=0,d=s.useReadTransaction();try{for(let{key:m,value:h}of s.getRange({transaction:d})){let p=h.is_hash_attribute||h.isPrimaryKey,_,g;if(p&&(_=h.compression,g=Kg(),g?h.compression=g:delete h.compression,_?.dictionary?.toString()===g?.dictionary?.toString()&&(_=null,g=null)),c.put(m,h),!(p||h.indexed))continue;let y=new SK.default(!p,p);y.encoding="binary",y.compression=_;let T=n.openDB(m,y);T.decoder=null,T.decoderCopies=!1,T.encoding="binary",y.compression=g;let R=a.openDB(m,y);R.encoder=null,console.log("copying",m,"from",e,"to",t),await f(T,R,p,d)}if(i){let m=n.openDB(bT.AUDIT_STORE_NAME,ym);console.log("copying audit log for",e,"to",t),f(i,m,!1,d)}async function f(m,h,p,_){let g=0,y=0,T=0,R=1e7,N=null;for(;R-- >0;)try{for(let O of m.getKeys({start:N,transaction:_}))try{N=O;let{value:F,version:Z}=m.getEntry(O,{transaction:_});if(F?.length<14&&p){T++;continue}l=h.put(O,F,p?Z:void 0),g++,_.openTimer&&(_.openTimer=0),y+=(O?.length||10)+F.length,u++>5e3&&(await l,console.log("copied",g,"entries",T,"delete records,",y,"bytes"),u=0)}catch(F){console.error("Error copying record",typeof O=="symbol"?"symbol":O,"from",e,"to",t,F)}console.log("finish copying, copied",g,"entries",T,"delete records,",y,"bytes");return}catch{if(typeof N=="string"){if(N==="z")return console.error("Reached end of dbi",N,"for",e,"to",t);N=N.slice(0,-2)+"z"}else if(typeof N=="number")N++;else return console.error("Unknown key type",N,"for",e,"to",t)}}o(f,"copyDbi"),await l,console.log("copied database "+e+" to "+t)}finally{d.done(),a.close()}}var _K,AT,Yl,oC,gK,SK,bT,TK,aC,cc,lC=ue(()=>{De();_K=require("lmdb"),AT=require("path"),Yl=require("fs-extra"),oC=w(oe()),gK=w(Dm()),SK=w(Lm()),bT=w(qt());k();Mi();TK=w(Fa()),aC=w(yt()),cc=w(Q());o(jme,"compactOnStart");o(EK,"getTotalDBRecordCount");o(tf,"noop");o(RK,"copyDb")});var nf=M((O0e,OK)=>{"use strict";var Qme=require("minimist"),{isMainThread:dC,parentPort:gp,threadId:I0e}=require("worker_threads"),dt=(k(),v(W)),no=Q(),fC=ie(),NT=gT(),IT=mr(),N0e=Nt(),IK=yt(),Si=ef(),yK=Gd(),{compactOnStart:Jme}=(lC(),v(cC)),Xme=xc(),{restartWorkers:wT,onMessageByType:Zme}=rt(),{handleHDBError:ehe,hdbErrors:the}=ge(),{HTTP_STATUS_CODES:rhe}=the,Sp=oe(),{sendOperationToNode:AK,getThisNodeName:nhe,monitorNodeCAs:she}=(ss(),v(Go)),{getHDBNodeTable:w0e}=(Dl(),v(Iw));Sp.initSync();var _p=`Restarting HarperDB. This may take up to ${dt.RESTART_TIMEOUT_MS/1e3} seconds.`,ihe="Restart is not available from the CLI when running in non-pm2 mode. Either call restart from the API or stop and start HarperDB.",bK="Clustering is not enabled so cannot be restarted",ohe="Invalid service",rf,xs;OK.exports={restart:NK,restartService:mC};dC&&Zme(dt.ITC_EVENT_TYPES.RESTART,async(e,t)=>{e.workerType?await mC({service:e.workerType}):NK({operation:"restart"}),t.postMessage({type:"restart-complete"})});async function NK(e){xs=Object.keys(e).length===0,rf=await Si.isServiceRegistered(dt.PROCESS_DESCRIPTORS.HDB);let t=Qme(process.argv);if(t.service){await mC(t);return}if(xs&&!rf){console.error(ihe);return}if(xs&&console.log(_p),rf){Si.enterPM2Mode(),no.notify(_p);let r=Xme(Object.keys(dt.CONFIG_PARAM_MAP),!0);return fC.isEmptyOrZeroLength(Object.keys(r))||IK.updateConfigValue(void 0,void 0,r,!0,!0),ahe(),_p}return dC?(no.notify(_p),Sp.get(dt.CONFIG_PARAMS.STORAGE_COMPACTONSTART)&&await Jme(),process.env.HARPER_EXIT_ON_RESTART&&process.exit(0),setTimeout(()=>{wT()},50)):gp.postMessage({type:dt.ITC_EVENT_TYPES.RESTART}),_p}o(NK,"restart");async function mC(e){let{service:t}=e;if(dt.HDB_PROCESS_SERVICES[t]===void 0)throw ehe(new Error,ohe,rhe.BAD_REQUEST,void 0,void 0,!0);if(Si.expectedRestartOfChildren(),rf=await Si.isServiceRegistered(dt.PROCESS_DESCRIPTORS.HDB),!dC){e.replicated&&she(),gp.postMessage({type:dt.ITC_EVENT_TYPES.RESTART,workerType:t}),gp.ref(),await new Promise(s=>{gp.on("message",i=>{i.type==="restart-complete"&&(s(),gp.unref())})});let n;if(e.replicated){e.replicated=!1,n=[];for(let s of server.nodes){if(s.name===nhe())continue;let i;try{({job_id:i}=await AK(s,e))}catch(a){n.push({node:s.name,message:a.message});continue}n.push(await new Promise((a,c)=>{let u=2400,d=setInterval(async()=>{if(u--<=0){clearInterval(d);let h=new Error("Timed out waiting for restart job to complete");h.replicated=n,c(h)}let m=(await AK(s,{operation:"get_job",id:i})).results[0];if(m.status==="COMPLETE"&&(clearInterval(d),a({node:s.name,message:m.message})),m.status==="ERROR"){clearInterval(d);let h=new Error(m.message);h.replicated=n,c(h)}},250)}))}return{replicated:n}}return}let r;switch(t){case dt.HDB_PROCESS_SERVICES.clustering:if(!Sp.get(dt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=bK;break}xs&&console.log("Restarting clustering"),no.notify("Restarting clustering"),await wK();break;case dt.HDB_PROCESS_SERVICES.clustering_config:case dt.HDB_PROCESS_SERVICES["clustering config"]:if(!Sp.get(dt.CONFIG_PARAMS.CLUSTERING_ENABLED)){r=bK;break}xs&&console.log("Restarting clusteringConfig"),no.notify("Restarting clustering_config"),await Si.reloadClustering();break;case"custom_functions":case"custom functions":case dt.HDB_PROCESS_SERVICES.harperdb:case dt.HDB_PROCESS_SERVICES.http_workers:case dt.HDB_PROCESS_SERVICES.http:if(xs&&!rf){r=`Restart ${t} is not available from the CLI when running in non-pm2 mode. Either call restart ${t} from the API or stop and start HarperDB.`;break}xs&&console.log("Restarting httpWorkers"),no.notify("Restarting http_workers"),xs?await Si.restart(dt.PROCESS_DESCRIPTORS.HDB):await wT("http");break;default:r=`Unrecognized service: ${t}`;break}return r?(no.error(r),xs&&console.error(r),r):(t==="custom_functions"&&(t="Custom Functions"),`Restarting ${t}`)}o(mC,"restartService");async function ahe(){await wK(),await Si.restart(dt.PROCESS_DESCRIPTORS.HDB),await fC.asyncSetTimeout(2e3),Sp.get(dt.CONFIG_PARAMS.CLUSTERING_ENABLED)&&await uC(),xs&&(await IT.closeConnection(),process.exit(0))}o(ahe,"restartPM2Mode");async function wK(){if(!IK.getConfigFromFile(dt.CONFIG_PARAMS.CLUSTERING_ENABLED))return;if((await yK.getHDBProcessInfo()).clustering.length===0)no.trace("Clustering not running, restart will start clustering services"),await NT.generateNatsConfig(!0),await Si.startClusteringProcesses(),await Si.startClusteringThreads(),await uC(),xs&&await IT.closeConnection();else{await NT.generateNatsConfig(!0),rf?(no.trace("Restart clustering restarting PM2 managed Hub and Leaf servers"),await Si.restart(dt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await Si.restart(dt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)):(await yK.getHDBProcessInfo()).clustering.forEach(s=>{no.trace("Restart clustering killing process pid",s.pid),process.kill(s.pid)}),await fC.asyncSetTimeout(3e3),await uC(),await IT.updateLocalStreams(),xs&&await IT.closeConnection(),no.trace("Restart clustering restarting ingest and reply service threads");let t=wT(dt.LAUNCH_SERVICE_SCRIPTS.NATS_INGEST_SERVICE),r=wT(dt.LAUNCH_SERVICE_SCRIPTS.NATS_REPLY_SERVICE);await t,await r}}o(wK,"restartClustering");async function uC(){await NT.removeNatsConfig(dt.PROCESS_DESCRIPTORS.CLUSTERING_HUB),await NT.removeNatsConfig(dt.PROCESS_DESCRIPTORS.CLUSTERING_LEAF)}o(uC,"removeNatsConfig")});var HK=M((L0e,FK)=>{"use strict";var P0e=require("lodash"),Bn=(k(),v(W)),{handleHDBError:CK,hdbErrors:che}=ge(),{HDB_ERROR_MSGS:lhe,HTTP_STATUS_CODES:uhe}=che,hC=Q();FK.exports={getRolePermissions:fhe};var Wl=Object.create(null),dhe=o(e=>({key:e,perms:{}}),"permsTemplateObj"),MK=o((e=!1)=>({describe:e,tables:{}}),"schemaPermsTemplate"),vK=o((e=!1,t=!1,r=!1,n=!1)=>({[Bn.PERMS_CRUD_ENUM.READ]:e,[Bn.PERMS_CRUD_ENUM.INSERT]:t,[Bn.PERMS_CRUD_ENUM.UPDATE]:r,[Bn.PERMS_CRUD_ENUM.DELETE]:n}),"permissionsTemplate"),pC=o((e=!1,t=!1,r=!1,n=!1,s=!1)=>({attribute_permissions:[],describe:e,...vK(t,r,n,s)}),"tablePermsTemplate"),PK=o((e,t=vK())=>({attribute_name:e,describe:BK(t),[Tp]:t[Tp],[EC]:t[EC],[_C]:t[_C]}),"attrPermsTemplate"),LK=o((e,t=!1)=>({attribute_name:e,describe:t,[Tp]:t}),"timestampAttrPermsTemplate"),{READ:Tp,INSERT:EC,UPDATE:_C}=Bn.PERMS_CRUD_ENUM,UK=Object.values(Bn.PERMS_CRUD_ENUM),xK=[Tp,EC,_C];function fhe(e){let t;try{if(e.permission.super_user||e.permission.cluster_user)return e.permission;let r={...global.hdb_schema};delete r[Bn.SYSTEM_SCHEMA_NAME],t=e.role;let n=JSON.stringify([e.__updatedtime__,r]);if(Wl[t]&&Wl[t].key===n)return Wl[t].perms;let s=mhe(e,r);return Wl[t]?Wl[t].key=n:Wl[t]=dhe(n),Wl[t].perms=s,s}catch(r){if(!e[Bn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]||e[Bn.TIME_STAMP_NAMES_ENUM.UPDATED_TIME]<Bn.PERMS_UPDATE_RELEASE_TIMESTAMP){let n=`Role permissions for role '${role_name}' must be updated to align with new structure from the 2.2.0 release.`;throw hC.error(n),hC.debug(r),CK(new Error,lhe.OUTDATED_PERMS_TRANSLATION_ERROR,uhe.BAD_REQUEST)}else{let n=`There was an error while translating role permissions for role: ${t}.